Differences

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

Link to this comparison view

pm:prj2026:atoader:theodor.mitrofan [2026/05/22 18:31]
theodor.mitrofan [Software Design]
pm:prj2026:atoader:theodor.mitrofan [2026/05/25 12:03] (current)
theodor.mitrofan [Introducere]
Line 10: Line 10:
 Pentru mine, utilitatea este didactica si practica: invat sa stapanesc interactiunea dintre senzori asincroni (RFID, Ultrasonic) si actuatoare (Servomotor) folosind o arhitectura de tip Finite State Machine (FSM), eliminand total functiile blocante de tip delay(). Pentru un utilizator real, sistemul ofera un feedback clar (pe ecranul LCD) si un acces fluid. Pentru mine, utilitatea este didactica si practica: invat sa stapanesc interactiunea dintre senzori asincroni (RFID, Ultrasonic) si actuatoare (Servomotor) folosind o arhitectura de tip Finite State Machine (FSM), eliminand total functiile blocante de tip delay(). Pentru un utilizator real, sistemul ofera un feedback clar (pe ecranul LCD) si un acces fluid.
  
-Laboratoarele folosite au fost 3-timere, 5-spi si 6-i2c+Laboratoarele folosite au fost 3-timere, PWM, 5-spi si 6-i2c
  
 ===== Descriere generala ===== ===== Descriere generala =====
Line 70: Line 70:
 | **RFID RC522** | SS (SDA) | PB2 / SS | Pin configurat ca ieșire pentru a selecta modulul pe magistrala SPI (Slave Select). | | **RFID RC522** | SS (SDA) | PB2 / SS | Pin configurat ca ieșire pentru a selecta modulul pe magistrala SPI (Slave Select). |
 | **RFID RC522** | IRQ | Neconectat | Pin opțional pentru întreruperi,​ lăsat liber deoarece sistemul interoghează modulul direct din cod (polling). | | **RFID RC522** | IRQ | Neconectat | Pin opțional pentru întreruperi,​ lăsat liber deoarece sistemul interoghează modulul direct din cod (polling). |
-===== Software Design =====                                  +===== Software Design =====
-  In stadiul actual, partea software a proiectului este functionala si        +
-  integreaza toate componentele principale ale sistemului.+
  
-  Functionalitatile implementate pana acum sunt:                              +In stadiul actualpartea software a proiectului este functionala si integreaza toate componentele principale ale sistemului.
-    +
-  - citirea UID-ului de pe cardurile RFID prin modulul RC522                  +
-  - autorizarea cardurilor pe baza unei liste de UID-uri cunoscutesalvate +
-  in firmware +
-  - controlul barierei (servomotor) prin semnal PWM generat pe Timer1 +
-  - detectarea trecerii masinii prin senzorul ultrasonic HC-SR04 +
-  - afisarea starii ​sistemului ​pe display-ul LCD 16x2 prin I2C (expander +
-  PCF8574) +
-  - numararea locurilor libere si actualizarea automata dupa fiecare intrare +
-  confirmata +
-  - tratarea cazului in care parcarea este plina, fara a ridica bariera +
-  - tratarea cazului de timeout, in care cardul a fost scanat dar masina nu a +
-   ​trecut +
-  - trimiterea de mesaje de debug prin UART pentru fiecare eveniment+
  
-  La porniresistemul initializeaza toate perifericele si afiseaza ​pe LCD +Functionalitatile implementate pana acum sunt: 
-  ​numarul de locuri ​libere ​din totalul de 10. Sistemul intra apoi intr-o +  * citirea UID-ului de pe cardurile RFID prin modulul RC522                  
-  ​bucla in care asteapta scanarea unui card. Dupa ce un card este detectat si +  * autorizarea cardurilor pe baza unei liste de UID-uri cunoscutesalvate in firmware 
-   ​validatbariera se ridica, iar sistemul incepe sa monitorizeze senzorul +  * controlul barierei (servomotor) prin semnal PWM generat ​pe Timer1 
-  ​ultrasonic pentru a confirma trecerea masinii inainte ​de a inchide bariera +  * detectarea trecerii masinii prin senzorul ultrasonic HC-SR04 
-  ​la loc si a decrementa contorul.+  * afisarea starii sistemului pe display-ul ​LCD 16x2 prin I2C (expander PCF8574) 
 +  ​* numararea locurilor ​libere ​si actualizarea automata dupa fiecare intrare confirmata 
 +  ​* tratarea cazului ​in care parcarea ​este plinafara a ridica ​bariera 
 +  ​* tratarea cazului ​de timeout, in care cardul ​fost scanat dar masina nu a trecut 
 +  ​* trimiterea de mesaje de debug prin UART pentru fiecare eveniment
  
-  ==== Structura codului ====+La pornire, sistemul initializeaza toate perifericele si afiseaza pe LCD numarul de locuri libere din totalul de 10. Sistemul intra apoi intr-o bucla in care asteapta scanarea unui card. Dupa ce un card este detectat si validat, bariera se ridica, iar sistemul incepe sa monitorizeze senzorul ultrasonic pentru a confirma trecerea masinii inainte de a inchide bariera la loc si a decrementa contorul.
  
-  Codul este impartit in module clare, fiecare cu rol bine definit:+==== Structura codului ====
  
-  - initializare periferice: UART, I2C, SPI, RC522, servo (Timer1), HC-SR04, +Codul este impartit in module clare, fiecare cu rol bine definit: 
-  ​LCD +  * initializare periferice: UART, I2C, SPI, RC522, servo (Timer1), HC-SR04, LCD 
-  ​modul SPI: configurare master, transfer pe 8 biti, control SS si RST +  ​modul SPI: configurare master, transfer pe 8 biti, control SS si RST pentru RC522 
-  ​pentru RC522 +  ​modul RC522: scriere/​citire registri, control antena, REQUEST, anticolizie si citire UID dubla pentru validare 
-  ​modul RC522: scriere/​citire registri, control antena, REQUEST, +  ​modul I2C: TWI master la ~100 kHz, doar operatii de scriere (LCD-ul nu necesita citire) 
-  ​anticolizie si citire UID dubla pentru validare +  ​modul LCD: driver HD44780 in mod 4-bit prin expander PCF8574, functii pentru clear, set_cursor, write_char/​string/​num 
-  ​modul I2C: TWI master la ~100 kHz, doar operatii de scriere (LCD-ul nu +  ​modul display: functii de nivel inalt pentru ecranele recurente (idle si parcare plina) 
-  ​necesita citire) +  ​modul servo: PWM pe Timer1 (Fast PWM, ICR1 ca TOP), control pozitie inchis/​deschis cu pre-pas pentru a forta miscarea 
-  ​modul LCD: driver HD44780 in mod 4-bit prin expander PCF8574, functii +  ​modul sonar: trigger pe PD2, masurare durata ecou pe PD3, conversie in cm prin impartire la 58 
-  ​pentru clear, set_cursor, write_char/​string/​num +  ​modul cards: lista statica de UID-uri autorizate si functia card_authorized() bazata pe memcmp 
-  ​modul display: functii de nivel inalt pentru ecranele recurente (idle si +  ​modul UART: configurare 9600 baud 8N1 si functii pentru text, numere zecimale, hex si UID 
-  ​parcare plina) +  ​logica principala: main.cpp orchestreaza toate modulele intr-o masina de stari implicita
-  ​modul servo: PWM pe Timer1 (Fast PWM, ICR1 ca TOP), control pozitie +
-  ​inchis/​deschis cu pre-pas pentru a forta miscarea +
-  ​modul sonar: trigger pe PD2, masurare durata ecou pe PD3, conversie in cm +
-   prin impartire la 58 +
-  ​modul cards: lista statica de UID-uri autorizate si functia +
-  ​card_authorized() bazata pe memcmp +
-  ​modul UART: configurare 9600 baud 8N1 si functii pentru text, numere +
-  ​zecimale, hex si UID +
-  ​logica principala: main.cpp orchestreaza toate modulele intr-o masina de +
-  ​stari implicita.+
  
-  ​==== Interactiunea dintre functionalitati ====+==== Interactiunea dintre functionalitati ====
  
-  ​Fluxul principal al aplicatiei este urmatorul:+Fluxul principal al aplicatiei este urmatorul: 
 +  * utilizatorul porneste sistemul 
 +  * perifericele sunt initializate si pe LCD apare mesajul "​Scanati cartela"​ impreuna cu numarul de locuri libere 
 +  * bariera este coborata in pozitia inchisa 
 +  * sistemul intra in bucla principala si asteapta un card RFID 
 +  * cand un card este detectat, RC522 returneaza UID-ul prin SPI 
 +  * sistemul verifica daca UID-ul este in lista de carduri autorizate 
 +  * daca UID-ul nu este autorizat, LCD afiseaza "Card respins"​ si revine la idle 
 +  * daca UID-ul este autorizat dar parcarea este plina, LCD afiseaza "​PARCARE PLINA" si revine la idle 
 +  * daca UID-ul este autorizat si exista locuri libere, servoul ridica bariera 
 +  * sistemul monitorizeaza HC-SR04 pentru a detecta trecerea masinii 
 +  * dupa ce masina trece, bariera coboara, contorul de locuri libere este decrementat,​ iar LCD-ul afiseaza "Loc ocupat"​ 
 +  * daca masina nu este detectata in intervalul de timp permis, bariera coboara fara a decrementa contorul, iar LCD-ul afiseaza "​Timeout!"​ 
 +  * sistemul revine la starea idle si asteapta urmatorul card
  
-  - utilizatorul porneste ​sistemul +Prin aceasta logica, ​sistemul ​evita sa scada locurile ​libere daca masina ​nu trece efectiv prin dreptul senzorului, si nu ridica bariera in fata cardurilor neautorizate sau cand parcarea este deja plina.
-  - perifericele sunt initializate si pe LCD apare mesajul "​Scanati cartela"​ +
-  impreuna cu numarul de locuri ​libere +
-  - bariera este coborata in pozitia inchisa +
-  - sistemul intra in bucla principala si asteapta un card RFID +
-  - cand un card este detectat, RC522 returneaza UID-ul prin SPI +
-  - sistemul verifica ​daca UID-ul este in lista de carduri autorizate +
-  - daca UID-ul ​nu este autorizatLCD afiseaza "Card respins" ​si revine la +
-  idle +
-  - daca UID-ul este autorizat dar parcarea este plina, LCD afiseaza "​PARCARE +
-   ​PLINA"​ si revine la idle +
-  - daca UID-ul este autorizat si exista locuri libere, servoul ridica +
-  bariera +
-  - sistemul monitorizeaza HC-SR04 pentru a detecta trecerea masinii +
-  - dupa ce masina trece, bariera coboara, contorul de locuri libere este +
-  decrementat,​ iar LCD-ul afiseaza "Loc ocupat"​ +
-  - daca masina nu este detectata in intervalul de timp permis, bariera +
-  coboara fara a decrementa contorul, iar LCD-ul afiseaza "​Timeout!"​ +
-  - sistemul revine la starea idle si asteapta urmatorul card+
  
-  Prin aceasta logica, sistemul evita sa scada locurile libere daca masina nu +==== Detectia trecerii masinii ====
-   trece efectiv prin dreptul senzorului, si nu ridica bariera in fata +
-  cardurilor neautorizate sau cand parcarea este deja plina.+
  
-  ==== Detectia trecerii masinii ====+Pentru a confirma ca masina a trecut efectiv prin dreptul barierei am folosit senzorul ultrasonic HC-SR04. Algoritmul nu se bazeaza pe o singura citire, ci pe doua etape consecutive de filtrare: 
 +  * etapa 1 - detectia prezentei: sistemul polleaza senzorul la fiecare 100 ms; daca 3 citiri consecutive returneaza o distanta mai mica de 30 cm, se considera ca masina este sub senzor 
 +  * etapa 2 - detectia plecarii: dupa ce masina a fost detectata, sistemul continua sa polleze; daca 5 citiri consecutive returneaza o distanta mai mare sau egala cu 30 cm, se considera ca masina a parasit zona
  
-  Pentru a confirma ca masina a trecut efectiv prin dreptul barierei am +Numarul de citiri consecutive necesare are rol de debounce si elimina citirile false cauzate de zgomotul ​ultrasonic ​sau de obstacole tranzitoriiDaca etapa 1 nu se incheie in 300 de cicluri (~30 secunde), tranzactia este considerata timeout si contorul nu este decrementat.
-  folosit senzorul ​ultrasonic ​HC-SR04Algoritmul ​nu se bazeaza pe o singura +
-  citire, ci pe doua etape consecutive ​de filtrare:+
  
-  - etapa 1 - detectia prezentei: sistemul polleaza senzorul la fiecare 100 +==== Controlul barierei ====
-  ms; daca 3 citiri consecutive returneaza o distanta mai mica de 30 cm, se +
-  considera ca masina este sub senzor +
-  - etapa 2 - detectia plecarii: dupa ce masina a fost detectata, sistemul +
-  continua sa polleze; daca 5 citiri consecutive returneaza o distanta mai +
-  mare sau egala cu 30 cm, se considera ca masina a parasit zona+
  
-  Numarul ​de citiri consecutive necesare are rol de debounce ​si elimina +Bariera este actionata ​de un servomotor cu rotatie continua (CR), controlat prin PWM la 50 Hz generat ​de Timer1 in mod Fast PWM cu ICR1 = 40000 (TOP) si prescaler /8. Pentru acest tip de servomotor, latimea pulsului setata prin OCR1A nu dicteaza o pozitie fixa a bratului, ci directia si viteza de rotatie a motorului: 
-  ​citirile false cauzate ​de zgomotul ultrasonic sau de obstacole tranzitorii+  ​* stare de STOP (rotor oprit): OCR1A = 3000 (~1.5 ms) 
-   Daca etapa 1 nu se incheie in 300 de cicluri ​(~30 secunde), tranzactia +  * miscare sens deschidere: OCR1A = 2400 (~1.2 ms
-  ​este considerata timeout si contorul nu este decrementat.+  ​* miscare sens inchidere: OCR1A = 3600 (~1.8 ms)
  
-  ​==== Controlul barierei ​====+Pentru a asigura o cursa corecta a barierei, functia servo_set_position() activeaza miscarea in directia dorita (deschis sau inchis) pentru un timp prestabilit (ROT_TIME_MS,​ calibrat pentru unghiul de ~90 de grade). Dupa expirarea acestui delay generat de _delay_ms(),​ semnalul PWM revine automat la valoarea de STOP (3000) pentru a frana si opri rotorul in noua pozitie. Aceasta calibrare inlocuieste controlul clasic in bucla inchisa al servomotoarelor standard. 
 +==== Validarea functionalitatilor ​====
  
-  Servomotorul este controlat prin PWM la 50 Hz generat ​de Timer1 in mod Fast +Am testat fiecare componenta separat inainte ​de integrarea finala: 
-   PWM cu ICR1 = 39999 (TOP) si prescaler ​/8Latimea pulsului este setata +  * RC522 a fost testat citind registrul de versiune ​(0x37la pornire ​si trimitand valoarea prin UART pentru a confirma comunicarea SPI 
-  ​prin OCR1A:+  * LCD-ul a fost testat initial cu un mesaj fix ("​Sistem parcare ​Initializare..."), apoi cu cifre si stringuri dinamice (contorul de locuri) 
 +  ​* servomotorul a fost testat separat alternand pozitiile SERVO_INCHIS si SERVO_DESCHIS pentru a regla valorile ​OCR1A 
 +  * HC-SR04 a fost testat trimitand distanta masurata prin UART si trecand obiecte prin fata senzorului 
 +  * algoritmul de autorizare a fost testat cu carduri din lista (UID 0x85 0x64 0xF3 0x06 si 0xE6 0xD7 0x10 0x06) si cu carduri necunoscute,​ pentru a verifica ambele ramuri (acces permis / acces respins) 
 +  * fluxul complet a fost testat scanand card, ridicand bariera, simuland trecerea unei masini (mana in fata senzorului) si verificand decrementarea contorului
  
-  - pozitia inchisOCR1A = 2700 (~1.35 ms) +Pentru debug am folosit UART la 9600 baud, unde se afiseaza fiecare eveniment importantUID-ul citit, statusul autorizarii,​ momentul ridicarii barierei, detectia masinii, timeout-urile si starea contorului dupa fiecare tranzactie.
-  ​pozitia deschis: OCR1A = 3300 (~1.65 ms)+
  
-  Pentru a asigura o miscare fiabila a servoului, functia +==== Optimizari realizate ====
-  servo_set_position() trimite intai o valoare de "​pre-pas"​ exagerata (2300 +
-  pentru inchis, 3700 pentru deschis), urmata de un delay de 200 ms, dupa +
-  care se aseaza pe valoarea finala. Acest pre-pas forteaza servoul sa +
-  porneasca miscarea chiar daca era deja aproape de pozitia target.+
  
-  ==== Validarea functionalitatilor ====+O prima optimizare a fost dubla citire a UID-ului in rc522_read_card(). Prima citire se face, apoi dupa 50 ms se face a doua citire si se compara cu prima. UID-ul este acceptat doar daca cele doua citiri sunt identice. Aceasta optimizare elimina UID-urile gresite cauzate de coliziuni partiale sau de carduri scoase din campul antenei in timpul citirii.
  
-  Am testat fiecare componenta separat inainte de integrarea finala:+A doua optimizare a fost filtrarea UID-urilor invalide (toate octetii 0x00 sau toti 0xFF). Aceste valori apar uneori cand antena RC522 detecteaza zgomot electromagnetic,​ dar nu corespund unui card real, si rejectandu-le se evita interpretarea zgomotului ca un card neautorizat.
  
-  - RC522 a fost testat citind registrul de versiune ​(0x37la pornire si +A treia optimizare ​a fost resetarea campului antenei dupa fiecare tranzactie prin rc522_reset_field(). Aceasta opreste antena ​pentru ​100 ms si o porneste ​din nouceea ce forteaza cardul aflat in apropiere sa fie recitit ca o tranzactie noua, in loc sa fie tratat ca o citire repetata.
-  trimitand valoarea prin UART pentru a confirma comunicarea SPI +
-  - LCD-ul a fost testat initial cu un mesaj fix ("​Sistem parcare / +
-  Initializare..."), apoi cu cifre si stringuri dinamice (contorul de locuri) +
-  - servomotorul a fost testat separat alternand pozitiile SERVO_INCHIS si +
-  SERVO_DESCHIS ​pentru ​a regla valorile OCR1A +
-  - HC-SR04 a fost testat trimitand distanta masurata prin UART si trecand +
-  obiecte prin fata senzorului +
-  - algoritmul de autorizare a fost testat cu carduri ​din lista (UID 0x85 +
-  0x64 0xF3 0x06 si 0xE6 0xD7 0x10 0x06) si cu carduri necunoscutepentru a +
-  verifica ambele ramuri (acces permis / acces respins) +
-  - fluxul complet a fost testat scanand cardridicand bariera, simuland +
-  trecerea unei masini (mana in fata senzorului) si verificand decrementarea +
-  contorului+
  
-  Pentru debug am folosit UART la 9600 baudunde se afiseaza ​fiecare +A patra optimizare a fost folosirea detectiei in doua etape la HC-SR04 (prezenta + plecare, fiecare ​cu praguri de citiri consecutive). Aceasta abordare evita atat alarmele false (un obiect care apare o singura citire)cat si decrementarea prematura a contorului ​(in care masina inca este sub senzor cand bariera se inchide).
-  eveniment important: UID-ul cititstatusul autorizarii,​ momentul ridicarii +
-   ​barierei,​ detectia masinii, timeout-urile ​si starea ​contorului ​dupa +
-  fiecare tranzactie.+
  
-  ​==== Optimizari realizate ​====+==== Element de noutate ​====
  
-  O prima optimizare ​a fost dubla citire ​UID-ului in rc522_read_card(). +Elementul de noutate al proiectului este faptul ca sistemul nu se limiteaza la a ridica bariera la scanarea unui card, ci confirma fizic trecerea masinii inainte de a marca locul ca fiind ocupat. Sistemul diferentiaza intre trei situatii: 
-  ​Prima citire se face, apoi dupa 50 ms se face doua citire ​si se compara +  * cardul ​a fost scanat dar masina nu trecut ​(timeout- bariera se inchide fara a decrementa contorul 
-  ​cu prima. UID-ul este acceptat doar daca cele doua citiri sunt identice. +  ​* cardul ​fost scanat ​si masina a trecut - bariera ​se inchide si contorul scade cu 1 
-  ​Aceasta optimizare elimina UID-urile gresite cauzate de coliziuni partiale +  ​* cardul a fost scanat dar parcarea este plina bariera nu se ridica deloc
-  sau de carduri scoase din campul antenei in timpul citirii.+
  
-  A doua optimizare a fost filtrarea UID-urilor invalide (toate octetii 0x00 +In plus, prin combinatia dintre verificarea dubla a UID-ului si filtrarea citirilor de zgomot pe antena RC522, sistemul evita sa accepte sau sa respinga in mod fals un card pe baza unei singure citiri instabile. Astfel, sistemul ofera o sincronizare reala intre evenimentul de autorizare si miscarea fizica a masinii, lucru care nu ar fi posibil cu un simplu cititor RFID conectat direct la actuator.
-  sau toti 0xFF). Aceste valori apar uneori cand antena RC522 detecteaza +
-  zgomot electromagnetic,​ dar nu corespund unui card real, si rejectandu-le +
-  se evita interpretarea zgomotului ca un card neautorizat. +
- +
-  A treia optimizare a fost resetarea campului antenei dupa fiecare +
-  tranzactie prin rc522_reset_field(). Aceasta opreste antena pentru 100 ms +
-  si o porneste din nou, ceea ce forteaza cardul aflat in apropiere sa fie +
-  recitit ca o tranzactie noua, in loc sa fie tratat ca o citire repetata. +
- +
-  A patra optimizare a fost folosirea detectiei in doua etape la HC-SR04 +
-  (prezenta + plecare, fiecare cu praguri de citiri consecutive). Aceasta +
-  abordare evita atat alarmele false (un obiect care apare o singura citire), +
-   cat si decrementarea prematura a contorului (in care masina inca este sub +
-  senzor cand bariera se inchide). +
- +
-  ==== Element de noutate ==== +
- +
-  Elementul de noutate al proiectului este faptul ca sistemul nu se limiteaza +
-   la a ridica bariera la scanarea unui card, ci confirma fizic trecerea +
-  masinii inainte de a marca locul ca fiind ocupat. Sistemul diferentiaza +
-  intre trei situatii: +
- +
-  - cardul a fost scanat dar masina nu a trecut (timeout) - bariera se +
-  inchide fara a decrementa contorul +
-  - cardul a fost scanat si masina a trecut - bariera se inchide si contorul +
-  scade cu 1 +
-  - cardul a fost scanat dar parcarea este plina - bariera nu se ridica deloc +
- +
-  ​In plus, prin combinatia dintre verificarea dubla a UID-ului si filtrarea +
-  ​citirilor de zgomot pe antena RC522, sistemul evita sa accepte sau sa +
-  ​respinga in mod fals un card pe baza unei singure citiri instabile. Astfel, +
-   sistemul ofera o sincronizare reala intre evenimentul de autorizare si +
-  ​miscarea fizica a masinii, lucru care nu ar fi posibil cu un simplu cititor +
-   RFID conectat direct la actuator.+
 ===== Rezultate Obtinute ===== ===== Rezultate Obtinute =====
  
-===== Concluzii ===== +[[https://​github.com/​TheodorMitrofan/​Smart-parking-system|Link github]]
-===== Download =====+
  
 +[[https://​youtube.com/​shorts/​nlaD8SWR9kA?​feature=share|Link video demo]]
  
  
pm/prj2026/atoader/theodor.mitrofan.1779463893.txt.gz · Last modified: 2026/05/22 18:31 by theodor.mitrofan
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