This shows you the differences between two versions of the page.
|
pm:prj2026:ciprian.popescu0411:alexandru.dabija04 [2026/05/09 15:52] alexandru.dabija04 [Hardware Design] |
pm:prj2026:ciprian.popescu0411:alexandru.dabija04 [2026/05/24 20:33] (current) alexandru.dabija04 |
||
|---|---|---|---|
| Line 2: | Line 2: | ||
| ===== Introducere ===== | ===== Introducere ===== | ||
| - | <note tip> | + | Acest proiect reprezinta un sistem electronic de vot creat pentru a simplifica si securiza procesul de autentificare si exprimare a votului. Sistemul permite verificarea utilizatorilor pe baza unor carduri individuale si ofera posibilitatea de a vota rapid intre doua optiuni disponibile, centralizand automat rezultatele finale. |
| - | Prezentarea pe scurt a proiectului vostru: | + | |
| - | * ce face | + | Scopul proiectului este de a demonstra modul in care un proces de vot poate fi realizat intr-un mod eficient, organizat si usor de utilizat, reducand posibilitatea erorilor si a voturilor multiple. Ideea de la care am pornit a fost necesitatea unui sistem accesibil care sa poata valida identitatea alegatorilor si sa ofere un raspuns imediat privind dreptul de acces la vot. |
| - | * care este scopul lui | + | |
| - | * care a fost ideea de la care aţi pornit | + | |
| - | * de ce credeţi că este util pentru alţii şi pentru voi | + | |
| - | </note> | + | |
| ===== Descriere generală ===== | ===== Descriere generală ===== | ||
| + | {{:pm:prj2026:ciprian.popescu0411:dabija_alexandru_catalin_334cd_block_schema.png?500|}} | ||
| - | <note tip> | + | * Sistemul implementat reprezinta o platforma electronica de vot care permite autentificarea utilizatorilor si exprimarea votului intr-un mod rapid si securizat. Fiecare utilizator utilizeaza un card RFID/NFC pentru identificare, iar sistemul verifica automat daca acesta exista in lista de votanti eligibili incarcata anterior de pe calculator. |
| - | O schemă bloc cu toate modulele proiectului vostru, atât software cât şi hardware însoţită de o descriere a acestora precum şi a modului în care interacţionează. | + | |
| + | * Dupa validare, utilizatorul primeste un raspuns vizual si sonor care indica daca accesul la vot este permis sau respins. In cazul autentificarii cu succes, alegatorul poate selecta una dintre cele doua optiuni disponibile folosind butoanele fizice. | ||
| + | |||
| + | * Sistemul gestioneaza automat procesul de validare, prevenirea votului multiplu, inregistrarea voturilor si afisarea rezultatelor finale pe display. Interactiunea dintre componentele hardware si software este coordonata de microcontroller, care controleaza citirea datelor, logica de votare si semnalele de feedback. | ||
| - | Exemplu de schemă bloc: http://www.robs-projects.com/mp3proj/newplayer.html | ||
| - | </note> | ||
| ===== Hardware Design ===== | ===== Hardware Design ===== | ||
| + | Lista de piese: | ||
| - | <note tip> | ||
| * Placa de dezvoltare ATmega328P Xplained Mini: Microcontrollerul principal care gestioneaza logica votarii, validarea ID-urilor si controlul perifericelor. | * Placa de dezvoltare ATmega328P Xplained Mini: Microcontrollerul principal care gestioneaza logica votarii, validarea ID-urilor si controlul perifericelor. | ||
| Line 41: | Line 39: | ||
| * Cablu de date (USB): Cablu utilizat pentru programarea microcontrolerului si comunicarea UART cu PC-ul pentru configurarea listei de votanti. | * Cablu de date (USB): Cablu utilizat pentru programarea microcontrolerului si comunicarea UART cu PC-ul pentru configurarea listei de votanti. | ||
| - | </note> | ||
| - | ===== Software Design ===== | ||
| + | Placa este alimentată direct prin cablul USB. | ||
| + | Pinul GND al plăcuței este conectat la șina de GND a breadboard-ului, iar pinul de 5V este conectat la șina de VCC a breadboard-ului. | ||
| + | |||
| + | Butoanele sunt configurate hardware în mod pull-down, utilizând rezistoare externe de 10 kΩ conectate între pinul de semnal și masă (GND). Astfel, în stare de repaus, microcontroller-ul citește un nivel logic LOW stabil, iar la apăsarea butonului circuitul se închide, generând un semnal HIGH pe pinii PC0 și PC1. | ||
| + | |||
| + | LED-urile sunt configurate astfel încât un nivel logic HIGH le aprinde, iar LOW le stinge. Între VCC și LED-uri este conectată o rezistență de limitare a curentului, utilizată pentru protecție. | ||
| + | |||
| + | 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, am facut un divizor de tensiune (foloseam pwm dar acesta dadea un puls instabil si uneori aparea gibberish pe lcd) | ||
| + | Modul LCD 1602 | ||
| + | |||
| + | ^ Pin componenta ^ Legatura ^ | ||
| + | | VSS | GND breadboard | | ||
| + | | VDD | VCC breadboard | | ||
| + | | V0 | div tenisiunde format din 1 rez 1k 2 rez 380 si o rez 10k| | ||
| + | | RS | PD7 microcontroller | | ||
| + | | RW | GND breadboard | | ||
| + | | E | PB0 microcontroller | | ||
| + | | D4 | PD2 microcontroller | | ||
| + | | D5 | PD3 microcontroller | | ||
| + | | D6 | PD4 microcontroller | | ||
| + | | D7 | PD5 microcontroller | | ||
| + | | A | 23b breadboard | | ||
| + | | K | GND breadboard | | ||
| + | | rez 380 ohm | 23a - VCC breadboard | | ||
| + | |||
| + | RFID-RC522 | ||
| + | |||
| + | ^ Pin componenta ^ Legatura ^ | ||
| + | | SDA | PB2 microcontroller | | ||
| + | | SCK | PB5 microcontroller | | ||
| + | | MOSI | PB3 microcontroller | | ||
| + | | MISO | PB4 microcontroller | | ||
| + | | GND | GND microcontroller | | ||
| + | | RST | PB1 microcontroller | | ||
| + | | 3V3 | 3V3 microcontroller | | ||
| + | |||
| + | buzzer pasiv KY-006 | ||
| + | |||
| + | ^ Pin componenta ^ Legatura ^ | ||
| + | | minus (-) | GND breadboard | | ||
| + | | VCC | VCC breadboard | | ||
| + | | S | PC5 microcontroller | | ||
| + | |||
| + | BTN1 | ||
| + | |||
| + | ^ Pin componenta ^ Legatura ^ | ||
| + | | leg 1 | PC0 microcontroller | | ||
| + | | leg 2 | GND breadboard | | ||
| + | | rezistenta 10k ohm | leg1 - VCC breadboard | | ||
| + | |||
| + | BTN2 | ||
| + | |||
| + | ^ Pin componenta ^ Legatura ^ | ||
| + | | leg 1 | PC1 microcontroller | | ||
| + | | leg 2 | GND breadboard | | ||
| + | | rezistenta 10k ohm | leg1 - VCC breadboard | | ||
| + | |||
| + | LED VERDE | ||
| + | |||
| + | ^ Pin componenta ^ Legatura ^ | ||
| + | | minus (-) | GND breadboard | | ||
| + | | plus (+) | j14 | | ||
| + | | rez 380 ohm | f14 - PC3 breadboard | | ||
| + | |||
| + | LED ROSU | ||
| + | |||
| + | ^ Pin componenta ^ Legatura ^ | ||
| + | | minus (-) | GND breadboard | | ||
| + | | plus (+) | j20 | | ||
| + | | rez 380 ohm | f20 - PC2 breadboard | | ||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | {{:pm:prj2026:ciprian.popescu0411:dabija_alexandru_catalin_hw.jpeg?500|}} | ||
| + | |||
| + | |||
| + | |||
| + | ====== 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 Studio, CodeVisionAVR) | + | |
| - | * librării şi surse 3rd-party (e.g. Procyon AVRlib) | + | |
| - | * algoritmi şi structuri pe care plănuiţi să le implementaţi | + | |
| - | * (etapa 3) surse ş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> | ||