Differences

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

Link to this comparison view

pm:prj2026:vlad.radulescu2901:rares.ciociea [2026/05/05 19:45]
rares.ciociea [Descriere generală]
pm:prj2026:vlad.radulescu2901:rares.ciociea [2026/05/25 18:36] (current)
rares.ciociea [Jurnal]
Line 7: Line 7:
 ====== Descriere generală ====== ====== Descriere generală ======
  
-<​note>​ +{{:​pm:​prj2026:​vlad.radulescu2901:​schema_bloc_ciociea_rares.png?700|}}
-{{:​pm:​prj2026:​vlad.radulescu2901:​schema_bloc.png?500|}}+
  
 **Descrierea sumara a modulelor si a modului de interactiune** **Descrierea sumara a modulelor si a modului de interactiune**
Line 24: Line 23:
 Sistemul interactioneaza printr-o bucla continua de tip **Achizitie date -> Procesare -> Actiune**. ​ Sistemul interactioneaza printr-o bucla continua de tip **Achizitie date -> Procesare -> Actiune**. ​
 Pachetul de baterii alimenteaza intregul ansamblu. In timpul rularii, senzorii colecteaza date din mediu si le transmit catre microcontroler sub forma de impulsuri sau niveluri de tensiune. ATmega328P analizeaza aceste intrari si, pe baza algoritmului de decizie, trimite semnale de control (PWM si directie logica) catre driverul L298N. Driverul actioneaza ca un amplificator,​ cupland motoarele la curentul bateriei pentru a executa deplasarea. In paralel, microcontrolerul raporteaza constant starea sistemului (baterie, distante, decizii de viraj) prin intermediul modulului Bluetooth. Pachetul de baterii alimenteaza intregul ansamblu. In timpul rularii, senzorii colecteaza date din mediu si le transmit catre microcontroler sub forma de impulsuri sau niveluri de tensiune. ATmega328P analizeaza aceste intrari si, pe baza algoritmului de decizie, trimite semnale de control (PWM si directie logica) catre driverul L298N. Driverul actioneaza ca un amplificator,​ cupland motoarele la curentul bateriei pentru a executa deplasarea. In paralel, microcontrolerul raporteaza constant starea sistemului (baterie, distante, decizii de viraj) prin intermediul modulului Bluetooth.
-</​note>​ 
 ====== Hardware Design ====== ====== Hardware Design ======
  
Line 42: Line 40:
   * **Sistem de Comunicație:​** 1x Modul Bluetooth HC-05.   * **Sistem de Comunicație:​** 1x Modul Bluetooth HC-05.
   * **Sistem de Alimentare:​**   * **Sistem de Alimentare:​**
-    * 1x Suport pentru ​baterii tip AA. +    * 1x Suport pentru ​baterii tip AA. 
-    * 4x Baterii Alcaline AA 1.5V (Tensiune totală nominală: ​6V).+    * 6x Baterii Alcaline AA 1.5V (Tensiune totală nominală: ​9V).
   * **Componente Pasive & Conectică:​**   * **Componente Pasive & Conectică:​**
-    * 1x Rezistor ​4.7kΩ (Albastru-precizie:​ Galben-Violet-Negru-Maro). +    * 2x Rezistor ​10kΩ
-    * 1x Rezistor 2.2kΩ (Albastru-precizie:​ Roșu-Roșu-Negru-Maro).+
     * 1x Breadboard mini (170 puncte).     * 1x Breadboard mini (170 puncte).
     * Set fire conexiune Dupont (Tată-Tată,​ Mamă-Tată).     * Set fire conexiune Dupont (Tată-Tată,​ Mamă-Tată).
Line 56: Line 53:
 *(Notă tehnică: Alimentarea logicii de 5V a microcontrolerului se face prin pinul de +5V al modulului L298N, acesta coborând tensiunea de 6V a bateriei printr-un regulator integrat).* *(Notă tehnică: Alimentarea logicii de 5V a microcontrolerului se face prin pinul de +5V al modulului L298N, acesta coborând tensiunea de 6V a bateriei printr-un regulator integrat).*
  
-{{:​pm:​prj2026:​vlad.radulescu2901:​schematic_provizoriu_ciociea_rares.png?500|}}+{{:​pm:​prj2026:​vlad.radulescu2901:​schematic_rares_ciociea.png?800|}}
  
 **Tabelul Conexiunilor Hardware (Pinout Map):** **Tabelul Conexiunilor Hardware (Pinout Map):**
-Pentru interfațarea senzorilor cu perifericele interne ale ATmega328P ​(Timere, ADC, USART, Întreruperi) ​s-a utilizat următoarea mapare:+Pentru interfațarea senzorilor cu perifericele interne ale ATmega328P s-a utilizat următoarea mapare:
  
 ^ Modul Extern ^ Pin Modul ^ Conexiune ATmega328P ^ Rol / Periferic Utilizat ^ ^ Modul Extern ^ Pin Modul ^ Conexiune ATmega328P ^ Rol / Periferic Utilizat ^
-| **Modul HC-05** | TX | PD0 (RXD) | Comunicație Serială (USART) | +| **Modul HC-05** | TX | PB0 | Comunicație Serială (USART) | 
-| **Modul HC-05** | RX | PD1 (TXD) | Comunicație Serială (USART) | +| **Modul HC-05** | RX | PB1 | Comunicație Serială (USART) | 
-| **L298N (Driver)** | ENA | PB1 (OC1A) ​| Control Viteză Motor Stânga (PWM Hardware) | +| **L298N (Driver)** | ENA | PD5 | Control Viteză Motor Stânga (PWM Hardware) | 
-| **L298N (Driver)** | ENB | PB2 (OC1B) ​| Control Viteză Motor Dreapta (PWM Hardware) | +| **L298N (Driver)** | ENB | PD6 | Control Viteză Motor Dreapta (PWM Hardware) | 
-| **L298N (Driver)** | IN1, IN2 | PD4, PD5 | Control Direcție Motor Stânga (GPIO) | +| **L298N (Driver)** | IN1, IN2 | PD4, PD7 | Control Direcție Motor Stânga (GPIO) | 
-| **L298N (Driver)** | IN3, IN4 | PD6PD7 | Control Direcție Motor Dreapta (GPIO) | +| **L298N (Driver)** | IN3, IN4 | PB2PB3 | Control Direcție Motor Dreapta (GPIO) | 
-| **Divizor Tensiune** | Vout (Intersecție) | PC0 (ADC0) | Monitorizare nivel baterie (ADC) | +| **Divizor Tensiune** | Vout (Intersecție) | PC0 (A0) | Monitorizare nivel baterie (ADC) | 
-| **TCRT5000** | A0 | PC1 (ADC1) | Detecție analogică margine (ADC) | +| **TCRT5000** | A0 | PC1 (A1) | Detecție analogică margine ​/ podea (ADC) | 
-| **HC-SR04 (Senzori)** | Pinii Echo | PD2/PD3 (INT0/INT1) | Captură timp răspuns (Întreruperi Externe) | +| **HC-SR04 (Față)** | Trig, Echo | PD2PD3 | Măsurare distanță față ​(GPIO) | 
- +| **HC-SR04 (Stânga)** | Trig, Echo | PC2 (A2), PC3 (A3) | Măsurare distanță stânga ​(ADC folosit ca GPIO) | 
 +| **HC-SR04 (Dreapta)** | Trig, Echo | PC4 (A4), PC5 (A5) | Măsurare distanță dreapta (ADC folosit ca GPIO) |
 ===== 3. Diagrame de Semnal ===== ===== 3. Diagrame de Semnal =====
  
Line 87: Line 84:
  ​{{:​pm:​prj2026:​vlad.radulescu2901:​l298n.png?​800|}}  ​{{:​pm:​prj2026:​vlad.radulescu2901:​l298n.png?​800|}}
  
-====== Software Design ====== 
  
-*(Nota: Aceasta sectiune prezinta o arhitectura de nivel inalt, detaliile urmand sa fie rafinate in etapa finala de implementare).*+ 
 +====== Software Design ======
  
 ===== 1. Mediu de dezvoltare ===== ===== 1. Mediu de dezvoltare =====
-Pentru scrierea, compilarea si incarcarea ​firmware-uluimediul de dezvoltare ales este **Arduino IDE**. ​Desi platforma hardware este un ATmega328P Xplained Mini, ecosistemul Arduino ofera un flux de lucru mult mai rapid (Rapid Prototyping) si o sintaxa ​mai accesibila pentru gestionarea pinilor ​(GPIO) si a functiilor ​de timpcomparativ cu programarea stricta pe registri ​in Microchip Studio.+ 
 +Pentru scrierea, compilarea si incarcarea ​codului pe microcontroler (ATmega328P)am renuntat la clasicul ​Arduino IDE in favoarea **Visual Studio Code (VS Code) impreuna cu extensia PlatformIO**.  
 + 
 +Aceasta alegere ne-a oferit ​un flux de lucru mult mai profesional. PlatformIO permite impartirea codului in mai multe fisiere ​(cum ar fi separarea logicii ​de Bluetooth in ''​hc05_comm.hpp''​)ofera un sistem de autocomplete mult mai destept si gestioneaza automat compilarea fara sa ne incurcam ​in setari ascunse. Desi folosim framework-ul Arduino pentru usurinta, mediul VSC + PlatformIO ne-a permis sa scriem un cod mult mai curat si modular.
  
 ===== 2. Librarii si surse 3rd-party ===== ===== 2. Librarii si surse 3rd-party =====
-Pentru a mentine un control strict asupra executiei si a minimiza overhead-ul,​ utilizarea librariilor externe va fi limitata la minimum necesar: 
-  * Se va folosi exclusiv biblioteca standard **Arduino Core** (pentru functii de baza precum millis(), analogRead(),​ analogWrite(),​ digitalWrite()). 
-  * Interfatarea cu senzorii ultrasonici si citirea nivelului bateriei se vor face prin metode standard, fara a importa librarii masive din surse terte. 
-  * Optional, pentru modulul Bluetooth, se poate folosi libraria SoftwareSerial.h inclusa in pachetul standard Arduino. 
  
-===== 3. Algoritmi si structuri ​de date planificate ===== +Ca sa pastram o viteza ​de reactie maxima ​a robotului ​si sa nu incarcam memoria procesorului cu cod inutil, am decis sa limitam ​la extrem folosirea librariilor externeAstfel, am folosit doar: 
-Aplicatia va fi proiectata pe o arhitectura **non-blocanta** (fara utilizarea instructiunii delay()), esentiala pentru reactia in timp real a robotului la datele primite de la senzori+  * **<​Arduino.h>​** - Importata automat de PlatformIO, esentiala pentru functiile de baza (''​millis()''​''​analogRead()'',​ ''​digitalWrite()''​)
-  * **Multitasking cooperativ:** Se va utiliza functia ​millis() ​pentru a implementa "​software timere"​. Acest algoritm permite procesorului sa citeasca senzoriisa raporteze date prin Bluetooth si sa ajusteze PWM-ul motoarelor ​(aproapesimultan+  * **<​SoftwareSerial.h>​** - Libraria standard folosita pentru a crea un port serial virtual pe alti pini, necesara pentru comunicarea cu modulul Bluetooth HC-05
-  * **Masina de Stari Finita (FSM):** Structura principala de control va fi un bloc switch-case ce defineste comportamentul robotului. Starile planificate includ: MERGE_FATA, DETECTARE_PERETE,​ INTOARCERE_90_GRADE_ST/​DR,​ ALINIERE_ZIG_ZAG,​ OPRIRE_URGENTA_MARGINI si LOW_BATTERY+  * **"​hc05_comm.hpp"​** - Un fisier header propriu creat pentru a pastra functiile ​de trimitere si primire mesaje separat de fisierul principal ''​main.cpp''​.
-  * **Algoritm de acoperire:** Logica FSM va dicta un traseu de tip Boustrophedon (zig-zag). La detectarea unui obstacol frontal, robotul va verifica senzorii laterali ​pentru a alege directia corecta ​de viraj, alternand intoarcerile stanga-dreapta.+
  
-===== 4. Surse si functii implementate ​(Etapa 3===== +Nu am folosit librarii terte (gen NewPing) pentru ​senzorii ultrasonici tocmai ​pentru ​a putea controla manual timpii ​de asteptare ​si a preveni blocarea procesorului.
-*(Sectiunea va fi completata cu fragmente de cod in momentul finalizarii dezvoltarii. Principalele functii planificate sunt:)* +
-  * void setup() si void loop() - structura de baza Arduino. +
-  * void readSensors() - responsabila de declansarea impulsurilor Trig si citirea duratei Echo, precum si citirea ADC pentru ​TCRT5000 si baterie. +
-  * void motorControl(int vitezaStanga,​ int vitezaDreapta) - o functie de abstractizare ce transpune cerintele de miscare in semnale PWM si stari logice ​pentru ​driverul L298N. +
-  * void updateFSM() - functia care proceseaza datele ​de la senzori ​si decide comutarea dintr-o stare in alta. +
-===== Rezultate Obţinute =====+
  
-<​note ​tip> +===== 3. Algoritmi si structuri de date ===== 
-To be determined+ 
-</note>+Programul a fost gandit pe o arhitectura **100% non-blocanta**. Asta inseamna ca nu exista nicio instructiune de tip ''​delay()''​ in bucla principala, permitand robotului sa citeasca senzorii, sa conduca motoarele si sa trimita telemetrie pe telefon in acelasi timp. 
 + 
 +Logica principala se bazeaza pe doua mari concepte: 
 +  * **Masina de Stari Finita (FSM):** Creierul robotului este o variabila (''​stareRobot''​) care ii dicteaza ce face in orice moment: 
 +    * **Starea 0 (Stop):** Asteapta comenzi, motoarele sunt oprite
 +    * **Starea 1 (Mers Inainte):** Robotul inainteaza si scaneaza continuu cu cei 3 senzori frontali si cu senzorul de podea. 
 +    * **Starea 2 (Mers Inapoi):** Se activeaza automat daca vede un obstacol sub 30 cm sau daca ramane fara podea. Da cu spatele cateva sute de milisecunde pentru a-si face loc. 
 +    * **Starea 3 (Rotire):** Executa virajul efectiv pe baza deciziei luate in starea 2, dupa care revine in starea 1. 
 + 
 +  * **Algoritmul de Acoperire Organica (Memoria deciziilor):​** Pentru ca robotul sa nu se blocheze intr-o bucla repetitiva (cum ar fi sa faca mereu stanga si sa se invarta in cerc), am implementat un vector ''​istoricDecizii[10]''​. Acesta memoreaza ultimele 10 directii alese. Cand robotul da de un obstacol, algoritmul alege directia de viraj pe baza senzorilor laterali, dar timpul de rotire este generat **aleatoriu** (intre 400 si 900 milisecunde). Daca memoria detecteaza ca robotul face prea multe viraje in aceeasi directie sau se loveste de prea multe ori intr-un timp scurt, declanseaza o masura de urgenta: sterge memoria si executa o rotatie foarte lunga, tot aleatorie, pentru a evada din acel colt al camerei. 
 + 
 +===== 4. Surse si functii implementate ===== 
 + 
 +Pentru a pune in practica algoritmii de mai sus, codul a fost impartit in cateva functii vitale si puternic optimizate hardware: 
 +  * **''​setup()''​ si ''​loop()''​**:​ In ''​setup()''​ initiem pinii si generam un ''​randomSeed()''​ citind "​zgomotul"​ de pe un pin analogic liber (A6), asigurandu-ne ca deciziile robotului sunt diferite la fiecare pornire. In ''​loop()''​ se ruleaza Masina de Stari si se trimite telemetria spre telefon (voltaj, distanta) la fiecare 1000 de milisecunde,​ calculat via ''​millis()''​. 
 +  * **''​getDistanta()''​**:​ Aceasta este functia senzorilor ultrasonici. Secretul ei sta in parametrul de timeout modificat la 3500 microsecunde. Astfel, procesorul nu asteapta dupa ecouri venite de la 4 metri distanta, ci inchide ascultarea la aprox. 60 cm. Asta a eliberat procesorul si a reparat complet lag-ul de pe comenzile Bluetooth. 
 +  * **''​citesteVccReal()''​**:​ Functia care masoara voltajul real al bateriei LiPo folosind referinta interna de 1.1V a cipului. Aici am folosit tehnica de "​Double Dummy Read" (citire in gol a pinilor analogici) pentru a da timp condensatorului intern din microcontroler sa se goleasca, evitand astfel combinarea valorilor de la senzorul de podea cu cele de la baterie. 
 +  * **''​salveazaDecizie()''​**:​ Functia care gestioneaza memoria circulara de 10 pozitii, adaugand noul viraj (Stanga sau Dreapta) in vector si mentinand logica de evadare alerta. 
 +  * **Functiile de miscare** (''​mergiInainteIncet()'',​ ''​rotesteStangaIncet()''​ etc.): Setari rapide de stare logica (HIGH/LOW) si PWM pe pinii L298N pentru a controla puntea H fara a aglomera bucla principala.
  
 ===== Concluzii ===== ===== Concluzii =====
  
-===== Download =====+Proiectul ne-a demonstrat ca o placuta simpla cu microcontroler ATmega328P poate sa gestioneze multi senzori si sa ia decizii destul de destepte, daca codul este scris eficient si curat.
  
-<note warning>​ +Cea mai mare lectie invatata a fost legata de functiile blocantePentru ​un robot care trebuie sa reactioneze in timp real si sa asculte si de comenzi prin Bluetoothinstructiunile ​de tip delay() sau timeout-urile prea mari la senzori sunt complet interzise. De asemenea, am vazut ca limitarile fizice ale cipului (cum ar fi un singur voltmetru intern impartit la toti piniipot fi pacalite usor prin trucuri software, cum sunt citirile duble.
-O arhivă (sau mai multe dacă este cazul) cu fişierele obţinute în urma realizării proiectului:​ surse, scheme, etcUn fişier README, ​un ChangeLogun 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 Alin331CC -> **:pm:prj2009:​cc:​dumitru_alin**. +Din punct de vedere al traseului, am realizat ca daca lasam robotul sa faca doar viraje fixe (de exemplu, mereu la 90 de grade), acesta va ramane blocat rapid intr-o bucla infinita pe acelasi traseu. Introducerea algoritmului cu timpi de viraj aleatori si stocarea istoricului de decizii au fost cheia pentru a obtine un comportament mult mai inteligent si o acoperire foarte buna a intregii camere. 
-</note>+ 
 +===== Download ===== 
 + 
 +GitHubhttps://github.com/raresciociea/​swiffer-autonom
  
 ===== Jurnal ===== ===== Jurnal =====
  
-<note tip> +13.05.2025 - Au fost lipite cu cositor firele care duc la motoare si la divizorul de tensiune. Dovada ca etapa hardware a fost indeplinita este transmiterea pe serial Bluetooth a citiriilor senzorilor, si rotirea motoarelor. 
-Puteți avea și o secțiune ​de jurnal în care să poată urmări asistentul ​de proiect progresul proiectului+ 
-</​note>​+{{:​pm:​prj2026:​vlad.radulescu2901:​serial_bluetooth_terminal_rares_ciociea.jpg?​300|}} 
 + 
 +Link test roti: https://​drive.google.com/​file/​d/​1JDcxumcGRbAPboI4evX0atG_J3Q3IFuz/​view?​usp=drivesdk 
 + 
 +20.05.2026 - Am rezolvat problema uriasa ​de lag de pe Bluetooth, din cauza careia trebuia sa apasam de multe ori pe telefon ca sa prindem comanda de Start sau Stop. Problema era de la pulseIn(), ​care bloca procesorul timp de 25 de milisecunde pentru fiecare senzor ultrasonic cand robotul era in spatiu deschis. Am scazut timeout-ul la 3500 microsecunde (suficient pentru vreo 60cm in fata), iar acum aplicatia de pe telefon raspunde instant, din prima
 + 
 +22.05.2026 - Am reparat citirea divizorului de tensiune pentru baterie. Dupa ce am scos delay-urile din cod, telemetria incepuse sa arate aiurea o valoare blocata in jur de 3V, desi la multimetru aveam 8.4V. Bug-ul era cauzat de schimbarile extrem de rapide de pe multiplexorul ADC intre senzorul de podea (A1) si baterie (A0). Am rezolvat prin adaugarea unei "​citiri in gol" (dummy read) si a unei micro-pauze de stabilizare hardware, curatand condensatorul intern al ADC-ului. Acum tensiunea afisata este stabila si corecta.
  
 +24.05.2026 - Am imbunatatit radical algoritmul de acoperire a camerei. Am renuntat la timpii ficsi de viraj care invarteau robotul in aceleasi zone si am trecut pe timpi de rotire complet aleatori (intre 400ms si 900ms). In plus, am activat si memoria ultimelor 10 decizii salvate intr-un vector. Daca robotul se loveste des in acelasi loc sau face aceeasi intoarcere la nesfarsit, sistemul isi da seama ca e blocat, reseteaza istoricul si forteaza o manevra lunga de evadare (U-Turn) ca sa iasa din colturi.
 +Link Demo:
 +https://​drive.google.com/​file/​d/​1l5hyUvKaTeUjokgSLg2P7t9O1l73x-RN/​view?​usp=drivesdk
 ===== Bibliografie/​Resurse ===== ===== Bibliografie/​Resurse =====
  
pm/prj2026/vlad.radulescu2901/rares.ciociea.1777999515.txt.gz · Last modified: 2026/05/05 19:45 by rares.ciociea
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