Cutie securizata - Paunoiu Darius Alexandru

Introducere

O cutie cu incuietoare smart, ce se deblocheaza pe baza de cod pin. Ideea de la care am pornit este un seif, deci scopul proiectuiului este de a depozita obiecte de valoare intr-un mod sigur. Utilitatea lui provine din dorinta omului pentru confidentialitate si siguranta.

Descriere generală

Cutia vine un cod pin preconfigurat, si anume “0000”. Utilizatorul poate folosi acest cod pin, sau il poate schimba introducand secventa “*00*”, dupa care ii se va cere sa introduca vechiul cod pin, apoi urmatorul cod pin. Daca codul vechi introdus este gresit actiunea va esua, afisandu-se un mesaj care informeaza utilizatorul de ce a esuat.

Codul pin poate contine doar cifre, fiind format din 4 cifre.

Butonul '#' poate fi folosit pentru a anula comanda actuala.

Incuietoare cutiei va ramane deschisa cat timp utilizatorul nu inchide capacul. Seriala afiseaza informatii de debug daca este conectata, iar LCD-ul afiseaza toate informatiile de care utilizatorul are nevoie.

Pentru a reseta codul pin, in cazul in care este nevoie, in interiorul cutiei exista un buton marcat cu RESET_CODE. Codul va fi resetat la cel din fabrica.

Codul pin este salvat pe un card microSD. Codul nu este salvat in “clar”, ci se foloseste un hash al lui. Codul propriu zis nu este salvat niciodata, si este folosit doar la citire pentru a calcula hash-ul.

Aplicatia asteapta input de la utilizator, ce poate reprezenta un cod PIN din cifre, un cod special (“*00*”) pentru a schimba codul pin sau apasarea butonului CANCEL ('#') care anuleazaz actiunea curenta si revine in starea initiala de asteptare a input-ului. Daca codul pin este corect, incuietoarea se va deschide, in caz contrar afisandu-se un mesaj de eroare.

Sistemul are feedback atat prin afisajul pe display, cat si prin sunete ce se aud dintr-un buzzer.

Utilizatorul are dreptul la 3 incercari. Daca greseste codul pin de 3 ori, este nevoit sa astepte 10 secunde pana cand poate introduce un nou cod pin.

O schema block a proiectului este:

Hardware Design

Lista componente folosite:

  • Arduino UNO
  • LCD I2C 1604
  • Servomotor SG90
  • Senzor magnetic HALL KY-003 DIGITAL
  • Cititor de micro SD-CARD
  • Buton
  • Switch intrerupere alimentare
  • Buzzer

Alimentarea placii se va face de la o baterie de 9V, prin mufa special dedicat de pe placa. Aceasta va avea un buton de tip switch pentru a intrerupe alimentarea componentelor. Alimentarea componentelor este facuta prin creearea unei “bari” de VCC si una de GND, folosind pini lipiti intre ei.

Schema componentelor este urmatoarea:

Software Design

Un cod pin este format din 4 cifre. Nu poate contine alte caractere. Codul pin de fabrica al aplicatiei este “0000”.

Daca codul PIN introdus este are acelasi hash cu cel al codului corect, se va trimite un semnal care va deschide incuietoarea (invartirea servomotorului). Dupa o perioadata fixa (3 secunde) de timp, se va verifica daca cutia a fost inchisa (senzorul HALL detecteaza campul magnetic), si va inchide incuietoarea.

Codurile pin nu sunt stocate direct pe card, ci se foloseste o functie de hashing. Astfel se va stoca valoarea hash-ului respectiva unui cod pin. Functia de hash a fost verificata inaintea implementarii in arduino si nu produce coliziuni pentru nicio combinatie posibila de cod pin de intrare.

Parola va fi salvata pe un card microSD, aceasta fiind salvata si dupa decuplarea sursei de energie. Codul pin poate fi schimbat prin introducerea secventei “*00*”, dupa care se asteapta codul pin vechi, urmat de introducerea noului codul pin dorit. Daca codul pin vechi a fost uitat, accesul este imposibil fara forta. Daca cutia este deschisa, se poate apasa butonul din interior marcat cu reset pentru a reseta codul pin la cel de fabrica “0000”. Acest buton va genera o intrerupere ce va oprii orice actiune era in proces.

Pentru a intrerupe actiunile, in intrerupe se modifica o variabla de stare, ce reprezinta ca actiunea curenta trebuie oprita iar pin-ul resetat.

Pentru a gestiona afisarea la LCD, se va folosi o implementare pe stari. Daca starea device-ului nu s-a schimbat, atunci nu se mai modifica mesajul(nu resetam lcd-ul degeaba).

Functia Hash a fost testata pentru toate input-urile posibile si nu produce coliziuni, fiind perfecta pentru ce avem nevoie in aceasta implementare.

Utilizatorul nu poate introduce un cod PIN ce contine altceva inafara de cifre, un mesaj de eroare fiind afisat in caz contrar.

Monitorizarea numarului de incercari se face printr-o variabila globala, fiind reseta odata cu apasarea butonului de reset pin sau introducerea codului pin corecta, sau dupa asteptarea timpului de 10 secunde.

Pentru sunetele buzzerului, se folosesc 2 sunete simple, formate din cate 2 note muzicale. Pentru esec se foloseste de 2 ori nota B4 (494 Hz). Pentru succes, se folosesc notele B5 (988 Hz) si E6(1319 Hz).

Seriala USART este folosita pentru a afisa informatii de debug.
Cititorul de card comunica folosind protocolul SPI.
Comunicatie cu display-ul se face folosind protocolul I2C.
Servomotorul este controlat prin PWM.
Butonul actioneaza o intrerupere pe INT0.

Link catre codul sursa pe GitHub

Rezultate Obţinute

Link demo: Youtube

Concluzii

Per total, desi proiectul pleaca de la o idee simpla, implementarea este destul de complexa, folosindu-se destul de multe mecanisme pentru a “complica” (cu rost) proiectul. A fost surprizator de greu sa realizez partea fizica a proiectului (nu ma asteptam sa fie asa greu sa inghesui niste fire intr-o cutie). Mi-ar fi placut daca aspectul interior al componentelor ar fi fost mai “clean” dar pentru asta probabil ar fi trebui sa imi leg eu componentele de placi si sa leg fire exact de lungimea dorita. Consider ca proiectul este destul de complex atat hardware cat si software.

Download

O arhiva cu resursele folosite: aici

Jurnal

  • 06.05.2023: Realizare documentatie initiala
  • 21.05.2023: Adaugarea schema hardware + lista componentelor finala.
  • 24.05.2023: Adaugare explicatii software + imbunatire schema hardware (adaugare buton)
  • 25.05.2023: Modificare format dokuWiki, adaugare explicatii extra si link GitHub pentru cod
  • 26.05.2023: Adaugare functii noi
  • 28.05.2023: Adaugare concluzii

Bibliografie/Resurse

pm/prj2023/fstancu/darius.paunoiu.txt · Last modified: 2023/05/28 21:17 by darius.paunoiu
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0