Menu Zamknij

Zdalne sterowanie robota

Cel

Nauka ręcznego, zdalnego sterowania robotem, przy pomocy dedykowanego dla micro:bita gamepada.

Wymagania

  • dwa moduły micro:bit,
  • platforma robota AlphaBot2 z nadstawką AlphaBot2 for micro:bit,
  • Waveshare Gamepad for micro:bit.

Wprowadzenie

Poprzedni robot był samodzielny i niezależny. Sposób jazdy oraz reakcję na przeszkody miał zakodowane w wewnętrznym programie. Obecnie skupimy się na zmuszeniu robota do zachowania zadanego zewnętrznymi urządzeniami.

Do zdalnego poruszania robotem, oprócz samej platformy robota AlphaBot2 z zamontowanym modułem micro:bit (rozdział Robot omijający przeszkody), będziemy potrzebowali drugiego micro:bita jako nadajnika. Moduły skomunikujemy radiowo. Pojedynczy micro:bit ma bezpośrednio dostępne jedynie dwa przyciski. Mogłoby to wystarczyć albo można byłoby także wykonać zewnętrzne przyciski, jednak takie rozwiązanie jest nieeleganckie i niewygodne. Dlatego użyjemy rozszerzenia, także od Waveshare, w postaci gamepada z joystickiem i przyciskami. Wybór takiego typu sterowania nie jest obligatoryjny, ale zgodność producenta gamepada z robotem jest pewnym ułatwieniem, bowiem jest on podany jako przykładowy w dokumentacji technicznej robota www.waveshare.com/w/upload/b/b0/Alphabot2_for_microbit_User_Manual_EN.pdf.

Aby sterować robotem w ten sposób, będziemy zmuszeni do napisania dwóch programów – osobnego dla nadajnika i odbiornika, pamiętając przy tym o zapewnieniu wspólnego, takiego samego kanału komunikacji radiowej.

Gamepad

Rysunek 1. Rozmieszczenie głównych komponentów gamepada WaveShare dla BBC Micro Bit

Sam gamepad Waveshare nie jest urządzeniem skomplikowanym. Umożliwia on jedynie dostęp do wyjść złącza stykowego micro:bita w wygodny i elegancki sposób, przez skonfigurowanie sprzętowe dodatkowych przycisków, potencjometrów i brzęczyka. Posiada przy tym własne zasilanie z akumulatora litowo-jonowego.

Rozmieszczenie elementów na płytce gamepada pokazane jest na rysunku 1:

  1. analogowy (!) joystick z przyciskiem,
  2. przyciski A i B,
  3. gniazdo podłączenia modułu micro:bit,
  4. wyłącznik zasilania,
  5. diody sygnalizujące stan zasilania i akumulatora,
  6. buzzer (brzęczyk),
  7. akumulator litowo-jonowy 14 500,
  8. gniazdo zasilania zewnętrznego micro-USB umożliwiające także ładowanie akumulatora,
  9. przyciski C, D, E, F.
Rysunek 2. Opis wyprowadzeń umieszczony z drugiej strony płytki gamepada

Podłączenie elementów gamepada do fizycznych wejść micro:bita znajduje się na tylnej stronie płytki rozszerzenia (rysunek 2). Wszystkie podłączenia są już sprzętowo przygotowane do współpracy z modułem głównym, na przykład przez odpowiednie rezystory podciągające. Można zauważyć, że przyciski A i B dublują działanie analogicznych przycisków micro:bita. Rzeczywistym rozszerzeniem są przyciski C, D, E, F i przycisk joysticka P, podłączone w taki sposób, aby nie kolidować z wyświetlaczem LED. Sygnały X i Y joysticka obsługiwane są przez analogowe wejścia P1 i P2. Buzzer (5), standardowo dla micro:bita, podłączony jest do wyjścia P0, bowiem bloki grupy Music w edytorze MakeCode wykorzystują właśnie to wyjście.

Rysunek 3. Gamepad z podłączonym prawidłowo micro:bitem

Decydując się na ładowanie akumulatora przez układy ładowania gamepada (gniazdo (8)), warto rozważyć zakup droższych akumulatorów, z wbudowanymi zabezpieczeniami przed przeładowaniem i nadmiernym rozładowaniem. Taki zakup jest korzystniejszy i z czasem okazuje się bardziej ekonomiczny nawet przy posiadaniu profesjonalnej ładowarki.

Sprzętowa konfiguracja, oprócz założenia akumulatora, wymaga także prawidłowego, jak na rysunku 3, założenia modułu micro:bit. Niestety niedopatrzeniem projektantów micro:bita jest to, że możliwe jest wpięcie płytki na dwa sposoby w każde przystosowane dla niego gniazdo. Jednak błędne założenie nie powinno doprowadzić do uszkodzenia czegokolwiek, bo czynne styki znajdują się po jednej, przedniej stronie płytki.

Rysunek 4. Grupa bloków WSJoyStick

Aby mieć dostęp do fizycznych komponentów dodatku, musimy dodać odpowiednie bloki do palety. W tym celu, podobnie jak z innymi rozszerzeniami dodajemy go przez Advanced/Extensions i na stronie zarządzania dodatkami w polu wyszukiwania wprowadzamy adres gitowego repozytorium github.com/waveshare/JoyStick. Można także nie ładować dodatków, wykorzystując wiedzę o podłączeniach poszczególnych pinów micro:bita do gamepada, jednak, pomimo niedużej liczby elementów grupy WSJoyStick (rysunek 4), może okazać się to trudne ze względu na konieczność rozumienia fizycznej realizacji połączeń. Schemat modułu oraz bardzo dużą ilość dodatkowych informacji i dokumentacji można znaleźć na stronie producenta www.waveshare.com/joystick-for-micro-bit.htm.

Nadajnik

Rolę nadajnika, składającego się z gamepada i micro:bita, ograniczymy do odczytu danych z analogowego joysticka i wysłania ich drogą radiową. Ponieważ wysyłamy dwie liczby o różnych znaczeniach, wykorzystamy blok radiowy, poznany wcześniej, wysyłający parę (nazwa, wartość).

Listing 1

Nie korzystamy z panelu WSJoyStick (rysunek 4), ponieważ nie zapewnia on obsługi analogowej joysticka. Blok WSJoystick/DIR jest blokiem logicznym umożliwiającym rozpoznanie ośmiu głównych kierunków ruchu. Będziemy zatem odczytywać stan joysticka wprost, przez blok Pins/analog read, na pinach P1 dla osi X i P2 dla osi Y. Następnie wysyłamy go radiowo, dołączając string jednoznakowy X lub Y odpowiednio. Na koniec dodajemy przerwę 50 ms pomagającą w synchronizacji układów nadajnika i odbiornika.

Kalibracja


Odczyt położenia joysticka jest dokonywany 10-bitowym przetwornikiem A/D. Zatem liczba odpowiadająca odczytowi jest z zakresu 0–1023. W tym przypadku skrajne położenia joysticka powinny odpowiadać minimum i maksimum tego zakresu, a położenie neutralne wartości środkowej. W rzeczywistym układzie niekoniecznie tak być musi, dlatego należy przeprowadzić testy działania układu. Programy pomagające w określeniu rzeczywistych wartości przedstawione są na listingach 2 i 3.

Listing 2
Listing 3

Po ich załadowaniu na micro:bita, należy odczytać wartości liczbowe wyświetlane na matrycy LED w skrajnych położeniach joysticka i w jego położeniu neutralnym. Wyniki otrzymane na egzemplarzu autora przedstawione są w tabeli .

PinKierunekWartość LWartość NWartość P
P1X35161022
P2Y35221022
Tabela 1

Można uniknąć problemów związanych z kalibracją joysticka, wprowadzając strefy nieczułości na dokładną wartość odczytów na krańcach przedziałów i w centrum.

Odbiornik

Ponieważ po stronie nadajnika ograniczyliśmy zadania przez niego wykonywane, „całą pracę”, czyli nasłuchiwanie i odbieranie informacji radiowych, przetwarzanie danych i sterowanie silnikami, będzie musiał wykonać odbiornik umieszczony na robocie AlphaBot2. Cały program odbiornika przedstawiony jest na listingu 4.

Listing 4

Zgodnie z poprzednimi zaleceniami ilość zadań wykonywanych w czasie obsługi przerwania, w naszym wypadku wywołanego sygnałem radiowym, ograniczymy do minimum, czyli do odebrania wartości położenie joysticka i zapisania ich w zmiennych X i Y.

Pętla forever wykorzystuje te wartości w celu ustalenia prędkości kół lewego i prawego określonych zmiennymi M1 i M2, przyjmującymi wartości od -255 do 255. Konieczne zatem jest nie tylko przeskalowanie zmiennych, lecz także przesunięcie. Sygnał Y, odpowiadający jeździe do przodu i do tyłu, jednakowo zmienia wartości M1 i M2, aby jednak zapewnił zgodność zakresów, musi być podzielony przez 2. Sygnał X, decydujący o skręcie, przyspiesza jedno z kół, a opóźnia drugie, przy czym dla zachowania lepszej sterowności jest dodatkowo podzielony przez 2, czyli wypadkowo jest czterokrotnie osłabiony. Bez tego dodatkowego dzielenia, robot będzie działał, ale będzie bardzo czuły na skręt, co przy jego dużej prędkości jeżdżenia znacząco utrudnia kierowanie nim. Szereg warunków if zabezpiecza przed przekroczeniem wartości dla silników, co może mieć miejsce podczas skręcania z dużymi prędkościami.

Czujnik ultradźwiękowy

Umieszczony z przodu robota, przypominający oczy, czujnik ultradźwiękowy jest przetwornikiem analogowym. W MakeCode mamy do niego dostęp poprzez blok AlphaBot2/Ultrasonic, który zwraca liczbę całkowitą równą ilości centymetrów od przeszkody. W tym projekcie zaprezentowane zostanie jego użycie w celu dźwiękowego ostrzegania o bliskości obiektów.

Listing 5

Fragment kodu odpowiedzialnego za dźwiękowe ostrzeganie o zbliżającej się przeszkodzie, wkomponowany w blok forever, zaprezentowano na listingu 5. W prezentowanym programie odległość jest przeskalowana na wysokość wydawanego tonu.

Modyfikacje

Wykorzystanie samego gamepada daje bardzo dużo możliwości ze względu na ogólny charakter tego dodatku. Warto wspomnieć o pominiętej w tym skrypcie grupie Advanced/Games, w której zapalanie diod na matrycy LED micro:bita powiązane jest z powołaniem do życia „duszka”, czyli w micro:bitowej terminologii sprite’a. Z duszkiem, dodatkowo, w stosunku do zwykłego świecenia diody, możliwe jest skojarzenie pewnych zdarzeń, umożliwiających pisanie bardzo prostych gier. Udostępnione są też bloki punktacji i powiadamiania o stanie gry. Posiadając tylko dwa przyciski micro:bita, mamy ograniczone możliwości sterowania sprite’ami. Dodanie gamepada zwiększa te możliwości bez rezygnowania z kompaktowego charakteru urządzenia.

Modyfikacje zdalnego sterowania rozpoczniemy od poprawienia programu odbiornika 4 tak, aby był bardziej przenośny, to znaczy odporny na wymianę elementów. Po pierwsze w kodzie pojawiają się w wielu miejscach stałe, wprost napisane liczby 516 i 522, charakterystyczne dla danego urządzenia. Ogólnie przyjęte zalecenia programistyczne nakazują w takim przypadku na zdefiniowanie odpowiednich stałych. Pozwala to, w przypadku wykorzystania innego egzemplarza gamepada, na zmianę jedynie tych stałych, a nie wyszukiwanie ich w kodzie. Niestety w MakeCode nie ma możliwości definiowania stałych, można jednak określić zmienne w bloku On start i traktować je jak stałe.

Jeszcze lepszą przenośność zapewni wprowadzenie nieczułości układu na sygnały joysticka w pobliżu neutralnego jego położenia. Wymaga to modyfikacji odbiornika, poprzez uwzględnienie dodatkowych warunków. Programy należy zawsze pisać, o ile to możliwe, tak, aby działały niezależnie od użytych rozwiązań sprzętowych.

Modyfikacji w programie odbiornika, z dodanym kodem 5, wymaga zmiany reakcji na ultradźwięki. Opóźnia ona reakcję całego układu obsługą wyjścia dźwiękowego. Nie poruszaliśmy zagadnień, możliwych do zaimplementowania, a związanych z wielowątkowością, dlatego lepiej inaczej reagować na sygnały z czujnika ultradźwiękowego, można na przykład wykorzystać buforowaną matrycę LED lub odesłać radiowo wiadomość do nadajnika i tam obsłużyć w dowolny sposób tę informację. Można też wykorzystać robota do zdalnego mierzenia odległości. Wówczas podjeżdżamy do przeszkody, wciskamy pomiar, obsługujemy czujnik ultradźwiękowy jednokrotnie i wysyłamy dane radiowo do nadajnika. Pozostaje wyświetlić wynik pomiaru na matrycy LED.

Zgromadzona wiedza z ostatnich dwóch rozdziałów pozwala na tworzenie bardzo złożonych i ciekawych projektów związanych z poruszaniem dwukołowego robota. Najprostszym pomysłem jest połączenia zdalnego, ręcznego sterowania, z reakcją na czujniki, na przykaład uniemożliwiając sterowanemu z gamepada robotowi zderzenie z przeszkodą.

Ponadto do wykorzystania pozostają także inne czujniki, na których sygnały może reagować robot. Kompas wbudowany w micro:bita może pozwolić robotowi na orientację w kierunkach w przestrzeni, przez co można zmusić go do podążania po prostej lub do precyzyjnej zmiany kierunku ruchu, co jest niezwykle trudne nawet dla robota wyposażonego w enkodery na kołach. Akcelerometr może pozwolić robotowi na orientację przy podjeżdżaniu pod górę lub zjeżdżaniu z niej. Sam moduł radiowy oprócz wymiany informacji pozwala na pomiar siły sygnału radiowego na danym kanale. Można w tym przypadku zaprogramować robota szukającego źródła sygnału.

Dzięki temu, że micro:bit, przy zastosowaniu odpowiednich rozszerzeń, może obsługiwać komunikację Bluetooth, można sterować robotem z telefonu komórkowego, co jest dokładnie opisane w instrukcji robota AlphaBot2.

Największą wadą platformy AlphaBot2 współpracującej z micro:bitem jest brak dostępu do wolnych wejść tego modułu. Uniemożliwia to rozbudowę projektu o nowe czujniki czy elementy wykonawcze. Chcąc zwiększyć funkcjonalność robota, musimy zdecydować się na inną platformę systemu wbudowanego, na przykład Arduino lub Raspberry Pi. Jest to możliwe po zastosowaniu innej nakładki na robota, bowiem AlphaBot2 współpracuje ze wszystkimi popularnymi modułami.

Literatura

Powtórzenie zaprezentowanych projektów nie wymaga studiowania dodatkowej literatury. Dopiero wprowadzenie modyfikacji może wiązać się z koniecznością uzupełnienia wiedzy. Najlepszym źródłem informacji w przypadku jakiegoś konkretnego problemu jest internet. Książka pisana swoją wyższość ukazuje dopiero jako podręcznik czy przewodnik.

Informacje bibliograficzne dotyczące źródeł internetowych zamieściłem bezpośrednio w tekście, przy zagadnieniach, których dotyczą.

Do zapisu linków, tylko w tym spisie, wykorzystywana jest metoda skracania adresów (URL shortening). W tym skrypcie wybrano serwis TinyURL. Dostęp do wszystkich internetowych zasobów został przetestowany 27.02.2020.

Bibliografia zawiera tylko materiały pomocnicze do projektów, których dotyczą, a pominięto literaturę o charakterze ogólnoinformatycznym. Dobór materiałów do nauki kodowania, czy obsługi programów narzędziowych, pozostaje po stronie nauczyciela.

Literatury dotyczącej micro:bita jest niewiele, szczególnie w stosunku do najbardziej popularnych systemów wbudowanych. Nie można liczyć niestety na wiele informacji w języku polskim. Najbardziej godne polecenia, gromadzące także dużo społeczności są strony oficjalnego wsparcia:

oraz

Literatura uzupełniająca

W niektórych projektach nie wszystko da się podłączyć za pomocą pasujących do siebie wtyków i złącz. Należy wówczas wykonać takie podłączenia samodzielnie. Wymaga to nieco umiejętności majsterkowania i elektroniki. Bardzo ciekawą książką dla początkujących majsterkowiczów jest:

  • Roberts Dustyn, Wpraw to w ruch. Proste mechanizmy dla wynalazców, majsterkowiczów i artystów [e-book], tłum. Krzysztof Sawka, Helion, 2015.

Znajdziemy w niej oprócz podstaw elektroniki także dużo elementarnej mechaniki i materiałoznawstwa.

Majsterkowanie z użyciem systemów wbudowanych, tam gdzie nie wszystko pasuje do siebie za pomocą dedykowanych styków, wymaga elementarnej wiedzy z elektroniki. Niezmiennie najważniejszą książką na półce elektronika jest:

  • Horowitz Paul, Hill Winfield, Sztuka elektroniki, tłum. Bogusław Kalinowski, Grażyna Kalinowska, t. 1–2, wyd. 12 zmienione, WKŁ, Warszawa 2018.

Jednakże jest to pozycja dla wymagającego czytelnika. Podobnym standardem, ale skierowanym do początkujących jest:

  • Platt Charles, Elektronika. Od praktyki do teorii. Wydanie II [e-book], tłum. Konrad Matuk, Helion, 2016.

Na uwagę zasługuje ponadto, w moim przekonaniu bardzo dobra, książka polskiego autora:

  • Górecki Piotr, Wyprawy w świat elektroniki, t. 1, WKŁ, Warszawa 2006.
  • Górecki Piotr, Wyprawy w świat elektroniki. Wyższy stopień wtajemniczenia, t. 2, WKŁ, Warszawa 2011.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *