Robot

Arduino, płytka łącząca świat elektroniki z komputerami, którą bawiłem się w zeszłym roku, od pewnego czasu zbierała kurz w kącie. Chodził mi co prawda po głowie pewien pomysł, ale jakoś ciężko było mi się zebrać za jego realizację. Do czasu. Przyszedł styczniowy długi weekend (pierwszy w tym roku) i postanowiłem: buduję robota. Powstała całkiem fajna maszynka. Daje się sterować z komórki, a ponadto posiada kamerę, dzięki której wyświetla eksplorowane miejsca. Z czego się to ustrojstwo składa?

2 komórki z Androidem – klient, sterownik

W szafce, niedaleko Arduino, kurzyła się również stara komórka z Androidem: HTC Magic. Na codzień używam Motoroli Defy, również z Androidem. Postanowiłem wykorzystać oba urządzenia. Nowsza Motorola spełnia rolę klienta do obsługi robota. Wyświetla mi ona obraz z kamerki HTC i pozwala na sterowanie (do przodu, do tyłu, obrót w lewo i w prawo). Starszy HTC odbiera komendy i przesyła je (po kablu) do Arduino, które jest podłączone do silników.

Połączenie między komórkami leci po wi-fi, komunikacja odbywa się za pomocą dwóch programów: RobotController i RobotServer. HTC Magic podłączony jest do Arduino szeregowo, wg. przepisu z tej strony. Ostatecznie wymagane jest podłączenie dwóch kabli za pośrednictwem jednego scalaka (74LS04), wartego 80 groszy 🙂 Pewnym problemem może być zdobycie wtyczki ExtUSB – ja kupiłem na Allegro zaawansowane urządzenie o nazwie HTC YC A100, po czym urżnąłem wtyczkę. Podobno można też wykorzystać tę od oryginalnych słuchawek HTC. Należy wykorzystać kabel żółty (TX0, u mnie nr 9, inaczej niż w opisie) i czerwony (nr 7, uziemienie). Jeśli są dwa żółte i dwa czerwone, to bierzemy te, które nie siedzą w metalowej folii. Po wykonaniu kabla, można przesyłać komendy do Arduino za pomocą Androidowego urządzenia /dev/ttyMSM2 (prędkość 9600). Aha – na Androida trzeba wgrać alternatywny soft, polecam CyanogenMod.

Konsola sterowania robotem

Osoby niezainteresowane programowanie tę sekcję mogą z czystym sumieniem pominąć 🙂

RobotServer spełnia rolę prostego przekaźnika – wszystko, co dostanie na port UDP 9999 kieruje do /dev/ttyMSM2. Tam z kolei czeka już sterownik Arduino, który przyjmuje komendy ASCII postaci APPVVV (ustaw wartość PWM pinu PP na VVV, np. A05255) i DPPS (ustaw cyfrową wartość pinu PP na S, gdzie S to 1 lub 0). W ten sposób można ustawić stan dowolnego pinu za pośrednictwem sieci. Logika związana ze sterowaniem odbywa się po stronie klienta – to on musi wiedzieć, że aby np. obrócić się w lewo, lewa gąsienica musi jechać do tyłu, a prawa do przodu. Odpowiada za to klasa Robot. Klasa ta pozwala również na bardziej subtelne sterowanie gąsienicami dzięki funkcji move(double x, double y). Oba parametry przyjmują wartości -1 do 1, pierwszy odpowiada za ruch do przodu i do tyłu, a drugi za obroty. Tak więc np. move(0.7, 0.1) sprawi, że robot będzie jechał do przodu, lekko skręcając w prawo.

Oprócz tego RobotServer nasłuchuje na porcie UDP 9998 na wiadomość register i jeśli ją otrzyma, to na port UDP 9990 nadawcy wysyłany jest ciąg JPG-ów z kamerki. Można to przerwać, wysyłając komunikat unregister.

Podwozie i napęd

Robot musi się jakoś poruszać. Potrzebne są co najmniej dwa silniki (jeden z lewej, drugi z prawej strony) i jakieś podwozie, do którego silniki będą przymocowane. Postanowiłem iść na łatwiznę i kupić gotowe podwozie, korzystając z oferty sklepu Trobot. Kupiłem eleganckie, żółte podwozie z dwiema gąsienicami. Do podwozia dodawany jest pojemnik na baterie (bagatela, 6 paluszków AA), więc problem zasilania mamy również z głowy.

Sterowanie silnikami

Silnikami powinna oczywiście sterował płytka Arduino, jednak posiada ona jedynie zestaw wyjść cyfrowych, nieprzystosowanych do obsługi silników elektrycznych. Potrzeba więc kolejnego modułu, który na podstawie sygnałów pochodzących z Arduino będzie dostarczać silnikom odpowiednie napięcie. Popularny moduł nazywa się motor shield i był to niestety kolejny wydatek (na szczęście już ostatni). Motor shield nakłada się bezpośrednio na płytkę z Arduino, która w ten sposób wzbogaca się o 4 eleganckie zaciski do kabli silników (i 2 zaciski do kabli zasilania). Motor shield konfiguruje się za pomocą zworek, wszystko jest opisane na wiki. Zasilanie podłączyłem do wejść Arduino Vin i Ground.

Diodka

Jako wisienkę na torcie umieściłem na nim 3-kolorową diodę LED, którą również można zaświecić zdalnie. Podłączyłem ją do PIN-ów 9, 10 i 11.

I gotowe 🙂

Po zmontowaniu wszystkiego razem, za pomocą odpowiedniej ilości gumek recepturek, robot działa. Można nim jeździć, omijać przeszkody (gąsienice radzą sobie całkiem nieźle) i obserwować teren. Pracę podzieliłem na kilka etapów: 1) robot jeździ, 2) daje się sterować zdalnie z komputera, 3) daje się sterować zdalnie z drugiej komórki, 4) przesyła obraz. W sumie poszło gładko, a zakończenie każdego etapu dawało motywację do rozpoczęcia kolejnego 🙂 Całość zajęła 3 dni. Nie pamiętam, kiedy ostatni raz tak dobrze się bawiłem 🙂

Wszystkie powstałe sterowniki wrzuciłem na swojego githuba. Nie daję na nie żadnej gwarancji, u mnie mniej-więcej działają, więc może przydadzą się komuś jeszcze.

8 myśli nt. „Robot

  1. Jarek

    wypasik. też mam w planach taką konstrukcję – tyle, że opartą na starym tablecie Nokia N800 (leży gdzieś w szafie 🙂 dodatkowo zamiast kodować część serwerową w Javie, machnę ją w Pythonie!

  2. sherril

    Myślę, że wiele z powyższych wypowiedzi są trafne. Z częścią się nie zgadzam, ale wynika to raczej z moich osobistych przekonań, aniżeli samej treści wypowiedzi.

  3. demoura

    Proponuję niektórym więcej rozwagi. Czasami warto przemyśleć niektóre kwestie, zanim podejmie się odpowiednie działania.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *