Differences

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

Link to this comparison view

pm:prj2026:ciprian.popescu0411:alexandru.dabija04 [2026/05/18 14:42]
127.0.0.1 external edit
pm:prj2026:ciprian.popescu0411:alexandru.dabija04 [2026/05/24 20:33] (current)
alexandru.dabija04
Line 50: Line 50:
 Modulul RFID RC522 este conectat direct la placă, fără a utiliza breadboard-ul. Acesta funcționează la 3.3V, nu la 5V. Modulul RFID RC522 este conectat direct la placă, fără a utiliza breadboard-ul. Acesta funcționează la 3.3V, nu la 5V.
  
-Pentru LCD, deoarece nu a fost utilizat un potențiometru, ​pinul V0 (responsabil ​de controlul contrastului) este conectat la PD6 al microcontroller-ului, ​un pin cu suport PWM. Astfel, contrastul este controlat printr-un semnal PWM setat la aproximativ 50% duty cycle. +Pentru LCD, deoarece nu a fost utilizat un potențiometru, ​am facut un divizor ​de tensiune (foloseam pwm dar acesta dadea un puls instabil si uneori aparea gibberish pe lcd)
 Modul LCD 1602 Modul LCD 1602
  
Line 57: Line 56:
 | VSS | GND breadboard | | VSS | GND breadboard |
 | VDD | VCC breadboard | | VDD | VCC breadboard |
-| V0 | PD6 microcontroller ​|+| V0 | div tenisiunde format din 1 rez 1k 2 rez 380 si o rez 10k|
 | RS | PD7 microcontroller | | RS | PD7 microcontroller |
 | RW | GND breadboard | | RW | GND breadboard |
Line 123: Line 122:
  
  
-===== Software Design =====+====== Software Design =====
 + 
 +      * Demo: https://​youtube.com/​shorts/​VWpsEvxI2Nw 
 +      * github: https://​github.com/​dabijaAlex/​Voting 
 + 
 +Proiectul a fost dezvoltat in PlatformIO, folosind framework-ul Arduino pentru microcontrolerul ATmega328P. Codul este scris in C++ si este complet modularizat pentru a asigura o structura curata si o mentenanta usoara.  
 + 
 +Sistemul utilizeaza intrari si iesiri digitale (GPIO) pentru controlul LED-urilor de stare, butoanelor de vot (YES/NO) si al buzzerului. De asemenea, firmware-ul integreaza comunicatia hardware pe magistrala SPI pentru cititorul de carduri RFID, bit-banging software pe 4 biti pentru ecranul LCD paralel si comunicatia UART (USART0) prin Serial Monitor pentru configurare,​ control si logarea cardurilor neautorizate. 
 + 
 +Arhitectura modulara a codului: 
 +  * **config.h**:​ Centralizeaza toate definitiile de pini hardware (LED-uri, buzzer, butoane, pini SPI si LCD) si constantele globale (debounce, dimensiuni maxime). 
 +  * **global_vars.h / global_vars.cpp**:​ Gestioneaza alocarea de memorie si partajarea sigura a variabilelor de stare, vectorilor de votanti si obiectelor prin directiva ''​extern''​. 
 +  * **lcd.h / lcd.cpp**: Contine driverul grafic de control pentru ecranul paralel si algoritmul inteligent de wrapping al textului. 
 +  * **audio.h / audio.cpp**:​ Gestioneaza semnalele acustice emise de buzzer pentru interactiunea cu utilizatorul. 
 +  * **utils.h / utils.cpp**:​ Include logica de parsare a string-urilor Hex, verificarea semnaturilor UID si initializarea initiala a perifericelor. 
 +  * **main.cpp**:​ Reprezinta orchestratorul principal ce contine rutinele de intrerupere si masina de stari. 
 + 
 +Functii principale implementate:​
  
 +^ Functie ^ Rol ^
 +| main() | Punctul de intrare obligatoriu in aplicatia C++. Initializeaza timerele si registrii interni prin functia Arduino ''​init()''​ si ruleaza intr-o bucla infinita programul. |
 +| setup() | Configureaza starea initiala a perifericelor hardware, porneste comunicatia seriala, magistrala SPI, cititorul RFID si ecranul LCD, aducand sistemul intr-o stare stabila de functionare. |
 +| loop() | Reprezinta bucla principala a programului. Verifica asincron buffer-ul serial si ruteaza logica aplicatiei prin intermediul unui automat cu 9 stari logice distincte. |
 +| ISR(PCINT1_vect) | Rutina de intrerupere pe schimbarile de pin (Port C). Gestioneaza debouncing-ul software prin timestamp-uri ''​millis()''​ pentru a inregistra corect apasarile butoanelor de vot YES si NO. |
 +| lcd_init() | Initializeaza fizic ecranul LCD paralel in modul de lucru pe 4 biti, trimitand secventele de initializare si setand parametrii de afisare (cursor dezactivat, directia de scriere). |
 +| lcd_command(uint8_t cmd) | Trimite o comanda de control catre registrul de instructiuni al LCD-ului (ex: curatare ecran, deplasare cursor) utilizand o abordare sigura cu blocarea temporara a intreruperilor. |
 +| lcd_data(uint8_t data) | Transmite un octet de date catre registrul RAM (DDRAM) al LCD-ului pentru a afisa un caracter specific pe ecran la pozitia curenta a cursorului. |
 +| lcd_display_message() | Afiseaza mesaje pe ecranul LCD. Include un algoritm inteligent de wrapping care cauta ultimul spatiu (''​ ' ' ''​) din primele 16 caractere pentru a muta textul pe randul doi fara a rupe cuvintele. |
 +| sound_buzzer() | Genereaza o frecventa bruta pe pinul buzzerului, comutand starea logica HIGH/LOW la un interval specific de microsecunde pentru o durata determinata de milisecunde. |
 +| play_accept_sound() | Ruleaza o secventa acustica scurta si ascutita pentru a confirma vizual si auditiv ca un card valid a fost scanat si accesul la vot a fost permis. |
 +| play_denied_sound() | Genereaza un ton grav si prelungit pentru a semnala o eroare critica sau incercarea de utilizare a unui card neautorizat. |
 +| play_warning_sound() | Emite un semnal acustic intermitent de avertizare pentru a notifica utilizatorul ca un votant autorizat incearca sa introduca un buletin de vot duplicat. |
 +| check_uid_match() | Compara octet cu octet o semnatura UID scanata de la un card RFID cu baza de date locala a sesiunii pentru a determina validitatea acesteia. |
 +| clear_rfid_cache() | Curata complet structura interna de date a cititorului MFRC522 si buffer-ul UID pentru a pregati senzorul pentru o noua citire corecta. |
 +| parse_uid_string() | Convertecte string-ul ASCII de 8 caractere hexazecimale primit din Serial Monitor in octeti fizici de date pentru a putea fi stocati si comparati in memorie. |
 +| print_unauthorized_uid() | Formateaza si transmite prin USART0 catre Serial Monitor un mesaj de alerta ce contine ID-ul hexazecimal complet al unui card respins, permitand monitorizarea tentativelor de frauda. |
  
-<note tip> +Logica Automatului de Stari (State Machine): 
-Descrierea codului aplicaţiei ​(firmware): +Sistemul tranzitioneaza dinamic intre 9 stări: ''​STATE_SLEEPING'' ​(asteapta comanda "​start"​), ''​STATE_SETUP_QUESTION''​ (salveaza intrebarea), ''​STATE_SETUP_VOTERS''​ (configureaza numarul si UID-urile votantilor),​ ''​STATE_SHOW_WELCOME'' ​(solicita card), ''​STATE_WAIT_FOR_CARD'' ​(interogheaza RFID si blocheaza butoanele), ''​STATE_VOTING_PROMPT''​ (asteapta alegerea YES/NO), ''​STATE_ACCESS_DENIED''​ (card necunoscut),​ ''​STATE_ALREADY_VOTED''​ (vot duplicat) si ''​STATE_FINISHED''​ (afisare rezultate finale).
-  * mediu de dezvoltare ​(if any(e.g. AVR StudioCodeVisionAVR) +
-  * librării şi surse 3rd-party (e.g. Procyon AVRlib) +
-  * algoritmi şi structuri pe care plănuiţi să le implementaţi +
-  * (etapa 3surse şi funcţii implementate +
-</note>+
  
-===== Rezultate Obţinute =====+Interceptia Globala de Reset: 
 +La fiecare iteratie din ''​loop()'',​ sistemul verifica registrul hardware ''​UCSR0A''​. Daca se detecteaza cuvantul cheie **"​reset"​** primit prin terminal, logica normala a starii curente este suprascrisa instantaneu. Sistemul curata toate datele din buffer, reseteaza flag-urile (inclusiv variabila globala de printare seriala ''​printed_final''​) si aduce sistemul inapoi in starea initiala de veghe (''​STATE_SLEEPING''​).
  
-<note tip> +Biblioteci folosite:
-Care au fost rezultatele obţinute în urma realizării proiectului vostru. +
-</​note>​+
  
-===== Concluzii =====+^ Biblioteca ^ Rol ^ 
 +| Arduino.h | Functii de baza pentru interactiunea cu hardware-ul ATmega328P: control GPIO, gestionare timere, delay, macro-uri de bit. | 
 +| SPI.h | Gestioneaza comunicatia pe magistrala hardware SPI (pinii MOSI, MISO, SCK) pentru transferul de date de mare viteza cu perifericele active. | 
 +| MFRC522.h | Asigura driverul software complet pentru controlul cipului RFID MFRC522, acoperind initializarea antenei, citirea si incarcarea UID-ului. | 
 +| usart.h | Modul extern dezvoltat in C dedicat interactiunii directe cu registrii USART0 (UBRR0, UCSR0B, UDR0) pentru transmisia si receptia pe interfata seriala. |
  
-===== Download ===== 
  
-<note warning> 
-O arhivă (sau mai multe dacă este cazul) cu fişierele obţinute în urma realizării proiectului:​ surse, scheme, etc. Un fişier README, un ChangeLog, un 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 Alin, 331CC -> **:​pm:​prj2009:​cc:​dumitru_alin**. +===== Resurse Hardware =====
-</​note>​+
  
-===== Jurnal =====+  * **Placa de dezvoltare ATmega328P Xplained Mini**: https://​www.microchip.com/​en-us/​development-tool/​atmega328p-xmini 
 +  * **Documentatie Laborator PM (Xplained Mini)**: https://​ocw.cs.pub.ro/​courses/​pm/​proiect/​xplainedmini 
 +  * **Schema si Cablaj PM-Board**: https://​github.com/​dantudose/​PM-Board
  
-<note tip> 
-Puteți avea și o secțiune de jurnal în care să poată urmări asistentul de proiect progresul proiectului. 
-</​note>​ 
  
-===== Bibliografie/​Resurse =====+===== Resurse ​Software ​=====
  
-<​note>​ +  * **MFRC522 Library**: https://​github.com/​miguelbalboa/​rfid 
-Listă cu documente, datasheet-uri,​ resurse Internet folosite, eventual grupate pe **Resurse Software** şi **Resurse Hardware**. +  * **SPI Library**: https://​github.com/​arduino/​ArduinoCore-avr/​tree/​master/​libraries/​SPI 
-</note>+  ​* **Arduino Core for AVR Framework**:​ https://​github.com/​arduino/​ArduinoCore-avr 
 +  * **AVR Libc (util/delay.h)**: https://​www.nongnu.org/​avr-libc/​user-manual/​group__util__delay.html
  
 <​html><​a class="​media mediafile mf_pdf"​ href="?​do=export_pdf">​Export to PDF</​a></​html>​ <​html><​a class="​media mediafile mf_pdf"​ href="?​do=export_pdf">​Export to PDF</​a></​html>​
  
pm/prj2026/ciprian.popescu0411/alexandru.dabija04.1779104545.txt.gz · Last modified: 2026/05/24 20:07 (external edit)
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