SPRAWOZDANIE
Transkrypt
SPRAWOZDANIE
Grupa I5a (poniedziałek godz. 8:00) Poznań dn. 08.06.2008r. SPRAWOZDANIE Architektura systemów komputerowych – projekt robota WYKO NANI E : Tomasz Stróżyk Kamil Piska Paweł Skrzypek Jakub Kaczmarek Tomasz Skowroński 80150 80125 80144 80072 80143 Strona 1 z 9 1. Wymagania ogólnie projektu. Robot powinien pokonywać trasę o kształcie litery S, składającą się z białych kartek. W przypadku wyjechania poza trasę powinien sam na nią wrócić. Robot powinien być wykonany w dwóch wersjach: - autonomiczny robot obsługiwany poprzez port LPT podłączony do komputera - autonomiczny robot obsługiwany poprzez mikrokontroler 8-bitowy Rys 1. Robot w czasie budowy Rys 1a. Robot w czasie budowy Rys 1b. Robot w czasie budowy Strona 2 z 9 2. Schemat budowy robota, oraz jego obsługa poprzez port LPT. Rys 2. Schemat podłączenia silników Powyższy schemat pokazuje podłączenie silników. Jeden silnik (podłączony pod piny D4, D5) odpowiedzialny jest za poruszanie pojazdu przód/tył, natomiast drugi silnik (piny D2, D3) wykonuje skręty. Do sterowania każdym silnikiem wykorzystujemy po dwie pary tranzystorów (PNP i NPN), które po otrzymaniu napięcia z pinu na porcie LPT, przekazują napięcie z baterii do silnika. Przedstawię teraz poszczególne kombinacje sygnałów na pinach i reakcję robota (W celu uproszczenia przyjmiemy, że napięcie na danym pinie oznaczamy 1, brak napięcia 0): D2=1; D3=0 Skręt w lewo D2=0; D3=1 Skręt w prawo D2=0; D3=0 Brak skrętu D4=0; D5=1 Jazda w tył D4=1; D5=0 Jazda w przód D4=0; D5=0 Postój Strona 3 z 9 Rys 3. Układ sterujący pracą silników Czujniki: Do wykrywania białego podłoża wykorzystaliśmy czujniki firmy SEEKA, zasilane baterią 9 voltową, które reagują (zależnie od ustawienia) na biały/czarny kolor wysyłając na wyjście 9 volt. Do przekazania sygnału na port LPT wykorzystaliśmy przekaźniki 9 voltowe. Do cewki z każdego mamy podłączone wyjście z każdego czujnika, a do przekazywania napięcia użyliśmy jeden ze styków portu danych (dokładnie D1). Z przekaźników informacje o wyjechaniu poza trasę są przesyłane przez wejścia 12 (lewy czujnik), 13 (prawy czujnik), 10 (jeżeli którykolwiek wykryje stan niepożądany). Poniżej schemat sterowania czujnikami: Rys 4. Seeka GSZ3S Rys 5. Schemat podłączenia czujników Strona 4 z 9 Rys 6. Czujnik w naszym robocie Program obsługujący robota: Do napisania programu użyliśmy języka Delphi, a nie C, z jednego powodu, a mianowicie istnieje biblioteka w języku Delphi (ZLPortio), która w miarę prosty sposób pozwala obsługiwać porty LPT w systemie WINDOWS XP. Kod programu: unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Zlportio, StdCtrls, ExtCtrls; var Form1: TForm1; const LPTdata=$378; LPTdata2=$379; // Port danych // Port statusowy implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); begin if ZLIOStarted then Label1.Caption := 'Sterownik załadowany poprawnie.' else Strona 5 z 9 Label1.Caption := 'Nie można załadować sterownika.'; end; procedure TForm1.Timer1Timer(Sender: TObject); var b,c:byte; begin while True do begin b:=portreadb(LPTdata2); // czytamy bieżącą wartość if(b=111) then c:=20 //robot wyjechał na prawo, skręć w lewo else if (b=95) then c:=24 //robot wyjechał na lewo, skręć w prawo else c:=16; // jedź prosto portwriteb(LPTdata,c); // wpisujemy nową wartość Label2.Caption:=IntToStr(b); // kontrolnie wypisujemy liczbę end; end; end. 3. Robot sterowany za pomocą mikrokontrolera. Mikrokontroler Do obsługi robota użyliśmy mikrokontrolera AVR - „Atmega8-16PU”. Jest to 8-bitowy mikrontroler produkowany przez firmę ATMEL. Jest zasilany 5 voltami, posiada 3 porty (PB, PC, PD), możliwość ustawiania zgłaszania przerwania na zbocza lub sygnał. Jako układ jest tani, ma darmowe, aczkolwiek dobrze rozbudowane oprogramowanie. Do programowania użyliśmy języka C w kompilatorze WinAvr, a jako programator PonyProg2000 wraz z programatorem sprzętowym podłączanym pod port LPT „AVR PROG I – LPT”. Schemat połączenia programatora z mikrontrolerem (jak i schemat mikrokontrolera): Rys 7. Schemat połączenia mikrokontrolera i programatora Strona 6 z 9 Do obsługi robota użyliśmy następujących pinów (odpowieniki pinów LPT). Do czego służy Pin na LPT Pin na Atmega8 Skręt w lewo D2 (nr 4) PC0 (nr 23) Skręt w prawo D3 (nr 5) PC1 (nr 24) Jazda w przód D4 (nr 6) PC2 (nr 25) Jazda w tył D5 (nr 7) PC3 (nr26) Lewy czujnik PaperOut (nr 13) PD2/INT0 (nr 4) Prawy czujnik Select (nr 12) PD3/INT1 (nr 5) Napięcie na pinach INT pojawia się analogicznie jak w wersji z LPT, tylko tym razem napięcie bierzemy z napięcia całego układu. Układ z racji, że potrzebuje do działania 5V, jest zasilany wykorzystując port USB. Rys 8. Mikrokontroler i programator Strona 7 z 9 Program obsługujący robota #include <inttypes.h> #include <avr/io.h> #include <avr/interrupt.h> #define #define #define #define #define STOP 0 FORWARD 1 LEFT 2 RIGHT 3 BACKWARD 4 void go(int dir){ int prt = PORTC & 0xF0; switch(dir){ case FORWARD: prt=4; break; case LEFT: prt=5; break; skręconymi w lewo case RIGHT: prt=6; break; skręconymi w prawo case BACKWARD: prt=8; break; case STOP: prt=0; break; } PORTC = prt; } // jazda na przód // jazda na przód z kołami // jazda na przód z kołami // jazda w tył // stop void sensor_int(){ int sensor = (bit_is_set(PIND, 2) ? 0 : 2) + (bit_is_set(PIND, 3) ? 0 : 1); lewy int backMode,i ; start_int: switch(sensor){ case 1: go(LEFT); break; case 2: go(RIGHT); break; case 3: go(FORWARD); break; default: go(STOP) goto start_int; // +2 jeśli prawy // +1 jeśli // tylko lewy włączony //tylko prawy włączony //oba wyłączone break; } } ISR(INT0_vect){ sensor_int(); } ISR(INT1_vect){ sensor_int(); } //obsługa przerwań int main (void) { int prt = PORTC & 0xF0; unsigned int i,j=0; DDRC = 0x0F; //ustawienie 4 bitów sterujących silnikami w tryb 'OUTPUT' DDRD = 0; //ustawienie portu D (czujniki) w tryb 'INPUT' PORTC = 0; //ustawienie 0 na piny sterujące silnikami Strona 8 z 9 GIMSK |=_BV(INT0); GIMSK |=_BV(INT1); //ustawienie bitów w masce przerwań MCUCR MCUCR MCUCR MCUCR // obsługa przerwań zbocze // opadające, rosnące &= &= &= &= ~_BV(ISC11); _BV(ISC10); ~_BV(ISC01); _BV(ISC00); sei(); // włączenie obsługi przerwań while(1){ ; } return (0); } 4. Napotkane problemy. - pierwszym problemem okazało się wybranie sposobu napędzania robota oraz metody jego skręcania, pierwszym pomysłem było napędzanie przednich kół, z których każde mogło by się kręcić do przodu lub do tyłu co powodowało by skręt, jednak w końcu zdecydowaliśmy się na użycie jednego silnika do obsługi napędu tylnego i jednego do skrętu kołami tylnymi (zasada podobna do tych stosowanych w koparkach). - kolejnym problemem było to, że robot powinien jeździć, a jednak nie poruszał się (gdy podnosiło się go podnosiło to wtedy silniki działały i koła ruszały się), przyczyną tego problemu jak się okazało był za ciężki kabel LPT. - następnym problemem był zakup mikrokontrolera, po kupnie modelu poleconego przez sprzedawcę w sklepie (AT89C51 firmy Atmel) okazało się, że nie posiada on w pamięci bootloadera, który by pozwolił przesyłać dane bezpośrednio (tzn. przez MAX232) z RS-232, udało nam się to rozwiązać dokonując zakupu Atmega8-16PU. - ostatnim problemem o którym chcieliśmy napisać (bo było sporo więcej różnych pomniejszych problemików i kłopotów z którymi musieliśmy się zmierzyć w czasie etapów tworzenia robota) było rozwiązanie zasilania mikroukładu i programatora, które potrzebowały napięcia 5V, rozwiązaniem było wykorzystanie portu USB jako źródła napięcia. Strona 9 z 9