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