Line follower
Introducere
Proiectul are drept scop realizarea unei masinute care urmareste in mod independent un traseu format din linii negre pe un fundal alb.
Descriere generală
Placuta de baza realizata in cadrul laboratorului (ATMega16 MCU)
2 motoare comandate prin puntea H
6 senzori IR amplasati in partea frontala a masinii, cat mai aproape de motoare pentru a asigura precizia virajului
alimentarea se realizeaza folosind 12 baterii AAA (1.5V)
Hardware Design
Lista Piese
2 x 50:1 Metal Gearmotor 37Dx54L mm - 12 V: 200 RPM and 300 mA
placuta punte H : 4 x tranzistori IRF640 + 4 x tranzistori IRF9640 (pnp, npn) + 4 tranzistori BC547
placuta senzori 6xIR CNY70, 6 rezistente x 10 KOhmi, 6 rezistente x 220 Ohmi
placuta de baza conform specificatiilor din laborator (ATMega16 MCU)
12 x baterii AAA 1.5 V pentru alimenarea motoarelor si a microcontrollerului
2 x roti plastic
sasiu lemn
Schema electrica Punte H:
Schema Proteus Punte H:
Pentru aceasta placuta am folosit de fapt doua astfel de punti, cate una pentru fiecare motor. Legatura intre aceasta si placuta de baza este facuta prin portul C al microcontroller-ului
Schema Proteus placuta senzori:
Placuta de senzori este legata la microcontroller pe portul A al acestuia.
Software Design
Pentru aceasta etapa am folosit IDE-ul CodeVisionAVR pentru a automa anumite taskuri:
Pentru bootloader am folosit BootloadHID deoarece mi s-a parut mai usor de utilizat :
Nu necesita instalarea unui driver special de Windows
Este deja configurat pentru setup-ul folosit la proiect (Atmega16 @ 16MHz cu USB-ul conectat pe D+ → PD2, D- → PD3)
LED-ul de pe PD7 clipeste cat timp ne aflam in bootloader
Aplicatia porneste daca se apasa pe tasta conectata la PD6 sau daca trec 10 secunde fara activitate de programare pe USB.
Incarcarea unui program se face folosind programul bootloadHID.exe (inclus in arhiva bootloader-ului atasata in seciunea downloads).
Detalii implementare
Functii:
inainte(), inapoi() - ambele motoare rotesc in aceeasi directie
stanga(), dreapta() - un motor roteste intr-o directie, iar celalalt in directia opusa : utile pentru curbe stranse
half_dreapta(), half_stanga() - intr-un anumit moment de timp, functioneaza un singur motor (stanga/dreapta) : utile pentru curbe largi
read_adc() - implementeaza partea de achizitie de date: face conversia AD pentru unul din cele 6 canale disponibile (1 canal/senzor)
main(): initializarea porturilor I/O; setare clk 1 + clk 2, initializari intreruperi, determina si seteaza directia in functie de datele primite de la senzori: verifica daca valoarea adc(canal_senzor) este < 90 ⇒ culoare neagra (senzorul se afla pe traseu)
Pentru mai multe detalii, fisierul sursa a codului program este prezent in arhiva atasata in sectiunea Download .
Rezultate Obţinute
Am obtinut o masinuta line follower care poate urmari trasee ce pot contine curbe largi sau stranse. Desigur, precizia acestuia ar putea fi imbunatatita, deoarece motoarele functioneaza la viteza constanta/maxima.
Concluzii
Pentru imbunatatiri se poate utiliza PWM in controlarea motoraselor, obtinandu-se o viteza de rotatie variabila necesara urmaririi cu precizie a unui traseu foarte complex.
Download
Bibliografie