This is an old revision of the document!
Pană Ştefan, 332CC
Robot cu două motoare care urmăreşte o linie de culoare neagră (având fundalul de culoare albă).
Proiectul constă în implementarea unui robot care urmărește o linie neagră cu ajutorul unui senzor infraroșu care detectează poziţia robotului față de linia pe care o urmează. Acesta poate fi utilizat în fabrici pentru mutarea diverselor obiecte eficient și autonom (evident, robotul utilizat într-o fabrică are un șașiu de dimensiuni mai mari și este mai rezistent la greutate).
Schema bloc:
Astfel, placa de dezvoltare Arduino UNO primeşte informaţii legate de poziţia robotului de la senzorii cu infraroşu. În funcţie de aceste valori placa trimite mai departe informaţii către driver-ul de motoare L293D care acţionează cu viteze diferite cele 2 motoare (stângul, respectiv dreptul).
Componentele robotului sunt:
Design-ul circuitului în Tinkercad
Astfel, o baterie de 9V este suficientă pentru a alimenta întregul circuit.
Pentru început am verificat că fiecare piesă merge conform specificaţiilor folosind exemple din bibliotecile oficiale (AFMotor de la Adafruit pentru shield-ul L293D şi QTRSensors de la Pololu pentru senzorii IR). Ulterior am citit documentaţiile acestor biblioteci pentru a vedea ce funcţii îmi oferă.
Am ales să implementez un algoritm care foloseşte componente proporţionale şi derivative (algoritm PD) deoarece acesta are o acurateţe şi o viteză mult mai mare decât metodele clasice care folosesc unul sau doi senzori. Un dezavantaj al acestei metode este faptul că în funcţie de: dimensiunea roţilor, puterea motoarelor, greutatea robotului, distanţa la care este amplasat senzorul IR faţă de roţi; trebuie reglate componentele KP şi KD (denumite astfel în codul ce urmează a fi prezentat) pentru ca robotul să aibă un control cât mai optim.
Astfel, am ales să folosesc 5 senzori din cei 8 disponibili din 2 motive:
Pentru a putea utiliza cât mai eficient senzorii IR, înainte ca robotul să poată urmări linia acesta trebuie calibrat manual (am folosit exemplul din fişierul “QTRAExample” al bibliotecii QTRSensors pentru a calibra robotul).
După calibrare, cu ajutorul funcţiei “readLine” din aceeaşi bibliotecă aflu poziţia în care se află linia neagră faţă de senzorii folosiţi (eu folosesc senzorii 2, 3, 4, 5, 6, senzorul 4 fiind cel din mijloc).
Astfel, calculăm eroarea ca fiind pozitia (o valoare de la 0 la 4000, ca în figura din partea dreaptă) - 2000 (valoarea senzorului din mijloc). Calculăm viteza cu care va trebui crescută/scăzută (în funcţie de poziţie) viteză motorului stâng, respectiv drept cu ajutorul componentelor proporţionale şi derivative menţionate anterior.
De asemenea, mă asigur că vitezele celor două motoare stau în parametri normali de funcţionare (viteza curentă este mai mică decât viteza maximă şi mai mare decât 0).
După ce mă asigur că vitezele sunt în parametri normali de funcţionare setez vitezele celor două motoare folosind funcţia “setSpeed” din biblioteca AFMotor iar apoi setez cele două motoare să meargă înainte folosind funcţia “run” din aceeaşi bibliotecă şi dând ca parametru keyword-ul “FORWARD”.
Surse: panastefan_linefollower.zip
Fişierele se încarcă pe wiki folosind facilitatea Add Images or other files. Namespace-ul în care se încarcă fişierele este de tipul :pm:prj20??:c? sau :pm:prj20??:c?:nume_student (dacă este cazul). Exemplu: Dumitru Alin, 331CC → :pm:prj2009:cc:dumitru_alin.