Differences

This shows you the differences between two versions of the page.

Link to this comparison view

pm:prj2025:eradu:cristian.tudor1607 [2025/05/25 21:49]
cristian.tudor1607 [Bibliografie/Resurse]
pm:prj2025:eradu:cristian.tudor1607 [2025/05/30 04:56] (current)
cristian.tudor1607 [Jurnal]
Line 3: Line 3:
  
 Voi implementa un robot de aspirat. Spre deosebire de un Roomba adevărat, robotul de aspirat are forma unei mașinuțe, va folosi un senzor ultrasonic si un servomotor ca sa evite obstacolele,​ si va face viraje pe loc, deoarece fiecare roata va fi controlată independent folosind PWM.\\ ​ Pentru partea de aspirat, voi folosi o sticla ca suport și un motoraș cu ventilator.\\ ​ Voi implementa un robot de aspirat. Spre deosebire de un Roomba adevărat, robotul de aspirat are forma unei mașinuțe, va folosi un senzor ultrasonic si un servomotor ca sa evite obstacolele,​ si va face viraje pe loc, deoarece fiecare roata va fi controlată independent folosind PWM.\\ ​ Pentru partea de aspirat, voi folosi o sticla ca suport și un motoraș cu ventilator.\\ ​
-Considerând camera dreptunghiulară,​ robotul va încerca sa o parcurgă pe toată in zig-zag. Se deplasează înainte, pana de de un obstacol (peretele), moment în care virează, se deplasează lateral pe o distanță scurtă, si virează iar in aceeași direcție. Acum robotul o va lua înapoi, pe o noua banda de aspirat.\\ +Considerând camera dreptunghiulară,​ robotul va încerca sa o parcurgă pe toată in zig-zag. Se deplasează înainte, pana de de un obstacol (peretele), moment în care investighează direcțiile posibile, folosind senzorul ultrasonic, si alege calea cea mai libera.\\
 Scopul robotului e sa automatizeze curățenia prin casa.\\ Scopul robotului e sa automatizeze curățenia prin casa.\\
  
Line 12: Line 12:
 </​note>​ </​note>​
 ===== Descriere generală ===== ===== Descriere generală =====
- 
-<note tip> 
-O schemă bloc cu toate modulele proiectului vostru, atât software cât şi hardware însoţită de o descriere a acestora precum şi a modului în care interacţionează. 
- 
-Exemplu de schemă bloc: http://​www.robs-projects.com/​mp3proj/​newplayer.html 
-</​note>​ 
  
 == Schema bloc == == Schema bloc ==
Line 24: Line 18:
  
 ===== Hardware Design ===== ===== Hardware Design =====
- 
-<note tip> 
-Aici puneţi tot ce ţine de hardware design: 
-  * listă de piese 
-  * scheme electrice (se pot lua şi de pe Internet şi din datasheet-uri,​ e.g. http://​www.captain.at/​electronic-atmega16-mmc-schematic.png) 
-  * diagrame de semnal ​ 
-  * rezultatele simulării 
-</​note>​ 
  
 ==Lista de piese== ==Lista de piese==
Line 41: Line 27:
   * [[https://​www.optimusdigital.ro/​ro/​motoare-altele/​3265-motor-in-miniatura.html?​search_query=mini+motor&​results=101|Motor in miniatura 3-6V]]   * [[https://​www.optimusdigital.ro/​ro/​motoare-altele/​3265-motor-in-miniatura.html?​search_query=mini+motor&​results=101|Motor in miniatura 3-6V]]
   * [[https://​www.optimusdigital.ro/​ro/​elice/​12120-elice-pentru-jucarii.html?​search_query=elice&​results=129|Elice]]   * [[https://​www.optimusdigital.ro/​ro/​elice/​12120-elice-pentru-jucarii.html?​search_query=elice&​results=129|Elice]]
 +  * [[https://​www.itgalaxy.ro/​acumulator-extern/​joyroom/​jr-pbf12-10000mah-12w-1-x-usb-c-2-x-usb-a-negru-770632/?​gad_source=1&​gad_campaignid=20294441435&​gbraid=0AAAAAD84GZYJQYyTwte-AX6IZuU7X43yJ&​gclid=CjwKCAjwi-DBBhA5EiwAXOHsGchkSPpvP4oJ3iYhMdPkSbrDAXcBf_b503_fgRHLNAQVFNOCjLnBHxoCXdMQAvD_BwE| Powerbank]]
  
 ==Schema electrica== ==Schema electrica==
Line 50: Line 37:
     * M1 - D11     * M1 - D11
     * M2 - D3     * M2 - D3
-    * M3 - D5 +    * M3 - D5 (nu a fost folosit in varianta finala, dar e conectat prin shield) 
-    * M4 - D6+    * M4 - D6 (nu a fost folosit in varianta finala, dar e conectat prin shield) ​
  
 <​note>​ <​note>​
Line 70: Line 57:
  
 Servomotorul se leagă pe shield la S1, iar conform datasheet-ului:​ Servomotorul se leagă pe shield la S1, iar conform datasheet-ului:​
-    * Control (3) - D9 pe Arduino+    * Control (3) - D10 pe Arduino
     * VCC (2) - 5V pe Arduino     * VCC (2) - 5V pe Arduino
     * GND (1) - GND pe Arduino     * GND (1) - GND pe Arduino
 +
 +Bateriile se leagă la **EXT_PWR** de pe shield.
  
  
 ===== Software Design ===== ===== Software Design =====
- 
- 
-<note tip> 
-Descrierea codului aplicaţiei (firmware): 
-  * mediu de dezvoltare (if any) (e.g. AVR Studio, CodeVisionAVR) 
-  * librării şi surse 3rd-party (e.g. Procyon AVRlib) 
-  * algoritmi şi structuri pe care plănuiţi să le implementaţi 
-  * (etapa 3) surse şi funcţii implementate 
-</​note>​ 
- 
  
 ===Mediu de dezvoltare=== ===Mediu de dezvoltare===
Line 107: Line 86:
 === Structura codului === === Structura codului ===
 Robotul Roomba va funcționa pe baza unui FSM, cu următoarele stări: Robotul Roomba va funcționa pe baza unui FSM, cu următoarele stări:
-   * **Deplasare înainte** - starea ​în care robotul trebuie sa stea cât mai mult +   * **IDLE** - Stare de setup. Robotul este oprit și poziționează senzorul ultrasonic ​în poziția centrală. Trece apoi în starea de deplasare înainte (GO_FORWARD). 
-   * **Scanare mediu** - după observarea unui obstacol, ​robotul va încerca sa observe mediul înconjurător pe o raza scurtapentru ​decide ​in ce direcție e mai bine sa meargă +   * **GO_FORWARD** - Robotul se deplasează înainte continuu. La intervale regulate (CHECK_INTERVAL),​ măsoară distanța față de obstacol. Dacă distanța este sub un prag critic (CRITICAL_DISTANCE)trece în starea GO_BACKWARD. Dacă distanța este sub un prag mai mare (DIST_THRESHOLD)trece în starea OBSTACLE_DETECTED. Pragul critic scade șansa robotului de se bloca in colțuri sau locuri inaccesibile pentru el. 
-   * **Viraj la stanga** - starea in care se efectuează virajul la stânga +   * **GO_BACKWARD** - Robotul ​se deplasează înapoi pentru o perioadă fixă (BACKWARD_TIME) pentru a se distanța de obstacol. La finalul perioadei, trece în starea OBSTACLE_DETECTED. 
-   * **Viraj la dreapta** - starea in care se efectuează virajul la dreapta +   * **OBSTACLE_DETECTED** - Robotul oprește motoarele și pregătește scanarea mediului în jur pentru a decide o direcție sigură de deplasare. Trecerea ​se face către starea SCAN_ALL. 
-   * **Mișcare laterală** - pentru ​ca robotul va face un traseu in zig-zag, pentru a acoperi toată suprafața, e nevoie de mici mișcări laterale, ​de durată scurtă +   * **SCAN_ALL** - Robotul efectuează o scanare cu servomotorul în mai multe direcții ​pentru ​a colecta date despre distanțele în stânga, centru și dreapta. După scanare, trece în starea DECIDE_DIRECTION. 
-   * **Oprit** - starea in care se +   * **DECIDE_DIRECTION** ​Pe baza datelor scanaterobotul determină unghiul optim pentru a vira, calculând un offset față de poziția centrală ​servomotorului ​și durata necesară a virajului. În funcție ​de direcție, se trece în starea TURN_LEFT sau TURN_RIGHT. 
 +   * **TURN_LEFT** - Robotul efectuează o virare la stânga pentru durata calculată. După finalizarea virajului, oprește motoarele și revine la deplasarea înainte (GO_FORWARD). 
 +   * **TURN_RIGHT** - Robotul efectuează o virare la dreapta pentru durata calculată. După finalizarea virajului, oprește motoarele și revine la deplasarea înainte (GO_FORWARD).
  
  
Line 126: Line 107:
  
 == Măsurarea distanței == == Măsurarea distanței ==
-Funcțiile pentru măsurarea distanței sunt in headerul **Sonar.h**.\\ Am creat un API pentru a controla senzorul ultrasonic, folosind cunoștiințele dobândite in laboratoarele de **GPIO**, **Timere** și **Întreruperi**.+Funcțiile pentru măsurarea distanței sunt in headerul **Sonar.h**.\\ Am creat un API pentru a controla senzorul ultrasonic, folosind cunoștiințele dobândite in laboratoarele de **GPIO**, **Timere** și **Întreruperi**. ​Am vrut sa folosesc Timer2 pentru a măsura timpul fără **millis**, dar suprascrierea ISR-ului de Overflow intervine peste librăria ce expune API-ul pentru motoare si apăreau conflicte. Totuși, am folosit întreruperi pentru măsurarea distanței. 
 <code C> <code C>
 void initSonar(void);​ void initSonar(void);​
-void initTimer2(void);​ 
 void initEchoInterrupt(void);​ void initEchoInterrupt(void);​
- 
 void sendTriggerPulse(void);​ void sendTriggerPulse(void);​
 uint16_t measureDistance(void);​ uint16_t measureDistance(void);​
-void checkObstacle(void);​+</​code>​
  
 +<​note>​
 +**Cum funcționează ?** \\ 
 +Se generează o întrerupere pe pinul la care este legat ECHO al senzorului ultrasonic la fiecare schimbare a semnalului.\\ Când TRIG emite unda, ECHO trece pe HIGH, iar când se întoarce unda, ECHO trece pe LOW. Se retine timestampul pentru fiecare dintre aceste evenimente si se face diferența, pentru a calcula timpul dus-întors al undei. Știind viteza sunetului, si timpul dus-întors,​ putem calcula ușor distanța parcursă.
 +</​note>​
 +
 +== Alegerea unei noi direcții ==
 +Pentru alegerea unei noi direcții, FSM-ul din main folosește mai multe API-uri, definite in **ServoControl.h**:​
 +
 +<code C>
 +void initServoControl(void);​
 +void lookAtRightInstant(int angle);
 +void lookAtLeftInstant(int angle);
 +void lookCenter(void);​
 +void initLookPoints(void);​
 +void clearLookPoints(void);​
 +void scanAllLookPoints(void);​
 +int getBestAngle(void);​
 </​code>​ </​code>​
 +
 +<​note>​
 +Robotul alege direcția prin rotirea servomotorului la mai multe unghiuri predefinite pentru a scana distanțele din stânga, centru și dreapta. Pe baza acestor măsurători,​ se selectează unghiul cu cea mai mare distanță liberă, iar robotul se va orienta spre acea direcție pentru a evita obstacolele.
 +</​note>​
 +
 +
  
 ===== Rezultate Obţinute ===== ===== Rezultate Obţinute =====
  
-<note tip> +  * Robotul a fost capabil sa evite obstacole si sa aleagă bine o noua direcție de deplasare
-Care au fost rezultatele obţinute în urma realizării proiectului vostru+  * Sistemul de vid funcționează parțial – eficiența de aspirare este limitată (aproape inexistentă). 
-</​note>​+  * Controlul motoarelor și al servomotorului este stabil. 
 +  * Senzorul ultrasonic detectează corect peretele și obstacolele.
  
 ===== Concluzii ===== ===== Concluzii =====
 +Proiectul demonstrează posibilitatea realizării unui robot de curățenie funcțional,​ cu un design modular și scalabil. Limitările țin mai ales de lipsa unui algoritm mai sofisticat pentru detecția și ocolirea obstacolelor,​ precum și de eficiența sistemului de aspirare.
 ===== Download ===== ===== Download =====
  
Line 156: Line 160:
 ===== Jurnal ===== ===== Jurnal =====
  
-<note tip> +== Video demonstrativ == 
-Puteți avea și o secțiune de jurnal în care să poată urmări asistentul de proiect progresul proiectului. +https://www.youtube.com/shorts/​H-P-53NL3jc 
-</note>+ 
 +== Imagini == 
 + 
  
 ===== Bibliografie/​Resurse ===== ===== Bibliografie/​Resurse =====
Line 170: Line 177:
 https://​cdn-learn.adafruit.com/​downloads/​pdf/​adafruit-motor-shield.pdf https://​cdn-learn.adafruit.com/​downloads/​pdf/​adafruit-motor-shield.pdf
  
-== Resurse software == 
 https://​ww1.microchip.com/​downloads/​en/​DeviceDoc/​Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf https://​ww1.microchip.com/​downloads/​en/​DeviceDoc/​Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf
 +
 +https://​www.circuito.io/​blog/​arduino-uno-pinout/​
 +
 +== Resurse software ==
 +
 +https://​github.com/​adafruit/​Adafruit-Motor-Shield-library/​tree/​master
 +
 +== Cod sursa ==
  
 https://​github.com/​cristiantudor1607/​RoombaCar https://​github.com/​cristiantudor1607/​RoombaCar
pm/prj2025/eradu/cristian.tudor1607.1748198950.txt.gz · Last modified: 2025/05/25 21:49 by cristian.tudor1607
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