Robot klasy Line
Transkrypt
Robot klasy Line
Robot klasy Line-follower Projekt z kursu Sterowniki Robotów Prowadzący: mgr inż. Jan Kędzierski Autorzy: Piotr Bandrowski Remigiusz Wawrzyniak Wrocław, 2012 Spis treści Cel projektu ............................................................................................................................................. 3 Konstrukcja i napęd ................................................................................................................................. 3 Zasilanie ................................................................................................................................................... 3 Elektronika............................................................................................................................................... 4 Oprogramowanie .................................................................................................................................... 4 Wnioski .................................................................................................................................................... 5 Załącznik 1- schemat ideowy ................................................................................................................... 6 Załącznik 2- kod programu ...................................................................................................................... 7 Załącznik 3- projekt płytki PCB- płytka główna........................................................................................ 8 Załącznik 4- projekt płytki PCB- płytka czujników ................................................................................... 9 Cel projektu Celem projektu było stworzenie prostego robota klasy Line-follower- pokonującego trasę wyznaczoną przez czarną linię z wykorzystaniem zamontowanych sensorów, bez jakiejkolwiek ingerencji człowieka. Zaprojektowaliśmy robota wyposażonego w system jezdny klasy (2,0)- sterowanego napędem, poruszającego się ze stałą prędkością i wyposażonego w trzy czujniki optyczne. Prostota urządzenia wynika z faktu, iż nie było projektowane z myślą o zawodach, a jedynie w celach edukacyjnych i posłużyło nam do wdrożenia się w temat robotów tej klasy. Konstrukcja i napęd Podstawą konstrukcji robota jest płytka laminatu o wymiarach 160x100mm, która jednocześnie pełni rolę miejsca montażu większości elementów elektronicznych, oraz znajdujących się z tyłu: koszyka na baterię, silników i przymocowanych do nich dwóch plastikowych kół o średnicy 90mm. Ponadto z przodu konstrukcji, przy pomocy czterech śrub, zamontowano koło samonastawne o średnicy 20mm w taki sposób, że jego oś znajduje się 35mm pod główną płytką, a jego kąt skrętu jest mechanicznie ograniczony przez śruby. Ostatnim elementem konstrukcji urządzenia jest płytka laminatu o wymiarach 60x60mm, będąca miejscem montażu elektroniki związanej z układem czujników. Przymocowano ją do większej płytki przy pomocy dwóch śrub tak, by znajdowała się na wysokości osi koła podporowego. Sensory są rozmieszczone w jednej linii, w odległości 10mm od sąsiadującego. Sygnał elektryczny pomiędzy płytkami przekazywany jest za pomocą pięciu przewodów. Maszyna napędzana jest przy pomocy dwóch silniczków DC Polulu (przekładnia 120:1, 120 obrotów na minutę) umieszczonych z tyłu konstrukcji- przymocowano je do płytki przy pomocy kleju. Przednie koło nie jest napędzane i pełni jedynie funkcję podporową. Zasilanie Robot zasilany jest przy pomocy sześciu baterii AAA 1.5V umieszczanych w koszyku. W celu zredukowania napięcia do wartości 5V zastosowano stabilizator L7805CV w układzie z kondensatorami 2x220μF i 2x100nF. Urządzenie nie posiada wyłącznika i by przerwać jego pracę należy odciąć zasilanie poprzez usunięcie baterii z koszyka. Włączone zasilanie sygnalizowane jest przez czerwoną diodę LED znajdującą się na głównej płytce. Elektronika Urządzenie jest sterowane przez mikrokontroler ATmega8. Zdecydowaliśmy się na wykorzystanie go ze względu na doświadczenie z programowaniem procesorów AVR zdobyte na uczelni, a także z powodu jego dostępności, popularności i ceny. W celu umożliwienia programowania robota, na płytce umieściliśmy złącze ISP Canada pozwalające na podłączenie programatora. Do pinów portu C mikrokontrolera (pełniących rolę wejść analogowych) podłączono zestaw trzech czujników optycznych CNY70. Wybraliśmy je ze względu na dostępność i sprawdzone działanie w tego typu konstrukcjach innych twórców. Sensory obsługiwane są przy pomocy multipleksowanego przetwornika analogowo-cyfrowego znajdującego się na wyposażeniu mikrokontrolera. Do sterowania silnikami wykorzystany został mostek H, w układzie scalonym L293D. Spowodowane jest to faktem, iż silnik pobiera zbyt dużo prądu by możliwe było sterowanie nim bezpośrednio z portu mikrokontrolera, ponadto mostek H umożliwia w prosty sposób kontrolę kierunku obrotów silnika. Schemat ideowy elektroniki robota dostępny jest w załączniku. Oprogramowanie Zestaw trzech czujników odbiciowych dostarcza informacji (w postaci napięcia) o przebiegu linii, informacja ta jest z kolei przetwarzana przez przetwornik analogowo-cyfrowy mikrokontrolera. Zwracana zmienna może przyjąć wartość od 0 do 255. Doświadczalnie wybraliśmy próg po przekroczeniu którego robot wykrywa ścieżkę- dzieje się to dla wartości powyżej 180. Przetwornik analogowo-cyfrowy ustawiono tam, by korzystał z wewnętrznego źródła napięcia odniesienia i wykorzystywał konwersję 8-bitową. Włączono również sprzętowe PWM, ale program nie ma możliwości sterowania mocą silnika. W zależności od konfiguracji odpowiedni sygnał jest wysłany do silników. Program sterujący robotem napisany został w języku C, poniżej przedstawiam jego schemat blokowy UML. Wnioski Zauważone problemy: - Obecne ustawienie czujników sprawia, że w pewnym zakresie świecą na siebie (nadajnik 1go transoptora świeci na odbiornik drugiego transoptora). Powoduje to pewne zakłócenie przy poruszaniu się na trasie- zwłaszcza w przypadku ostrych zakrętów; - Brak wyłącznika, można odwrócić robota do góry nogami lub wyjąć baterie. Możliwości rozwoju: - Zamontowanie wyłącznika, kontroli mocy silników i ustawienie progu wykrycia linii np. przez potencjometr; - Zamontowanie większej ilości czujników odbiciowych co zwiększy dokładność, można również zamontować dodatkowy czujnik, aby próg uzależnić od oświetlenia. Załącznik 1- schemat ideowy Załącznik 2- kod programu #include <avr/io.h> #include <util/delay.h> // diody #define DA_DIR #define DA_PORT #define DA #define DB_DIR #define DB_PORT #define DB //silnik prawy #define MP1_DIR #define MP1_PORT #define MP1 #define MP2_DIR #define MP2_PORT #define MP2 #define MPP_DIR #define MPP_PORT #define MPP //silnik lewy #define ML1_DIR #define ML1_PORT #define ML1 ML2_DIR |= ML2; MLP_DIR |= MLP; MLP_PORT |= MLP; MPP_PORT |= MPP; DDRC PORTC (1 << PC6) MP1_DIR |= MP1; MP2_DIR |= MP2; MPP_DIR |= MPP; DDRD PORTD (1 << PD0) DDRB PORTB (1 << PB0) DDRD PORTD (1 << PD6) /*Ustawienie sprzętowego PWM */ /* ATmeta8 1MHz, PWM 2.5kHz*/ ICR1 = 20; OCR1A =20; OCR1B = 20; TCCR1A=(1<<COM1A1)|(1<<COM1B1)|(1<<WGM11); TCCR1B=(1<<WGM13)|(1<WGM12)|(1<<CS10); DDRB PORTB (1 << PB2) return 0; } DDRD PORTD (1 << PD5) #define ML2_DIR #define ML2_PORT #define ML2 PORTD (1 << PD7) DDRD #define MLP_DIR #define MLP_PORT #define MLP PORTB (1 << PB1) int main() { DB_DIR |= DB; //czerwona Init_ADC(); pwm_init(); int L,P,S; DDRB #define prog 180 void Init_ADC(void) { ADMUX|=(_BV(ADLAR) | _BV(REFS0) | _BV(REFS1)) ; ADCSRA|=(_BV(ADEN) | _BV(ADPS2) | _BV(ADPS0)) ; ADCSRA&=~(_BV(ADSC)|_BV(ADIF) |(1<<5)|_BV(ADIE)|_BV(ADPS1)); } while(1) { L = Read_ADC(4) ; P = Read_ADC(5); S = Read_ADC(2); //ccc - do gory nogami if(L>prog && S>prog && P>prog ) { lewy(0,100); prawy(0,100); } int Read_ADC(int nr) { ADMUX = nr; ADMUX|=(_BV(ADLAR) | _BV(REFS0)) ; //bbb - zgubil trase if(L<prog && S<prog && P<prog ) { lewy(0,100); prawy(0,100); } ADCSRA|=_BV(ADSC); while(!((ADCSRA&_BV(ADIF))>>ADIF)); return ADCH; } int prawy(int kier,int moc) { if(kier == 1) { MP1_PORT |= MP1; MP2_PORT &= ~MP2; } if(kier == -1) { MP1_PORT &= ~MP1; MP2_PORT |= MP2; } if(kier == 0) { MP1_PORT |= MP1; MP2_PORT |= MP2; } return 0; } //ccb lewo if(L > prog && S>prog && P < prog) { lewy(0,100); prawy(-1,100); } //bcc prawo if(L < prog && S>prog && P > prog) { lewy(-1,100); prawy(0,100); } //bcb prosto if(L < prog && S>prog && P < prog) { lewy(-1,100); prawy(-1,100); } int lewy(int kier,int moc) { if(kier == 1) { ML1_PORT |= ML1; ML2_PORT &= ~ML2; } if(kier == -1) { ML1_PORT &= ~ML1; ML2_PORT |= ML2; } if(kier == 0) { ML1_PORT |= ML1; ML2_PORT |= ML2; } return 0; } int pwm_init() { ML1_DIR |= ML1; //cbb ostre lewo if(L > prog && S<prog && P < prog) { lewy(1,100); prawy(-1,100); } //bbc ostre prawo if(L < prog && S<prog && P > prog) { lewy(-1,100); prawy(1,100); } } } Załącznik 3- projekt płytki PCB- płytka główna Załącznik 4- projekt płytki PCB- płytka czujników