Line follower

Pană Ştefan, 332CC

Introducere

Robot cu două motoare care urmăreşte o linie de culoare neagră (având fundalul de culoare albă).

Descriere generală

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).

Hardware Design

Componentele robotului sunt:

  • Arduino UNO
  • Kit şasiu maşină 2 roţi
  • Senzor inflaroşu QTR-8A
  • Shield cu driver de motoare L293D
  • Baterie 9V
  • Fire de legătură

Design-ul circuitului în Tinkercad

Astfel, o baterie de 9V este suficientă pentru a alimenta întregul circuit.

Software Design

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:

  • am fost limitat de placa Arduino UNO în a folosi maxim 6 senzori analogi;
  • am folosit cel mai mic număr impar mai mic decât 6 deoarece am vrut să am doar un senzor în mijloc drept reper la poziţia robotului faţă de linia neagră.

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

Rezultate Obţinute

După multe reglaje fine ale coeficienţilor proporţionali şi derivativi am ajuns la un rezultat favorabil, după cum se vede şi în următorul material video.

Link video: https://youtu.be/VJ0_tYIkoIA

Circuitul a fost construit dintr-o placă de pal pe care am lipit cu scotch dublu adeziv o foaie de hârtie albă de 1m x 1m. Ulterior am lipit pe foaia de hârtie bandă izolatoare de culoare neagră pentru a crea un traseu sinuos.

Galerie Foto (robot + circuit)

Concluzii

A fost o experienţă interesantă în care am învăţat să lipesc componente, să gândesc scheme electrice pentru un proiect real şi să mă descurc în situaţii limită (cu 4 zile înainte de deadline mi s-a stricat puntea H L298N şi am fost nevoit să o schimb cu un shield pentru motoare L293D, astfel că atât partea de hardware cât şi partea de software a fost afectată).

Sunt mulţumit că am reuşit să pun robotul în mişcare şi să văd cum o bucată de cod scrisă de mine are corespondent în viaţa reală.

Download

Jurnal

24 Aprilie 2022: Am dat comandă de piese

27 Aprilie 2022: Comanda a ajuns

5 Mai 2022: Am început să testez piesele pentru a vedea că acestea merg conform specificaţiilor

9 Mai 2022: Am început să caut metode eficiente de line following, rezumându-mă în final la metoda PD

23 Mai 2022: Am întâmpinat probleme cu puntea H pentru motoare (L298N) şi am decis să schimb componenta cu un shield L293D

24 Mai 2022: Pentru prima data robotul a urmărit linia

25 Mai 2022: Reglaje pentru componentele proporţionale şi derivative

26 Mai 2022: Continuarea reglajelor

27 Mai 2022: Finalizare documentaţie pe wiki

Bibliografie/Resurse

pm/prj2022/bogdanc/line-follower.txt · Last modified: 2022/05/27 14:46 by stefan.pana
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0