Prezentare: Proiectul reprezintă un sistem de securitate pentru controlul accesului, care validează identitatea utilizatorilor pe baza tag-urilor sau cardurilor RFID. La scanarea unui card autorizat, sistemul acționează un mecanism de blocare (simulat printr-un servomotor), afișează un mesaj personalizat de bun venit pe un ecran LCD cu interfață și emite un semnal sonor de confirmare.
Scopul proiectului: Scopul principal este crearea unei yale electronice inteligente care să permită gestionarea utilizatorilor (adăugare/ștergere) direct din interfața fizică a dispozitivului. Acest lucru se va realiza printr-un “Master Card” care accesează un mod de configurare, salvând noile ID-uri în memoria non-volatilă (EEPROM) a microcontroller-ului.
Ideea de la care am pornit: Ideea a pornit de la sistemele clasice de control acces din clădirile de birouri sau hoteluri. Am dorit să dezvolt o versiune interactivă a acestora, care să ofere nu doar siguranță, ci și un feedback vizual personalizat și auditiv pentru utilizator.
Utilitate: Pentru mine, este o oportunitate excelentă de a integra simultan mai multe protocoale de comunicație (SPI) și funcții hardware avansate (Timere, PWM, Întreruperi și EEPROM) pe un singur microcontroller. Pentru alții, un astfel de sistem poate fi scalat și integrat în viața reală pentru a securiza dulapuri, cutii de valori sau chiar ușa unei camere.
Arhitectura sistemului este centrată în jurul unui microcontroller ATmega328P și este împărțită în trei blocuri logice principale: Input, Procesare și Output.
Sistemul este montat pe breadboard în jurul unei plăci ATmega. Toate componentele sunt conectate și sistemul răspunde corect la scanarea cardurilor.
| Componentă | Rol în proiect |
|---|---|
| Arduino Uno (ATmega328P) | Creierul sistemului — decide ce se întâmplă când se scanează un card și ține minte cardurile autorizate |
| Modul RFID RC522 | Citește cardurile și brelocurile RFID |
| LCD | Afișează mesaje (status, bun venit, erori) |
| Servomotor SG90 | Simulează zăvorul care se deschide |
| Buzzer pasiv | Sunete de confirmare sau eroare |
| LED roșu | Indicator vizual când accesul e refuzat |
| Buton | Deschide zăvorul din interior (buton de “exit”) |
Schema separă cele două surse de alimentare (3.3 V doar pentru RC522, 5 V pentru restul) și cele două magistrale de comunicare (SPI pentru RC522, toate cu masă comună pe breadboard.
Codul este scris în limbajul C, direct cu regiștri (bare-metal), fără framework-ul Arduino. Am folosit Microchip Studio 7 pentru scriere și compilare, iar placa o programez prin debugger-ul mEDBG de pe ATmega328P Xplained Mini, folosind interfața ISP.
Nu am folosit nicio bibliotecă externă. Tot codul este scris de mine, direct pe regiștri, pentru că cerința a fost să lucrez la nivel de regiștri, nu cu funcții gata făcute de tip digitalWrite().
Singurele header-e incluse sunt cele standard din AVR-libc:
<avr/io.h> — definițiile de regiștri ale ATmega328P<avr/interrupt.h> — macro-ul ISR() și sei() / cli()<util/delay.h> — întârzieri (_delay_ms, _delay_us)
Driverul pentru LCD (HD44780, pe 4 biți) și driverul pentru cititorul RFID (MFRC522) le-am scris eu de la zero, în loc să folosesc biblioteci gata făcute de tip LiquidCrystal sau MFRC522.
Noutatea proiectului este că am scris tot codul de la zero, fără biblioteci, și că utilizatorii se pot adăuga direct de pe dispozitiv. Cardul autorizat nu este scris fix în cod: dacă ții butonul apăsat 3 secunde, intri într-un mod de înrolare în care scanezi un card nou, iar UID-ul lui se salvează în EEPROM. Astfel cardul rămâne salvat chiar și după ce oprești curentul.
Fiecare temă de laborator are un rol concret în proiect:
Exemplu — configurarea Timer1 pentru semnalul PWM al servo-ului:
void servoInit(void) { DDRB |= (1 << PB1); // OC1A iesire TCCR1A = (1 << COM1A1) | (1 << WGM11); // Fast PWM, TOP=ICR1 TCCR1B = (1 << WGM13) | (1 << WGM12) | (1 << CS11); // prescaler 8 ICR1 = 39999; // perioada 20ms = 50Hz OCR1A = SERVO_CLOSED; // pozitia initiala }
Exemplu — întreruperea pe buton (ISR scurt, doar ridică un flag):
ISR(INT0_vect) { exitRequested = 1; }
La pornire, programul inițializează toate componentele (LCD, USART, întrerupere, timere, SPI, RFID), încarcă UID-ul master din EEPROM și intră în starea de standby (“Sistem Blocat”).
Apoi, în bucla principală, sistemul așteaptă două lucruri:
Reacțiile sistemului:
^ Funcție ^ Rol ^
int0Init / ISR(INT0_vect) | Configurarea și tratarea întreruperii butonului |
servoInit / servoWrite | Configurare Timer1 PWM și control poziție servo |
buzzerInit / buzzerTone / buzzerOff | Generare tonuri pe Timer2 |
usartInit / usartTx / usartPrint / usartHex | Ieșire serială pentru debug |
eepromWrite / eepromRead / loadMaster / saveMaster | Stocare UID master în EEPROM |
spiInit / spiTransfer | SPI master la nivel de regiștri |
rcWrite / rcRead / rc522Init / rcTransceive / rcReadCard | Driver MFRC522 și citire UID |
lcdInit / lcdNibble / lcdByte / lcdClear / lcdSetCursor / lcdPrint | Driver LCD HD44780 pe 4 biți |
lockSystem / grantAccess / denyAccess / isMaster | Mașina de stări a aplicației |
Am testat pe rând, nu tot odată: