Line Follower

Autor

Introducere

Prin acest proiect imi propun realizarea unui robot de tip Line Follower folosind algoritmul PID. Acesta va putea urmari o linie neagra pe un fundal alb fara ajutor extern (va fi complet autonom). Pe langa aceasta functionalitate de baza, doresc sa pun si un senzor de distanta pentru a putea ocoli obstacolele de pe drum.

Descriere Generala

Cum Functioneaza

Pentru urmarirea liniei se folosesc senzori infrarosii care analizeaza intensitatea culorii din fata lor (intensitate mare = negru, intenistate mica = alb) si in functie de datele returnate de acestia, programul robotului calculeaza care e viteza care trebuie atribuita fiecarui motor, cu scopul de a remedia eventuala eroare de pozitie. Ocolirea obstacolelor se face in momentul in care senzorul de proximitate detecteaza un obiect la o distanta prea mica, programul intrand in functia de ocolire.

In exemplul alaturat, senzorii digitali transimt pozitia medie a liniei negre, aceasta fiind in dreapta centrului. Din aceasta cauza, A.I.-ul (inteligenta artificiala) robotului va atribui o viteza mai mare motorului din stanga si una mai mica celui din dreapta, virand astfel spre dreapta pana cand pozitia liniei va coincide cu cea a centrului.

Schema Bloc

Algoritmul de reglare PID

Algoritmul PID (Proportional Integral Derivativ) este unul din cei mai folositi algoritmi pentru regulatoare industriale, de exemplu pentru controlarea motoarelor, asigurand o performanta de reglare excelenta.

Un regulator PID calculeaza constant o anumita eroare intre starea actuala si starea dorita si aplica o corectie pe baza unei proportii, unei integrale si a unei derivate. Cu alte cuvinte, algoritmul raspunde automat cu o solutie pentru a reveni in starea dorita. De exemplu, regulatorul de viteza al masinilor foloseste acest algoritm; factorii externi, cum ar fi panta soselei influenteaza viteza masinii, dar algoritmul PID raspunde in cel mai optim mod pentru a reveni la viteza dorita.

In cazul robotului, acest algoritm analizeaza eroare de pozitie a centrului barei de senzori (pozitia oprima) si pozitia actuala a linei negre si gaseste cel mai efficient mod de a atribui viteze celor 2 motoare astfel incat sa revina la pozitia dorita.

Dezavantajul acestui algoritm este reprezentat de faptul ca cele 3 variabile (KP, KI, KD) se gasesc doar pe cale experimentala.

Hardware design

Lista Componente

  • Arduino Leonardo
  • Driver de motoare
  • Bara de 6 seznori
  • Senzor de distanta IR
  • 2 motoare electrice micro metal HPCB
  • Suport baterii
  • 6 baterii AA de 1.5V
  • Roti, fire, led, buton, etc

Design


Schema electrica

Software Design

Scopul robotului este acela de a completa traseul fara ajutorul utilizatorului, dar pentru a porni este nevoie de un input de la user. Aceasta interactiune (intre user si robot) se face prin intermediul unui buton (input) si a unui led (output). Folosind aceste 2 elemente putem programa diferitele etape de initializare ale robotului, aceste etape fiind semnalate prin utilizarea ledului.

Ca orice program scris pentru Arduino, acesta este impartit in partea de setup() si cea de loop().

setup()
In aceasta sectiune a programaului initializam pinii si asteptam input de la user.
Prima apasare de buton va porni functia de calibrare a senzorilor, necesara pentru ca acestia sa “inteleaga ce inseamna” alb, respectiv negru. Mai multe detalii in sectiunea calibrate()
A doua apasare de buton semnaleaza ca robotul a fost pus pe traseu si poate sa inceapa parcurgerea acestuia. Accest lucru se intampla la 1 secunda dupa apasare.

loop()
Aceasta este functia principala a robotuli care dicteaza toate actiunile luate.
In aceasta bucla, atat timp cat robotul inca nu a ajuns la linia de sosire, se verifica atat senzorul de distanta cat si bara de senzori IR. In cazul in care avem un obstacol in fata la o distanta suficient de mica, intram in rutina de ocolire.
Trebuie sa verificam si daca robotul a ajuns la capatul traseului, lucru realizat prin functia checkFinal().Mai multe detalii in sectiunea checkFinal()
In cazul in care nu trebuie sa ocolim un obstacol si programul nu s-a terminat, este nevoie sa analizam inputul senzorilor care citesc dunga neagra. In functie de eroarea fata de mijloc (valoarea 2500), folosind algorimtul PID calculam diferenta de viteza care trebuie sa existe intre cele 2 motoare. Dupa acest calcul se apeleaza metoda go() care atribuie fiecauri motor viteza calculata pentru a corecta eroarea.

calibrate()
Este folosita pentru a calibra bara de senzori. Acest lucru este realizat print treceri succesive ale senzorilor peste suprafata alba si cea neagra timp de 2.4 secunde. In urma acestei operatii, senzorii vor stii sa citeasca dunga neagra (valoarea 1000 pentru negru si 0 pentru alb).

checkFinal()
Folosita pentru verificarea conditiei de finish. Sfarsitul traseului este marcat printr-o line neagra groasa perpendiculara pe directia de mers. Cu alte cuvinte, daca primul si ultimul senzor citesc o valoare apropiata de 1000, inseamna ca am ajuns la lina de finish, iar programul se termina.

ocolire()
Rutina folosita pentru a ocoli obstacolul.

go()
Primeste ca argument viteza celor 2 motoare si o atribuie acestora.

Biblioteci
Pentru a putea interactiona cu bara de senzori am folosit biblioteca Zumo Shield, iar pentru buton am folosit biblioteca Push Button.

Codul a fost dezvoltat pe platforma Arduino 1.8.15 (IDE).

Rezultate Obţinute

Concluzii

Prin acest proiect am invatat mult mai multe despre ce inseamna sa proiectezi, construiesti si programezi un robot. Consider ca “El Toro” cum imi place sa il numesc (datorita coarnelor care tin senzorul de proximitate) isi atinge scopurile, dar recunosc ca ar putea fi imbunatatit.

Upgradeuri posibile

  • Materiale mai usoare
  • Marirea unghiului de atac prin marirea distantei dintre roti
  • O sursa de alimentare mai performanta (alt tip de baterii)
  • Ajustarea parametrilor algoritmului PID
  • Repozitionarea bateriilor pentru a face mai usor accesul la Arduino

Arhiva

Bibliografie/Resurse

pm/prj2021/amocanu/linefollower.txt · Last modified: 2021/06/03 10:56 by andrei.florescu2904
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