Autorii pot fi contactati la adresele: Login pentru adresa
Proiectul consta in crearea unui robot al carui scop este sa se deplaseze cat mai precis de-a lungul unei linii.
Pentru detectarea liniei sunt folositi 3 senzori infrarosii. Datele furnizate de acestia sunt ajustate cu ajutorul convertorului analog-digital integrat microcontroler-ului. Robotul se deplaseaza cu ajutorul a doua motoare plasate lateral, viteza lor fiind variata cu ajutorul mecanismului de PWM(implementat prin intermediul timer-elor inerente microcontroller-ului). Rotirea acestuia este realizata prin actionarea in sens invers a celor doua motoare in functie de unghiul cotiturii. Miscarea propriu-zisa se face dupa urmatorul algoritm:
- daca a fost activat doar senzorul stang sau cel stang si cel central se opreste roata stanga si cea dreapta se invarte inainte
- daca a fost activat doar senzorul drept sau cel drept si cel central se opreste roata dreapta si cea stanga se invarte inainte
- daca nu este activ niciun senzor robotul cauta alternativ linia in ambele directii
- daca e activ doar senzorul central se deplaseaza inainte
- daca sunt activi toti senzorii sau doar cei externi se continua actiunea precedenta
Lista componente:
1 x cadru
1 x driver motor: DRV8833 Dual Motor Driver Carrier
1 x bara de 3 senzori: QTR-3A
2 * motoare 6V (incluse in pachetul cadrului)
2 x roti
1 x roata spate
3 x baterie 1.5V (pentru alimentarea placii)
1 X baterie 9V (pentru alimentarea motoarelor)
Schema electrica:
Am folosit avr-gcc si Programmer's Notepad. Am conectat cei 3 senzori la primii trei pini de pe portul A. Am folosit adc-ul cu prescaler-ul setat la 128 pentru a citi datele de la senzori. Pentru a controla motoarele folosim timerele 0 si 1. Amandoua timerele functioneaza in modul phase correct PWM cu prescaler 1 si numara pana la 256 (timerul 1 este setat sa functioneze doar pe 8 biti). Driver-ul de motoare este conectat la PD4 si PD5 (timer 1) pentru un motor si la PB3 si PB4 (timer 0) pentru celalalt motor. Fiecare motor va primi mereu 0 de pe un pin si semnal PWM de pe celalt. In functie de pin-ul pe care primeste semnal se roteste intr-o directie sau in cealalta.
Programul asteapta initial o apasare pe buton pentru a porni. Dupa ce a pornit, intra intr-o bucla infinita in care:
-citeste valorile intoarse de cei 3 senzori
-considerand ca o valoare de cel putin 512 inseamna ca un senzor e pe linie, analizeaza in care din cele 8 cazuri posibile se afla si calculeaza vitezele motoarelor (viteza este un float intre -1 si 1, unde 1 inseamna viteza maxima inainte si -1 inseamna viteza maxima inapoi)
-modifica factorii de umplere ai timerelor pentru a seta motoarele la vitezele calculate
Am obtinut un line follower functional, dar cam lent si care nu merge prea bine la curbe bruste.
Ar fi trebuit sa luam o bara cu 8 senzori, pentru ca doar cu 3 nu se poate face un line follower prea bun. La o curba brusca sau o intersectie, cei trei senzori nu mai sunt de ajuns.
Trebuia sa luam si motoare mai bune pentru ca cele pe care le-am folosit au o putere foarte mica. Motoarele se misca incet pana si in linie dreapta si cum se consuma putin bateria nu se mai misca aproape deloc. In plus, nici nu am putut sa controlam mai fin cat de repede sa se miste motoarele si eventual sa facem PID tinand cont ca deja sub 90% motoarele nu se mai miscau.
Ziua 1 - 20.05.2015
Planuiam sa conectam driver-ul de motoare si senzorii. Am constatat ca datasheet-ul driver-ului este un pic diferit fata de ce cumparasem noi. In consecinta ne-am limitat la o analiza a modului in care vom continua cu acest proiect.
Ziua 2 - 21.05.2015
Am conectat senzorii. Am citit date de la acestia pentru a ne asigura ca functioneaza corect si ca stim sa-i folosim. Am incercat sa testam si motoarele, dar am conectat prin driver-ul de motoare bateria de 9V si la microcontroller. Pe langa aceasta am gresit parametrii PWM-ului si nu am setat pinii corespunzatori ca output. Din cauza modului in care transportam robotul am fost nevoiti sa deconectam aproape toate firele inainte de plecare.
Ziua 3 - 22.05.2015
Am conectat driver-ul de motor cum trebuie si am testat functionalitatea motoarelor. Planul nostru initial era sa folosim timer-ul 1 si timer-ul 3 pentru a controla cele doua motoare. Nu am reusit sa controlam timer-ul 3, motiv pentru care ne-am hotarat sa recurgem la urmatorul compromis: folosim timer-ul 1 in modul pe 8 biti si timer-ul 0. Nu am reconectat senzorii deoarece acestia trebuiau pozitionati foarte aproape de sol si nu aveam un distantier in acel moment. Am incercat in schimb sa scriem un algoritm de line following, fara a-l testa.
Ziua 4 - 23.05.2015
Am conectat definitiv placa cu circuite pe suportul robotului. Pentru aceasta am folosit o placa de plastic plasata deasupra suportului. Pentru a nu atinge circuitele am folosit 4 distantieri. Peste aceasta placa de plastic am plasat placuta cu circuite. Am distantat placuta de circuite de placa de plastic cu ajutorul unor bucati de carton folosite pe post de distantieri.
Ziua 5 - 26.05.2015
Am pornit de la algortimul de line following implementat in ziua 3. Am modificat diversi parametrii, am imbunatatit algoritmul. Ne-am confruntat cu probleme semnificative la rotirea in curbe. Am testat robotul pe un circuit din robolab, constatand ca acesta functiona in general corect, mai putin in intersectii(trebuia ajustat algoritmul).
Ziua 6 - 28.05.2015
Am incercat sa ajustam parametrii algoritmului la care am ajuns in ziua 5. Am rezolvat problemele de miscare la intalnirea intersectiilor. Am modificat algoritmul in felul urmator: daca robotul ajunge sa iasa in totalitate de pe linie(cu toti senzorii in afara) el se va roti alternativ in stanga si in dreapta in cautarea liniei. Nu am putut face robotul sa se intoarca corect in curbe de 90 de grade(acest lucru s-a dovedit a fi aproape imposibil de realizat cu doar 3 senzori destul de apropiati unul de celalalt). Am hotarat sa-l lasam in acest stagiu datorita lipsei componentelor electronice necesare pentru imbunatatirea algoritmului si din rationamente de timp.
ATMega324PA Datasheet: http://cs.curs.pub.ro/wiki/pm/_media/doc8272.pdf
DRV8833 Datasheet: https://www.pololu.com/file/download/drv8833.pdf?file_id=0J534