This shows you the differences between two versions of the page.
|
pm:prj2026:bianca.popa1106:radu_gabriel.covacs [2026/05/13 09:49] radu_gabriel.covacs [Biblioteci si surse 3rd-party] |
pm:prj2026:bianca.popa1106:radu_gabriel.covacs [2026/05/13 10:26] (current) radu_gabriel.covacs [Algoritmi şi structuri] |
||
|---|---|---|---|
| Line 12: | Line 12: | ||
| Proiectul este construit in jurul microcontrolerului **ATmega328P Xplained Mini**, care functioneaza ca un centru de comanda ce primeste informatii de la senzori si trimite instructiuni catre elementele de executie si sistemul de monitorizare de pe laptop. | Proiectul este construit in jurul microcontrolerului **ATmega328P Xplained Mini**, care functioneaza ca un centru de comanda ce primeste informatii de la senzori si trimite instructiuni catre elementele de executie si sistemul de monitorizare de pe laptop. | ||
| - | **Interactiunea modulelor:** | + | ====Interactiunea modulelor:==== |
| * **Senzorii IR:** Sunt utilizati pentru a detecta prezenta fizica a masinilor pe locurile de parcare. Acestia trimit un semnal digital catre pinii microcontrolerului atunci cand fasciculul de lumina infrarosie este intrerupt de vehicul. | * **Senzorii IR:** Sunt utilizati pentru a detecta prezenta fizica a masinilor pe locurile de parcare. Acestia trimit un semnal digital catre pinii microcontrolerului atunci cand fasciculul de lumina infrarosie este intrerupt de vehicul. | ||
| Line 21: | Line 21: | ||
| * **Integrarea cu Laptopul (Python & MySQL):** Toate evenimentele din parcare sunt trimise catre laptop prin cablul USB (Serial/UART). Un script scris in Python asculta aceste date si le salveaza automat intr-o baza de date MySQL. | * **Integrarea cu Laptopul (Python & MySQL):** Toate evenimentele din parcare sunt trimise catre laptop prin cablul USB (Serial/UART). Un script scris in Python asculta aceste date si le salveaza automat intr-o baza de date MySQL. | ||
| - | **Schema Bloc** | + | ====Schema Bloc==== |
| {{:pm:prj2026:bianca.popa1106:schema_bloc_covacs_radu.png?780|}} | {{:pm:prj2026:bianca.popa1106:schema_bloc_covacs_radu.png?780|}} | ||
| ===== Hardware Design ===== | ===== Hardware Design ===== | ||
| - | **Lista componente:** | + | ====Lista componente:==== |
| * ATmega328P Xplained Mini -> https://ww1.microchip.com/downloads/en/DeviceDoc/50002659A.pdf | * ATmega328P Xplained Mini -> https://ww1.microchip.com/downloads/en/DeviceDoc/50002659A.pdf | ||
| * 3 x Senzori IR -> https://www.handsontec.com/dataspecs/sensor/IR%20Obstacle%20Detector.pdf | * 3 x Senzori IR -> https://www.handsontec.com/dataspecs/sensor/IR%20Obstacle%20Detector.pdf | ||
| Line 38: | Line 38: | ||
| * 2 x Rezistenta (10 kΩ) | * 2 x Rezistenta (10 kΩ) | ||
| - | **Schema electrica:** | + | ====Schema electrica:==== |
| {{:pm:prj2026:bianca.popa1106:schema_electrica_radu_covacs.png?780|}} | {{:pm:prj2026:bianca.popa1106:schema_electrica_radu_covacs.png?780|}} | ||
| - | **Diagrame de semnal:** | + | ====Diagrame de semnal:==== |
| {{:pm:prj2026:bianca.popa1106:diagrama_hc-sr04_radu_covacs.png?780|}} | {{:pm:prj2026:bianca.popa1106:diagrama_hc-sr04_radu_covacs.png?780|}} | ||
| Line 69: | Line 69: | ||
| ^ Librărie ^ Rol ^ Sursă ^ | ^ Librărie ^ Rol ^ Sursă ^ | ||
| - | | ''Wire.h'' | Comunicație I2C (master) | inclusă în Arduino core | | + | | ''<avr/io.h>, <avr/interrupt.h>'' | Acces direct la registrele hardware, manipulare intreruperi | AVR-GCC Toolchain | |
| - | | ''LiquidCrystal_I2C.h'' | Driver pentru LCD 16x2 cu adaptor PCF8574 | Frank de Brabander (GitHub) | | + | | ''<util/delay.h>'' | Acces la functii de temporizare | AVR-GCC Toolchain | |
| - | | ''Adafruit_BMP280.h'' | Driver BMP280 | Adafruit Industries | | + | | ''<util/twi.h>'' | Macrouri standard pentru gestionarea starilor protocolului I2C (TWI) pe AVR | AVR-GCC Toolchain | |
| - | | ''Adafruit_Sensor.h'' | Interfață unificată senzori (dependență BMP280) | Adafruit Industries | | + | | ''<stdio.h>, <string.h>, <stdint.h>'' | Tipuri de date standardizate, operatii de I/O si manipulare buffer-e / siruri de caractere | AVR-GCC Toolchain | |
| - | | ''avr/io.h'', ''avr/interrupt.h'' | Acces direct la registre AVR și ISR | AVR-libc (toolchain) | | + | | ''pyserial'' | Gestionarea comunicatiei seriale (UART) intre microcontroler si scriptul Python | Python Package Index (PyPI) | |
| - | | ''SoftwareSerial.h'' | UART pe pini software (dezvoltare/debug) | inclusă în Arduino core | | + | | ''mysql-connector-python'' | Stabilirea conexiunii si executarea interogarilor in baza de date MySQL | Oracle (PyPI) | |
| + | | ''streamlit'' | Framework pentru generarea interfetei grafice web in mod dinamic. | Streamlit Inc. (PyPI) | | ||
| + | |||
| + | ====Algoritmi şi structuri==== | ||
| + | |||
| + | ===1. Masurarea non-blocanta a distantei (Senzor Ultrasonic HC-SR04)=== | ||
| + | |||
| + | Sistemul evita utilizarea functiilor blocante printr-o abordare hardware asincrona. La fiecare 200 ms, în bucla principala, se genereaza un impuls Trigger de 10 μs. Receptia semnalului Echo este captata hardware printr-o intrerupere de tip Pin Change (PCINT2_vect). | ||
| + | Pentru a calcula durata exacta a semnalului HIGH, algoritmul foloseste un mecanism hibrid de cronometrare: combina contorul global de milisecunde (g_uptime_ms) cu valoarea instantanee a registrului Timer0 (TCNT0), obtinand o rezolutie foarte fină (4 μs per pas). Conversia din timp in distanta (centimetri) se face printr-o operatie optimizata pentru a evita calculele cu virgula mobila (floating-point), folosind direct constanta acustica: dist = durata_us / 58. Aceasta abordare elibereaza complet CPU-ul in timpul deplasarii undei sonore. | ||
| + | |||
| + | ===2. Scalare liniara și generare semnal PWM hardware (Servomotor)=== | ||
| + | |||
| + | Controlul barierei se realizeaza asincron, manipuland direct perifericul Timer1 configurat in modul Fast PWM. In loc sa recurga la biblioteci standard, unghiul bratului este controlat printr-un algoritm de scalare liniara care transforma unghiul fizic (0° – 90°) in ciclu de lucru (duty cycle), modificand valoarea registrului de comparare OCR1A. | ||
| + | Formula utilizata este OCR1A = 2000 + (angle * 2000 / 90). Aceasta ecuatie translateaza gradele in „ticuri” de ceas de baza: pentru pozitia inchisa (0°), registrul ia valoarea de baza 2000 (generand un impuls precis de 1 ms), iar pentru pozitia deschisa (90°) atinge pragul de 4000 (impuls de 2 ms). Actualizarea directa a acestui registru permite o actionare mecanica precisa, in timp ce generarea frecventei de 50 Hz este gestionata complet in fundal de catre unitatea hardware, eliminand orice overhead asupra microcontrolerului. | ||
| + | |||
| + | ===3. Detectarea fronturilor (Edge Detection) si calculul dinamic al tarifului=== | ||
| + | Senzorii infrarosu pentru locurile de parcare sunt cititi periodic, insa sistemul nu prelucreaza starea lor continua, ci reactioneaza strict la tranzitiile de stare (detectarea fronturilor crescatoare si descrescatoare) comparand starea curenta cu cea anterioara. La ocuparea locului (front descrescator): Sistemul memoreaza amprenta de timp curenta in vectorul 'occupancy_start_time'. La eliberarea locului (front crescator), sistemul calculeaza diferenta de timp pentru a afla durata stationarii in milisecunde. Algoritmul aplica apoi modelul de tarifare multiplicand secundele scurse cu constanta PRICE_PER_SECOND, generand valoarea finala de plata in mod dinamic si eficient din punct de vedere al memoriei. | ||
| + | |||
| + | ===4. Automat de stari temporizat pentru controlul accesului=== | ||
| + | Pentru a permite sistemului sa citeasca in continuare senzorii si sa trimita date pe seriala in timp ce o masina trece pe la bariera, s-a eliminat complet utilizarea functiilor de intarziere (delay). Logica barierei a fost modelata ca un automat de stari folosind variabilele 'asteptare_inchidere' si 'moment_eliberare_senzor'. Cand o masina declanseaza bariera, sistemul o ridica si asteapta ca vehiculul sa paraseasca raza senzorului ultrasonic. Odata ce senzorul nu mai detecteaza obstacolul (dist > 10), se declanseaza un "timp de gratie" de 3 secunde (current_time - moment_eliberare_senzor > 3000). Aceasta abordare garanteaza ca bariera nu va cobori peste masina (prevenind accidentele) si pastreaza microcontrolerul 100% responsiv in timpul celor 3 secunde de asteptare. | ||