(Nasz pierwszy) LineFollower

(Nasz pierwszy) LineFollower

Chciałbym zaprezentować Wam robota klasy LineFollower, którego zbudowaliśmy wspólnie z moją przyjaciółką. Jak wspomniałem w tytule, jest to nasza pierwsza taka konstrukcja, którą jednak planujemy dalej udoskonalać i poprawiać.

Części

Jest tego bardzo dużo, więc wymienię najważniejsze:

Budowa

Postawiliśmy na koncept często spotykany w podobnych robotach. Na większej płytce (z tyłu) znajduje się większość elektroniki, czyli mikrokontroler, mostek, zasilanie itd. Do tej płytki są też zamocowane silniki, za pomocą dedykowanych mocowań. Tu również zamontowany jest akumulator. Na drugiej, wysuniętej do przodu płytce znajduje się 8 czujników odbiciowych KTIR0711S, których zadaniem jest wykrywanie czarnej linii na białym tle. Dzięki odsunięciu od osi silników robot zyskuje czas na reakcję, co przydaje się przy ostrych zakrętach. Ważne jest też ułożenie czujników – w naszym przypadku koncepcja lekkiego łuku sprawdziła się i robot pokonuje nawet ostre zakręty.

Płytki połączone są płaskownikiem w włókna węglowego, zaś elektrycznie taśmą IDC10. Bateria została zamocowana opaskami zaciskowymi do tylnej płytki. Na płytce czujników zostały zamontowane dwie obudowy po klasycznych tranzystorach, które (wraz z jedną ze śrub) stanowią przednie zawieszenie robota tak, by między czujnikami a podłożem był odstęp ok, 2mm.

      

Ze względu na małe rozmiary większość elementów na płytce to elementy SMD. Płyki zostały zaprojektowane w Eagle, z uwzględnieniem otworów montażowych pod chociażby płaskownik czy silniki. Płytki wykonałem termotransferem i wytrawione w B327. Obyło się bez podtrawień, jedynie płytka czujników posiadała małą “wyrwę” którą udało się świetnie skorygować pisakiem. Pozostało tylko wywiercić otwory  pod podzespoły przewlekane i śrubki i można było brać się za lutowanie i składanie :)

    

Napęd

Robota napędzają silniki Pololu High Power z przekładnią 10:1. Silniki te są popularne w podobnych konstrukcjach i mają duży zapas mocy, przydatny przy ostrych zakrętach. Napęd jest przenoszony na koła Solarbotics RW2. Są to średniej klasy koła z gumowymi oponami, istnieje możliwość wymiany ich na poliuretanowe.

Elektronika

Mózgiem całego robota jest 8-bitowy mikrokontroler ATMega328 w obudowie TQFP. Mikrokontroler taktowany jest z częstotliwością 16MHz za pomocą rezonatora kwarcowego. Taka konfiguracja jest identyczna z płytką Arduino Nano (nie zawiera jedynie interfejsu USB) i pozwala na programowanie w środowisku Arduino IDE, w którym zresztą został zaprogramowany. W przeciwieństwie do Arduino programowaliśmy go za pomocą programatora ISP. Silniki obsługuje mostek H TB6612, popularny w podobnych konstrukcjach. Jak wcześniej wspominałem czujniki to (również popularne w linefollowerach) czujniki KTIR0711S w liczbie 8 sztuk. 

Na płytce znajdują się też trzy diody LED (z czego dwie są sterowane mikrokontrolerem) oraz przycisk uruchamiający i zatrzymujący robota. Zielona dioda świeci się gdy robot jest uruchomiony, a jej miganie informuje o niskim stanie baterii. Żółta świeci się gdy robot jedzie, miga przy uruchamianiu robota.

W trakcie jazdy układ zasilamy z akumulatora litowo-polimerowego o pojemności 300 mAh i napięciu 7,4V. Pojemność akumulatora pozwala na dłuższe przejazdy robotem przy względnie niskiej masie. Na wejściu znajduje się układ zabezpieczający przed zwarciem i odwrotną polaryzacją. Napięcie 7,4V zasila mostek H i silniki. Następnie za pomocą stabilizatora liniowego napięcie jest obniżane do 5V, które zasila mikrokontroler, układ kontroli napięcia i czujniki odbiciowe. Dodatkowy stabilizator obniża napięcie do 3,3V, które zasila moduł komunikacyjny. Oba stabilizatory są z rodziny LM1117.

Ponieważ nasz mikrokontroler ATMega32 (w wersji TQFP) posiada 8 wejść analogowych, z których wszystkie poszły na czujniki, postanowiliśmy zrealizować zewnętrzny układ kontroli napięcia na komparatorze analogowym LM393. Jego podstawowym zadaniem jest wykrywanie, czy napięcie baterii nie spadło poniżej progu rozładowania (wg obliczeń miało to być ok. 6,1V), co powoduje zaświecenie się czerwonej diody LED  i wysłanie sygnału do mikrokontrolera, który reaguje wyłączeniem silników i przejściem w stan uśpienia. Drugi komparator wysyła informację o niskim (ale dopuszczalnym) stanie baterii. uC informuje o tym poprzez miganie jedną z diód.

I tu wymagany jest komentarz: układ ten – choć teoretycznie jest bajecznie prosty – przysporzył nam trochę kłopotów a niestabilna praca diód Zenera zmusiła nas do doboru pozostałych elementów metodą prób i błędów.  aktualnie próg rozładowania wynosi (wg pomiarów) około 7 V, co nie przeszkadza w użytkowaniu, a jedynie skraca czas pracy robota :). Pozostaje nam poszukanie lepszych podzespołów, ewentualnie próba zastąpienia Zenerów źródłami napięcia z prawdziwego zdarzenia. Jeżeli projektujecie podobny układ – warto pomyśleć o przetworniku A/C z prawdziwego zdarzenia :).

Komunikacja

Aby ułatwić zmianę parametrów robota, zastosowaliśmy system transmisji z użyciem programowalnego układu ESP8266. Komunikacja między mikrokontrolerem a modułem odbywa się przez interfejs RS232 . Aby zachować kompatybilność pomimo różnicy napięć na jednej z linii zastosowaliśmy prosty dzielnik napięcia. Aktualnie moduł Wi-Fi przesyła komunikaty odebrane od mikrokontrolera przez protokół Telnet. Ta prosta implementacja powstała na potrzeby debugowania robota w trakcie jazdy jak również umożliwia szybką zmianę parametrów jazdy, podgląd stanu czujników (przydatne przy ustawiania progu czerni/bieli), pozwala również wystartować i zatrzymać robota zdalnie. W planach również był podgląd parametrów regulatora w trakcie jazdy, jednak przy bardzo krótkich międzyczasach pomiaru odczyt potrafił się zglitchować lub kompletnie zawiesić :) Na szczęście za pomocą przejściówki USB-UART możemy podłączyć robota “po kablu” i równie skutecznie (choć mniej wygodnie) poustawiać to i owo…

    

Program

Cały program został napisany w środowisku Arduino IDE, Został on podzielony na kilka funkcji (m.in. jazda, kontrola stanu baterii, wprowadzanie danych, odczyt z czujników). Najważniejszą z punktu widzenia pracy robota jest ride(), w której to pętli robot pracuje. 

Algorytm pracy robota opiera się na regulatorze PID (proporcjonalno-całkująco-różniczkującym). Choć brzmi to jak koszmar studenta matematyki, jego działanie implementacja w C są bardzo proste: Na początek z czujników odbiciowych odczytywany jest ich stan, na podstawie ustawionego progu program ustala, gdzie (w stosunku do osi robota) znajduje się czarna linia i po uwzględnieniu tego, że czarna linia może znajdować się jednocześnie na dwóch czujnikach reprezentuje ją w postaci liczby od 1 do 15. Stan 8 (środkowy) jest wartością zadaną, do której robot dąży. Następnie odejmuje się od odczytu z czujników od wartość zadaną i uzyskujemy zmienną nazywaną błędem regulacji. Po odjęciu, gdy robot znajduje się na środku linii, błąd ten ma wartość 0, gdy będzie za bardzo w lewo – błąd będzie ujemny, gdy za bardzo w prawo – dodatni. 

Teraz na podstawie błędu dokonuje się wspomniana regulacja, która składa się z trzech członów:

Człon P (proporcjonalny) jest najprostszy. Wynik będzie proporcjonalny do błędu. Słowem – im bardziej musimy skręcić, tym bardziej skręcamy. Sam człon ma wadę – skręcając nasz błąd się zmniejsza, przez co coraz słabiej skręcamy.

Człon D (różniczkujący) w przeciwieństwie do członu P jest proporcjonalny do różnicy błędu aktualnego od poprzedniego. – Analogicznie do liczenia pochodnej (różniczkowania) funkcji .Oznacza to że robot może skręcać bardziej jednostajnie.

Człon I (całkujący) opiera się na dodawaniu lub odejmowaniu (jeśli błąd jest ujemny) sygnału błędu do poprzedniego pomiaru. Tu również analogicznie do całkowania funkcji. Choć jest on zaimplementowany, raczej nie używa się go w LineFollowerach.

Każdy z członów ma przypisaną stałą kP, kI i kD. Współczynniki te są mnożone z obliczonymi parametrami P,I,D. Dzięki temu możemy dobrać, które człony mają bardziej wpływać na robota, które mniej, a które w ogóle – wystarczy wyzerować tą stałą. Zależy to od wielu czynników – długości robota, rozstawie czujników, prędkości itd,itp. Parametry te należy dobrać ręcznie, po przez eksperymentowanie. W naszym przypadku możliwa jest też regulacja czasu różniczkowania/całkowania – co ile milisekund regulator ma reagować.

Na koniec przemnożone parametry są sumowane i tworzą wynik.

Choć może wydawać się to skomplikowane, myślę że fragment programu mówi sam za siebie:

Wynik regulacji następnie (po dodaniu/odjęciu go od prędkości zadanej) służy do ustalenia wypełnienia sterującego silnikami.

Protokół komunikacyjny

Moduł Wi-Fi  pozwala na komunikację za pomocą protokołu Telnet, w trybie tekstowym. Dlatego, w celu wygodniejszego wprowadzania poleceń stworzyliśmy prosty interfejs, pozwalający na szybką zmianę parametrów regulacji, podgląd stanu czujników, uruchomienie/zatrzymanie robota oraz podgląd „na bieżąco” parametrów jazdy (błąd czujników, parametry regulatora PID, prędkości obu silników). Interfejs przyjmuje proste, jednoliterowe komendy – co widać na jednym z obrazków wyżej.

Efekty

Muszę przyznać, że końcowy efekt zaskoczył nas oboje. Początkowo zamierzeniem było zbudowanie czegoś naprawdę prostego, ale nasza ambicja i chęci (pomimo braku doświadczenia) zaprowadziła nas właśnie do tego. Robot okazał się być szybki i radzi sobie z nawet bardziej skomplikowanymi trasami. Tak naprawdę jedynym ograniczeniem aktualnie są program i jakość kół, gdyż aktualne łatwo łapią brud z trasy i tracą w ten sposób przyczepność, przez co robot czasami wpada w poślizg. Do poprawki są też oczywiście wspomniany moduł komunikacyjny, układ kontroli napięcia i kilka drobnych niuansów. Sam robot ma spory potencjał i myślę że jeszcze będzie miał okazję pokazać swoje możliwości.

      

Na razie zostawiam Was z krótkim filmikiem z pracy urządzenia. W przyszłości na moim kanale na YT pojawi się jakaś większa kompilacja, ale ze względu na brak czasu (sesja…) muszę odłożyć jego przygotowanie :(. Link do filmu: https://www.instagram.com/p/BPIMsPxAMp3/

Jeżeli macie pytania – piszcie w komentarzach. 

Hubert

 

Ocena: 4.07/5 (głosów: 14)

Podobne posty

12 komentarzy do “(Nasz pierwszy) LineFollower

Odpowiedz

anuluj

Masz uwagi?