Autorul poate fi contactat la adresa: Login pentru adresa
Robotul de tip LineFollower este un robot clasic, care urmareste o linie neagra pe un fundal alb (sau invers, depinzand de variantii). Scopul acestuia este de a termina circuitul intr-un timp cat mai scurt. Am ales acest proiect, intrucat am mai facut roboti asemanatori, insa niciodata programati direct in C pe registrii (AVR) si ma astept ca acest lucru sa fie un “challenge”. In urma acestui proiect sper sa imi extind intelegerea asupra procesarii datelor de catre un robot de LineFollower intrucat acest limbaj este mai apropiat de procesor decat limbajul folosit inainte (Arduino).
Microcontroller ATMEGA 328
Modul cu Driver de Motor Dual (L298N)
Bară de Senzori Infraroșu Reflectivi (QTR-8A)
7805 (la care am renuntat pana la urma, intrucat era inclus in driver)
2 motoare (10:1)
2 roti
1 baterie 12V
1 sasiu (pcb taiat)
1 Ball Caster
pini tata-tata
fire mama-mama si fire simple
1 dioda
suruburi + piulite
Software-ul robotului a fost creat in Notepad++, compilat in cmd folosind WinAVR si uploadat pe placuta folosind HIDBootFlash.
Algoritmul programului este unul destul de simplu. Se citesc senzorii, se calculeaza eroarea si se dau pe motoare valorile necesare pentru a corecta eroarea. Initial am vrut sa implementez si algoritmul PID, insa intrucat viteza roborului este relativ mica, iar oscilatiile mici, am renuntat la idee.
Pentru calculul erorii, am creat un vector cu ponderi (factor[8] = {-3*k, -2*k, -1*k, -0, 0, 1*k, 2*k, 3*k}), unde k=7 (ales dupa cateva incercari). Programul va citi inputul de pe pini, iar daca pe pinul i vede “negru”, va adauga la eroare (initial 0) factor[i].
Am creat, de asemenea, o functie de PWM de mana (am scris mai jos de ce nu am folosit PWM clasic) in care, un interval de timp de 20 ms l-am impartit in p ms is 20-p ms. Pentru p ms activez pinul de output specific motorului si sensului pe care il vreau, iar pentru 20-p ms, il sting. Am scris aceasta functie de 4 ori, pentru fiecare pin. Programul apeleaza functia specifica folosind motorRightForward(7 - err) si motorLeftForward(7 + err). Astfel, daca linia este in dreptul senzorilor din dreapta, atunci err>0, iar motorul din stanga va da mai multa viteza, iar cel din dreapta mai putina; daca linia este in dreptul senzorilor din stanga, atunci err<0, iar motorul din stanga va da mai putina viteza, iar cel din dreapta mai multa. Cu cat err este mai mare in modul, cu atat diferenta va fi mai mare.
Am abordat de asemenea 2 cazuri speciale:
→ toti senzorii citesc “negru”: exista deci o portiune de traseu unde 2 linii se suprapun, asa ca robotul va merge inainte, cu aceeasi viteza pe ambele motoare
→ toti senzorii citesc “alb”: robotul a pierdut linia. Pentru a reajunge pe linie, verificam valoarea lui err (inainte sa o suprascriem) si avem 2 cazuri:
Nota: Am incercat 1 zi intreaga sa fac PWM-ul sa mearga asa cum este prezentat in laborator, insa nu a mers de niciun fel (ori motorul nu mergea deloc, ori la putere maxima). Am cautat alte tutoriale pe net, am discutat cu colegi ce foloseau acelasi driver de motoare, insa nimic. Mi-am prezentat problema catre 2 laboranti diferiti, insa nu am reusit sa identificam problema impreuna. Unul dintre ei mi-a recomandat insa sa scriu PWM-ul de mana, ceea ce am si facut pana la urma (chiar daca este o solutie mai “urata” dpdv al implementarii).
Robotul final este unul functional, chiar daca arata ca o caramida (de aici si numele).
Am mai facut 2 LineFollower-uri pana acum (folosind Arduino ProMini insa), asa ca nu prea am avut probleme la partea de hardware, ba chiar am incercat sa o simplific cat mai mult posibil. Problemele de la partea de software au constat in principal in a face PWM-ul sa mearga, care a esuat. Nici acum nu stiu de ce nu functioneaza. Per total, proiectul a fost unul interesant, care m-a fortat sa invat sa programez un microcontroller, chiar si atunci cand nu am “wrapper-ul” Arduino care sa ma ajute.
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:prj2017:avoinescu:dumitru_alin.
Laboratorul de PM cu PWM: http://cs.curs.pub.ro/wiki/pm/lab/lab3
Tutoriale de PWM gasite pe internet, dintre care, mai importante:
→ http://robotika.yweb.sk/skola/AVR/visionrobo%20com/PWM%20in%20AVR%20v1.0.pdf
→ http://maxembedded.com/2012/01/avr-timers-pwm-mode-part-ii/
Documentatie L298N: https://tronixlabs.com.au/robotics/motor-controllers/l298n-dual-motor-controller-module-2a-australia/