Jakiś czas temu zostałem poproszony o recenzję Kursu arduino od podstaw. Autor, Tomasz Kubisztal, na kolejnych filmach video pokazuje i omawia programy obsługujące wyświetlacze, czujniki itp., by na koniec zbudować jeżdżącego robota, który omija przeszkody. Zabawka spodobała mi się na tyle, że postanowiłem zbudować podobną. Na początku nieco odstraszyła mnie wartość poszczególnych modułów – według opisu – 250zł. Sprawdziłem ceny części na ebayu i stwierdziłem, że da się taniej. Dużo taniej.
Robot z kursu arduino składa się z 4 modułów, które bez problemu można kupić u chińskich sprzedawców. Jak kupować na ebayu, pisałem tutaj: Tanie zakupy w Chinach.
Części składowe to:
Całość kosztowała 93,66zł, czyli dużo mniej w porównaniu z gotowym robotem za 250zł, którego moduły były pewnie kupowane w polskich sklepach. Kupiłem też inny (tańszy) moduł do sterowania silnikami, ale w tym projekcie jest to bez naczenia. Wadą zakupów na drugim końcu świata jest oczywiście czas dostawy – relacjonowałem to na facebooku, google+ i twitterze.
Mając wszystkie moduły, zacząłem składać je w całość. Prace można podzielić na dwie grupy – montaż mechaniki i odpowiednie połączenia elektryczne modułów. Zacząłem od skręcania platformy. Na początek usunąłem wszystkie ochronne papierki, które przeciwdziałają zarysowaniu części podczas transportu. Przed przykręceniem silników do platformy, przylutowałem do nich kabelki, zakończone goldpinami dodatkowo zaizolowanymi koszulkami termokurczliwymi. Przykręcając metalowe płytki do przekładni, należy zrobić to z wyczuciem, tak by nie odkształcić plastikowej obudowy, co może blokować wewnętrzy mechanizm. Tylne kółko skrętne montuje się za pośrednictwem gwintowanych tulejek dystansowych. Moje złożone podwozie wygląda tak:
Do platformy trzeba przykręcić Arduino Uno z płytką Motor Shield, podpiąć ultradźwiękowy czujnik odległości i zamontować baterie. Ja najpierw jednak zmodyfikowałem program z Kursu Arduino, adaptując go do swojej bazy sprzętowej i zrobiłem testy z podpiętymi prowizorycznie modułami.
Już na tym etapie napotkałem kilka problemów. Chińskie Arduino Uno nie chciało poprawnie sterować układem L298D na płytce Motor Shield. Okazało się, że winne są zimne luty na gniazdach goldpinów, punkty lutownicze w ogóle nie trzymały się padów na laminacie. Trzeba było odessać starą cynę, miejsca lutowania posmarować pastą i na nowo zlutować. Kolejny problem to błędne sterowanie jednym z silników – tu również winne były zimne luty, tym razem na układzie L298D. Wystarczyła odrobina pasty lutowniczej i rozgrzany grot, by wszystko wróciło do normy. Moduły były naprawdę tanie, więc nie byłem zbytnio zdziwiony napotkanymi usterkami, a przy ich usuwaniu dogłębnie analizowałem kod programu i schemat elektryczny, ucząc się czegoś nowego.
Po testach “prowizorki”, przyszedł czas na właściwy montaż. Podobnie jak w Kursie, zdecydowałem się na zastosowanie dodatkowej platformy, do której przykręciłem Arduino UNO złożone w kanapkę z Motor Shield. Wykorzystałem plastikową płytkę i śruby M3x30. Zamiast typowych baterii AA w koszyczku, wykorzystałem ogniwa Li-Ion ze starej baterii z laptopa w konfiguracji 2p2s, przytwierdzone trytką do platformy.
Z przodu przykręciłem plastikowy kątownik, do którego przymocowałem ultradźwiękowy czujnik za pomocą piankowej taśmy dwustrunnej. Nie przyklejałem płytki czujnika, a obudowy konektorów kabelków.
Do podłączenia jest w sumie 10 kabelków, wszystkie do płytki Motor Shield. Zasilanie z akumulatorków, około 8V doprowadziłem do złącza śrubowego Vin i GND – jest ono używane do zasilania silników i poprzez stabilizator pozostałą elektronikę. Można też wpiąć te kabelki do gniazd na goldpiny – Vin i GND w części POWER, jednak złącza śrubowe wydają się solidniejsze. Zasilanie prawego silnika podłączyłem do punktów A+ i A-, lewego do B+ i B-. Jeśli okaże się, że zamiast do przodu robot kręci się wokół własnej osi, wystarczy zamienić miejscami kabelki silnika (odwrócić polaryzację) lub zmienić kierunek obrotów w kodzie. Zasilanie czujnika HC-SR04 trzeba dołączyć do +5V i GND, ECHO do 4 pinu, TRIG do 7. To również można zmienić w kodzie. Wszystkie połączenia można zobaczyć na zdjęciu:
Całość tworzy całkiem zwartą konstrukcję, która bez szwanku wytrzymuje zderzenia ze ścianą, co nie raz sprawdziłem :).
Nigdy wcześniej nie programowałem Arduino, więc poszedłem na łatwiznę i wykorzystałem kod jeżdzącego robota z Kursu. Musiałem go nieco zmodyfikować z uwagi inny Motor Shield, wymagający odmiennego sterowania. Żeby nie było zbyt łatwo, zamiast biblioteki NewPing, użyłem bliźniaczej HCSR04Ultrasonic. Kod wygląda tak:
/* ********** Jezdzaca platforma - robot na arduino ********* */#include <Ultrasonic.h> // definicje dla HCSR04 #define TRIGGER_PIN 7 #define ECHO_PIN 4 Ultrasonic ultrasonic(TRIGGER_PIN, ECHO_PIN); // silnik lewy const int kierunekLewy=12; const int hamulecLewy=9; const int predkoscLewy=3; //silnik prawy const int kierunekPrawy=13; const int hamulecPrawy=8; const int predkoscPrawy=11; //ustawienia void setup() { Serial.begin(9600); pinMode(kierunekLewy,OUTPUT); pinMode(kierunekPrawy,OUTPUT); pinMode(hamulecLewy,OUTPUT); pinMode(hamulecPrawy,OUTPUT); pinMode(predkoscLewy,OUTPUT); pinMode(predkoscPrawy,OUTPUT); } //petla glowna programu void loop() { float cmMsec; long microsec = ultrasonic.timing(); cmMsec = ultrasonic.convert(microsec, Ultrasonic::CM); //Serial.print("CM: "); //Serial.print(cmMsec); doPrzodu(); delay(50); if (cmMsec<=30) { doTylu(); delay(500); } } void doPrzodu() { analogWrite(predkoscLewy,100); analogWrite(predkoscPrawy,105); //Lewy do przodu digitalWrite(kierunekLewy,HIGH); digitalWrite(hamulecLewy,LOW); //Prawy do przodu digitalWrite(kierunekPrawy,HIGH); digitalWrite(hamulecPrawy,LOW); } void doTylu() { analogWrite(predkoscLewy,200); analogWrite(predkoscPrawy,0); //Lewy do przodu digitalWrite(kierunekLewy,LOW); digitalWrite(hamulecLewy,LOW); //Prawy stop digitalWrite(kierunekPrawy,HIGH); digitalWrite(hamulecPrawy,HIGH); }
UWAGA! Arduino podłączone do komputera za pomocą kabelka USB musi mieć odłączoną baterię!.
Nie będę tu dokładnie opisywał co jak działa, w skrócie – główna pętla zaczyna się od pobrania z czujnika odległości, następnie następuje wywołanie podprogramu doPrzodu na 50 milisekund, następnie sprawdzany jest warunek czy zmierzona odległość to równo lub mniej niż 30cm, jeśli tak, następuje skok do doTylu, gdzie lewy silnik kręci się do tyłu przez 500ms a prawy stoi – robot cofa i skręca. Jeśli odległość jest większa niż 30cm, robot jedzie do przodu. W praktyce wygląda to tak:
Jeśli przeszkoda jest na wprost czujnika – robot wykrywa ją, cofa z obrotem i jedzie na wprost. Gorzej jeśli przedmiot czy ściana nie znajdują się prostopadle – wtedy często następuje kraksa. Kod jest bardzo prosty i można, a nawet trzeba nieco na nim poeksperymentować i ulepszyć.
Mój robot kosztował ~100zł, czy można go zbudować jeszcze taniej? Pewnie tak, samemu budując platformę, a Arduino zastępując choćby atmegą 8 i tranzystorowym mostkiem H. W takim rozwiązaniu warto wykorzystać gotowy czujnik HC-SR04, który kosztuje ok. 4zł.
Mega tanie, bezprzewodowe moduły Internet of Things na dobre zadomowiły się w naszych sieciach. Od…
Pewnie nie każdy posiadacz tytułowej stacji lutowniczej wie, że posiada ona możliwość aktualizacji firmware'u. Producent…
Jakiś czas temu, przeglądając Aliexpress natknąłem się na ciekawy shield do Arduino Nano. Według opisu…
W mailach i komentarzach kilka razy przewijała się prośba o ten wpis. Chodzi o aktualizację…
Dziś tematyka audio, a nawet audiofilska. Uznany wzmacniacz słuchawkowy Lehmann Black Cube Linear o dość…
Tradycyjnie w styczniu, publikuję podsumowanie minionego roku na stronie grylewicz.pl. Poniżej trochę liczb, lista najpopularniejszych…
Zobacz komentarze
Czemu twojego robota trochę ciągnie na bok?
Wynika to z niedoskonałości przekładni. Koryguje się to w linijkach analogWrite(predkoscLewy,100);
i
analogWrite(predkoscPrawy,105);
podając różne współczynniki wypełnienia, tak by robot jechał prosto.
Też chciałem kupić ta platformę i w zasadzie to samo napisać :D Pozdrawiam :)
No to masz gotowca, skopiuj i gotowe :) Śledze opisy Twoich zabawek, bo chętnie bym sklecił coś latającego :)
A mógłbym się dowiedzieć gdzie za taką cenę kupić sterownik?
Sterownik czyli?
A i czy ktoś by pomógł mi nanieść na to ustawienia pod czujnik US-015 2-400cm.