Witam! To będzie mój pierwszy wpis na tej stronie i będzie dotyczył zdalnie sterowanego pojazdu wyposażonego w kamerkę 2,4 GHz. Myślę że jest to ciekawy pomysł na prezent dla dziecka. Moduły nRF24l01 (wersja z antenką) zapewniają spory zasięg i w moim przypadku mogę podglądać każde miejsce w mieszkaniu bez wstawania z łóżka. Na otwartej przestrzeni zasięg tych modułów to PODOBNO powyżej 1000m. Obraz z kamery odbierany jest przy pomocy odbiornika 2,4 GHz podłączonego do laptopa. Serwomechanizm umożliwia rozglądanie się w górę i w dół.
Do wykonania robota użyłem:
- 3 pojemników na żywność,
- 4 kółek ze starej zabawki (samochodzika),
- 2 pojemników na tabletki musujące,
- kostka elektryczna,
- pojemnik na baterie,
- dwa małe kątowniki,
- śrubki, nakrętki,
w części elektronicznej:
- 4 silnik DC z przekładnia,
- 2 arduino nano,
- 2 moduły nRF24l01,
- kilka kondensatorów,
- serwomechanizm,
- kamerka 2,4 GHz,
- przetwornica DC/DC ,
- moduł joystick,
- potencjometr 10 K,
- akumulatorki 6 x AA i 1 x 9V,
- 2 sterowniki l293d,
- włączniki, przewody, kondensatory itp..
Pojemniki po tabletkach musujących służą do podtrzymania silników przykręconych do ścianek największego pojemnika. Mniejszy zielony pojemnik przeznaczony jest na baterie.
Koła przymocowane są do osi silnika przy pomocy kostki elektrycznej, natomiast serwomechanizm do korpusu robota przy pomocy dwóch kątowników i 4 śrubek co widać na zdj. poniżej:
Kamera zamocowana jest przy pomocy opasek zaciskowych. Konstrukcja jest prosta ale myślę, że efekt nie jest zły biorąc pod uwagę, że pojazd wykonany jest ze zwykłych pojemników na żywność. Kontroler również wykonany jest ze zwykłego pojemnika.
Poglądowy schemat nadajnika:
Poglądowy schemat odbiornika:
Na schematach pominąłem niektóre połączenia (podałem tylko miejsca ich podpięcia) aby schemat był bardziej czytelny. Nie jestem najlepszy w rysowaniu schematów ale mam nadzieje, że są w miarę czytelne. Na schematach nie ma też kondensatorów wygładzających napięcie.
Zastosowałem kondensatory 10uF przylutowane miedzy pin GND, a VCC (3,3V) w modułach nRF24l01. Między piny silników kondensatory ceramiczne 1uF. Między stabilizowane 5V z arduino (zasilające logikę l293d), a masę kondensator 100uF. Między zasilanie 7,8V (do zasilania silników), a masę dwa kondensatory: ceramiczny 1uF i elektrolityczny 100uF.
Schemat nie pokazuje też obwodu świateł robota ale tego akurat chyba nie trzeba pokazywać (po prostu diody podłączone do baterii przez rezystor i włącznik).
Jeżeli chodzi o obwód nadajnika to został on umieszczony w pojemniku na kanapki z wywierconym otworem na antenkę, przymocowanym joystickiem i potencjometrem.
Serwomechanizm poruszający kamerką zasilany jest przez przetwornice DC/DC podłączoną do baterii.
Cała elektronika schowana jest we wnętrzu robota.
Kod nadajnika:
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 |
//Robot inspekcyjny sterowany zdalnie #include <SPI.h> #include "RF24.h" RF24 radio(9,10); const uint64_t pipe = 0xE8E8F0F0E1LL; int msg[1]; int potpin_1 = A0; // VRy z modułu joysticka int val_1; int potpin_2 = A1; // VRx z modułu joysticka int val_2; int potpin_3 = A3; // potencjometr do sterowania serwomechanizmem int val_3; void setup(void){ radio.begin(); radio.openWritingPipe(pipe); } void loop() { //przypisanie wysyłanej informacji odpowiednim wychyleniom potencjometrów val_1 = analogRead(potpin_1); val_1 = map(val_1, 0, 1023, 101, 200); msg[0] = val_1; radio.write(msg, 1); val_2 = analogRead(potpin_2); val_2 = map(val_2, 0, 1023, 0, 100); msg[0] = val_2; radio.write(msg, 1); val_3 = analogRead(potpin_3); val_3 = map(val_3, 0, 1023, 201, 255); msg[0] = val_3; radio.write(msg, 1); } |
Kod odbiornika
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 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 |
//Robot inspekcyjny zdalnie sterowany #include <Servo.h> #include <SPI.h> #include "RF24.h" RF24 radio(9,10); const uint64_t pipe = 0xE8E8F0F0E1LL; int msg[1]; int data; int pos; Servo servo1; int sspeed; // prędkość //silnik-lewy przód const int in1 = 15; const int in2 = 14; const int ena = 5; // PWM pin do zmiany prędkości //silnik-lewy tył const int in1t = 4; const int in2t = 2; //silnik-pawy przód const int in12 = 17; const int in22 = 16; //silnik-prawy tył const int in12t = 8; const int in22t = 7; void setup() { servo1.attach(6); pinMode(in1, OUTPUT); pinMode(in2, OUTPUT); pinMode(ena, OUTPUT); pinMode(in1t, OUTPUT); pinMode(in2t, OUTPUT); pinMode(in12, OUTPUT); pinMode(in22, OUTPUT); pinMode(in12t, OUTPUT); pinMode(in22t, OUTPUT); delay(50); radio.begin(); radio.openReadingPipe(1,pipe); radio.startListening(); } void loop() //przypisanie odbieranym sygnałom odpowiednich czynności { if (radio.available())radio.read(msg, 1); if (msg[0] >0 && msg[0] <45){data = msg[0]; sspeed = map(data, 0, 45, 255, 50); right(sspeed);} if (msg[0] >55 && msg[0] <100){data = msg[0]; sspeed = map(data, 100, 55, 255, 50); left(sspeed);} if (msg[0] >100 && msg[0] <145){data = msg[0]; sspeed = map(data, 101, 145, 255, 50); backward(sspeed);} if (msg[0] >155 && msg[0] <200){data = msg[0]; sspeed = map(data, 200, 154, 255, 50); forward(sspeed);} if ((msg[0] >=145 && msg[0] <=155)&&(msg[0] >=45 && msg[0] <=55)){data = msg[0]; stopp(); } if (radio.available())radio.read(msg, 1); if (msg[0] <255 && msg[0] >200){data = msg[0]; pos = map(data, 201, 254, 10, 110); servo1.write(pos);} } void stopp() { analogWrite(ena, 0); digitalWrite(in1, LOW); digitalWrite(in2, LOW); digitalWrite(in12, LOW); digitalWrite(in22, LOW); digitalWrite(in1t, LOW); digitalWrite(in2t, LOW); digitalWrite(in12t, LOW); digitalWrite(in22t, LOW); } void forward(int sspeed) //jazda w przód { digitalWrite(in1, HIGH); digitalWrite(in12, HIGH); digitalWrite(in2, LOW); digitalWrite(in22, LOW); digitalWrite(in1t, HIGH); digitalWrite(in12t, HIGH); digitalWrite(in2t, LOW); digitalWrite(in22t, LOW); analogWrite(ena, sspeed); } void backward(int sspeed) //jazda w tył { digitalWrite(in1, LOW); digitalWrite(in12, LOW); digitalWrite(in2, HIGH); digitalWrite(in22, HIGH); digitalWrite(in1t, LOW); digitalWrite(in12t, LOW); digitalWrite(in2t, HIGH); digitalWrite(in22t, HIGH); analogWrite(ena, sspeed); } void left(int sspeed) // prawe silniki do przodu, a lewe do tyłu { digitalWrite(in1, LOW); digitalWrite(in12, HIGH); digitalWrite(in2, HIGH); digitalWrite(in22, LOW); digitalWrite(in1t, LOW); digitalWrite(in12t, HIGH); digitalWrite(in2t, HIGH); digitalWrite(in22t, LOW); analogWrite(ena, sspeed); } void right(int sspeed) // lewe silniki do przodu, a prawe do tyłu { digitalWrite(in1, HIGH); digitalWrite(in12, LOW); digitalWrite(in2, LOW); digitalWrite(in22, HIGH); digitalWrite(in1t, HIGH); digitalWrite(in12t, LOW); digitalWrite(in2t, LOW); digitalWrite(in22t, HIGH); analogWrite(ena, sspeed); } |
Jako uzupełnienie mojego artykułu dołączam linki z filmikami prezentującymi robota:
Pozdrawiam! Mam nadzieję, że nie jest źle jak na pierwszy raz.
Jestem miło zaskoczony, spodziewałem się jakiegoś badziewia, a tu całkiem ciekawy projekcik :). Ale po kolei: sprzęt – pełna prowizorka, zgodna z najlepszymi zasadami majsterkowania. Tylko zamiast arduino mogłeś dać “łyse” mikrokontrolery, cena całości od razu idzie w dół. Program jak na pisany w arduino nie jest zły, działa i nie jest specjalnie przekombinowany. No i należy się wielki plus za prawidłowe filtrowanie zasilania.
Cale arduino wychodzi taniej niz czysta atmega w polsce..
Jeśli Atmega kosztuje 100 zł to się zgodzę.
Zależy jakie Arduino. Ja np w projektach korzystam z chińskiego klona micro, który kosztował chyba $3.5 z przesyłką chociaż to trwało ok. miesiąca. Ale za tą cenę mam atmegą i stabilizację zasilania (5V i 3.3V) więc coś takiego może być opłacalne.
ja chińskie Nano kupowałem po jakieś 8zł, a megę za 24zł
Daję piątkę bo nie można 4.5.
Dwie uwagi do kodu:
1) Przygotowując kod do publikacji zadbaj o czytelność – nigdy nie umieszczaj więcej niż jednej instrukcji w linii i zadbaj o to, aby nie przekroczyć prawego marginesu, bo poziome skrolowanie przeszkadza w czytaniu;
2) Nieprawidłowo stosujesz operator przecinka – to nie to samo co średnik! Przecinek oznacza, że kompilator ma pełną swobodę w wyborze kolejności wykonania instrukcji – a nie chciałbyś pewnie, aby np. najpierw wartość val została przekazana do nadajnika, następnie zostało obliczone map(val,…) a na samym końcu do val podstawiona wartość z wejścia analogowego.
@ethanak: Z tą czytelnością nie jest tak źle :)
ethanak: słuszna uwaga z tymi średnikami.. moje niedopatrzenie.. zastosowanie średników znacząco poprawia niezawodność działania..
Ładny projekt :) Tak przy okazji, możesz sprawdzić tak mniej więcej realny zasięg? W to 1000 metrów nigdy nie wierzyłem, ale jak na otwartej przestrzeni ogarną około 150 metrów to też sobie takiego robota sprawię :D
też nie wierze w 1000m.. jak będę miał czas to sprawdzę.
Pozdro!
co to za kamerka? nie zakłóca działania zdalnego sterowania?
Też sie bałem że będzie problem z zakłóceniami.. ostatecznie nie jest źle ale gdy oddale sie na większą odległość to obraz troche jest zanieczyszczony.. jak będe miał czas to pójdę w plener sprawdzić ile maksymalnie moge sie oddalić od odbiornika.
Pozdrawiam!
Też jestem ciekawy co to za kamerka i ile kosztuje?
Ciężko powiedzieć bo w sumie nie kupiłem jej.. leżała już dłuższy czas niepotrzebna.. kiedyś służyła jako monitoring w sklepie.. plusem jest obecność diod IR dzięki czemu można prowadzić nocne eskapady:D no i fajne jest to że jest dostosowana do monitoringu zewnętrznego ;) ale ceny nie jestem w stanie określić..
Pozdro!
Brawo :)
Jakich dokładnie silników użyłeś? Jaka tam jest przekładnia ?:)
chyba 70 RPM 6V, bo takie po prostu miałem, kiedyś na ebayu kupiłem po taniu..
Jakich silników użyłeś i z jaką przekładnią dokładnie ?:)
użyłeś jako kodu do “znalezenia się” odbiornika i nadajnika słowa pipe. można oczywiscie wpisac w obu programach np 0001, jestem ciekawy czy da się i czy ktoś wie jak wstawic w setup zmienną by ustawić w nadajniku kilka kodów i za pomocą przełacznika zmieniac to z którym odbiornikiem ma się nadajnik komunikować
pipe to nazwa zmiennej z tego co widze więc nie mogłobybyć 0001 :) W zmiennej pipe przechowywany jest adres, wystarczyłoby dodać instrukcje która ustawiałaby inny adres (oczywiście trzeba też z deklaracji zmiennej usunąć “const”)
Co to za muzyka, którą słychać przy prezentacji tego robota?
Alan Walker- Fade
Robbit: Dziękuję
Napisałeś że wykorzystałeś 2x arduino nano. Na schematacie odbiornika jest arduino UNO, a na nadajniku NANO. A z koleji w samym robocie od strony nadajnika jest UNO, a przy odbiorniku NANO xd jak to w końcu jest?:P
a co to za różnica jakie arduino?
Super projekt, chętnie sam bym spróbował coś takiego sobie zbudować.
Patrząc na podane tutaj elementy, jaki może być łączny koszt budowy swojego :)
hi sir, i have to control the robot car project. Where the rear wheels in the form of a dc motor is controlled with flex sensors and front wheels in the form of a servo motor controlled by the accelerometer sensor. Robot controller with a car connected with nrf24l01. if one of the sensors to control I can. but if it combines both to control I can not. Both sensors transmit data simultaneously . dc motors and servo motors confused receive data so that its movement is chaotic. How should I fix this? can you help me.? Can I send my program to you and you see.? Please. My email: rema_adhe@yahoo.com
Witam. Mam problem z tymi modułami (wiem że ro nie powinno być tu tylko na forum ale tam nikt nie potrafi mi pomóc) Mam przylurowane kondensatory 4.7 uf przy vcc 3.3v i gnd gdy wgrywam program testowy znajduje połączenie ale gdy chce przesłać dane to mam napisane radio niedostępne (bo tak ma być napisane gdy radio nie jest dostępne :) ) mam takie same moduły leżą obok siebie podłączone wszystko dobrze sprawdzałem milion razy. Czy ktoś wie o co chodzi???
Hello!
I want to know how can you stream video so well!!
Can you share me the code for streaming video via RF?
My email: bangjdev@gmail.com
Thanks!
Witam!
Aktualnie nie można skopiować kodu z Waszej strony. Prosił bym o usunięcie usterki.
Arduino:1.8.5 (Windows 7), Płytka:”Arduino/Genuino Uno”
C:\Users\Marcin\AppData\Local\Temp\arduino_modified_sketch_111650\Blink.ino:11:21: fatal error: RF24.h: No such file or directory
#include “RF24.h”
^
compilation terminated.
exit status 1
Błąd kompilacji dla płytki Arduino/Genuino Uno.
Ten raport powinien zawierać więcej informacji jeśli w
File -> Preferencje zostanie włączona opcja “Pokaż
szczegółowe informacje podczas kompilacji”
taki blad przy probie wgrania do odbiornika,ktos cos moze wie?
Ok juz wszystko wiem,nie było tematu.
Jak naprawiłeś ten błąd? Mam ten sam problem
Witam. Jak rozwiązać problem gdy układ straci łączność? Jakiś gotowy kod? Dembek88@gmail.com
czy zastosowany sposób wysyłania położenia potencjometrów z nadajnika, poprzez wysyłanie położenia x i y w tym samym bajcie nie powoduje problemów z kontrolą?
chodzi mi o to, że kontroler nie zawsze jest wychylony tylko w jednej osi i czasami może być wychylony po przekątnej.
odbiornik odbierze na zmiane 30 i 180 to jak to bedzie jechalo?
potrzebuje kod do “łazika” 4 silniki, arduino uno, nrf24l01, i tu jest problem bo sterownik silników to l298N i nie umiem poprawić kodu aby wszystko działało poprawnie. (kończy się na tym że pojazd nie zatrzymuje się po puszczeniu joysticka ) czy mógł byś coś zaradzić ?