This is an old revision of the document!
Self Parking Robot
Introducere
Robotul propus este un robot controlat prin telecomanda cu posibilitatea de a executa manevre de parcare(laterala, cu fata sau cu spatele).
Scopul lui este atat de invatare pentru mine, dar si de a demonstra anumite mecanisme necesare masinilor autonome.
Ideea mi-a venit intr-o seara cand ma gandeam la posibile idei de proiecte. Nu am avut un motiv ulterior in spate pentru tema asta, doar mi s-a parut o idee interesanta si provocatoare din punct de vedere tehnic.
Acest proiect este o posibilitate foarte buna de invatare.
Descriere generală
Robotul este controlat folosind o telecomanda cu infra-rosu, acest semanl este procesat de un Arduino UNO, care trimite un semnal catre driverul de motoare care controleaza motoarele DC. La primirea unei anumite comenzi, microcontroller-ul incepe executia manevrei de parcare. Prima data cauta un loc potrivit(merge in fata pana da de un spatiu gol) se positioneaza conform algoritmului manevrei pentru care a primit comanda si incepe sa o execute pana ajunge la o distanta potrivita de marginile zonei delimitate. In timpul manevrei robotul nu mai poate primi alta comanda
Hardware Design
Piese necesare
Arduino UNO - microcontroler
Driver motoare - pentru a putea controla motoarele
Motoare DC - pentru deplasare
Senzori de distanta HC-SR04 - pentru a detecta obstacole sau puncte de referinta pentru parcare
Senzor infrarosu - pentru control de la distanta
Telecomanda
Suport baetrii 6V - pentru curentul catre driver
Pin out
PD0, PD1 - senzor ultrasonice fata, e convenabil dpdv al firelor
PD2, PD4 - senzor ultrasonice lateral, e convenabil dpdv al firelor
PD11, PD12 - senzor ultrasonice spate, e convenabil dpdv al firelor
PD13 - senzor infrarosu, e convenabil pentru fire
PD3, PD5 - motor A, pentru ca sunt pini cu PWM si sunt convenabili ca pozitionare
PD6, PD9 - motor b, pentru ca sunt pini cu PWM si sunt convenabili ca pozitionare
Schema electrica
Software Design
Prezentarea uneltelor folosite
mediul de dezvoltare: PlatformIO(folosit initial) & Arduino IDE(folosit ulterior pentru facilizarea utilizarii IRremote)
pentru implementare am folosit libraria IRremote pentru controlul receiverului de infrarosu pentru a nu implementa protocolul NEC si Arduino.h pentru afisat pe seriala in general
Detalii de implementare
Pentru implementare am folosit o buna parte din laboratoare:
GPIO: cititul senzorilor de distanta si controlul directiei la moatoare
PWM: pentru controlul motoarelor
Intreruperi & Timere: ca sa citesc senzorii de distanta periodic
UART: pentru debug in special(am si o implementare proprie bazata pe laborator, dar nu a mers foarte bine asa ca am folosit utilitarul expus prin Arduino.h, dar o sa pun si aceast lab pentru ca am incercat sa fac o comunicare intre 2 arduino-uri prin UART, dar nu a mai fost nevoie)
Pentru a face o descriere succinta a arhitecturii proiectului am 3 componente principale:
motor: controlul motoarelor prin PWM si expune o interfata pentru controlul motoarelor usor de folosit abstractizand logica din spate
distance: pentru detectarea obstacolelor si referintelor pentru parcare
IRremote: pentru controlul robotului prin telecomanda
Aceste componente sunt unite in main.c
Detectarea obstacolelor
pentru detectarea distantelor folosesc 4 senzori de distanta cu ultrasonice
cand senzorul din fata sau cel din spate detecteaza un obiect forteaza oprirea robotului
pentru a detecta locurile disponibile pentru parcare folosesc senzorii din lateral si caut secventa urmatoare: ambii senzori detecteaza un obiect, doar senzorul din spate detecteaza un obiect, nici un senzor nu detecteaza un obiect, senzorul din fata detecteaza iar un obiect
prin acest algoritm simplu reusim sa gasim un loc liber si putem incepe manevrele de parcare
Algoritmul de parcare
Rezultate Obţinute
Rezultat final
* Rezultatul principal de care sunt cel mai mandru este ca am obtinut ceva care merge, folosind o buna parte din ce am invatat la laborator. Asta a fost si motivul pentru care am implementat folosind avr-c ca sa pot sa pun in aplicare si sa inteleg mai bine ce am folosit la laboratoare semestrul asta.
* Rezultatele sunt multumitoare, sure it's far from perfect si probabil o sa mai lucrez la acest proiect ca un mini proiect personal, dar in opinia mea e mult mai importanta calatoria si faptul ca am fost pus intr-un context pe care nu il stiam suuuper bine(partea de hardware)
Concluzii
* M-am confruntat cu destule dificultati pe parcurs, cateva dintre ele fiind:
* Am purtat lupta vietii mele cu driverele de motor, am schimbat 3 drivere: unul a venit ars si imi scotea pe un pin de input 5V, unul avea 4 pini de in care cereau pwm si am ramas rapid fara timere pe care sa calculez pwm-ul pentru ca aveam nevoie de timere si la receiver-ul de ir si la senzori cu ultrasonice si ultimul care a fost un succes(al 3-lea e mereu cu noroc)
* Si senzorii cu ultrasonice mi-au dat batai de cap si in special faptul ca eu aveam nevoie de 4
* Partea de lucru cu infrarosu a fost cam crancena si pana la urma am ajuns sa folosesc o librarie pentru ca era mai usor
* Dupa ce am trecut peste aceste probleme implementarea a fost straight-forward(aveam componentele separat testate si implementate si a trebuit sa le pun cap la cap)
* Implementarea curenta nu include toate incercarile si aproach-urile la care m-am gandit si care nu au mers(sa folosesc un singur pin de echo pt senzori de distanta, sa conectez 2 arduino-uri unul pentru senzori si unul pentru motoare, sa implementez algoritmul NEC pentru infrarosu, lipiturile facute, incercarea de a adauga un buzzer si led-uri pentru semnalizare) pe care le-am scos pentru ca nu functionau corect impreuna cu codul deja scris
* Experienta a fost fun si as mai repeta-o, dar ce as face mai bine ar fi:
organizare mai buna ca timp
scris de teste
sa incerc sa vin prima data cu un PoC inainte sa fac restul implementarii
sa imi setez asteptari la joase
Download
O arhivă (sau mai multe dacă este cazul) cu fişierele obţinute în urma realizării proiectului: surse, scheme, etc. Un fişier README, un ChangeLog, un script de compilare şi copiere automată pe uC crează întotdeauna o impresie bună

.
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:prj2009:cc:dumitru_alin.
Jurnal
Puteți avea și o secțiune de jurnal în care să poată urmări asistentul de proiect progresul proiectului.
Bibliografie/Resurse
Listă cu documente, datasheet-uri, resurse Internet folosite, eventual grupate pe Resurse Software şi Resurse Hardware.
Export to PDF