Cel
Zapoznanie z metodami dostępu do czujników i elementów wykonawczych gotowej platformy robota AlphaBot2.
Wymagania
- moduł micro:bit
- platforma robota Waveshare AlphaBot2 z nadstawką AlphaBot2 for micro:bit
Roboty modelarskie
Młodzieży szkolnej terminy o bardzo szerokim znaczeniu kojarzą się przeważnie bardzo jednoznacznie, na przykład: programowanie – gra, robotyka – robot. Pomimo że skojarzenia te są bardzo logiczne i poprawne, to jednak prowadzą do frustracji ze względu na to, że możliwości uczniowskie napisania gry czy zrobienia robota znacząco odbiegają od wyobrażeń. Okazuje się bowiem, że spowodowanie, by robot „szedł” po linii prostej jest bardzo złożonym zagadnieniem. Wszystko jednak zależy od zastosowanych, gotowych rozwiązań, zarówno pod względem sprzętowym, jak i programowym.

W internetowych sklepach robotyki jest ogrom elementów składowych dla konstruktorów, od elementarnych czujników, po całe platformy robotów. Bardzo popularne, traktowane jako uniwersalny punkt wyjścia, są różnego rodzaju podwozia (rysunek 1). Sprzedawane są w postaci płyty z tworzywa sztucznego w odpowiednim kształcie i z otworami pozwalającymi na montaż dodatkowych elementów. Podwozia takie najczęściej posiadają silniki DC (na prąd stały) z enkoderami (czujnikami położenia wałka) i przystosowane do nich koła napędowe oraz odpowiednie podpory (jak na przykaład na rysunku 1 przednie, bierne kółko prowadzące). Niektóre elementy robota z rysunku 1 zakupione są osobno i nie stanowią przeważnie kompletu z podwoziem: moduł mikrokontrolera, uchwyt na baterie czy czujnik ultradźwiękowy odległości, który nadaje robotom wygląd naśladujący oczy.
Zdecydowana większość robotów jeżdżących wyposażona jest w dwa koła napędowe, każde z nich wyposażone w swój własny, niezależny silnik. Takie rozwiązanie daje robotowi bardzo dużą zwrotność, upraszczając sterowanie ze względu na brak układu kierowniczego i eliminując konieczność stosowania układu różnicowego.
Platforma AlphaBot2
Jeszcze prostszym rozwiązaniem niż konstrukcja robota na gotowym podwoziu jest zakup całej platformy robota z zamontowanymi już potrzebnymi elementami. Czasami platformy takie występują wraz z wbudowanym mikrokontrolerem, niektóre zaś wymagają dokupienia elementów pośredniczących pozwalających na samodzielny dobór modułu sterującego (na przykład micro:bit). Po stronie użytkownika pozostaje jedynie zaprogramowanie robota. Rozwiązanie takie pomimo ewidentnej prostoty jest jednak mało elastyczne. W większości przypadków rozbudowanie projektu przez zwiększenie jego funkcjonalności dodatkowymi czujnikami czy elementami wykonawczymi będzie bardzo trudne, jeżeli nie niemożliwe.

Przykładem uniwersalnej platformy robota, z której będziemy korzystać w tym rozdziale, jest AlphaBot2, której producentem jest, znany nam już z wyświetlacza LCD (rozdział Wizytówka), Waveshare. Na AlphaBot2 składa się okrągła (średnicy 110 mm) płytka bazowa z czujnikami, silnikami i gumowymi kołami 42 mm oraz nadstawka – płytka tej samej średnicy, umieszczona równolegle nad bazą, stanowiąca interfejs do podłączenia modułu sterującego (rysunek 2).
Sam AlphaBot2 nie może zostać zaprogramowany. Musi mieć dołączony programowalny moduł. Na rysunku 2 jest to micro:bit. AlphaBot2 daje możliwość podłączenia wielu popularnych platform, za każdym razem wykorzystując inną „górną” płytkę.
AlphaBot2 posiada bardzo dobrą i obszerną dokumentację. Dla platformy tego robota została stworzona osobna instrukcja specjalnie dla użytkowników micro:bita: www.waveshare.com/w/upload/b/b0/Alphabot2_for_microbit_User_Manual_EN.pdf. Oprócz opisu wykorzystania fizycznych komponentów płyty bazowej znajdziemy tam także podstawy programowania micro:bita w języku Blocks.
Baza AlphaBot2
Od komponentów zainstalowanych na płytce Waveshare AlphaBot2-Base zależeć będą możliwości robota na niej skonstruowanego. Rysunek 3 prezentuje elementy umieszczone na płytce bazowej AlphaBot2:
- gniazdo przyłączeniowe nadstawki,
- silniki DC z przekładniami i zamontowanymi kołami napędowymi,
- uchwyt na baterie,
- wskaźnik zasilania – dioda LED,
- dwa czujniki zbliżeniowe na podczerwień,
- ultradźwiękowy czujnik/miernik odległości,
- wyłącznik zasilania,
- czujniki odbiciowe na podczerwień dla śledzenia linii wraz z dwoma potencjometrami kalibracyjnymi,
- cztery diody LED RGB.


Wyłącznikiem (7) wyłączamy zasilanie nie tylko na płytce bazowej, lecz także na nadstawce przyłączonej do gniazda (1). Włączenie zasilania sygnalizowane jest diodą (4). Do zasilania modułu, niestety, wymagane są dosyć niestandardowe w zastosowaniach domowych, ale nierzadkie w profesjonalnych aplikacjach, ogniwa litowo-jonowe 3,7 V typu 14 500. W zamian dostajemy za to bardzo długi czas pracy robota. Do ładowania takich akumulatorów konieczne jest zastosowanie specjalnej ładowarki. Warto przy tym rozważyć zakup droższych ogniw z wbudowanymi zabezpieczeniami przed przeładowaniem oraz nadmiernym rozładowaniem.
Czujniki zbliżeniowe na podczerwień (5) są cyfrowe i działają, niezależnie od podłączonego do gniazda (1) modułu, od momentu włączenia zasilania (7). Ich stan można obserwować za pomocą zielonych diod LED przy nich umieszczonych.
Diody (9) są diodami RGB, co oznacza, że w ich pojedynczej strukturze w rzeczywistości znajdują się trzy diody LED – czerwona, zielona i niebieska. Takie diody mogą na zasadzie mieszania barw świecić w dowolnym kolorze. Ich rola w robocie jest jedynie dekoracyjna. Dostęp do nich w edytorze MakeCode uzyskujemy poprzez załadowanie dodatku (Extensions) Neopixel dostępnego na pierwszej stronie zarządzania rozszerzeniami.
Nadstawka AlphaBot2 for micro:bit
Do podłączenia do płytki bazowej AlphaBot2-Base modułu micro:bit potrzebna będzie odpowiednia płytka pośrednia. Jej pełna nazwa to AlphaBot2 for micro:bit, a jej wierzchnia strona jest widoczna na rysunku 4. Jej jedynym zadaniem jest umożliwienie stabilnego podłączenie micro:bita do płytki bazowej robota. W tym celu na nadstawce znajduje się gniazdo, widoczne na rysunku 4, pasujące do złącza stykowego micro:bita, a od dołu, niewidoczne na rysunku, gniazdo, przez które odpowiednią wiązką przewodów można podłączyć się do gniazda (1) z rysunku 3. Jedynym dodatkowym elementem nadstawki jest buzzer (brzęczyk) podłączony przez wzmacniacz do pinu P0 micro:bita.
Pełna instrukcja montażu AlphaBot2 for micro:bit do AlphaBot2-Base znajduje się w dokumencie www.waveshare.com/w/upload/0/0e/AlphaBot2-microbit-assembly-diagram-en.pdf.
Programowanie robota

Ponieważ całe zadanie konstrukcyjne wymaga jedynie przykręcenia i podłączenia nadstawki do płytki bazowej AlphaBot2 oraz włożenia micro:bita w odpowiednie gniazdo, pozostaje jedynie oprogramowanie robota. Wykorzystanie fizycznych elementów robota będzie możliwe, gdy dostępne będą odpowiednie bloki w palecie komponentów edytora MakeCode. Postępujemy w tym przypadku identycznie jak z innymi dodatkami, co już wielokrotnie było opisane w poprzednich rozdziałach. Wybieramy z palety Advanced/Extensions i w polu wyszukiwania wpisujemy adres repozytorium github.com/waveshare/pxt-AlphaBot2. Po załadowaniu dodatku w palecie pojawią się bloki pozwalające na sterowanie robotem (rysunek 5).
Robot w ruchu
Wprawienie robota w ruch jest stosunkowo proste. Podstawowym blokiem sterującym silnikami jest AlphaBot2/Motor pozwalający na ustalenie, który silnik i z jaką prędkością ma się poruszać. Prędkość w jednostkach umownych można wybrać z zakresu od -255 do 255, przy czym prędkość 0 oznacza wyłączenie silnika, a prędkości ujemne oznaczają obroty wstecz. Równe prędkości na obu kołach oznaczają jazdę „po prostej”, różne jazdę po łuku, a prędkości równe, ale o przeciwnych znakach oznaczają obrót w miejscu. Zapis wartości prędkości blokiem Motor jest buforowany do czasu zmiany jego wartości.
Największą wadą tej platformy jest brak sprzężonego z kołem enkodera – kółka z nacięciami umożliwiającymi dokładne określenie kąta, o jaki obróciło się koło. Podczas zmiany kierunku jazdy, w celu określenia kąta skrętu jesteśmy zdani na kontrolę prędkości obrotowej kół oraz czasu jej trwania. Jest to jeden z najmniej dokładnych sposobów zadawania toru. Twórcy platformy zdecydowali, że robot ten będzie w czasie ruchu posługiwał się wbudowanymi czujnikami i zrezygnowali z trudnych w obsłudze enkoderów. Znaczną poprawę w kontroli kierunku ruchu zaawansowany programista może osiągnąć za pomocą wbudowanego w micro:bit kompasu.

Program 1 demonstruje działanie bloku Motor. Silnik M1 odnosi się do koła lewego, a M2 do prawego. Możliwość sterowania niezależnie każdym silnikiem umożliwia dowolne zaplanowanie trasy na równej powierzchni. Zamiast uporczywego wprowadzania odpowiedniego bloku Motor i wstrzymywania wykonania programu blokiem pause w programie zdefiniowana została trójparametrowa funkcja jedź(lewe_koło, prawe_koło, czas). Jej działanie jest oczywiste: parametry lewe_koło i prawe_koło określają prędkość obrotową (speed) właściwego silnika, a parametr czas określa w milisekundach, ile ma trwać dany stan ruchu. W bloku forever wyraźnie widać efektywność wykorzystania funkcji w tym przykładzie, skrócenie kodu i zwiększenie czytelności programu. Bezparametrowa funkcja stop() zatrzymuje silniki poprzez uruchomienie na każdym z nich bloku Motor z zerową prędkością.
Robot z listingu 1 jedzie przez jedną sekundę do przodu, potem zakręca w prawo (obraca się lewe koło) i następnie obraca się w prawo w miejscu. Potem zatrzymuje się i czeka dwie sekundy, po czym powraca do początku wykonania programu.
UWAGA!!!: „Ślepy” robot jadący z prędkością 255 do przodu jest dość szybki i z pewnością nie jest dla niego w takim przypadku obojętne zderzenie z twardymi przedmiotami czy ścianami. Należy unikać, jeżeli nie jest się do końca przekonanym o torze, po jakim będzie poruszał się robot, poruszania nim z dużymi prędkościami, tym bardziej, że trajektorię zadajemy, określając czas trwania ruchu, co jest dosyć nieprecyzyjne. Nie tylko uderzenie może być niebezpieczne dla robota, lecz także „pchanie” ciężkiego lub unieruchomionego obiektu, bowiem, ze względu na dobrą przyczepność gumowych kół, można uszkodzić przekładnię lub spalić silnik.
Pomimo że poprzez definicję dodatkowych funkcji ułatwiliśmy sobie sterowanie robotem, to czasami wygodniej jest skorzystać z gotowych metod udostępnionych w grupie AlphaBot2. Mamy tam dwa dodatkowe bloki Run1 pozwalające na wybór: jazda do przodu, do tyłu, skręt w lewo, w prawo i stop, z jaką prędkością i ewentualnie przez jaki czas ma trwać dany stan ruchu.

Listing 2 demonstruje pewną ciekawą właściwość w zachowaniu się silników. Podczas ruchu zmiana prędkości obrotowej jednego koła nie powoduje zmiany stanu drugiego, pomimo że wywołaliśmy go blokiem Run. W przykładzie 2 robot jedzie prosto przez jedną sekundę, później po łuku w lewo, ze względu na spowolnienie lewego koła. Przez cały czas prawe koło porusza się z tą samą prędkością. Następnie znowu prosto i zatrzymuje się na dwie sekundy. Druga część programu wymusza ruch „na wstecznym” po tym samym torze co „do przodu”. Ponieważ nie mamy sprzężenia zwrotnego, możemy oczekiwać, że nie zakończymy ruchu dokładnie w punkcie startowym. Ten przykład pozwoli nam ocenić dokładność takiego rodzaju sterowania.
Omijanie przeszkód
Do omijania przeszkód wykorzystamy dwa czujniki na podczerwień ((5) na rysunku 3). Każdy z nich posiada nadajnik i odbiornik podczerwieni. Po odbiciu promieni od przeszkody czujnik sygnalizuje zaistniały fakt, nie oferując żadnej więcej informacji (na przykład odległości). Natrafienie na przeszkodę jest widoczne z zewnątrz przez użytkownika dzięki dwóm zielonym diodom umieszczonym bezpośrednio przy czujnikach.

Czujniki skierowane są do przodu, zatem przy cofaniu nadal należy zachować ostrożność. Także podczas jazdy do przodu nie zawsze będzie możliwość zareagowania. Rozstawienie czujników powoduje, że z przodu jest dosyć duża strefa nieczułości i można uderzyć w przeszkodę, której rozmiary poprzeczne dochodzą do nawet 8 cm (rysunek 6 z lewej). Dzieje się tak dlatego, że czujniki skręcone są lekko na zewnątrz. Projektanci urządzenia przednią strefę nieczułości pozostawili pod kontrolą dodatkowego miernika ultradźwiękowego. Ponieważ w tym rozdziale nie będziemy z niego korzystać, nadal musimy uważać na przeszkody o małych poprzecznych rozmiarach, na które można najechać z przodu, na przykład nogi od stołów. Czułość, czyli zakres wykrywania przeszkody, został tak dobrany, aby bezpiecznie najechać na zewnętrzny narożnik 90º (rysunek 6 w środku). Pozwala to na bezkolizyjny ruch dookoła większości dużych przedmiotów, filarów czy ścian. Ukierunkowanie charakterystyki na zewnątrz pozwala dodatkowo na najazd na ściany pod bardzo małymi kątami (rysunek 6 z prawej) rzędu kilku stopni. Jadąc prawie równolegle do ściany, możemy się z nią co prawda zderzyć, ale nie będzie to groźne dla robota. Jeszcze gorzej wygląda sprawa omijania przeszkód poziomych. Nie da się w takim układzie czujników nie zahaczyć o poprzeczkę zawieszoną na wysokości wystającej płytki micro:bita.
Z tej pobieżnej analizy widać, że projektując robota samodzielnie od początku, którego jedynymi „oczami” będą czujniki zbliżeniowe na podczerwień, aby zapobiec kolizjom, potrzeba minimum trzech, a najlepiej, pięciu czujników dla ruchu w jednym kierunku.
Do kontroli czujników służy blok AlphaBot2/Infrared zwracający wartość logiczną true/false. Niestety nie ma możliwości reakcji na zdarzenia zgłaszane przez czujniki poprzez obsługę przerwań (szkoda).

Napiszemy najprostszy program dający możliwość reakcji na przeszkodę, wykorzystujący czujniki na podczerwień naszego robota (listing 3).
Działanie programu jest bardzo proste. Robot porusza się do przodu z prędkością 70. Prędkość można zwiększyć, ale trzeba uważać, bo zbyt duża jej wartość może nie dać szansy robotowi na reakcję. Gdy zadziała czujnik lewy, obrotem w prawo robot będzie „uciekał” od przeszkody i odwrotnie reakcją na sygnał z prawego czujnika będzie skręt w lewo. Zachowanie robota można modyfikować przez zmianę prędkości poruszania się i obrotów oraz zmianę czasu, a tym samym kąta obrotu.
Modyfikacje
Moduł micro:bit nadzorujący pracą robota nie jest w pełni obciążony. Do naszej dyspozycji pozostaje matryca LED, która może informować nas o różnych zdarzeniach. Podobnie pin P0, do którego podłączony jest brzęczyk, może w czasie poruszania się robota lub w odpowiedzi na jakieś zdarzenie zagrać melodyjkę. Trzeba wówczas pamiętać, aby grać w tle (in background), bo inaczej robot nie przyjmie żadnych rozkazów do czasu odegrania muzyki.

Zabawa ze „ślepym” robotem może polegać na zaprogramowaniu go, tak aby przejechał po zadanym torze lub tak, by nie potrącić pachołków. Uczniowie mogą to wykonać metodą prób i błędów, ale lepiej, aby przeprowadzili najpierw kalibrację robota. Polegałaby ona na określeniu kąta obrotu jako funkcji względnej prędkości kół i czasu trwania ich włączenia. Można z powodzeniem założyć, że kąt obrotu jest proporcjonalny do czasu jego trwania. Pozostanie tylko określenie zależności prędkościowej.
Dodanie do ruchu robota elementów losowych spowoduje, że będzie sprawiał wrażenie posiadania jakiejś inteligencji.
Zaprezentowany program omijania przeszkód, pomimo że działający, jest podatny na wpadanie w pułapki, na przykład takie jak zaprezentowany na rysunku 7 wjazd w narożnik. W tym przypadku może nastąpić szybkie naprzemienne odbijanie od lewej do prawej i z powrotem. Takich i innych pułapek można uniknąć, zmieniając nie tylko parametry w programie 3, ale przede wszystkim algorytmy reakcji na przeszkody.
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:
- BBC Micro Bit Main Page [https://tinyurl.com/y36runae],
- Micro Bit Let’s Code [https://tinyurl.com/y57san4c],
- Microsoft MakeCode Editor for micro:bit [https://tinyurl.com/ybarrla5],
- micro:bit support [https://tinyurl.com/rmfkwbf]
oraz
- AlphaBot2 for micro:bit Assembly [https://tinyurl.com/rgfr6yz],
- Alphabot2 for micro:bit User Manual [https://tinyurl.com/va74svv].
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.
1 W edytorze MakeCode Blocks te bloki nie są nazwane, ale ich rzeczywiste nazwy to Run i RunDelay.

Służysz społeczności blogowej, pięknie przy tym składasz frazy, przyjmij najszczersze wdzięczności moich wyrazy 🙂