This shows you the differences between two versions of the page.
|
pm:prj2026:alexandru.jipa2803:dacian.pascu [2026/05/06 10:08] dacian.pascu created |
pm:prj2026:alexandru.jipa2803:dacian.pascu [2026/05/22 20:40] (current) dacian.pascu |
||
|---|---|---|---|
| Line 3: | Line 3: | ||
| SmartDoor este un sistem de control al accesului bazat pe carduri RFID. La scanarea unui card, Arduino Nano interoghează un server prin WiFi pentru a verifica dacă accesul este permis, afișează rezultatul pe un ecran LCD și trimite un log cu fiecare tentativă către server. | SmartDoor este un sistem de control al accesului bazat pe carduri RFID. La scanarea unui card, Arduino Nano interoghează un server prin WiFi pentru a verifica dacă accesul este permis, afișează rezultatul pe un ecran LCD și trimite un log cu fiecare tentativă către server. | ||
| - | |||
| - | Ideea a pornit de la nevoia unui sistem simplu și ieftin de a înlocui cheile fizice cu carduri de proximitate, oferind totodată un jurnal de acces persistent pe server. | ||
| Utilitatea proiectului constă în: | Utilitatea proiectului constă în: | ||
| Line 14: | Line 12: | ||
| ===== Descriere generală ===== | ===== Descriere generală ===== | ||
| - | Sistemul este compus din cinci blocuri principale care interacționează în lanț: | + | Sistemul este compus din cinci blocuri principale: |
| *Bloc de citire — Modulul RC522 citește UID-ul cardului RFID prezentat și îl trimite către Arduino Nano prin interfața SPI (prin intermediul level shifter-ului bidirecțional, deoarece RC522 lucrează la 3.3V iar Arduino la 5V). | *Bloc de citire — Modulul RC522 citește UID-ul cardului RFID prezentat și îl trimite către Arduino Nano prin interfața SPI (prin intermediul level shifter-ului bidirecțional, deoarece RC522 lucrează la 3.3V iar Arduino la 5V). | ||
| Line 20: | Line 18: | ||
| *Bloc de control — Arduino Nano primește UID-ul, îl formatează și îl transmite modulului ESP8266 prin comunicație serială UART (prin intermediul unui adaptor de tensiune 5V→3.3V). | *Bloc de control — Arduino Nano primește UID-ul, îl formatează și îl transmite modulului ESP8266 prin comunicație serială UART (prin intermediul unui adaptor de tensiune 5V→3.3V). | ||
| - | *Bloc de comunicație WiFi — ESP8266 ESP-01 se conectează la rețeaua WiFi și trimite o cerere HTTP(S) către serverul de backend cu UID-ul cardului. Primește răspunsul (permis/refuzat) și îl transmite înapoi la Arduino. | + | *Bloc de comunicație WiFi — ESP8266 ESP-01 se conectează la rețeaua WiFi și trimite o cerere HTTP către serverul de backend cu UID-ul cardului. Primește răspunsul (permis/refuzat) și îl transmite înapoi la Arduino. |
| - | *Bloc de afișare — LCD 1602 cu modul I2C afișează mesajul corespunzător răspunsului primit: "Access Granted" sau "Access Denied". Comunicația I2C (SDA/SCL) funcționează direct la 5V, fără conversie de nivel. | + | *Bloc de afișare — LCD 1602 cu modul I2C afișează mesajul corespunzător răspunsului primit: "Access Granted" sau "Access Denied". |
| *Bloc de alimentare — Modulul MB102 montat pe breadboard furnizează 5V pentru Arduino și LCD, respectiv 3.3V (prin adaptoare) pentru modulele ESP și RFID. | *Bloc de alimentare — Modulul MB102 montat pe breadboard furnizează 5V pentru Arduino și LCD, respectiv 3.3V (prin adaptoare) pentru modulele ESP și RFID. | ||
| Line 35: | Line 33: | ||
| | 1 | Arduino Nano | 1 | Microcontroler principal, 5V logic | | | 1 | Arduino Nano | 1 | Microcontroler principal, 5V logic | | ||
| - | | 2 | Breadboard + modul alimentare MB102 | 1 set | Sursă 5V/3.3V din USB sau jack | | + | | 2 | Breadboard + modul alimentare MB102 | 1 | Sursă 5V/3.3V din USB sau jack | |
| | 3 | Modul WiFi ESP8266 ESP-01 | 1 | UART la 3.3V | | | 3 | Modul WiFi ESP8266 ESP-01 | 1 | UART la 3.3V | | ||
| | 4 | Adaptor 5V→3.3V pentru ESP8266 (4-pin) | 1 | Conversie nivel UART + alimentare 3.3V | | | 4 | Adaptor 5V→3.3V pentru ESP8266 (4-pin) | 1 | Conversie nivel UART + alimentare 3.3V | | ||
| - | | 5 | Kit cititor RFID RC522 | 1 | SPI la 3.3V, include card și breloc | | + | | 5 | Kit cititor RFID RC522 | 1 | SPI la 3.3V | |
| | 6 | Level shifter 8 canale bidirecțional (5V↔3.3V) | 1 | Conversie logică SPI Arduino↔RC522 | | | 6 | Level shifter 8 canale bidirecțional (5V↔3.3V) | 1 | Conversie logică SPI Arduino↔RC522 | | ||
| | 7 | LCD 1602 cu modul I2C (PCF8574) | 1 | Afișaj feedback acces, 5V, I2C | | | 7 | LCD 1602 cu modul I2C (PCF8574) | 1 | Afișaj feedback acces, 5V, I2C | | ||
| | 8 | Cabluri jumper | ~25 | M-M și M-F | | | 8 | Cabluri jumper | ~25 | M-M și M-F | | ||
| + | |||
| + | |||
| + | ===== Schema Electrica ===== | ||
| + | |||
| + | {{https://raw.githubusercontent.com/dacianpascu06/proiect-pm/main/pictures/schema_electrica.png?800x600|Schemă Electrica SmartDoor}} | ||
| + | ===== Descriere Pini ===== | ||
| + | |||
| + | == Arduino Nano == | ||
| + | | Pin | Utilizare | Descriere | | ||
| + | | VIN | Alimentare intrare | Primește tensiunea de 9V de la baterie pentru a alimenta întregul sistem prin regulatorul intern al Nano. | | ||
| + | | 5V | Alimentare ieșire | Furnizează 5V către side-ul B al level shifter-ului, LCD și linia de alimentare a breadboard-ului. | | ||
| + | | 3.3V | Alimentare ieșire | Furnizează 3.3V direct către VCC al RC522 și VCC al ESP8266 prin adaptorul de tensiune. | | ||
| + | | GND | Masă comună | Conectează masa comună pentru toate modulele din circuit. | | ||
| + | | D2 / RX | UART recepție | Primește datele seriale de la modulul ESP8266 (răspunsul serverului: permis/refuzat). | | ||
| + | | D3 / TX | UART transmisie | Trimite UID-ul cardului RFID citit către modulul ESP8266 pentru verificare pe server. | | ||
| + | | D9 | RST RC522 | Controlează pinul de reset al modulului RC522 pentru inițializarea și repornirea cititorului RFID. | | ||
| + | | D10 | SS / SDA RC522 | Pinul de Slave Select SPI, activează comunicația cu RC522 când este tras la LOW. | | ||
| + | | D11 / MOSI | SPI date ieșire | Transmite datele de comandă de la Arduino către RC522 prin protocolul SPI. | | ||
| + | | D12 / MISO | SPI date intrare | Primește datele citite de RC522 (UID card) înapoi la Arduino prin protocolul SPI. | | ||
| + | | D13 / SCK | SPI clock | Generează semnalul de clock pentru sincronizarea comunicației SPI cu RC522. | | ||
| + | | A4 / SDA | I2C date LCD | Linia de date I2C pentru trimiterea caracterelor și comenzilor către LCD 1602. | | ||
| + | | A5 / SCL | I2C clock LCD | Generează semnalul de clock I2C pentru sincronizarea comunicației cu LCD 1602. | | ||
| + | |||
| + | == RFID RC522 == | ||
| + | | Pin | Utilizare | Descriere | | ||
| + | | VCC | Alimentare 3.3V | Primește 3.3V de la pinul 3.3V al Arduino prin side-ul A al level shifter-ului. | | ||
| + | | GND | Masă | Conectat la masa comună a circuitului. | | ||
| + | | SDA (SS) | Chip Select SPI | Activează modulul RC522 pentru comunicație atunci când Arduino îl selectează. | | ||
| + | | SCK | Clock SPI | Primește semnalul de clock SPI de la Arduino prin level shifter. | | ||
| + | | MOSI | Date intrare SPI | Primește comenzi și date de la Arduino prin level shifter. | | ||
| + | | MISO | Date ieșire SPI | Trimite UID-ul cardului citit înapoi către Arduino prin level shifter. | | ||
| + | | RST | Reset | Permite Arduino să reseteze și să reinițializeze modulul RC522 când e necesar. | | ||
| + | |||
| + | == Waveshare Level Shifter 8 Canale == | ||
| + | | Pin | Utilizare | Descriere | | ||
| + | | VCCA | Alimentare 3.3V (side A) | Referința de tensiune pentru side-ul de 3.3V, conectat la pinul 3.3V al Arduino. | | ||
| + | | VCCB | Alimentare 5V (side B) | Referința de tensiune pentru side-ul de 5V, conectat la pinul 5V al Arduino. | | ||
| + | | GND | Masă | Masă comună pentru ambele side-uri ale convertoarelor de nivel logic. | | ||
| + | | A0-A4 | Side 3.3V → RC522 | Pinii de 3.3V conectați direct la RC522 (SCK, MOSI, MISO, SS, RST). | | ||
| + | | B0-B4 | Side 5V → Arduino | Pinii de 5V conectați la Arduino (D13, D11, D12, D10, D9), realizând conversia bidirecțională. | | ||
| + | |||
| + | == ESP8266 ESP-01 == | ||
| + | | Pin | Utilizare | Descriere | | ||
| + | | VCC | Alimentare 3.3V | Primește 3.3V prin adaptorul de tensiune dedicat ESP8266. | | ||
| + | | GND | Masă | Conectat la masa comună a circuitului. | | ||
| + | | TX | UART transmisie | Trimite răspunsul serverului (permis/refuzat) către pinul RX al Arduino. | | ||
| + | | RX | UART recepție | Primește UID-ul cardului de la Arduino pentru a-l trimite serverului prin WiFi. | | ||
| + | |||
| + | == LCD 1602 I2C == | ||
| + | | Pin | Utilizare | Descriere | | ||
| + | | VCC | Alimentare 5V | Primește 5V de pe linia de alimentare a breadboard-ului pentru a alimenta ecranul. | | ||
| + | | GND | Masă | Conectat la masa comună a circuitului. | | ||
| + | | SDA | I2C date | Primește datele de la Arduino (A4) pentru a afișa mesajele "Access Granted" / "Access Denied". | | ||
| + | | SCL | I2C clock | Primește semnalul de clock I2C de la Arduino (A5) pentru sincronizarea comunicației. | | ||
| + | |||
| + | ===== Poza Proiect ===== | ||
| + | {{https://raw.githubusercontent.com/dacianpascu06/proiect-pm/main/pictures/poza_proiect.jpg?800x600|Poza Proiect SmartDoor}} | ||
| ===== Software Design ===== | ===== Software Design ===== | ||
| - | ===== Rezultate Obţinute ===== | + | |
| - | ===== Concluzii ===== | + | Codul combina librării Arduino |
| + | (MFRC522, SoftwareSerial) cu cod bare-metal AVR scris de mână pentru TWI și LCD. | ||
| + | |||
| + | === Structura proiectului === | ||
| + | |||
| + | * ''twi.c / twi.h'' — driver I2C bare-metal | ||
| + | * ''lcd.c / lcd.h'' — driver LCD 1602 peste PCF8574, mod 4-bit | ||
| + | * ''main.cpp'' — logica principală: RFID, WiFi, heartbeat, afisare | ||
| + | |||
| + | === Driverul TWI (I2C) === | ||
| + | |||
| + | Am implementat comunicația I2C direct pe registrele ATmega328P. | ||
| + | |||
| + | Fiecare tranzacție urmează secvența clasică I2C: | ||
| + | - ''twi_start()'' — generează condiția START, așteaptă TWINT | ||
| + | - ''twi_write()'' — încarcă byte-ul în TWDR, pornește transmisia, așteaptă TWINT | ||
| + | - ''twi_stop()'' — generează condiția STOP, așteaptă ca TWSTO să se reseteze singur | ||
| + | |||
| + | === Driverul LCD === | ||
| + | |||
| + | LCD-ul comunică prin PCF8574, un expander I2C de 8 biți. Asta înseamnă că un | ||
| + | singur byte trimis prin I2C controlează simultan RS, EN, backlight și pinii D4-D7 | ||
| + | ai HD44780. | ||
| + | |||
| + | Display-ul lucrează în modul 4-bit, deci fiecare comandă sau caracter se trimite | ||
| + | în două etape — nibble-ul de sus primul, apoi cel de jos. Pentru fiecare nibble se | ||
| + | pulsează pinul EN ca HD44780 sa captureze datele. | ||
| + | |||
| + | === Logica principală === | ||
| + | |||
| + | **Heartbeat** | ||
| + | |||
| + | Am folosit Timer1 în mod CTC cu prescaler 1024 și OCR1A = 15624, ceea ce | ||
| + | generează o întrerupere la fiecare secundă. O data la 90 de secunde | ||
| + | resetam flagul triggerHeartbeat. | ||
| + | |||
| + | La fiecare 90 de secunde, Arduino verifică dacă serverul este în viață printr-un | ||
| + | GET /alive. Dacă serverul răspunde cu 200 OK e bine. Dacă WiFi-ul a căzut | ||
| + | între timp, încearcă reconectarea înainte să trimită heartbeat-ul. | ||
| + | |||
| + | **Citirea cardului RFID** | ||
| + | |||
| + | Librăria MFRC522 comunică cu cititorul RC522 prin SPI. ''PICC_IsNewCardPresent()'' | ||
| + | și ''PICC_ReadCardSerial()'' sunt apelate continuu în loop. Când un card e detectat, | ||
| + | UID-ul (de obicei 4 bytes) e formatat ca string hex (ex. ''A3 4F 12 BC'') pentru | ||
| + | afișare pe LCD și concatenat fără spații pentru cererea HTTP. | ||
| + | |||
| + | **Comunicația cu serverul** | ||
| + | |||
| + | ESP8266 ESP-01 e controlat prin comenzi AT pe un SoftwareSerial pe pinii D2/D3. | ||
| + | Fluxul pentru o verificare de card este: | ||
| + | |||
| + | - ''AT+CIPSTART'' — deschide conexiune TCP pe portul 80 al serverului | ||
| + | - ''AT+CIPSEND'' — anunță câți bytes urmează | ||
| + | - GET /pm?uid=<uid> HTTP/1.1 — cererea efectivă | ||
| + | - parsează răspunsul după câmpul "verdict": 1 = acces permis, 0 = refuzat | ||
| + | - ''AT+CIPCLOSE'' — închide conexiunea | ||
| + | |||
| + | Răspunsul e afișat pe LCD: "WELCOME!" sau "DENIED ENTRY!" timp de 2 secunde, | ||
| + | după care ecranul revine la "Ready to scan!". | ||
| + | |||
| + | === Biblioteci folosite === | ||
| + | |||
| + | * ''MFRC522'' — comunicație SPI cu cititorul RFID | ||
| + | * ''SoftwareSerial'' — UART software pentru ESP8266 pe D2/D3 | ||
| + | * ''SPI'' (Arduino built-in) — bus SPI hardware pentru RC522 | ||
| + | * ''avr/interrupt.h'' — macro-uri ISR și sei()/cli() pentru Timer1 | ||
| + | * ''util/delay.h'' — delay-uri precise în µs/ms pentru protocolul LCD | ||
| ===== Download ===== | ===== Download ===== | ||
| https://github.com/dacianpascu06/proiect-pm | https://github.com/dacianpascu06/proiect-pm | ||
| - | ===== Jurnal ===== | ||
| ===== Bibliografie/Resurse ===== | ===== Bibliografie/Resurse ===== | ||
| + | |||
| + | * **Pentru LCD și controller:** [[https://web.stanford.edu/class/ee281/handouts/hd44780_lcd_controller_datasheet.pdf|Datasheet HD44780]] | ||
| + | * **Pentru Arduino (ATmega328P):** [[https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf|Datasheet ATmega328P]] | ||
| + | * **Pentru modulul WiFi (ESP8266):** [[https://www.espressif.com/sites/default/files/4a-esp8266_at_instruction_set_en_v1.5.4_0.pdf|ESP8266 AT Instruction Set]] | ||
| + | * **Sursă de inspirație (LCD și controller):** [[https://github.com/Ovidiu22/LCD-1602/blob/main/LCD-1602/src/LCD.c|github repo]] | ||