autonomiczny robot mobilny w kategorii linefollower morprof
TRANSCRIPT
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);
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.
1
2
(
3
4 4
5
6
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.