Line follower este un roboțel care poate să urmărească o linie neagră pe fundal alb. Am ales acest proiect pentru că ni s-a părut interesant să-l construim și implica atât parte hardware, cât și parte software. Pe viitor ne-am propus să îmbunătățim algoritmul folosit pentru a participa la RoboChallenge.
Descriere generală
Blocuri principale
Microcontroller Atmega16 (alimentarea plăcuței este la 9V, microcontrollerul este la 5V)
Driver motoare L298N
Bandă 8 senzori
Alimentări
Motoare
Schemă robot
Componente
plăcuță de baza realizată la laborator
driver pentru motoare (folosește L298N cu diode pe output pentru a limita curentul de inducție ce se poate genera)
magician robot kit (motoare, șasiu, roți)
o bară senzori linie (QTR-8A)
o baterie 9V
6 baterii 1.5V
suport pentru baterii
cablu conectare baterii
întrerupător
plăcuță de test (folosită ca suport pentru senzori)
fire de legătură
șuruburi
piulițe
clame de prins cablu
bandă dublu adezivă și bandă izolatoare
șofer
Materiale ajutătoare
Pistol de lipit cu tot ce este necesar
Multimetru
Mini-bormașină (am găsit una în jur de 30 de lei pe Maica Domnului la Conex Electronics)
Trusă de scule
Traseu pentru roboțel
Hardware design
Descriere componente
Plăcuță La plăcuța de baza realizată în laborator am mai adăugat un întrerupător pentru a opri/porni circuitul. Pentru alimentare folosim o baterie de 9V care este conectată la ISP-ul de pe placa de bază.
Kit robot L-am cumpărat de la Robofun. A fost ușor de montat și ușor de adaptat pentru a prinde toate componentele pe el
Driver motoare Am cumpărat un driver deja asamblat de la cei de pe RoboFun însă putem spune că aceasta a fost cea mai proastă decizie luată în construirea robotului. Driverul era special creat pentru Arduino UNO și a trebuit să îi facem mici modificări (întrerupt conexiuni, creat conexiuni noi) pentru a funcționa cum trebuie. Întrucât nu aveam experiență foarte multă am pierdut mai bine de o zi făcând debugging până să reușim să ajungem la o primă versiune funcțională. Mai jos este schematicul driverului modificat.
Senzori Senzorii sunt conectați pe portul A al microcontrolerului. Mai multe detalii despre senzori pot fi găsite la: 960
Conexiuni
Am încercat pe cât posibil să folosim aceleași culori pentru fire astfel încât să știm care și unde merg: portocaliu - motor stânga, galben - motor dreapta, GND - este mereu negru, conexiune senzori - gri
Bateria de 9V este conectată la ISP pentru a alimenta plăcuța de baza.
Pe portul A (PA0 → PA7) al microcontrollerului sunt conectați senzorii. Alimentarea senzorilor se face de pe plăcuța de baza.
Pe portul D al microcontrollerului sunt conectate semnalele de enable (PD4 și PD5 corespunzători cu pinii 6 și 11 de pe driver) pentru motoare și ground-ul pentru driverul de motoare. Alimentarea motoarelor se face separat de la cele 6 baterii de 1.5V puse într-un suport, însă este nevoie de GND și de la plăcuța de bază.
Pe portul C al microcontrellerului sunt cele 4 input-uri ale driverului (PC0, PC1, PC2, PC3 care corespund pinilor 5,7, 10 și 12 de pe driver).
Software design
Am folosit Ubuntu 12.04 pe 32 de biți. Ca editor am folosit Vim și pentru compilare am folosit Makefile-ul din primul laborator.
Pentru a desena schematicul am folosit Eagle, iar pentru schema bloc am folosit Gliffy.com
Pentru a încărca programul .hex am folosit avrusbboot (trebuie folosit sudo atunci când se încarcă programul)
La începtul programului se fac inițializările necesare (Timer1, PWM), iar apoi într-o bucla infinită se interpretează valorile obținute de la senzori.
Algoritmul este destul de simplu și implementarea acestuia nu ne-a luat foarte mult timp. Se citesc valorile de la senzori și în funcție de acestea se mărește puterea într-un motor sau în altul. În cazul în care se detectează linia neagra la senzorii din dreapta (senz. 4,5,6,7), roboțelul va merge spre dreapta, iar în caz contrar (senz 1,2,3,4) acesta va merge spre stânga.
Conținutul funcției care seteaza puterea din motoare este:
/* set motor power */void go(int speedLeft,int speedRight){/* left motor power */
OCR1A = speedLeft;
PORTC |=(1<< PC0);
PORTC &=~(1<< PC1);/* right motor power */
OCR1B = speedRight;
PORTC |=(1<< PC2);
PORTC &=~(1<< PC3);}
Testare
Testarea hardware a fost destul de greoaie. Inițial am montat totul fără să ne facem prea multe griji pentru conexiuni greșite însă a fost nevoie să desfacem și să luăm la puricat fiecare conexiune. Recomandăm folosirea multimetrului și testarea pe bucăți cât mai mici posibile.
Pentru a testa algoritmul am verificat întâi dacă răspunde bine la curbe, iar apoi am printat un traseu (se găsesc foarte multe pe Internet)
Mai jos este un filmuleț cu o versiune aprope finală
Rezultate obținute și concluzii
Realizarea roboțelului (drumuri până pe Maica Domnului, asamblat, debugging, testat, documentație) ne-a luat undeva în jur de 30 de ore
Roboțelul este funcțional: detecteaza linia și o urmărește destul de binișor, însă nu merge foarte repede.
Posibile îmbunătățiri ar fi: folosirea PID controller pentru a urmări linia mai bine și reducerea greutății.
A fost o experiență interesantă pe care am repeta-o.
Jurnal
Documentare
Cumpărat kit de robot, driver, senzori și suport pentru baterii (Robofun)