Table of Contents

Two Factor Authentication Lock

Autor

Ana-Maria Milcu

Introducere

Two Factor Authentication Method este din ce în ce mai populară pentru diverse aplicații, o folosim pentru contul de Google, pentru contul bancar, de ce să nu o folosim să ne protejăm și locuința?
Ideea proiectului este să ofere o alternativă pentru ușile cu cheia clasică, care se poate fura. Având un tag RFID și o parolă care se poate schimba frecvent, oferă mai multă siguranță decât ușile încuiate cu cheie.

Descriere generală

Când un utilizator încearcă să deschidă lacătul, se va afișa un mesaj pe LCD pentru a notifica utilizatorul să aproprie tag-ul RFID, dacă tag-ul e înregistrat, se va cere mai departe parola, dacă e corectă, lacătul se deschide.
Pentru a descuia lacătul, se scanează tag-ul RFID, după ce utilizatorul e anunțat pe ercan că poate introduce parola, folosește numpad-ul și după introducerea a 4 cifre și apăsarea enter, se verifică parola.
Atunci când accesul este permis și parola este corectă se aprinde un beculeț verde, atunci când parola este greșită sau accesul e nepermis(din cauza că tag-ul nu este unul înregistrat) se aprinde un beculeț roșu și buzzer-ul va acționa să semnaleze accesul nepermis.
Dacă tag-ul este unul neînregistrat, utilizatorul are posibilitatea de a-l înregistra în sistem dacă cunoaște parola. După scanarea unui tag nepermis, pe ecran apare întrebarea: “Register new tag?”, pentru da se apasă tasta 1, pentru nu, oricare altă tastă. Dacă ulterior parola se introduce corect, tag-ul se înregistrează cu succes și va putea fi folosit.
Atunci când se introduce parola, dacă utilizatorul greșește vreun caracter, are posibilitatea de a-l șterge apăsând tasta '*'. Atunci când a terminat de introdus parola, pentru a putea fi validată, se apasă tasta '#', echivalentul lui Enter.

Schema bloc

Hardware Design

Lista de componente

  • Arduino UNO
  • Ecran LCD 16×2 cu I2C integrat
  • Breadboard
  • Keypad 4×4
  • Fire tata-tata, tata-mama
  • Cititor RFID
  • Tag-uri RFID
  • Rezistente
  • SG90 Servo motor
  • Led-uri de diferite culori
  • Buzzer



Schemă electrică:


Software Design

Mediul de dezvoltare folosit a fost Arduino IDE .

Biblioteci folosite în implementare:

  • <Keypad.h> (pentru Keypad)
  • <MFRC522.h> (pentru cititorul RFID)
  • <LiquidCrystal_I2C.h> (pentru LCD-ul cu I2C integrat)
  • <Servo.h> (pentru Servo)

Detalii de implementare:

Principalele variabile utilizate:

  • lcd - afișarea mesajelor pe LCD
  • kp - citirea input-ului care vine de la tastatură
  • rfid - citirea input-ului de la cititorul RFID
  • servo - pentru modificarea stării servo-ului
  • tag_uids - lista de UIDs ale tag-urilor înregistrate în sistem
  • correct_pass - parola corectă formată din 4 cifre care se reține în program, deci se poate modifica din software
  • password - aici se reține parola introdusă de utilizator la keypad la momentul respectiv de timp
  • state - starea în care se află programul, mai multe detalii mai jos

Introducerea parolei

* La introducerea parolei LCD-ul afișează pe primul rând mesajul 'Enter password' iar pe al doilea rând va afișa caracterele tastate. Se folosește funcția readPassword(). În program există o variabilă numită count care reține indexul caracterului la care s-a ajuns cu citirea parolei, și este incrementat la fiecare caracter nou tastat la keypad. Dacă se apasă tasta '*', se va șterge ultimul caracter tastat din memorie, dar și de pe LCD. Acest lucru se realizează cu ajutorul funcției deleteLastKey() care decrementează count-ul și șterge de pe ecran ultima tastă. Parola este gata de validare doar atunci când user-ul a tastat 4 caractere și a apăsat '#', care joacă rol de enter. Abia apoi se va verifica egalitatea dintre password și correct_pass.

Înregistrarea unui nou tag RFID

* Dacă se scanează un tag al cărei UID nu se găsește printre tag_uids, utilizatorul este întrebat dacă dorește să înregistreze acest nou tag. Dacă apasă tasta 1 și introduce parola corectă, numărul de tag-uri disponibile va fi incrementat și noul UID se adaugă în lista tag_uids.

State

Programul are 3 stări posibile:
1) Starea 1 este starea în care așteaptă scanarea unui tag RFID. Dacă tag-ul este unul deja înregistrat, trece mai departe la starea 2, dacă nu, utilizatorul va fi întrebat daca dorește să înregistreze acest tag nou(are nevoie de parolă). Pentru a alege această variantă, trebuie apăsată tasta 1, iar pentru refuz, orice altă tastă. Dacă se apasă tasta 1, programul intră în starea 3, cea în care așteaptă parola corectă pentru validarea noului tag. Dacă nu se apasă tasta 1, progamul revine în starea inițială 1, așteptând din nou un tag.
2) Starea 2 înseamnă că s-a scanat deja un tag înregistrat și acum se așteaptă introducerea parolei corecte, pentru a deschide lacătul. După introducerea parolei, fie se deschide lacătul și LED-ul verde se aprinde în cazul parolei corecte, fie LED-ul roșu se aprinde și se activează sunetul buzzer-ului în cazul parolei greșite. Ulterior se revine în starea 1, se așteaptă deci deblocarea lacătului în continuare.
3) Starea 3 este cea în care se dorește înregistrarea unui tag nou. Similar ca mai sus, se așteaptă o parolă. Dacă este corectă, tag-ul se înregistrează cu succes și utilizatorul este anunțat prin aprinderea LED-ului verde și print-un mesaj pe LCD, dacă nu, LED-ul roșu se aprinde și sunetul buzzer-ului se activează.

Alte funcții folosite

* searchTagUID() - funcție care caută prin lista de UID permise tag-ul curent citit de la modulul RFID, returnează 1 dacă găsește o egalitate, 0 dacă nu
* allowTag() - funcție care anunță utilizatorul că tag-ul scanat este unul permis, activează LED-ul verde
* denyTag() - funcție care anunță utilizatorul că tag-ul scanat nu este unul permis, activează LED-ul roșu și buzzer-ul; întreabă utilizatorul dacă dorește înregistrarea noului tag și trece programul în state = 3
* permitAccess() - funcție care rotește servo-ul cu 90 de grade(deschiderea lacătului) și activează LED-ul verde
* denyAccess() - funcție care anunță utilizatorul că nu a primit acces, activează LED-ul roșu și buzzer-ul
* registerNewTag() - funcție care anunță utilizatorul că noul tag s-a adăugat cu succes, adaugă UID-ul noului tag la lista UID-urilor permise și activează LED-ul verde
* denyRegisteringNewTag() - funcție care anunță utilizatorul că nu parola este eronată deci nu poate înregistra noul tag, activează LED-ul roșu și buzzer-ul
* setup() - inițializarea variabilelor, state = 1
* loop() - funcție care ciclează prin cele 3 stări posibile


Rezultate obținute

Link demo proiect

Cod sursă

Concluzii

Deși la început am privit această materie cu scepticism, întrucât nu am fost niciodată o fană a materiilor înclinate către partea de hardware, pot spune că proiectul acesta mi s-a părut foarte foarte interesant și sunt mândră de ce am reușit să fac, chiar am învățat foarte multe lucruri despre Arduino și cât de multe lucruri poți crea cu puțină imaginație.
Consider că a fost o adevărată provocare acest proiect și pe departe cea mai interesantă temă din acest semestru :D Mă bucur că am avut ocazia să facem ceva practic, deși semestrul a fost online. Cel mai mult mi-a plăcut să asamblez partea hardware, a fost ca un lego care avea șansa să se ardă în orice moment, iar printre cele mai mari provocări a fost lipirea pinilor cititorului RFID.
Concluzia pe care o trag este că proiectul chiar e practic și ar putea fi folosit ca încuietoare electrică dacă aș prinde servo-ul de un cârlig care ar debloca o ușă la mișcarea de 90 de grade a servo-ului.

Bibliografie/Resurse