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.

10 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 e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *