Schema bloc de mai jos prezinta arhitectura mini seifului inteligent. Acesta permite autentificarea utilizatorului folosind o parola introdusa de la tastatura si/sau un card RFID, iar accesul este oferit prin actionarea unui servomotor pentru deblocare/blocare.
Partea software a proiectului este impartita in mai multe module care controleaza si coordoneaza componentele hardware ale sistemului.
Schema electrica a proiectului este construita in jurul microcontrollerului ATmega328P, care controleaza toate perifericele sistemului. In simularea din Tinkercad a fost utilizat Arduino Uno R3 in locul microcontroller-ului propriu-zis (de unde si lipsa tututor pinilor necesari).
Modulul RFID RC522 si convertorul de nivel logic bidirectional 3.3V-5V nu sunt reprezentate direct in schema realizata in Tinkercad, insa acestea vor fi conectate in implementarea finala. Modulul RFID comunica cu ATmega328P prin interfata SPI folosind pinii PB2 (SS/SDA), PB3 (MOSI), PB4 (MISO), PB5 (SCK) si PB1 (RST). Deoarece RC522 functioneaza la 3.3V, iar microcontrollerul utilizeaza logica de 5V, intre cele doua componente este necesar un convertor de nivel logic bidirectional pentru adaptarea semnalelor si protejarea modulului RFID. Modulul RFID RC522 este alimentat la 3.3V, iar semnalele SPI dintre RC522 si ATmega328P trec prin convertorul de nivel logic bidirectional 3.3V-5V. Convertorul este alimentat cu 5V pe partea HV si cu 3.3V pe partea LV, avand masa comuna cu restul circuitului.
Aplicatia implementeaza firmware-ul pentru un sistem de acces la un seif, folosind exclusiv microcontroller-ul ATmega328P-XMINI si sursa externa. Acesta poate functiona fara a fi conectat la un dispozitiv PC / laptop. Sistemul permite configurarea metodei de autentificare si deschiderea seifului prin parola, card RFID sau parola/card RFID.
Interfata cu utilizatorul este realizata printr-un keypad 4×4 si un display LCD I2C 16×2. Starea sistemului este semnalizata prin LED RGB si buzzer, iar mecanismul de blocare/deblocare este actionat cu un servomotor.
Fluxul principal:
* intra in meniul de configurare# porneste procedura de deschidereA seteaza autentificare prin parolaB seteaza autentificare prin RFIDC seteaza autentificare prin parola + RFIDD comanda pentru blocareConfiguratia este pastrata in RAM, deci se pierde la resetarea microcontrollerului.
Proiectul este dezvoltat in PlatformIO, folosind framework-ul Arduino.
Configuratia principala se afla in platformio.ini:
atmelavrATmega328Parduinocustom, prin avrdude cu programator xplainedmini
Librariile externe sunt declarate in platformio.ini:
miguelbalboa/MFRC522@^1.4.12 - comunicatie cu modulul RFID RC522chris–a/Keypad@^3.1.1 - citire keypad matricial 4×4marcoschwartz/LiquidCrystal_I2C@^1.1.4 - control display LCD prin I2Cpaulstoffregen/TimerOne@^1.1.1 - configurare Timer1 si intrerupere periodicaSunt folosite si librarii din framework-ul Arduino:
Arduino.hWire.hSPI.hstring.h
Aplicatia este organizata ca o masina de stari finite. Starile principale sunt definite in enum-ul AppState:
STATE_IDLE - ecran principalSTATE_CONFIG_MENU - meniu configurareSTATE_CONFIG_PASSWORD - introducere parola nouaSTATE_CONFIG_RFID - inregistrare card RFIDSTATE_OPEN_ENTRY - introducere date pentru deschidereSTATE_TIMED_MESSAGE - afisare mesaj temporarSTATE_ERROR_FEEDBACK - feedback eroareSTATE_LOCKOUT - pauza de siguranta dupa 3 incercari gresite
Modul de autentificare este definit prin enum-ul AuthMode:
AUTH_NONEAUTH_PASSWORDAUTH_RFIDAUTH_PASSWORD_OR_RFIDIn functie de modul selectat, sistemul verifica parola, UID-ul RFID sau oricare dintre cele doua.
Codul foloseste TimerOne pentru a configura Timer1 la un tick de 1 ms:
Timer1.initialize(APP_TIMER_TICK_US); Timer1.attachInterrupt(onAppTimerTick);
Functia de intrerupere onAppTimerTick() incrementeaza variabila globala appTimerMs. Aceasta este folosita pentru timeout-uri, mesaje temporare, lockout, buzzer si controlul impulsurilor servo.
Sistemul permite maximum 3 incercari gresite. Dupa atingerea limitei, intra in starea STATE_LOCKOUT timp de 30 de secunde.
La parola gresita, utilizatorul este scos din instanta curenta de introducere a parolei pentru a evita aparitia unei erori duble cauzate de expirarea timerului.
Servomotorul este controlat prin impulsuri PWM generate manual. La blocare si deblocare se face o miscare relativa:
Unghiul miscarii este configurat prin SERVO_STEP_DEGREES.
Keypad-ul este citit prin libraria Keypad. Deoarece firele keypad-ului sunt inversate intre randuri si coloane, matricea tastelor este transpusa in cod pentru ca butoanele fizice sa corespunda corect cu valorile logice.
Fisierul src/main.cpp contine intreaga logica firmware. Codul este impartit in cateva zone principale:
setup() - initializeaza pinii, LCD-ul, SPI-ul, modulul RFID, Timer1 si starea initiala a aplicatiei.loop() - ruleaza continuu si actualizeaza servo-ul, buzzerul si masina de stari.updateAppState() - gestioneaza logica principala a aplicatiei si apeleaza handler-ul corespunzator pentru starea curenta.handleConfigMenu(), handleConfigPassword() si handleConfigRfid() - implementeaza meniul de configurare, setarea parolei si inregistrarea cardului RFID.handleOpenEntry() - verifica parola sau cardul RFID in timpul procedurii de deschidere.registerOpenFailure() si enterLockout() - gestioneaza incercarile gresite si blocarea temporara dupa prea multe erori.onAppTimerTick() si appMillis() - implementeaza baza de timp a aplicatiei folosind Timer1 si intreruperi.updateServo(), lockSafe() si unlockSafe() - controleaza servomotorul pentru blocarea si deblocarea mecanismului.updateBuzzer() si setStatusLed() - controleaza feedback-ul sonor si vizual pentru succes, eroare si stare curenta.Codul sursa este disponibil pe GitHub: https://github.com/bogdan2811/mini_seif