This is an old revision of the document!
Seiful 2FA reprezinta un mod inteligent de stocare a lucrurilor valoroase. Codul pin pentru deschiderea seifului nu este un cod fix, prestabilit, ci este generat si schimbat la cateva secunde de o aplicatie, similar logarii de tip “Two Factor Authentication”. Daca codul introdus este corect, utilizatorul va putea apropia mana de senzor si usa se va deschide singura.
Scopul acestui proiect este de a imbunatati modelul clasic de seif cu un pin de 4 cifre si de a oferi o securitate mult mai mare. Multi utilizatori seteaza coduri pin simple si usor de retinut, de exemplu “0000”, “1234” sau anul nasterii, care pot fi foarte usor ghicite de alte persoane. Prin folosirea acestei metode, codul va fi aproape imposibil de ghicit, iar utilizatorul nu va mai purta grija memorarii unui cod, intrucat il poate vedea pe telefon.
Am pornit de la ideea unui seif normal, observand tendinta oamenilor de a seta coduri pin cat mai simpliste, si m-am gandit sa aduc o imbunatatire in domeniul securitatii.
Schema bloc:
Proiectul are la baza o placuta Arduino UNO R3 si foloseste urmatoarele componente:
Placuta va calcula pe baza algoritmului TOTP un cod temporar, fiind acelasi algoritm folosit de “Google Authenticator”. Avand aceeasi cheie secreta, ambele coduri generate vor fi identice, astfel ca nu este nevoie de o comunicatie intre telefon si placuta.
Componente folosite:
Schema poate fi analizata mai in detaliu dand click aici.
Schema electrica: schema_electrica_claudiu.pdf
BOM:
Componenta | Cantitate | Locul achizitionarii | Datasheet |
---|---|---|---|
Arduino Uno R3 | 1 | Arduino | Datasheet |
LED rosu | 1 | LED rosu | |
LED verde | 1 | LED verde | |
Rezistenta 220Ω | 2 | Rezistenta 220 | |
Rezistenta 10KΩ | 2 | Rezistenta 10k | |
Buzzer pasiv | 1 | Buzzer | |
LCD 16×2 (I2C) | 1 | Ecran LCD | |
Keypad 4×3 | 1 | Keypad | |
Baterie AA | 8 | Baterii | |
Suport baterii | 2 | Suport baterii | |
RTC DS3231 | 1 | Modul RTC | |
Senzor distanta IR | 1 | Senzor distanta | |
Servomotor MG996 | 1 | Servomotor MG996 | |
Servomotor SG90 | 1 | Servomotor SG90 |
Descrierea componentelor:
Se foloseste ground comun intre alimentarea placutei si alimentarea celor doua motorase.
Descrierea codului aplicaţiei (firmware):
Mediu de dezvoltare: PlatformIO
Biblioteci:
Element de noutate: Deblocarea seifului se face prin autentificarea in 2 pasi; codul pentru seif se schimba la fiecare 30 de secunde si poate fi gasit pe aplicatia Google Authenticator dupa scanarea unui cod QR
Functionalitati din laboratoare: GPIO, USART, PWM, I2C
Algoritm:
Repartizare pini:
#define IR_SENSOR_PIN PD0 // Arduino D0 #define MG996_SERVO_PIN PB1 // Arduino D9 (OCR1A) #define GS21G_SERVO_PIN PB2 // Arduino D10 (OCR1B) #define BUZZER_PIN PB3 // Arduino D11 #define BUZZER 11 #define RED_LED PB4 // Arduino D12 #define GREEN_LED PB5 // Arduino D13
[GPIO] Ledurile, buzzerul si senzorul infrarosu au fost declarate si setate astfel:
// Set LEDs, buzzer and servos as output DDRB |= (1 << RED_LED) | (1 << GREEN_LED) | (1 << BUZZER_PIN) | (1 << MG996_SERVO_PIN) | (1 << GS21G_SERVO_PIN); // Set IR sensor as input with pull-up DDRD &= ~(1 << IR_SENSOR_PIN); // Set as input PORTD |= (1 << IR_SENSOR_PIN); // Enable pull-up resistor start_led(RED_LED); // acest apel executa aceasta linie PORTB |= (1 << PB4);
Tastatura a fost initializata folosind libraria Keypad.h si este retinuta ca matrice de 4×3.
[PWM] Motorasele au fost setate astfel:
// Set PWM pins as outputs pinMode(MG996_SERVO_PIN, OUTPUT); pinMode(GS21G_SERVO_PIN, OUTPUT); // Configure Timer1 for Fast PWM, 20ms period (50Hz) TCCR1A = (1 << COM1A1) | (1 << COM1B1) | (1 << WGM11); // Non-inverting PWM A & B TCCR1B = (1 << WGM13) | (1 << WGM12) | (1 << CS11); // Prescaler 8 ICR1 = 39999; // TOP = 20ms at 16MHz/8 => 0.5 µs per tick DDRB |= (1 << PB1) | (1 << PB2);
[I2C] Ecranul LCD si modulul RTC au fost initializate folosind librarii externe:
#include <LiquidCrystal_I2C.h> #include <RTClib.h> RTC_DS3231 rtc; LiquidCrystal_I2C lcd(0x27, 16, 2); lcd.init(); lcd.backlight(); lcd.clear(); lcd.setCursor(0, 0); if (!rtc.begin()) { Serial.println("RTC not found!"); while (1); }
[USART] Serialul este folosit pentru debug si este initializat astfel:
Serial.begin(9600);
Pentru a asigura ca motorasele se misca lin si la o viteza rezonabila a fost folosita urmatoarea functie pentru a schimba gradual unghiul la care sa se miste motorasul:
void smoothServoMove(uint8_t pin, int fromAngle, int toAngle, int stepDelay = 15) { if (fromAngle == toAngle) { setServoAngle(pin, toAngle); return; } int stepDirection = (toAngle > fromAngle) ? 1 : -1; for (int angle = fromAngle; angle != toAngle; angle += stepDirection) { setServoAngle(pin, angle); delay(stepDelay); } // Ensure the final angle is set precisely setServoAngle(pin, toAngle); }
Calibrari:
Fişierele se încarcă pe wiki folosind facilitatea Add Images or other files. Namespace-ul în care se încarcă fişierele este de tipul :pm:prj20??:c? sau :pm:prj20??:c?:nume_student (dacă este cazul). Exemplu: Dumitru Alin, 331CC → :pm:prj2009:cc:dumitru_alin.