This is an old revision of the document!
Descrierea proiectului: Proiectul constă în implementarea unui sistem de asistență la parcare (radar de proximitate) la scară redusă, având la bază microcontrolerul ATmega328P. Sistemul emite unde ultrasonice pentru a detecta distanța până la cel mai apropiat obstacol și oferă utilizatorului un feedback dublu: vizual (printr-un LED RGB) și sonor (printr-un buzzer pasiv).
Scopul proiectului: Scopul principal este de a crea un sistem de avertizare în timp real, capabil să proceseze date de la un senzor extern și să avertizeze șoferul/utilizatorul proporțional cu gradul de pericol (distanța până la obstacol). Proiectul demonstrează interfațarea microcontrolerului cu periferice externe folosind concepte fundamentale precum GPIO, Timere hardware și generare de semnale PWM.
Ideea de la care a pornit: Inspirația provine din industria auto (sistemele Parktronic / Acoustic Parking System). Am dorit să reproduc această funcționalitate esențială pentru siguranța rutieră într-un format simplificat (Proof of Concept), folosind componente discrete pentru a înțelege exact fluxul de semnal de la detecția fizică a obstacolului până la declanșarea alarmelor umane.
Sistemul funcționează într-o buclă continuă de măsurare și decizie. Microcontrolerul trimite un impuls scurt către senzorul HC-SR04, care emite un tren de unde ultrasonice. Când undele se întorc (ecou), microcontrolerul măsoară timpul scurs și calculează distanța fizică folosind formula: $d = \frac{t \cdot v_{sunet}}{2}$
În funcție de pragurile predefinite în cod, sistemul de decizie hardware acționează pinii asociați culorilor LED-ului RGB (Verde = Sigur, Galben = Atenție, Roșu = Pericol) și ajustează frecvența semnalului PWM trimis către buzzer (de la bipuri rare la un sunet continuu).
Lista de piese (Bill of Materials):
Maparea pinilor (Planificarea conexiunilor): Pinii aleși pe ATmega328P sunt următorii:
VCC → La pinul de 5V al plăcuțeiGND → La GNDTrig (Ieșire din uC) → PD2 (Pin digital standard)Echo (Intrare în uC) → PB0 (Pinul ICP1 - Input Capture, perfect pentru măsurarea ecoului cu Timerul 1)Signal → PD3 (Pinul OC2B, legat direct la Timerul 2, ajută la generarea hardware PWM)Pinul Roșu (R) → PC0Pinul Verde (G) → PC1Pinul Albastru (B) → PC2
Schema Electrică KiCad - Radar de Parcare PDF
Diagrame de semnal: Pentru a calcula distanța, sistemul comunică cu senzorul HC-SR04 respectând diagrama de timp de mai jos (conform datasheet-ului oficial):
Formula de conversie utilizată în cod pe baza acestui semnal este: $Distanța (cm) = \frac{Timpul (\mu s)}{58}$.
Rezultatele simulării (TinkerCAD): Înainte de asamblarea fizică, hardware-ul și logica mașinii de stări au fost modelate și validate în mediul de simulare TinkerCAD. Sistemul reacționează în timp real la apropierea obstacolului virtual, modificând starea:
Note privind simularea hardware: Din cauza unor limitări cunoscute ale motorului de simulare web TinkerCAD la sincronizarea timerelor hardware interne din AVR cu modelele fizice virtuale (fenomenul de Echo Lock-up), codul rulat în simulator a necesitat o adaptare. Pentru a valida vizual efectul de Software PWM pe LED și sincronizarea buzzer-ului, s-a utilizat un “Software Counter” pentru citirea distanței. Pe implementarea hardware fizică (varianta finală a proiectului), acest workaround este eliminat, sistemul folosind strict Timer-ul 1 Hardware (16-bit) pentru a măsura cu precizie absolută pulsul de pe pinul Echo.
🌐 Apasă aici pentru a deschide și testa simularea interactivă direct în TinkerCAD
Mediul de dezvoltare:
Proiectul va fi dezvoltat folosind mediul Visual Studio Code (VS Code), având instalată extensia PlatformIO. Se va folosi framework-ul nativ Atmel AVR (fără framework-ul Arduino), compilatorul folosit fiind avr-gcc. Încărcarea codului (upload) se va face nativ prin portul USB, folosind interfața mEDBG integrată pe plăcuța ATmega328P Xplained Mini. Simularea inițială a circuitului și a registrilor se va face în TinkerCAD.
Biblioteci și surse 3rd-party folosite: Fiind un proiect de tip “bare-metal”, nu se vor utiliza biblioteci externe de nivel înalt. Se vor folosi exclusiv bibliotecile standard din suita AVR Libc:
<avr/io.h> - pentru accesul la regiștrii hardware (ex: PORTB, DDRD, TCCR1A etc.).<avr/interrupt.h> - pentru manipularea vectorilor de întrerupere (ISR).<util/delay.h> - pentru funcții blocante necesare la inițializări (dacă este cazul).Algoritmi și structuri de date planificate: Logica principală a programului va fi implementată sub forma unui Finite State Machine (Mașină de Stări - FSM) cu trei stări principale, corespunzătoare distanței:
STATE_SAFE (Verde, distanță > 20 cm)STATE_WARNING (Galben, distanță între 10 cm și 20 cm)STATE_DANGER (Roșu, distanță < 10 cm)Calculul distanței se va realiza folosind un algoritm bazat pe Timer1 (16-bit). Microcontrolerul va genera un puls de 10µs pe pinul Trigger, apoi va activa funcția de Input Capture (sau va folosi o întrerupere PCINT) pentru a măsura durata pulsului Echo pe pinul PB0. Formula matematică implementată va fi: $Distanta(cm) = \frac{Timp(us)}{58}$.
Pentru a nu bloca execuția codului (funcții neblocante), generarea sunetului în buzzer va fi delegată Timer-ului 2 (8-bit), folosind modul hardware Fast PWM sau CTC. Frecvența generată (pitch-ul și ritmul de bip-uri) va fi actualizată dinamic de mașina de stări în funcție de distanța citită.
(Etapa 3) Surse și funcții implementate: (Această secțiune detaliază structura codului ce va fi implementat)
Aplicația va fi modularizată, având fișierul principal main.c și fișiere header/surse separate pentru claritate. Funcțiile cheie vor fi:
void gpio_init(void) - Configurează pinii direcționali (DDRx) pentru LED-ul RGB, Buzzer și pinul de Trigger.void timer1_init(void) - Configurează Timer-ul 1 pentru citirea pulsului Echo.void timer2_init(void) - Configurează Timer-ul 2 pentru generarea semnalului PWM către buzzer.uint16_t get_distance(void) - Declanșează senzorul, citește regiștrii timerului, returnează distanța calculată și resetează flag-urile.void update_led_status(uint8_t state) - Modifică regiștrii de PORT pentru a schimba culorile LED-ului RGB pe baza stării calculate.ISR(TIMER1_CAPT_vect) - (Opțional) Rutina de tratare a întreruperii pentru a prinde exact momentul în care pulsul Echo se termină, asigurând precizie maximă fără a face polling.Implementarea practică a proiectului s-a desfășurat în două etape principale, reflectând procesul iterativ de dezvoltare și validare hardware:
Etapa 1: Prototiparea și Simularea Logică În prima fază, au fost asamblate componentele de ieșire (microcontrolerul, LED-ul RGB și buzzer-ul). Pentru a valida logica de avertizare a sistemului înainte de conectarea senzorului, a fost scris un cod de test care a simulat software apropierea treptată a unui vehicul. Această etapă a confirmat funcționarea corectă a generării semnalelor PWM software pentru efectul de “respirație” al LED-ului și a temporizărilor pentru buzzer.
Demonstrație Video - Simulare Inițială: 📺 Click aici pentru demonstrația video
Etapa 2: Integrarea Senzorului și Finalizarea Odată cu instalarea senzorului ultrasonic HC-SR04, proiectul a atins forma sa finală. Codul a fost rescris pentru a citi distanțele reale în mediu fizic, utilizând Timer-ul 1 hardware al microcontrolerului pentru interceptarea exactă a ecoului. Pe lângă funcționalitatea de bază de avertizare (Verde → Galben → Roșu), varianta finală a integrat următoarele rafinamente software:
Materiale Media Finale
main.c), înlocuind numărătoarele software cu citirea directă și precisă a distanței prin Timer-ul 1 Hardware.