Autonomiczny robot mobilny w kategorii linefollower MORPROF Autorzy projektu: Marek Płóciennik 145396 Marcin Wytrych 145419 Koordynator Projektu: Dr inż. Grzegorz Granosik
Spis Treści: 1. Opis projektu 2.Konstrukcja 3. Elektronika 4. Sterowanie 5. Podsumowanie
1. Opis projektu Głównym założeniem realizowanego projektu było zbudowanie autonomicznego robota mobilnego w kategorii linefollower. Takie roboty mobilne mają za zadanie przejechać wyznaczoną trasę w jak najkrótszym czasie. Trasa zbudowana jest z białej powierzchni i czarnej ok. 2 cm szerokości linii, może składać się z przeróżnych odcinków określonych w regulaminie. Przewidywany czas końcowy realizacji projektu MORPROF był przewidziany na około 20 września 2009 r., ponieważ 28 września 2009r. organizowano zawody Robotic Arena we Wrocławiu. Aby wystawić MORPROFA należało jednak przeprowadzić testy zachowania się konstrukcji na torze. Kolejnym założeniem było sprawdzenie możliwości sterowania robotem za pomocą implementacji różnych typów oraz algorytmów sterowania np. regulatora PID w celu płynnej kontroli pokonywanej trasy. rys.1. Powyższe zdjęcie przedstawia przykładowy przebieg trasy dla robotów kategorii linefollower.
2. Konstrukcja Aby robot mógł wystartować w zawodach jego konstrukcja musi spełniać wymagania regulaminu. W regulaminie jest napisane że: - Główny obrys robota musi mieścić się na kartce papieru formatu A4. - Waga robota nie jest ograniczona. - Robot musi poruszać się w sposób autonomiczny. Komunikacja z robotem w czasie przejazdu trasy jest zabroniona (oprócz startu i zatrzymania robota). - Robot powinien być tak zaprojektowany by można było go uruchomić na znak dany przez sędziego. Podstawą konstrukcji całego robota był laminat (tworzywo sztuczne) do którego zostały przymocowane silniki, czujniki oraz pakiety zasilające. rys.2. Powyższy rysunek przedstawia widok z góry całej konstrukcji. Całość napędzały 2 silniki DC z przekładnią o napięciu zasilania 12V i prędkości 1200 obr/min. Silniki zostały zamontowane przy użyciu aluminium, ponieważ jest to materiał łatwy w obróbce oraz łatwo dostępny.
Układ napędowy oraz nośny składa się z: - silnik DC (rys.3. oznaczone 2); - elastycznego sprzęgła służy do redukcji naprężeń oraz niedokładności wynikających z ręcznej konstrukcji (rys.3. oznaczone 3); - kół napędzających konstrukcję (rys.3. oznaczone 4); - kółek realizujących stabilność konstrukcji oraz zabezpieczenie przed podnoszeniem się lub opuszczaniem za nisko palety czujników (rys.3. oznaczone 1); - palety czujników (rys.3. oznaczone 4); 5 1 6 4 2 4 3 rys.3. Widok z dołu 1) kółka pomocnicze; 2) silniki; 3) elastyczne sprzęgło; 4) koła napędzające; 6) regulacja palety czujników względem podłoża. Kółka pomocnicze to kółeczka napinające taśmę magnetofonową w odtwarzaczach kasetowych. Całość zasilają dwa pakiety Ni-Mh używane w modelarstwie do modeli zdalnie sterowanych RC o parametrach 7.2 V; 4000 mah.
3. Elektronika Układ sterowania opiera się na prostej konstrukcji elektronicznej, bazującej na mikrokontrolerze Atmega 8, podwójnym mostku H (układ L298) oraz czujnikach odbiciowych QRD1114. Tworząc układ sterowania korzystaliśmy z dokumentacji technicznej poszczególnych elementów. Schematy oraz projekty płytek drukowanych zamieszczamy poniżej. rys.4. Stabilizator zasilający układ elektroniczny +5V. rys.5. Schemat podłączenia mikrokontrolera z pozostałymi elementami. Poniższe rysunki przedstawiają projekty płytek drukowanych oraz gotowe zmontowane układy.
rys.6. Projekt płytki. rys.7. Gotowy układ płytki. rys.8. Projekt płytki mostka H. rys.9. Zmontowany układ mostka H. Kolejne rysunki przedstawiają układy połączeń, wyprowadzeń oraz zawartości komponentów
rys.10. Schemat budowy czujnika linii. rys.11. Sposób podłączenia czujnika linii. rys.12. Schemat wewnętrzny układu L298. rys.13. Widok układu L298 oraz oznaczenie jego wyprowadzeń.
rys.14. Połowa układu L298 jeden pełny mostek H. Paleta czujników została zrealizowana na płytce uniwersalnej (rys.3 oznaczone 5) na podstawie schematu połączeń pokazanych na rys.7. Rezystory umieszczone w obwodzie fotorezystora i diody ograniczają prąd płynący przez te elementy. Sygnał podawany na wejście mikrokontrolera to napięcie w zakresie 0-5V. W sytuacji kiedy czujnik widzi białą powierzchnię, promieniowanie diody odbija się od niej, polaryzuje fototranzystor, w wyniku czego przewodzi złącze C-E. Napięcie na wyjściu signal (rys.7.) ma bardzo małą wartość (co jest uzależnione od charakterystyki czujnika). W chwili gdy czujnik trafia na czarną powierzchnię, promieniowanie diody zostaje przez nią pochłonięte. Skutkiem tego jest brak polaryzacji tranzystora. Przez złącze C-E nie płynie prąd w wyniku czego na wyjściu signal (rys.7.) jest stan wysoki (napięcie ok. 5V). Cały układ z mikrokontrolerem działa na poziomach napięć zgodnych z logiką TTL (0-5V). Poniżej jest podana ch-ka prądu kolektora (fototranzystor w czujniku QRD1114) w funkcji odległości. Wynika z niej że najlepsze osiągi są w granicach 20-30 milsów. W milimetrach jest to przedział od 0,5080 do 0,7620. Czujniki te sprawdzają się nawet przy odległości do około 5mm. Silniki są sterowane za pomocą drivera zbudowanego z układu L298 i kilku elementów dodatkowych zgodnie z notą katalogową. Praca drivera jest sterowana za pomocą dwóch bitów ustawiających kierunek oraz trzeciego bitu, z którego generowany jest sygnał MSI (PWM) sterujący prędkością silnika.
rys15. Powyższy rysunek przedstawia charakterystykę wyjścia fototranzystora czujnika QRD1114 w zależności od odległości. Skala jest podana w milsach. rys.17. Charakterystyka czujników w zakresie przejścia pomiędzy powierzchniami białą i czarną.
4. Sterowanie Sterowanie robota jest zrealizowane w postaci programu napisanego w języku C i zaimplementowanego w mikrokontrolerze. Poniżej jest zamieszczony listing programu. #include <avr/io.h> #define F_CPU 16000000 #include <util/delay.h> #define bc bit_is_clear #define bs bit_is_set //konfiguracja wejść, wyjść, ustawienie timerów, inicjalizacja PWM void pwm_init() //ADC6 = 0x01; //ADC7 = 0x01; DDRC = 0xC0; DDRB = 0x06; // = (1<<PB1) (1<<PB2); DDRD = 0xF0; // = (1<<PD4) (1<<PD5) (1<<PD6) (1<<PD7); TCCR1A = (1<<COM1A1) (1<<COM1B1); TCCR1A = (1<<WGM11); TCCR1B = (1<<WGM13) (1<<WGM12) (1<<CS11); ICR1 = 1023; OCR1B = 0;//wpisujac tu odpowiednie wartosci zmieniasz kierunek //obrotu badz zatrzymijesz serwo OCR1A = 0; PORTD =(1<<4); //PORTD =(1<<4); //ustawienia bitów na atm_8 do //sterowania silnikami PORTD &=~(1<<5); //PORTD &=~(1<<5) PORTD =(1<<6); //PORTD =(1<<6) PORTD &=~(1<<7); //PORTD &=~(1<<7); void pwml(int pwm, int kierunek) //lewy silnik OCR1B = pwm; if (pwm==0) PORTD = (1<<4); PORTD = (1<<5); //zwarcie else if (kierunek==1) PORTD =(1<<4); PORTD &=~(1<<5); //przód else PORTD =(1<<5); PORTD &=~(1<<4); //tył void pwmr(int pwm, int kierunek) //prawy OCR1A = pwm;
if (pwm==0) PORTD = (1<<6); PORTD = (1<<7); //zwarcie else if (kierunek==1) PORTD =(1<<6); PORTD &=~(1<<7); //przód else PORTD =(1<<7); PORTD &=~(1<<6); //tył int main() pwm_init(); while(1) if( bs(pinc,5)) // włączenie krańcowych czujników oznacza //obrót w miejscu pwml(400,2); pwmr(700,1); goto s; if( bs(pinc,0)) pwml(700,1); pwmr(400,2); goto s; if( bs(pinc,4)) // włączenie pośrednich czujników oznacza //obrót z jazdą do przodu ograniczoną prędkością pwml(200,1); pwmr(650,1); goto s; if( bs(pinc,1)) pwml(650,1); pwmr(200,1); goto s; if( bs(pinc,3)) // włączenie środkowych czujników oznacza //jazde do przodu z pełną prędkością pwml(600,1); pwmr(600,1); goto s; if( bs(pinc,2)) pwml(600,1); pwmr(600,1); s:;
Program sterujący pracą robota składa się z części inicjując pracę silników, mikrokontrolera oraz algorytmu regulującego sterowanie silnikami. Robot posiada jedynie czujniki umieszczone w przedniej części. Na następnej stronie zamieszczony jest schemat blokowy działania programu. rys.18. Algorytm działania programu.
5. Podsumowanie Morprof jest naszym pierwszym wspólnym projektem dla tego też konstrukcja oraz wykonanie nie jest idealne. Robot jednak spełnia założone oczekiwania. Konstrukcja została wykonana w ramach możliwości oraz dostępu do poszczególnych podzespołów, komponentów a także miejsca, w którym można było wszystko poskładać i przeprowadzać niezbędne testy. Projekty schematów oraz płytek drukowanych zostały wykonane w programie EAGLE. Jest to środowisko dostępne bezpłatnie w wersji demo, w którym na podstawie stworzonego schematu ideowego można utworzyć projekt płytki. Płytki były w pełni projektowane oraz wykonywane przez nas. Wykonanie ich nie było łatwym zadaniem szczególnie w przypadku płytki z mikrokontrolerem. Układ atmega 8 jest w wersji smd co dodatkowo zwiększyło trudności polutowania całego układu. Paleta czujników została zamocowana w taki sposób, aby można było doregulować odległość czujników od powierzchni. Miało to na celu otrzymanie jak najdokładniejszych pomiarów z czujników. Kwestia sterowania odbywa się metoda spełnienia warunków. Warunki uwzględniają hierarchie ważności czujników, tzn. odczyt znajdujący się bliżej krańca jest ważniejszy od odczytu znajdującego się bliżej środka. Algorytm działania uwzględnia możliwość wystąpienia poślizgów w czasie wykonywania obrotów, skutkiem tego pełna efektywna prędkość wysterowania silników uzyskiwana jest jedynie przy załączonych środkowych czujnikach, przy większych prędkościach pokonywania zakrętu robot ma tendencje do wypadania z trasy na skutek konieczności zrównoważenia zbyt dużej wartości prędkości. W początkowym założeniu chcieliśmy zastosować sterowanie za pomocą regulatora PID. Doświadczenia pokazały że bez zastosowania enkoderów w celu zbierania informacji o aktualnej prędkości, regulacja za pomocą regulatora jest niepraktyczna. Układ wykorzystuje 6 czujników podłączonych w sposób podany na rysunku poniżej.
rys.16. Wyprowadzenia konkretnych pinów z układu. Czujniki są podłączone od pinu PC0 do pinu PC5 włącznie. Na pinach PB1 i PB2 są wyprowadzone sygnały MSI (PWM). Piny PD5, PD4, PD7 i PD6 służą do ustawiania kierunku obrotów silników. W projekcie nie wykorzystaliśmy pinów ADC6 i ADC7 ale są podpięte do wejść mikrokontrolera i wyprowadzone w celach ewentualnej modernizacji. Czujniki są podpięte do portu C mikrokontrolera który w zależności od konfiguracji może służyć jako wejście cyfrowe (stany 1 lub 0) a także jako wejście przetwornika A/C.