Witam wszystkich
Pamiętacie zeszłomiesięczny projekt naszego kolegi Cezarego?
Pływałbym, ale troszkę inaczej, a przede wszystkim szybciej ;)
Poprzeglądałem Thingiverse i znalazłem bardzo urzekający projekt, którego tanią realizację mam zamiar przedstawić poniżej.
Do projektu będą potrzebne:
– 2 arduino nano (mogą być inne)
– 2 moduły nRF24l01
– 2 kondensatory 10uF (do modułów nRF240l01)
– obudowa na akumulatory 18650- w moim przypadku na 2 sztuki
– 2 akumulatory 18650 (oczywiście można inne zasilanie załatwić)
– kable prototypowe
– kable do połączeń stałych+ jeden 4 przewodowy około metra
– 2 płytki prototypowe (lub jedna duża)
– obudowa uniwersalna na nadajnik (w projekcie użyłem pudełka o wymiarach 86x65x30)
– sterownik silników L298N
– serwo SG-90
– silnik dc (najlepiej z otworami na śruby)
– moduł joysticka
– 2 przełączniki
– bateria 9v
– klips do baterii 9v
– pręt gwintowany M3
– wiertła 2mm oraz 2,5mm
– męskie i żeńskie konektory BLS (opcjonalne)
– małe nakrętki, śruby/wkręty (M3 16mm, 10mm, przycinałem do krótszych nawet)
– „klej do plastików twardych” żeby skleić łódź w jedną całość (odradzam kropelkę)
– około 300g filamentu
– narzędzia typu nóż/kombinerki/lutownica/wiertarka/klej na gorąco/papier ścierny
Spis treści:
1. Drukowanie
2. Elektronika (schematy)
3. Programowanie (kody)
4. Łączenie tych światów w całość
5. Jak to pływa?
6. Źródła
1. Drukowanie
Zacznijmy od drukowania, żeby w międzyczasie bawić się elektroniką ;)
W paczce projektu jest kilka opcji wydrukowania łodzi- od jednego całego elementu po elementy przystosowane do drukarek Zmax=200 jak i drukarki Zmax=150.
Jeżeli komuś nie odpowiada wysokość elementów do drukarki Zmax=200 to powinien wydrukować te elementy:
hull bow 129mm
hull front mod 140mm
hull middle 50mm
hull back 140mm
lub hull complete podzielić
oraz oczywiście:
rudder
rudder mount
rudder horn 4.3
servo mount
switch mount (osobiście nie użyłem)
motor mount
deck back 165
deck front 138
Propeller 31
joystick back cover
joystick front cover
lacznik
clip
Osobiście bardzo raził mnie fakt, że muszę drukować 4 elementy i robić 3 klejenia dlatego skorzystałem z modelu hull_complete i w slicerze za pomocą opcji „stop printing at height:” podzieliłem wydruk na 3 elementy po 152,8mm, czyli w moim przypadku 1528 warstw każdy
Teraz jak to drukować, łódź jest zoptymalizowana abyśmy mogli drukować w trybie wazonów (vase mode) i taki tryb też włączamy.
Pierwszym elementem jaki drukowałem jest tył łodzi, aby poprawnie wydrukować ten element należy włączyć:
jeżeli drukujemy na ustawieniu 0,3mm wysokość warstwy to musimy ustawić 7 pierwszych warstw jako wypełnione w 100%, możemy drukować różną wysokością warstwy, ale trzeba zachować tą proporcję, czyli np. 0,15mm=14 wypełnionych pierwszych warstw, 0,1mm=21 warstw itd…
0,6mm szerokość ścieżki
wypełnienie ostatnich 3 warstw (aby była powierzchnia do klejenia)- w moim przypadku przy wysokości 0,1mm otrzymałem powierzchnię lekko podziurawioną, ale to nie szkodzi, klej będzie miał gdzie uciec.
vase mode
Aby wydrukować środek łodzi należy łódź obrócić o 180 stopni aby wypełniona warstwa, która będzie się łączyła z dziobem była na dole- jakby była na górze (czyli byśmy po prostu przesunęli łódź w dół) to wypełnione ostatnie warstwy drukowałoby się w powietrzu dając średni efekt.
Podsumowując:
Ilość wypełnionych pierwszych warstw redukujemy do rozsądnych kilku, obracamy łódź o 180 stopni i obniżamy o 152,8mm (w moim przypadku) i wydrukuje się takie coś:
Ostatnim dużym elementem jest dziób, który drukujemy jak pierwszy element, tylko chowamy pod stół 2×152,8mm (w moim przypadku) i pierwsze warstwy również redukujemy do kilku.
Drukowanie elementów deck_back i deck_front wygląda tak samo jak elementy wyżej bez żadnych komplikacji.
Kolejnym, ostatnim elementem wymagającym zmiany ustawień jest sprzęgło/łącznik, który połączy silnik z wałem, eksperymentowałem troszkę i najprostszy sposób jest najlepszy:
Zwykła tuleja o wymiarach 14mm wysokości 6mm średnicy i wewnątrz 2mm otwór. Polecam wydrukować kilka sztuk takich samych ponieważ będziemy wiercić, a to można łatwo zepsuć. Polecam ustawić rodzaj wypełnienia na okrągły jak na zdjęciu. Osobiście wydrukowałem to w 100% wypełneniu.
Resztę elementów takich jak ster/mocowanie możemy drukować standardowo bez żadnych specjalnych ustawień.
Potrzebujemy wydrukować jakąś obudowę do joysticka, zamiast robić ciężkie żelazko postawiłem na podzielenie pilota na 2 elementy.
1. Lekka, wyprofilowana obudowa na sam moduł
2. Pudełko na nrf/arduino/baterię, które będzie klipsem przypięte do kieszeni/paska- wykorzystałem obudowę uniwersalną o wymiarach 86x65x30, która walała mi się po szufladach ;)
Obudowę na joystick odważyłem się drukować bez supportów i wyszło dobrze- na pewno lepiej niż miałbym walczyć kombinerkami.
2. Elektronika
Zrobię tradycyjny makaron i rozpiskę co do czego ;)
Zacznijmy od nadajnika:
Bateria 9V -> arduino nano
…-… -> GND
…+… -> przełącznik -> VIN
Joystick -> arduino nano
GND -> GND
(oś Y) -> A6
(oś X) -> A5
VCC -> 5V
Moduł nrf -> arduino nano
GND -> GND
VCC -> 3V3
CE -> D9
CSN -> D10
SCK -> D13
MOSI -> D11
MISO -> D12
Wskazówka: potrzebujemy 3 złącza GND, a arduino ma 2, jeżeli nie chcemy ciąć i łączyć kabli to możemy się wlutować z masą do pinu od ICSP
Następny jest odbiornik:
Baterie -> L298N
…+… -> przełącznik -> +12V
…-… -> GND
L298N -> arduino nano
ENA -> D3
IN1 -> D7
IN2 -> D8
5V -> VIN
GND -> GND
L298N -> silnik DC
…+… -> …+…
…-… -> …-…
Moduł nrf -> arduino nano
GND -> GND
VCC -> 3V3
CE -> D9
CSN -> D10
SCK -> D13
MOSI -> D11
MISO -> D12
Serwo -> arduino nano
Brązowy -> GND
Czerwony -> 5V
Pomarańczowy -> D5
Polecam na początek zrobić to na płytkach prototypowych.
Jak jesteśmy już blisko modułu L298N to trzeba powiedzieć w skrócie jak on działa.
Do modułu podajemy zasilanie z akumulatorów, moduł może zasilać arduino bo ma wyprowadzenie 5v. Poza pinami zasilającymi i silnikiem do modułu podpinamy pin enA- jest to sterowanie prędkością silnika poprzez sygnał PWM. Piny IN1 i IN2 służą do sterowania kierunkiem obrotu silnika. Dodatkowo jeżeli enA=0 (jeżeli nie ruszamy joysticka to taki stan przyjmuje) to Silnik również będzie się zatrzymywał aż stanie.
3. Programowanie
Czas na kody, jako, że należę do osób, które „cannot into programowanie obiektowe” napisałem banalne kody strukturalnie. Na wstępnie napiszę w kilku zdaniach jak działa całokształt.
Transmiter odczytuje wartości z joysticka i na podstawie zebranych danych oblicza numery biegów- dwa biegi dla dwóch osi, które potem są wysyłane z kontrolnymi danymi do odbiornika.
Odbiornik odbiera gotowe dane, sprawdza ich poprawność i jeżeli się różnią od poprzednich danych to ustalany jest kierunek jazdy oraz prędkość.
Jakie biegi zaprojektowałem?
Podzieliłem wartości otrzymywane od joysticka na 7 części (1023/7=146) i zależnie od tego w jakiej części znajduje się wartość taki mamy bieg. Poniżej rysunek poglądowy wykonany w programie…. Paint
Oczywiście lewo/prawo jest na drugiej osi, ale z zasada działania taka sama.
Teraz kody:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
#include <SPI.h> #include "nRF24L01.h" #include "RF24.h" RF24 radio(9,10); //CE, CSN const uint64_t pipe = 0xE8E8F0F0E1LL; // adres na którym jest komunikacja const int X_pin = 5; // X pin od joysticka const int Y_pin = 6; // Y pin od joysticka int msg[4] = {1,3,3,7}; int wart_biegow[7] = { 147, 293, 439, 585, 731, 877, 1023 }; //7 wartosci o odstepnie 146 uint8_t liczbieg(int odczyt) { if (odczyt < wart_biegow[0]) //jezeli odczytalismy wartosc mniejsza od 1 elementu tablicy zwracamy bieg=0 return (0); // jezeli tak nie jest to szukamy po kolei naszego "miejsca" for (int i = 1; i < 6; i++) { if (odczyt < ((wart_biegow[i] + wart_biegow[i + 1]) / 2)) { return (i); } } // zwrot 6 jesli nie znalazlo sie nic w srodku return (6); } void setup() { radio.begin(); radio.setChannel(115); //wybranie kanalu radio.setPALevel(RF24_PA_MAX); //ustawienie duzego zasiegu radio.setDataRate( RF24_250KBPS ) ; //Minimalna predkosc=duzy zasieg radio.openWritingPipe(pipe); } void loop() { msg[1]=liczbieg(analogRead(X_pin)); //przypisanie do elementu tablicy wyniku funkcji liczbieg msg[2]=liczbieg(analogRead(Y_pin)); radio.write(msg, sizeof(msg)); //wyslanie naszej wiadomosci //odczkaj aż status zostanie wysłany delay(200); //a po co mamy tak spamowac } |
„Brzydkie” akapitowanie w Case’ach jest specjalne, żeby sztucznie nie odstraszać dużym kodem ;)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 |
#include <SPI.h> #include "nRF24L01.h" #include "RF24.h" #include "Servo.h" Servo servo; RF24 radio(9, 10); //CE CSN const uint64_t pipe = 0xE8E8F0F0E1LL; int msg[4]; int poprzednia_msg[2]={9,9}; bool A,B; //IN1 IN2 int pwm; //enA int odlaczamy=0; //jak utracimy zasieg, licznik void jedz(int bieg){ switch (bieg){ // A=enA B=enB pwm= konwertujemy wartosc biegu z przedzialu 0-1023 na wartosc 0-255 wymagana do PWM case 6: { A=1; B=0; pwm= map(1023,0,1023,0,255); break; } case 5: { A=1; B=0; pwm= map(682,0,1023,0,255); break; } case 4: { A=1; B=0; pwm= map(341,0,1023,0,255); break; } case 3: { A=1; B=1; pwm= map(0,0,1023,0,255); break; } case 2: { A=0; B=1; pwm= map(341,0,1023,0,255); break; } case 1: { A=0; B=1; pwm= map(682,0,1023,0,255); break; } case 0: { A=0; B=1; pwm= map(1023,0,1023,0,255); break; } }//jezeli lodz zamiast plynac do przodu plynie do tylu to trzeba zamienic cyfry w case'ach na rosnace digitalWrite(7,A); //zapisujemy odpowiednie stany na inA inB oraz wysylamy odpowiedni sygnal PWM digitalWrite(8,B); analogWrite(3,pwm); } void skrecaj (int bieg){ switch (bieg){ //w zaleznosci od biegu obracamy serwo o konkretna ilosc stopni case 0: { servo.write(30); break; } case 1: { servo.write(50); break; } case 2: { servo.write(70); break; } case 3: { servo.write(90); break; } case 4: { servo.write(110); break; } case 5: { servo.write(130); break; } case 6: { servo.write(150); break; } }//jezeli skrecanie jest odwrotne to mozemy zamienic kolejnosc cyfr w case'ach na malejaca } void setup() { servo.attach(5); //pomaranczowy od serwa servo.write(90); //ustawienie srodkowej pozycji serwa Serial.begin(9600); pinMode(3,OUTPUT); //pwm pinMode(7,OUTPUT); //IN1 pinMode(8,OUTPUT); //IN2 radio.begin(); radio.setChannel(115); radio.openReadingPipe(1,pipe); radio.setDataRate( RF24_250KBPS ) ; //mala predkosc=duzy zasieg radio.startListening(); //zaczynamy nasluchiwanie } void loop() { if (radio.available()) //jezeli mozemy odebrac jakies dane { odlaczamy=0; while (radio.available()){ radio.read(msg, sizeof(msg)); //odbieranie danych if (msg[0]==1 && msg[3] == 7) { if (poprzednia_msg[0] != msg[1]){//sprawdzanie czy bieg sie zmienil jedz(msg[1]); poprzednia_msg[0]=msg[1]; } if (poprzednia_msg[1] != msg[2]){//sprawdzanie czy bieg sie zmienil skrecaj(msg[2]); poprzednia_msg[1]=msg[2]; } } } } else { odlaczamy++; delay(500); if (odlaczamy==5){ digitalWrite(7,0); digitalWrite(8,0); //zerujemy wszystko, wyłączamy wszystko analogWrite(3,0); //mozna wskakiwac do wody- nie odplynie ;D } } } |
4. Łączenie tych światów w całość
Na początek skleimy łódź w jedną całość, w moim przypadku klej potrzebuje 12godzin aby wyschnąć, dlatego warto to zrobić jak najszybciej. Odradzam użycie kropelki ponieważ zbyt szybko wiąże- w zasadzie przy pierwszym (zazwyczaj krzywym) kontakcie mamy już mocne spojenie plastików.
Takiego kleju użyłem:
Na początku skleiłem środkową część z tyłem- dno ma być jak najbardziej równe na zewnątrz, w środku łodzi wyszło mi delikatnie krzywo ale to nic nie szkodzi.
Następnie położyłem na kilka godzin 2kg filamentu aby był jakiś docisk.
Po tym czasie zdecydowałem się dokleić ostatni element
Po wyrównaniu powstała taka konstrukcja, która mam nadzieję przetrwa całą noc i się nie rozsypie :)
Podczas gdy łódź schnie możemy zająć się joystickiem, oczyszczamy wydruk nożem i jak widać w moim przypadku moduł pasuje idealnie:
Następnie powiększamy wiertarką dziury na odpowiednie śruby lub znajdujemy odpowiednie śruby, uważajcie tylko, żeby nie przewiercić się na wylot.
Kolejnym etapem jest podłączenie około metrowego przewodu do modułu. Osobiście wykorzystałem kabel telefoniczny, który ma 4 przewody, nawet kolory się zgadzają ;)
Możecie użyć konektorów BLS lub po prostu to zlutować, nie mam obudów więc ładnie zaizoluję te piny
Wszystko teraz skręcamy i tak wygląda prawie skończony kontroler, prawie skończony ponieważ jeszcze zakleiłem klejem na gorąco dziurę przy kablu usztywniając/zabezpieczając go ;)
Teraz bierzemy się za obudowę do nadajnika, powiem szczerze, niby szybkie i proste- wrzucić wszystko i zamknąć, ale trochę się namęczyłem aby to upchać i żeby jakoś to wyglądało/działało.
Żeby nie zapomnieć napiszę to w tym miejscu, nrf24l01 do poprawnego działania potrzebuje kondensatora 10uF na zasilaniu, zrobiłem bardzo „cwany myk”, którym chętnie się z wami podzielę ;)
Na zdjęciu brzydko wygląda, w rzeczywistości jest estetyczniej, najważniejsze, że działa i nie zajmuje dużo miejsca.
W tym przypadku akurat mam nrf24l01 z antenką, oczywiście nie potrzebujesz dokładnie tej samej wersji, zwykła również da radę.
Walczyłem kilka godzin z tym pudełkiem, ale udało się, tak wygląda makaron w środku (nie lutowałem arduino/kabli ze względu na to, że może mi się przyda w innym projekcie) Bateria i nRF są przyklejone klejem na gorąco.
Widzicie ten zaznaczony pin? Przez niego straciłem około pół godziny bo się wysunął i nie działało :v
A tak prezentuje się skończony zestaw nadajnika:
Musimy jeszcze zamontować klips aby był możliwy montaż na pasku/kieszeni, użyłem kropelki:
A tak wygląda nadajnik założony na kieszeń:
Teraz musimy wykonać wał i połączyć go z silnikiem oraz śrubą, wyżej napisałem o wydrukowaniu kilku tulejek ze względu iż trzeba to prosto i szybko wywiercić w innym przypadku PLA zacznie się topić i będzie krzywo.
Wspomnianą tulejkę na początek złapałem w kombinerki i przewierciłem wiertłem 2mm i to wystarczyło aby można było mocno nabić tulejkę na oś silnika, jeżeli będzie luźno to spróbuj z mniejszym wiertłem/nalać kleju lub podgrzać oś silnika i wtopić do nie rozwierconej tulei.
Jak już uzyskaliśmy efekt widoczny na obrazku- tuleja mocno trzyma się na osi silnika. Możemy przejść do następnego etapu- drugą stronę tulei należy nawiercić wiertłem 2,5-2,7 ponieważ gwint m3 ma około 2,8mm- kupiłem w castoramie metr za ~1,5zł. Pręt gwintowany docinamy na odpowiednią długość- u mnie jest to 15cm i próbujemy wkręcić pręt w wywiercony otwór, powinno się udać i wyglądać mniej-więcej tak:
Śrubę po drugiej stronie możemy zamontować identycznie, ale możemy też wywiercić odpowiednio dużą dziurę, włożyć pręt i po prostu zalać klejem od góry. Oczywiście śrubę przymocujemy na samym końcu jak już wszystko będzie w łodzi ;)
Osobiście wydrukowałem śrubę w skali 110% i pręt gwintowany z lekkim oporem się wkręcił.
Teraz trzeba zamontować wszystko do łodzi, zacząłem od zrobienia dziur lutownicą, nadmiar ściąłem nożem.
Pamiętamy też o dziurze na nasz wał na pokładzie
jak i o powiększeniu dziur przy sterze i uchwycie do serwa, tak wygląda kompletny ster:
Tak prezentuje się serwo w uchwycie, niepotrzebnie rzeźbiłem, myślałem, że inaczej ma być…
A tak wygląda zamontowany ster, na tym etapie nie widziałem dziury do zrobienia przy sterze aby drucik mógł iść po linii prostej… potem to naprawiłem :)
Kolejnym etapem był montaż silnika, znalazłem silnik, który miał 2 otwory na śruby m3 aby montaż był łatwiejszy, a przede wszystkim pewniejszy niż kleje, otwory w tym elemencie są przewidziane na silniki bezszczotkowe więc musiałem zrobić swoje dziury na swój silnik.
Tak wygląda przykręcony silnik, te podkładki zmieniłem później na kilka zwykłych ponieważ śruby za głęboko mi wchodziły w silnik
Dochodzimy do momentu gdzie klej na gorąco poszedł w ruch :)
Silnik wraz z tym „koszykiem” przykleiłem na klej na gorąco ponieważ miałem możliwość dobrania odpowiedniej pozycji aby nie było zbyt dużych oporów i wszystko było na środku (wał).
Ostatnim etapem jest wprowadzenie się z elektroniką i szczerze mówiąc poszedłem tutaj na łatwiznę z kilku względów, ale pierw zobaczcie jak to wygląda w środku bez akumulatorów:
Od płytki prototypowej usunąłem listwy zasilające i całkiem dobrze zmieściło się w środku, jakbyście mieli jeszcze mniejszą płytkę to byłaby ona w pełni wykorzystana i nie zajmowałaby zbędnego miejsca. Szczerze mówiąc wolę takie rozwiązanie niż lutowanie nastu kabli ponieważ w tym momencie nie zamknąłem sobie drogi do ewentualnych modyfikacji. Woda dostanie się do środka? łatwo wymienię arduino i będzie działać dalej, a nawet mam łatwy dostęp do gniazda usb w razie aktualizacji oprogramowania.
Rozważam wsadzenie elektroniki w jakieś woreczki aby choć trochę poczuły się bezpiecznie.
Kolejna rzecz- dlaczego wszystko w środku jest na klej na gorąco?
– wygoda
– silnik, tak jak już wspomniałem, miałem możliwość wycentrować go i uchwyty wtedy nie bardzo się zgrywały aby robić tam dziury i skręcać
– będę musiał wyważyć zabawki w środku więc taki rodzaj kleju umożliwi mi odklejenie i przyklejenie w innym miejscu
A gdzie się podział nRF24l01? Ładnie go przykleiłem za piny do ścianki.
Tak wygląda całość po zamknięciu, ładnie się wsunęło, ale wątpię w wodoodporność no i tak nie planuję robić z tego łodzi podwodnej:
5.Jak to pływa?
Niczym legendarny TITANIC, nie było żadnych szans w starciu z górą lodową…
A tak na poważnie to zawiodła konstrukcja dociskająca i rano zastałem taki widok :D
Po naprawieniu i odczekaniu 12h (na klej) udało mi się zwodować łódź, oto efekty:
https://youtu.be/jfxpNYhUIew
Jakbym miał podsumować, demon prędkości to to nie jest, kwestia zastosowania dobrego silnika, ja nie wybrałem najszybszego DC tylko takiego co ma otwory montażowe, ale tragedii nie ma, jest dobrze, a mimo wszystko projekt jest bardzo tani, mógłbym strzelić, że całość kosztowała <50zł. Można wsadzić silnik bezszczotkowy, ale sam akumulator wyniesie więcej niż ten projekt, a gdzie jeszcze ESC, silnik, ładowarka itd. Banan na twarzy utrzymuje się długo po wodowaniu :D
6. Źródła
Projekt łodzi
Śruba pochodzi z tego projektu
Klips to ten projekt
Joystick
Poniżej paczka z wykorzystanymi modelami do wydrukowania oraz kodami.
Świetny projekt! Gratuluję!
Super sprawa, szkoda, że nie mam drukarki 3D. Mam za to do dyspozycji nieźle wyposażony warsztat stolarski, spróbuję wykonać podobną z drewna.
Witam.
Żądło pisze komentarze, ale projekt jest świetny, co prawda przerobić muszę sam kadłub(inne zastosowanie) i w sumie większość elektroniki ale mam punkt zaczepienia. Jedyne co mnie nurtuje to zasięgi czy 100 m na otwartej wodzie pociągnie?