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

Podobne dokumenty