Zaprogramowanie sterowania pojazdem przy pomocy klawiatury

Jak zaprogramować sterowanie pojazdem w aplikacji LOFI Blocks?

Pierwszą rzeczą, którą chcemy zrobić z naszym pojazdem zaraz po jego skonstruowaniu jest naturalnie uruchomienie go i jazda testowa. W najprostszy sposób można to zrobić dzięki aplikacji LOFI Control. W aplikacji LOFI Blocks musimy natomiast samodzielnie zaprogramować funkcje sterujące pojazdem.

W poniższej lekcji zobaczymy, jak działa sterowanie pojazdem “od kuchni”, jak możemy sterować silnikami i jak przy pomocy odpowiedniego określenia instrukcji warunkowych połączyć naciskanie klawiszy na klawiaturze z odpowiednim uruchamianiem silników robota.

Przygotowanie

– zmontuj dowolny pojazd z zestawu CODEBOX (lub EDUBOX)
– połącz robota z aplikacją LOFI Blocks (wersją online lub mobilną)
– silniki DC podłącz do portów M1 i M2

Programowanie

Zacznijmy od sterowania silnikami. Umieść swój pojazd na jakimś podwyższeniu, tak aby koła mogły się swobodnie kręcić, a pojazd był unieruchomiony – świetnie nadaje się do tego celu pudełko od śrubek.

Omówmy działanie bloku sterującego silnikiem. Umieść go w pętli POWTARZAJ i potestuj zmienianie poszczególnych parametrów.

– mamy do dyspozycji dwa silniki podłączone do portów M1 i M2 (motor 1, motor 2)
– każdy z silników może się obracać w kierunku przód lub tył
– moc silnika – określamy w zakresie 0-100, gdzie 0 to wyłączenie silnika, a 100 moc maksymalna

UWAGA – silniki, których używamy mają kilka ograniczeń technicznych – mają one stałą przekładnię, przez co słabo sobie radzą z jazdą “na wolnych obrotach”. Jeśli w programie dasz silnikowi zbyt niską moc (poniżej 40), nie będzie miał on dość energii aby ruszyć z miejsca. To trochę tak jakbyś na rowerze chciał ruszyć z najwyższej przerzutki – potrzeba na to bardzo dużo siły.

Zrób taki eksperyment – uruchom silnik z mocą 100, a następnie zmniejszaj ją powoli do zera (np. przy pomocy potencjometru). Zobaczysz, że jeżeli silnik jest rozpędzony zwolni płynnie prawie do zera, jeśli natomiast zrobisz odwrotnie, od zera będziesz powoli zwiększał moc do 100, wówczas silnik uruchomi się dopiero powyżej mocy około 50%.

Nie mamy bloczków sterujących bezpośrednio jazdą robota typu, JEDŹ DO PRZODU, SKRĘCAJ W LEWO, itp. Zamiast tego sterujemy niezależnie dwoma silnikami jeśli, więc chcemy, aby nasz robot:
– jechał do przodu – ustawiamy silniki M1 i M2 na kierunek przód
– jechał do tyłu – ustawiamy silniki M1 i M2 na kierunek tył
– skręcał w lewo – ustawiamy M1 na przód a M2 na tył

Najprostszy sposób sterowania robotem

Zanim przejdziemy do zaprogramowania sterowania robotem przy pomocy strzałek, chciałbym Ci pokazać najprostszy sposób na kierowanie. Wykorzystamy tu pewien trik – moc silnika określamy przy pomocy liczb od 0 do 100, ale parametr ten może również przyjmować zmienne logiczne prawda/fałsz, które będzie traktować jako 0/100. Ponieważ bloki wykrywające naciśnięcie klawiszy klawiatury (lub gamepada w wersji mobilnej) zwracają wartości prawda/fałsz, możemy je wrzucić bezpośrednio jako moc silników w taki sposób:

Jak widzisz sterowanie pojazdem w ten sposób może być całkiem sprawne – naciskając obydwa przyciski naraz jedziemy do przodu, naciskając tylko jeden skręcamy i możemy zawrócić, nie możemy niestety jechać do tyłu.
No ale zaraz…. przecież wystarczy dodać tylko odpowiednie bloki z kierunkiem TYŁ np. w ten sposób:

I co? Nie działa to za dobrze – niby robot jedzie, ale trochę się zacina, jakby dostawał drgawek. Czy masz pomysł, dlaczego tak może być? Przyjrzyjmy się jeszcze raz powyższemu skryptowi.

Podczas jednego odtworzenia pętli POWTARZAJ moc każdego silnika jest zmieniania dwukrotnie, M1 najpierw ustawiany jest tak jak wartość przycisku LEWO, a zaraz potem jak wartość przycisku PRAWO. Jeśli naciśnięty jest tylko przycisk LEWO silnik dostaje w bardzo szybkim tempie komunikaty 0, 100, 0, 100, 0 …… dlatego wpada w drgawki. Analogicznie dzieje się z silnikiem M2.

Jaki z tego wniosek? Podczas jednego odtworzenia pętli POWTARZAJ moc silnika powinna być ustawiana tylko jednokrotnie. W przeciwnym razie naciśnięcia poszczególnych przycisków będą wysyłać do robota sprzeczne komunikaty. Żeby uniknąć tego rodzaju błędów wykorzystamy INSTRUKCJE WARUNKOWE

Program sterujący pojazdem z wykorzystaniem instrukcji warunkowych

UWAGA – umieść robota z powrotem na podstawce (np. pudełku na śrubki), tak aby koła mogły się obracać ale pojazd stał w miejscu.

W dziale kontrola mamy do dyspozycji dwa rodzaje instrukcji warunkowych:
– warunek pojedynczy – JEŻELI…
– warunek podwójny – JEŻELI…W PRZECIWNYM RAZIE…

Chcemy, aby nasz program uruchamiał silniki, kiedy klawisz jest naciśnięty i zatrzymywał je, gdy klawisz nie jest wciśnięty. Spróbujmy więc wykorzystać warunek podwójny:
– Jeżeli klawisz GÓRA wciśnięty (wartość logiczna TRUE) – ustaw silniki M1 i M2 na moc 100 (jedź do przodu)
– W przeciwnym razie (wartość logiczna FALSE – ustaw silniki M1 i M2 na 0

Jeśli teraz uruchomimy program i naciśniemy strzałkę do góry, nasz robot ruszy do przodu, kiedy puścimy klawisz – robot się zatrzyma. Wydaje się, że program działa, dodajmy więc jazdę do tyłu po naciśnięciu klawisza DÓŁ.

Przetestuj powyższy program. Czy wszystko działa ok? Być może robot będzie momentami działał ok, ale znowu będzie wpadał w znajome drgawki. W tym programie popełniamy ten sam problem, co poprzednio – jednocześnie ustawiamy silniki na różne wartości. Kiedy naciśnięty jest klawisz GÓRA, robot otrzymuje instrukcję jazdy do przodu, ale zaraz potem musi zrobić to co ma zadane KIEDY NIE WCIŚNIĘTY JEST KLAWISZ DÓŁ, czyli zatrzymać silniki.

Rozwiązaniem tego problemu jest zamiana warunków podwójnych na pojedyncze.

W tym momencie kiedy naciśniemy klawisz GÓRA koła zaczną kręcić się do przodu, a kiedy naciśniemy DÓŁ koła zaczną obracać się do tyłu. Nie zatrzymują się jednak kiedy puścimy klawisz i robot cały czas jest w ruchu. Na szczęście bloczek wykrywający naciśnięcie klawiszy ma też opcję ŻADEN, która zwraca wartość TRUE kiedy żaden klawisz nie jest wciśnięty i właśnie wtedy chcemy, żeby nasz robot się zatrzymał. Dodajmy więc trzeci warunek – kiedy ŻADEN klawisz nie jest naciśnięty – ustaw M1 i M2 na 0.

Testujemy dalej – i co? Chyba jesteśmy na dobrej drodze. Robot nie ma już drgawek, bo pod warunkiem, że nie wciskamy obydwu przycisków naraz, tylko jeden warunek jest spełniony w danej chwili i robot nie otrzymuje sprzecznych komunikatów. Dodajmy więc brakujące kierunki LEWO i PRAWO.

Zwróć uwagę, że przy klawiszach LEWO i PRAWO, aby robot skręcał ustawiamy jeden silnik kręcący się do przodu, a drugi stojący. Dzięki temu ruch robota jest wolniejszy i łatwiej nim sterować. Jeśli chcesz przyspieszyć skręcanie, ustaw obrót jednego silnika do przodu, a drugiego do tyłu.

Mamy kompletne sterowanie naszym robotem!

UWAGA – Pewnie zwróci Twoją uwagę jedna rzecz – TWÓJ ROBOT NIE CHCE JEŹDZIĆ PROSTO! – tzn. czasem pojedzie prosto, czasem znosi go na lewo, czasem na prawo. Chciałbym Cię uspokoić – Twój robot nie jest uszkodzony, wynika to z ograniczeń technicznych jego konstrukcji.

LOFI Robot używa silników na prąd stały, ze stałą przekładnią 40:1, bez enkoderów. Szczególnie istotny w kwestii precyzyjnej jazdy jest ta trzecia opcja. Enkoder to swego rodzaju czujnik wbudowany w silnik, który przekazuje do sterownika sygnał zwrotny o tym jak obraca się silnik, dzięki czemu możemy precyzyjnie określać jego położenie i odległość, którą przejechało koło.

W naszej konstrukcji sterownik jedynie uruchamia silnik i nie otrzymuje żadnej informacji o tym jak on się obraca dlatego np. nie jesteśmy w stanie zaprogramować robota tak, aby przejechał dokładnie odległość jednego metra, możemy co najwyżej zaprogramować go tak aby jechał przez określony czas i na jego podstawie w przybliżeniu planować jaką odległość przejedzie pojazd. Dokładna prędkość pracy silnika jest zależna jest od wielu czynników – od tarcia wewnątrz przekładni, sprawności samego silniczka, która w różnych egzemplarzach może być zmienna o kilka procent, dlatego każdy silnik będzie pracował odrobinę inaczej co będzie przekładało się na nierówną jazdę.

W samej konstrukcji naszego pojazdu przy precyzyjnej jeździe nie pomaga również obrotowe kółko zamontowane z tyłu, podczas ruszania potrzebuje ono chwilę aby ustawić się prosto i również skrzywia tor jazdy.

Jak rozwiązać ten problem? Musielibyśmy wykorzystać inny typ silników aby móc sterować ich obrotem w pełni precyzyjnie, powinny być to silniki z enkoderami lub silniki krokowe. Ich kontrolowanie jednak jest dużo bardziej skomplikowane elektronicznie i programistycznie, dodatkowo są one dużo droższe.

W przypadku silników DC, które mamy teraz do dyspozycji najprostszym sposobem na wyrównanie ich pracy jest korekta w parametrach mocy jednego i drugiego silnika – czasami aby robot jechał prosto moc silnika M1 i M2 może się różnić nawet o kilkanaście procent.

O autorze scenariusza:

Maciej Wojnicki

Maciej Wojnicki

Projektant, konstruktor, programista, twórca LOFI Robota - edukacyjnego systemu do nauki robotyki i programowania dla dzieci w każdym wieku. Pomysłodawca i współzałożyciel pierwszego w Polsce Fab Labu (Trójmiasto) - otwartej pracowni szybkiego prototypowania i cyfrowej fabrykacji, zrzeszonej w międzynarodowej sieci podobnych instytucji.