Zasilanie jest pobierane z baterii zamontowanej w robocie. Układ logiczny (najczęściej mikrokontroler) służy do sterowania ruchem robota poprzez odczytywanie linii przez czujniki. Wykonany przez autora prototyp przedstawiono na fotografii głównej.
Dokładność ruchu robota liniowego zależy głównie od ruchu silnika i systemu czujników. Stosuje się wiele algorytmów koordynujących dane o linii odczytywane przez czujniki do sterowania silnikami. Jednak proste i najbardziej precyzyjne sterowanie uzyskuje się za pomocą algorytmu PID (proportional integral derivative).
Wzór funkcji PID będący kombinacją trzech kolejnych członów [P]+[I]+[D] jest następujący:
f(t)=[Kp.e(t)]+[Ki∫e(t).d(t)]+[Kd.de/dt]
gdzie e(t) jest wartością błędu, która jest różnicą wartości wymaganej i wartości rzeczywistej,
Kp=zmienna dla proporcji
Ki=stała dla całki
Kd= stała dla pochodnej
P=Kp pomnożone przez wartość błędu
I=Ki pomnożone przez wartość błędu poprzedniej całki
D=Kd pomnożone przez wartość pochodnej
Należy pamiętać, że stałe Kp, Ki, i Kd nie są takie same dla każdego robota liniowego. Za każdym razem należy przyjąć przybliżone wartości tych trzech stałych, a następnie skompilować i wgrać kod do mikrokontrolera w celu przetestowania zachowania się układu. Jest to bardzo żmudna praca, a podczas testowania traci się dużo czasu.
Zastosowanie powyższego wzoru jest uproszczone przy użyciu funkcji void runPID() w kodzie źródłowym. Wartości stałe Kp, Ki, Kd, opóźnienia i pętle potrzebne do sterowania sterownikiem można zmieniać naciskając tylko trzy przyciski.
Aktualnie ustawione wartości można przeglądać na wyświetlaczu OLED, a także są one automatycznie zapisywane do pamięci EEPROM mikrokontrolera, co ułatwia i upraszcza testowanie robota liniowego z algorytmem PID.
Układ i działanie
Schemat obwodu niestandardowego robota liniowego PID składa się z dwóch części: obwodu głównego i obwodu czujnika. Obwód główny jest pokazany na rysunku 1. Jest on zbudowany z regulatora napięcia 5 V 7805 (IC1), mikrokontrolera ATmega16 (IC2), regulatora napięcia 6 V 7806 (IC3), sterownika silnika L293D (IC4), czterech diod 1N4007 (D1 do D4), 10-segmentowego paska LED (BAR1), trzech diod LED (LED1 do LED3), dwóch silników zasilanych z baterii 6 V i kilku innych elementów.
Zespół obwodu czujnika pokazany jest na rysunku 2. Jest on zbudowany z dwóch op-ampów LM324 (IC5 i IC6), ośmiu diod LED nadających IR (IRTX1-IRTX8), ośmiu diod LED odbierających IR (IRRX1 -IRRX8) i kilku innych elementów.
Dane z linii są odczytywane przez osiem par diod LED nadających IR i diod LED odbierających IR (służących jako czujniki) ułożonych w linii. Rezystancja czujnika IR zmienia się w zależności od odbicia światła IR od koloru ścieżek na podłodze, przy czym ścieżki koloru białego odbijają najwięcej, a ścieżki koloru czarnego najmniej.
Zmianę rezystancji uzyskuje się po zmianie napięcia za pomocą sieci rezystancyjnej i podaniu go na osiem op-ampów (po cztery z układów IC5 i IC6) w celu dalszego wzmocnienia sygnału.
Wyjścia op-ampów są sygnałami wejściowymi dla mikrokontrolera ATmega16. Dzięki temu stan sygnałów uzyskanych przez mikrokontroler jest wyświetlany na 10-diodowym pasku (wykorzystano tu tylko osiem z dziesięciu diod).
Sygnał może być odwrócony za pomocą zworki J1, co umożliwia robotowi podążanie po podłodze za białą linią na czarnym tle lub czarną linią na białym tle.
Budowa i testowanie
Rozkład płytki drukowanej dla głównego układu jest pokazany na rysunku 3, a rozkład jego elementów na rysunku 4. Należy zmontować układ na płytce drukowanej. Trzeba podłączyć akumulator LiPo do BATT.1. Można również użyć zwykłego akumulatora kwasowo-ołowiowego 12 V zamiast akumulatora LiPo. Przed zamontowaniem ATmega16A na płytce drukowanej, należy wgrać do niej plik custom_pid_lf.hex.
Rozkład płytki drukowanej dla układu czujnika pokazany jest na rysunku 5, a rozkład jego elementów na rysunku 6. Po zmontowaniu układu na płytce PCB należy połączyć CON3 z CON4.
Po zmontowaniu głównego modułu i czujników na odpowiednich płytkach PCB, zamocuj główny moduł na górze obudowy wraz z baterią i czujnikiem na dole obudowy (około 25 mm nad powierzchnią).
Więcej szczegółów na temat montażu i połączeń można znaleźć na fotografii otwierającej autorskiego prototypu oraz na fotografii 7 montażu zespołu czujnika.
Wstępna konfiguracja
Zamocuj dwa silniki zasilane bateriami, kółko i baterię na dobrej obudowie, jak wyjaśniono poniżej. Umieść płytkę z ośmioma czujnikami podczerwieni na przedniej stronie z przerwą około 5 mm pomiędzy podłogą a diodami IR. Następnie umieść główną płytkę na podwoziu i wgraj plik custom_pid_lf.hex do mikrokontrolera (ATmega16) przez port ISP za pomocą dowolnego odpowiedniego programatora AVR po włączeniu zasilania płytki z baterii. Teraz należy wyłączyć zasilanie i wyjąć programator AVR z płytki głównej.
Podłącz wyjścia czujników do obwodu głównego i włącz zasilanie obwodu czujników. Tablica paskowa LED (BAR1) powinna migać, a dioda OLED powinna wyświetlać przez chwilę "wiadomość powitalną", a następnie domyślny tryb "stop".
Potem, należy wyregulować VR1 w pobliżu układów scalonych op-amp (LM324) w zespole czujnika, aby włączyć i wyłączyć osiem diod LED w tablicy paskowej LED podczas przesuwania zespołu czujnika na czarnej (lub białej) linii. Zaobserwować różnicę w wykrywaniu linii poprzez usunięcie i podłączenie zworki J1 i ustawienie jej zgodnie z kolorem linii (czarna lub biała). Otworzyć J1 dla linii czarnej i zamknąć J1 dla linii białej.
Autotest dla silników
Naciśnij przycisk S2, aby sprawdzić obroty silników, gdy robot podążający za linią jest w trybie Stop. Na wyświetlaczu OLED pojawi się komunikat "Krok 1 z 4, prawy silnik jest w trybie do przodu". W tym samym czasie prawy silnik będzie poruszał się w kierunku do przodu.
Następnie należy nacisnąć przycisk S2, aby sprawdzić działanie lewego silnika. W podobny sposób, naciskając przycisk S2, można sprawdzić, czy robot podążający za linią porusza się do przodu i do tyłu.
Jeśli któryś z silników nie obraca się, należy wyłączyć zasilanie bateryjne i poprawić połączenia przewodów w silniku. Następnie ponownie przejdź do autotestu i sprawdzaj, aż kierunki silników będą zgodne z komunikatami wyświetlanymi na wyświetlaczu OLED.
Konfiguracja stałych
W celu zmiany wartości stałych (Kp, Ki, i Kd) należy kolejno naciskać przycisk S1, aby wyświetlić aktualne wartości i zmienić wartości.
W celu zmniejszenia wartości należy nacisnąć przycisk S2, a w celu zwiększenia wartości przycisk S3. Jeżeli przez ponad pięć sekund nie zostanie naciśnięty żaden przycisk, zmienione wartości zostaną automatycznie zapisane w pamięci EEPROM mikrokontrolera.
Następujące parametry mogą być wybierane poprzez naciśnięcie przycisku S1, a następnie przycisków S2 lub S3 odpowiednio w celu zwiększenia lub zmniejszenia wartości:
- Stała Kp (wyświetlana jako KP na OLED) jest stałą mnożenia dla P w PID. Można ją zmienić na odpowiednią wartość, np. Kp=8,1
- Stała Ki (wyświetlana jako KI) jest stałą mnożenia dla I w PID. Zmień ją na KI=0,1
- Stała Kd (wyświetlana jako KD) jest stałą mnożenia dla D w PID. Zmień ją na Kd=0,1
- Opóźnienie pętli (wyświetlane jako DELAY) jest opóźnieniem pomiędzy odczytami danych linii przez czujniki IR. Można to zmienić na Delay=50.
- Pętla wyszukiwania (wyświetlana jako SEARCH) to ilość razy, kiedy program szuka linii przed przejściem do trybu zatrzymania. Można to zmienić na Search=45
Uruchamianie i zatrzymywanie
Naciśnij przycisk S3 aby uruchomić lub zatrzymać podążanie za linią, gdy nie jest w trybie konfiguracji. Naciśnij przycisk reset S4 w dowolnym momencie, aby zatrzymać i ponownie uruchomić urządzenie.
Aktualny tryb pracy Run/Stop jest wyświetlany w prawym górnym rogu wyświetlacza OLED. Początkowo, w trybie Stop, należy ustawić pewną wartość (powiedzmy 8,0) dla KP, utrzymując wartości KI i KD na poziomie zerowym. Trzeba utworzyć gruby, czarny, zakrzywiony tor na podłodze i umieścić robota podążającego za linią na górze toru. Potem nacisnąć przycisk S3, aby uruchomić robota podążającego za linią. Powinien on podążać za zakrzywioną linią narysowaną na podłodze. Aby dostosować dokładność ruchu robota, zmień wartości KD i KI.
Funkcja SearchLine() w kodzie jest wywoływana, gdy nie zostanie znaleziona żadna linia. Funkcja ta jest niezależna od algorytmu PID i może być zmieniana zgodnie z indywidualnymi wymaganiami, jeśli takie istnieją.