30042012 Wrocław STEROWNIKI ROBOTÓW ( PROJEKT ) ROBOT KLASY LINEFOLLOWER Prowadzący: Mgr inż Jan Kędzierski Wykonawca: Michał Chrzanowski 180588 Sterowniki robotów (projekt) Strona 1
1 Wstęp Celem projektu była konstrukcja robota mobilnego klasy linefollower W założeniu robot miał być jak najprostszy, płynnie podążający za linią Cała konstrukcja robota opiera się na laminacie jednostronnym, natomiast detekcja linii odbywa się za pomocą czujników odbiciowych Robot oparty jest na mikrokontrolerze Atmega 32 z rodziny AVR 2 Elementy składowe urządzenia: Mikrokontroler atmega32, 6 x czujnik odbiciowy CNY70, 1 x podwójny mostek H L293D, 1 x stabilizator liniowy 5V 7805CT, 2 x silnik DC HL149 z przekładnią 10:1, 1 x pakiet Li-pol Redox 74V 1300mAh, 1 x Wyświetlacz LCD WC1602K 2x16 ze sterownikiem HD4780, 8 x kondensator ceramiczny 100nF, 2 x kondensator elektrolityczny 220uF, 2 x rezystor 10kΩ, 1 x rezystor 47kΩ, 6 x rezystor 180Ω, 6 x rezystor 20kΩ, 1 x cewka 10uH, 1 x laminat jednostronny, 2 x koła Lego Technic, 1 x kółko podporowe plastikowe Pololu 3/8 Sterowniki robotów (projekt) Strona 2
3 Schemat elektroniczny układu Sterowniki robotów (projekt) Strona 3
4 Schemat płytki Rysunek 1 Schemat płytki z wymiarami [ mm] Rysunek 2 Zdjęcie wytrawionej płytki Sterowniki robotów (projekt) Strona 4
5 Rozwiązania konstrukcyjne 51 Czujniki odbiciowe Czujniki odbiciowe składają się z diody IR oraz z fotodetektora i zwracają różną wartość napięcia w zależności od podłoża, na które pada promieniowanie z diody Dla powierzchni białej czujniki zwracają około 0V (promieniowanie nie odbija się od powierzchni), natomiast dla powierzchni czarnej zwracane napięcie wynosi około 4V (promieniowanie odbija się od podłoża i trafia do fotodetektora) Tego typu czujniki najlepiej działają, gdy znajdują się blisko badanej powierzchni, dlatego czujniki w moim robocie znajdują się w odległości 05 mm lub mniejszej od powierzchni Jak widać na rysunku 2, pięć czujników jest zamontowanych wzdłuż jednej linii obok siebie w odstępach 5-milimetrowych Nad środkowym czujnikiem znajduję się dodatkowy szósty czujnik, który odpowiedzialny jest za wykrywanie ostrych zakrętów np zakręt pod kątem prostym W momencie gdy robot dojeżdża do kąta prostego, górny czujnik traci linię, natomiast boczne czujniki oraz środkowy nadal widzą linię W tym momencie robot wie, że dojechał do ostrego zakrętu i może podjąć odpowiednie działania Poniżej przedstawiam zasadę działania układu pomiarowego przy zakręcie o kącie prostym Rysunek 3 Zasada działania czujników przy ostrym zakręcie Na rysunku 0 oznaczają brak wykrycia linii, 1 oznaczają wykrycie linii Sterowniki robotów (projekt) Strona 5
52 Silniki DC Zastosowałem silniki HL149 przede wszystkim ze względu na cenę, oraz zastosowaną przekładnię 10:1, tak aby nie konstruować własnych przekładni Przekładnia 10:1 jest w zupełności wystarczająca dla tego typu robota Dodatkowym atutem tych silników jest fakt, że pracują na napięcie 6V, dzięki czemu nie musiałem stabilizować napięcia podawanego na silniki, ponieważ na mostku L293D jest spadek napięcia rzędu 15V, co przy zasilaniu 74V daje niemal idealną wartość zasilnia silników Prędkość obrotowa silnika na biegu jałowym wynosi 315 obrotów/min, co jest wartością bardzo małą w porównaniu z np mikrosilnikami Pololu Robot osiąga prędkość około 1 metr/sekundę 53 Zasilanie Li-pol 74 V Robot zasilany jest z pakietu 74V, przez co jak wspomniałem nie muszę stabilizować napięcia podawanego na silniki Stabilizuję tylko napięcie na 5V podawane na zasilanie logiczne układu 54 Podwójny mostek H L293D Zastosowany mostek H jest bardzo prosty w podłączeniu, ponieważ zawiera diody prostownicze wewnątrz obudowy, dzięki czemu nie potrzeba montować zewnętrznych diod prostowniczych w celu tłumienia chwilowej indukcyjności z silników Dodatkowo na mostku występuje spadek napięcia rzędu 15 V dzięki czemu nie muszę stabilizować napięcia na silniki Wydajność prądowa mostka wynosi 12 A (600mA na kanał), co jest wystarczające ponieważ maksymalny pobór prądu przez silnik wynosi 210mA 55 Wyświetlacz LCD Wyświetlacz LCD służył przede wszystkim do testów Finalnie jest wymontowany z pojazdu Sterowniki robotów (projekt) Strona 6
6 Rozwiązania programowe 61 Obsługa PWM PWM jest 8-bitowy, ponieważ jest to wystarczający zakres Natomiast preskaler jest ustawiony na wartość 1, tak aby PWM miał dużą częstotliwość Ustawienie poszczególnych rejestrów: TCCR1A = (1<<COM1A1) (1<<COM1B1) (1<<WGM10); TCCR1B = 1<<CS10; 62 Obsługa ADC Napięcie odniesienia jest ustawione na wewnętrzne napięcie 256V przede wszystkim ze względu na stabilność tego napięcia Nie stosuje żadnych dzielników napięcia, mimo, że napięcie 256V jest zbyt małe (czujniki zwracają około 4V, gdy znajdują się nad linią czarną) Różnica między białą powierzchnią, a czarną i tak będzie doskonale widoczna Przed dokonywaniem pomiarów z czujników przeprowadzam kalibrację czujników, która wygląda następująco: 1) Przed włączeniem zasilania, ustawiam robota na linii, w taki sposób, aby środkowe czujniki były nad czarną linią, a najbardziej zewnętrzne znajdowały się nad białą powierzchnią, 2) Następnie dokonuję pomiarów napięć i liczę średnią tych pomiarów, 3) Ostatecznie zwracam wartość, będącą progiem dla wykrycia linii: return bialy/2+czarny/2; Pomiary z ADC zapisuję do 8-bitowej liczby odczyt, gdzie każdy bit odpowiada każdemu kanałowi ADC ( w moim przypadku tylko 6 bitów, bo tyle mam czujników) Jeśli pomiar z ADC jest większy niż ustalony próg, wówczas czujnik znajduję się nad linią Ten stan jest oznaczany jako 1 i zapisywana pod odpowiedni bit: odczyt = (1<<k); Gdzie odczyt jest naszą 8-bitową liczbą, a dzięki parametrowi k ustalam wartość przesunięcia 1 Sterowniki robotów (projekt) Strona 7
63 Regulator PD Wartość uchybu ustalam na podstawie odczytów z czujników Wówczas sprawdzam każdy możliwy przypadek i ręcznie ustalam wartość uchybu Jeśli najbardziej zewnętrzny czujnik wykrywa linię (żaden z pozostałych nie) to wartość uchybu jest największa, jeśli środkowe czujniki wykrywają linię to uchyb jest zerowy Jeśli linia znajduje się z prawej strony robota uchyb jest dodatni, natomiast jeśli linia jest z lewej strony robota, uchyb przyjmuje wartość ujemną Takie ustalanie wartości uchybu jest potrzebne w celu sterowania silnikami w przód i tył switch(odczyt) { //jesli np nie ma linii lub nieznana konfiguracja to uchyb ma //wartosc poprzedniego int uchyb = blad_poprzedni; //przód case 0b001010: uchyb=0; break; case 0b000010: uchyb=0; break; case 0b001000: uchyb=0; break; //linia z prawej case 0b000001: uchyb=30; break; case 0b000101: uchyb=25; break; case 0b001111: uchyb=3; break; } //linia z lewej case 0b100000: uchyb=-30; break; case 0b110000: uchyb=-25; break; case 0b111010: uchyb=-3; break; Sterowniki robotów (projekt) Strona 8
Następnie mając już wartość uchybu wyliczam wartość poprawki z regulatora PD: pd = KP * blad + TD * d_uchyb; gdzie: #define KP #define TD 40 //stala_wzomocnienie 94 //stala_czasowa_d pd_uchyb jest to różnica między bieżącym błędem, a poprzednim, którą wyliczam po upływie jakiegoś czasu Realizuję to za pomocą dodatkowej zmiennej licznik, którą inkrementuję w głównej pętli main Jeśli licznik osiągnie ustaloną wartość to wyliczam tą różnicę if(licznik == ILE) { //roznica bledow po uplywie okreslonego czasu d_uchyb = blad - blad_pop; } //zapamietuje blad_pop dla D dla kolejnego wywolania blad_pop = blad; licznik = 0; Mając wyliczoną wartość z regulatora PD, mogę ustawić sterowanie silnikami: silniki(pwm_aktual + pd, PWM_AKTUAL - pd); Pierwszy parametr funkcji dotyczy silnika lewego, drugi parametr steruje silnikiem prawym Teraz w zależności od wartości tych parametrów, ustalam, czy silnik ma jechać do przodu (wartość >0), zatrzymać się (wartość==0), czy jechać do tyłu (wartość<0) Aby ustalić poprawną wartość PWM biorę wartość bezwzględną z tych parametrów 7 Podsumowanie Jest to mój pierwszy robot tego typu więc jestem zadowolony z rezultatu jaki udało mi się osiągnąć Robot płynnie porusza się po linii oraz jest estetyczny Jedyne co bym zmienił to silniki, ponieważ prędkości oraz rozmiar silników pozostawiają wiele do życzenia W przypadku większych środków finansowych zastosowałbym silniki Pololu 10:1 ze względu na małe gabaryty i dużą moc Sterowniki robotów (projekt) Strona 9
8 Bibliografia 1 Datasheet atmega 32 http://wwwatmelcom/images/doc2503pdf 2 Datasheet mostek H L293D http://wwwticom/lit/ds/symlink/l293pdf 3 Datasheet czujnik odbiciowy CNY70 http://wwwvishaycom/docs/83751/cny70pdf http://botlandcompl/optyczne/52-cny70-transoptor-odbiciowyhtml 4 Krótki opis PID http://wwwforbotpl/forum/topics20/programowaniepraktyczne-zastosowanie-regulatora-pid-w-robotyce-vt3655htm 5 Linefollower przykładowy http://wwwforbotpl/forum/topics33/projekt-linefollowera-vt6917htm?postdays=0&postorder=asc&highlight=pakiet&start=0 6 Wykrywanie linii http://wwwwrighthobbiesnet/guides/linefollowerhtm Sterowniki robotów (projekt) Strona 10
9 Zdjęcia Sterowniki robotów (projekt) Strona 11