Robot jeżdżący
Konstruowanie elektronicznie sterowanych pojazdów to najlepszy sposób na rozpoczęcie zabawy z robotyką. Mechaniczna konstrukcja platformy jest bardzo prosta a do wprawienia pojazdu w ruch wystarczą dwa silniki.
Charakter pojazdu określa sposób kontroli ruchu, do wyboru mamy czujniki odległości, podczerwieni, śledzenie lini, kotnrolę przez bluetooth, dodawanie kolejnych akcesoriów (np. chwytaka) itd. itp…
Co potrzebujesz do zbudowania podstawowego robota-pojazdu:
- Komplet części drewnianych + śrubki i nakrętki do zbudowania ramy pojazdu
- Dwa komplety części drewnianych do skonstruowania koła + odwa ringi 60mm średnicy / 5mm grubości
- Dwa silniki DC z przekładnią 120 obrotów/min
- Płytka prototypowa + kabelki
- Arduino
- Układ scalony typu MOSTEK H – najlepiej L293D
- Czujnik odległości – np. HC-SR04
- Obrotowe kółko do mebli
Pliki do ściągnięcia
Konstrukcja
-
1.Komplet podstawowych części mechanicznych slużących do zbudowania ramy pojazdu -
2. Silniki przykręć do mocowań w ścianach bocznych – UWAGA – do zamocowania użyj jak najkrótszych śrubek (5mm) inaczej zablokujesz przekładnię silnika.
3. Przy pomocy podłużnych elementów połącz i ustabilizuj ściany boczne. Zamontuj koła na trzpieniach silników.-
4. Na wysuniętej do tyłu podstawce zamontuj obrotowe kółko. W przypadku prostych pojazdów konstrukcja 3-kołowa sprawdza się dużo lepiej niż 4-kołowa, pojazd 3-kołowy jest stabilniejszy i ma lepszą przyczepność bo każde z kół stale ma kontakt z podłożem.
W przypadku 4 kół gdy podłoże nie jest idealnie płaskie, pojazd ma tendencję do lekkiego bujania (jak stół, gdy stoi na nierównej podłodze), koła tracą wówczas przyczepność i pojazd jedzie gorzej, szczególnie na zakrętach.
Jako koło obrotowe świetnie sprawdzają się małe kółka do mebli, można je łatwo i tanio kupić w marketach budowlanych. -
5. Do przedniego łącznika zamocuj element z płytką prototypową i Arduino. Pod tylną jego częscią powstanie miejsce, w którym można schować koszyk na baterie.
Montaż koła na trzpieniu silnika DC
Elektronika
Jako napęd pojazdu wykorzystaliśmy silniki na prąd stały. Ich zaletą w stosunku do serwomotorów jest fakt że do ich uruchomienia nie potrzeba elektronicznego sterowania (serwomotory kontrolowane są sygnałem PWM) silnik DC wystarczy podłączyć do źródła zasilania aby zaczął się kręcić. Dzięki temu w najprostszej postaci nasz pojazd nie potrzebuje Arduino, aby jechał jednostajnie do przoby wystarczy poprzez płytkę prototypową podłączyć silniki do baterii tak jak na poniższym schemacie.
W takim układzie pojazd porusza się ale nie mamy na niego żadnego wpływu. Jedyne co możemy zrobić to odwrotnie wpiąć przewody silnika do zasialania, wówczas zacznie się on kręcić w przeciwnym kierunku. Bez manualnej zmiany podłączeń nie mamy jednak możliwości zmiany kierunku jazdy pojazdu ani tym bardziej jego tempa.
Skonstruowanie obwodu elektrycznego, który dynamicznie zamieniać będzie polaryzację silnika ( odwracać bieguny + i – ), czyli zmieniać kierunek jazdy, również nie jest takie proste na szczęście możemy skorzystać z gotowego komponentu, który zapewni nam tę funkcję czyli MOSTKA H a dokładniej jego modelu o nazwie L293D, który ma wbudowane dwa mostki H – czyli może sterować niezależnie dwoma silnikami. Mostek H podłączony do Arduino pozwala na elektroniczne sterowania kierunkiem silnika DC a dodatkowo jeśli do sterowania silnikiem wykorzystamy sygnału PWM możemy płynnie regulować prędkość obrotową silnika, zyskujemy więc w ten sposób pełną kontrolę nad torem jazdy naszego pojazdu.
Poniższy schemat przedstawia podłączenie Arduino – Mostek H – dwa silniki DC. Dodatkowo na schemacie znajduje się czujnik odległości, który wykorzystamy jako “wzrok” naszego robota.
Ostatecznie po zamontowaniu wszyskich części konstrukcyjnych i elementów elektronicznych nasz pojazd wygląda następująco.
Programowanie
Gdy konstrukcja naszego pojazdu jest już gotowa i poprawnie podłączyliśmy wszystkie elementy elektroniczne. Możemy przystąpić do zaprogramowania Arduino tak aby odpowiednio sterował poruszaniem się naszego pojazdu.
Podstawowym mechanizmem, który chcemy opisać jest sterowanie pojazdem zależnie od odległości od najbliższej przeszkody mierzonej przez ultradźwiękowy czujnik odległości.
Program naszego robota możemy podzielić w tym wypadku na takie podstawowe bloki:
1. Pomiar Odległości
2. Sforumłowanie podstawowych funkcji sterujących silnikami (silnik1_przod, silnik2_tyl, silnik1_stop i analogicznie dla silnika nr 2)
3. Określenie algorytmu opisującego ruch pojazdu
1. Pomiar odległości
Użyty czujnik odległości (HC-SR04) to najpopularniejszy czujnik tego typu wykorzystywany do współpracy z Arduino, głównie ze względu na jego niską cenę (ok 10zł), dzięki czemu w sieci znajdziemy mnóstwo przykładów jak go obsługiwać.
Najprostszy przykład kodu do pomiaru odległości wygląda następująco:
int trigPin = 13; int echoPin = 12; long duration, distance; int dist; void setup() { Serial.begin (9600); pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); } void loop() { digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); duration = pulseIn(echoPin, HIGH); distance = (duration/2) / 29.1; Serial.print(distance); Serial.println(" cm"); delay(20); }
Skopiuj powyższy kod do programu Arduino i załaduj na płytkę a następnie otwór monitor portu szeregowego. Powinienneś zobaczyć wyniki pomiaru odległości przez czujnik w pełnym zakresie jego pracy tj. od 2cm do ok 160cm. Wynik pomiaru w powyższym przykładzie reprezentuje zmienna distance.
2. Sterowanie silnikami
Sterowanie silnikami odbywa się poprzez ustawianie odpowiednich pinów mostka H w stanie wysokim lub niskim. W kodzie odpowiadają za to funkcje: silnik1_przod(), silnik1_tył(), silnik1_stop(), oraz analogicznie dla drugiego silnika: silnik2_przod(), silnik2_tył(), silnik2_stop().
3. Algorytm ruchu
Odczytaliśmy już odległość jaka dzieli nasz pojazd od najbliższej przeszkody i jesteśmy w stanie kontrolować ruch jego kół, pora więc powiązać te dwa elementy razem i zaprogramować prosty algorytm, dzięki któremu nasz pojazd będzie w stanie napotkane przeszkody omijać.
Schemat naszego programu wygląda następująco:
- Jeśli nie widzisz żadnej przeszkody (pomiar z czujnika większy/równy 60cm) – jedź do przodu (kręć obydwoma kołami do przodu)
- Jeśli zbliżasz się do przeszkody (pomiar z czujnika mniejszy od 60cm) – skręcaj w lewo (kręć lewym kołem do tyły a prawym do przodu)
- Jeśli przeszkoda znajduje się bardzo blisko (pomiar z czujnika mniejszy od 15cm) – cofaj się (kręć obydwoma kołami do tyłu)
Ostatecznie kod naszego programu wygląda następująco:
int trigPin = 13; int echoPin = 12; int silnik1_1 = 5; int silnik1_2 = 6; int silnik2_1 = 9; int silnik2_2 = 10; int dist; void setup() { pinMode(silnik1_1,OUTPUT); pinMode(silnik1_2,OUTPUT); pinMode(silnik2_1,OUTPUT); pinMode(silnik2_2,OUTPUT); Serial.begin (9600); pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); } void loop() { odleglosc() ; if (dist < 60 ) { silnik1_tyl(); silnik2_przod(); } else { silnik1_przod(); silnik2_przod(); } if (dist < 15) { silnik2_tyl(); silnik1_tyl(); } } void silnik1_przod() { digitalWrite(silnik1_1,HIGH); digitalWrite(silnik1_2,LOW); } void silnik1_tyl() { digitalWrite(silnik1_2,HIGH); digitalWrite(silnik1_1,LOW); } void silnik1_stop() { digitalWrite(silnik1_2,LOW); digitalWrite(silnik1_1,LOW); } void silnik2_przod() { digitalWrite(silnik2_1,HIGH); digitalWrite(silnik2_2,LOW); } void silnik2_tyl() { digitalWrite(silnik2_2,HIGH); digitalWrite(silnik2_1,LOW); } void silnik2_stop() { digitalWrite(silnik2_2,LOW); digitalWrite(silnik2_1,LOW); } void odleglosc() { long duration, distance; digitalWrite(trigPin, LOW); // Added this line delayMicroseconds(2); // Added this line digitalWrite(trigPin, HIGH); delayMicroseconds(10); // Added this line digitalWrite(trigPin, LOW); duration = pulseIn(echoPin, HIGH); distance = (duration/2) / 29.1; Serial.print(distance); Serial.println(" cm"); delay(20); dist = distance; }