Line Follower and Obstacle Avoiding Car
Introducere
Prezentarea pe scurt a proiectului meu:
Proiectul consta intr-un robot de tip line-follower care poate sa ocoleasca anumite obstacole aparute in calea sa. Acesta urmareste un traseu bine definit, iar in cazul in care se intalneste cu un obstacol, il va ocoli, intorcandu-se inapoi pe circuit.
Scopul proiectului este de a fi folosit ca prototip pentru masini si roboti utili apoi in industrii precum agricultura sau constructii.
Ideea de la care am pornit are la baza un robot de explorare. Mai in detaliu, un robot care poate urmari o linie trasata pe teren si in acelasi timp sa evite obstacolele, cum ar fi roci sau arbori. Acest tip de robot ar putea fi utilizat in cercetarea terenurilor greu accesibile sau pentru a colecta date despre mediul inconjurator
Descriere generala
Un proiect de tipul line follower and obstacle avoiding implică construirea unui robot care poate urmări o linie trasată pe o suprafață plană, cum ar fi o bandă neagră sau o linie albă pe un fundal negru, și în același timp poate evita obstacolele care apar in cale.
Pentru a realiza acest proiect, voi avea nevoie de un ansamblu de piese, printre care se remarca: un microcontroller, senzori infraroșu sau senzori de proximitate pentru a detecta linia și obstacolele, motoare pentru a propulsa robotul și un algoritm de control care să permită robotului să urmeze linia și să evite obstacolele.
Hardware Design
Componente Hardware utilizate:
Placa de dezvoltare compatibila cu Arduino UNO R3
Doua roti
O a treia roata care nu este actionata de motor si se poate deplasa pe directia orizontala
Doua motoare TT ce pot fi dotate cu sistem de encoder
Patru baterii AA (1.5V) + dispozitiv de prindere
O baterie de 9V + dispozitiv de prindere
Senzor ultrasonic de distanta HC-SR04 + suport de prindere
Servomotor SG90
Doi senzori IR FC-123
Senzor IR Reflectiv Pololu QTRX-HD-06A
Driver Motor L298N
Mini Breadboard
Modul cu Buzzer activ
Fire mama-tata, tata-tata, mama-mama
Switch
Banda electrica izolatoare
Banda alba dublu adeziva
Conectori si suruburi
Sasiu
Header de pini (40buc)
Baterie externa
Schema Electrica
Conectare Senzor Ultrasonic HC-SR04
Pinul de GND este conectat la GND-ul de pe Arduino
Pinul de VCC este conectat la 5V de pe Arduino
Pinii de Trigger si Echo sunt conectati direct la Arduino pe pinul 6, respectiv pinul 7
Conectarea Servomotorului SG90
Conectarea Senzorilor IR FC-123
Pinii de GND si VCC sunt conectati la fel ca mai sus
Pinii de OUT sunt conectati direct la Arduino pe pinul 2, respectiv pinul 3
Conectarea Matricii de Senzori IR QTRX-HD-06A
Conectarea Senzorului de Buzzer
Conectarea Driver-ului Motor L298N
Primeste 6V de la baterie pe pinul de 12+, si GND tot de la aceasta
Primeste 5V de la Arduino pe pinul de 5+
Pinii de Input sunt conectati direct la Arduino pe pinii: 4, 5, 12 si respectiv 13
Pinii de Output sunt legati la cele doua motoarea TT.
Pinii de Enable sunt conectati direct la Arduino pe pinii de PWM: 10, respectiv 11
Alimentare
Arduino-ul impreuna cu toti ceilalti senzori sunt alimentati de o baterie externa, folosind conexiunea prin cablu USB
Driver-ul Motor L298N este alimentat de ansamblu de baterii AA
Software Design
Pentru a realiza partea de software, am folosit mediul de dezvoltare Arduino.
Codul il pot imparti in mai multe etape dupa cum urmeaza:
Etapa de initializare
Este inclusa biblioteca suplimentara «servo.h».
Sunt definiti majoritatea pinilor folositi in conformitate cu schema hardware.
Sunt declarate si initializate restul de variabile globale necesare in rezolvarea probei software.
Etapa de Setup
Este setata starea pinilor, si anume cea de OUTPUT, INPUT sau INPUT_PULLUP.
Este initializat si configurat un pin specific pentru a controla servomotorul.
Este atasata o rutina de intrerupere pentru ambii senzori de IR de pe margini.
Etapa de implementare a miscarii
Functiile: go_stop, go_forward, go_left, go_right, sunt foarte asemanatoare si indeplinesc acelasi scop: de a seta diferite viteze pe motoare si valori pe pinii corespunzatori.
Functia followLine se ocupa cu calcularea unor sume partiale pentru a decide directia in care sa se indrepte robotelul.
Sumele provin din valorile analogice ale pinilor de IR aflati pe matrice QTRX-HD-06A.
Functiile: turnObstacleRight si turnObstacleLeft se ocupa cu partea de ocolire a unui obstacol, folosindu-se la baza de functiile definite mai sus.
Etapa de identificare a unui obstacol
Sunt definite variabile locale care sa calculeze distanta si durata.
Urmeaza o secventa de cod care e menita sa genereze semnalul de trigger catre senzorul de ultrasunete.
Apoi este folosita functia de pulseIn pentru a extrage durata de timp necesara primirii unui puls sau impuls.
Intr-un final se poate aplica o formula matematica pentru a extrage distanta.(avand in vedere, o mica eroare)
Etapa de evitare a unui obstacol
Este actionat servomotorul sub trei unghiuri diferite menite sa acopere directiile: “stanga”, “dreapta”, si “fata”.
Datorita cablului USB care poate sa agate, am decis in teste sa realizez ocolirea numai pe partea dreapta.
Etapa de loop
Calculeaza distanta pana la obiect folosindu-se de functiile descrise mai sus.
Daca distanta obtinuta este mai mica decat o valoare de THRESHOLD, atunci avem un obstacol in fata si va trebui sa il evitam.
In caz contrar, robotul trebuie doar sa urmareasca linia.
Fotografii
Youtube
Concluzii
Acest proiect a reprezentat prima mea incursiune in lumea hardware si pot spune ca a fost o experienta cu suisuri si coborasuri. Am intampinat destul de multe probleme legate de alimentare. Dupa ce am reusit sa le rezolv pe acestea, au aparut altele noi, legate de senzorii IR, care s-au dovedit a fi montati intr-un spatiu mult mai restrans decat asteptarile mele. M-am stresat destul de tare cu acest proiect, insa sunt oarecum multumit de rezultatul final.
Download
Jurnal
21.04: Alegere tema
23.04: Crearea paginii de wiki
30.04: Prima comanda de piese de pe OptimusDigital
14.05: O prima incercare de asamblare a hardware-ului
15.05: O a doua comanda de piese de pe OptimusDigital
21.05: Implementarea unei parti a componentei software pentru testare
28.05: Construire pista si rezolvare de bug-uri
29.05: Finalizare pagina de wiki
Bibliografie/Resurse