This shows you the differences between two versions of the page.
|
pm:prj2026:ciprian.popescu0411:alexandru.dabija04 [2026/05/09 16:14] alexandru.dabija04 [Descriere generală] |
pm:prj2026:ciprian.popescu0411:alexandru.dabija04 [2026/05/24 20:33] (current) alexandru.dabija04 |
||
|---|---|---|---|
| Line 41: | Line 41: | ||
| - | ===== 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. | ||
| - | <note tip> | + | 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. |
| - | Descrierea codului aplicaţiei (firmware): | + | |
| - | * 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 ===== | + | Modulul RFID RC522 este conectat direct la placă, fără a utiliza breadboard-ul. Acesta funcționează la 3.3V, nu la 5V. |
| - | <note tip> | + | 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) |
| - | Care au fost rezultatele obţinute în urma realizării proiectului vostru. | + | Modul LCD 1602 |
| - | </note> | + | |
| - | ===== Concluzii ===== | + | ^ 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 | | ||
| - | ===== Download ===== | + | RFID-RC522 |
| - | <note warning> | + | ^ Pin componenta ^ Legatura ^ |
| - | 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ă ;-). | + | | SDA | PB2 microcontroller | |
| + | | SCK | PB5 microcontroller | | ||
| + | | MOSI | PB3 microcontroller | | ||
| + | | MISO | PB4 microcontroller | | ||
| + | | GND | GND microcontroller | | ||
| + | | RST | PB1 microcontroller | | ||
| + | | 3V3 | 3V3 microcontroller | | ||
| - | 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**. | + | buzzer pasiv KY-006 |
| - | </note> | + | |
| - | ===== Jurnal ===== | + | ^ Pin componenta ^ Legatura ^ |
| + | | minus (-) | GND breadboard | | ||
| + | | VCC | VCC breadboard | | ||
| + | | S | PC5 microcontroller | | ||
| - | <note tip> | + | BTN1 |
| - | Puteți avea și o secțiune de jurnal în care să poată urmări asistentul de proiect progresul proiectului. | + | |
| - | </note> | + | |
| - | ===== Bibliografie/Resurse ===== | + | ^ Pin componenta ^ Legatura ^ |
| + | | leg 1 | PC0 microcontroller | | ||
| + | | leg 2 | GND breadboard | | ||
| + | | rezistenta 10k ohm | leg1 - VCC breadboard | | ||
| - | <note> | + | BTN2 |
| - | Listă cu documente, datasheet-uri, resurse Internet folosite, eventual grupate pe **Resurse Software** şi **Resurse Hardware**. | + | |
| - | </note> | + | ^ 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. | | ||
| + | |||
| + | Logica Automatului de Stari (State Machine): | ||
| + | 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). | ||
| + | |||
| + | 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''). | ||
| + | |||
| + | Biblioteci folosite: | ||
| + | |||
| + | ^ 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. | | ||
| + | |||
| + | |||
| + | |||
| + | ===== Resurse Hardware ===== | ||
| + | |||
| + | * **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 | ||
| + | |||
| + | |||
| + | ===== Resurse Software ===== | ||
| + | |||
| + | * **MFRC522 Library**: https://github.com/miguelbalboa/rfid | ||
| + | * **SPI Library**: https://github.com/arduino/ArduinoCore-avr/tree/master/libraries/SPI | ||
| + | * **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> | ||