This shows you the differences between two versions of the page.
pm:prj2025:ajipa:claudiu.stefan [2025/05/19 18:03] claudiu.stefan1702 [Software Design] |
pm:prj2025:ajipa:claudiu.stefan [2025/05/24 21:39] (current) claudiu.stefan1702 [Bibliografie/Resurse] |
||
---|---|---|---|
Line 111: | Line 111: | ||
* daca simbolul este o cifra aceasta va fi atasata la sirul deja introdus, cu o singura conditie: se pot introduce maxim 6 cifre (aceasta este lungimea codului) | * daca simbolul este o cifra aceasta va fi atasata la sirul deja introdus, cu o singura conditie: se pot introduce maxim 6 cifre (aceasta este lungimea codului) | ||
* daca seiful este **deblocat** si senzorul de distanta detecteaza un obstacol usa se va deschide automat | * daca seiful este **deblocat** si senzorul de distanta detecteaza un obstacol usa se va deschide automat | ||
+ | |||
+ | Codul este creat individual pe placuta si verifica daca codul introdus este egal cu codul generat, astfel ca aplicatia si placuta lucreaza independent una de alta. Ambele folosesc algoritmul TOTP cu aceeasi cheie secreta si se poate garanta ca vor genera acelasi cod. Modulul RTC retine data si ora exacta, astfel se asigura faptul ca cele doua coduri sunt sincronizate (daca modulul ar retine ora cu 3 secunde in urma, atunci codul va fi actualizat cu 3 secunde intarziere, de unde rezulta importanta sincronizarii la secunda). | ||
+ | |||
+ | Repartizare pini: | ||
+ | <code> | ||
+ | #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 | ||
+ | </code> | ||
+ | |||
+ | **[GPIO]** Ledurile, buzzerul si senzorul infrarosu au fost declarate si setate astfel: | ||
+ | <code> | ||
+ | // 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); | ||
+ | </code> | ||
+ | |||
+ | Tastatura a fost initializata folosind libraria **Keypad.h** si este retinuta ca matrice de 4x3. | ||
+ | |||
+ | **[PWM]** Motorasele au fost setate astfel: | ||
+ | <code> | ||
+ | // 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); | ||
+ | </code> | ||
+ | |||
+ | **[I2C]** Ecranul LCD si modulul RTC au fost initializate folosind librarii externe: | ||
+ | <code> | ||
+ | #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); | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | **[USART]** Serialul este folosit pentru debug si este initializat astfel: | ||
+ | <code> | ||
+ | Serial.begin(9600); | ||
+ | </code> | ||
+ | |||
+ | Serialul este folosit in principal pentru debug si afisarea erorilor. | ||
+ | |||
+ | 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: | ||
+ | <code> | ||
+ | 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); | ||
+ | } | ||
+ | </code> | ||
**Calibrari**: | **Calibrari**: | ||
Line 116: | Line 204: | ||
* modulul RTC trebuie calibrat cu data si ora exacte dupa ce acesta pierde alimentarea de la curent (exista functia ajutatoare setRTC pentru a facilita acest lucru) | * modulul RTC trebuie calibrat cu data si ora exacte dupa ce acesta pierde alimentarea de la curent (exista functia ajutatoare setRTC pentru a facilita acest lucru) | ||
* a fost introdus un delay intre activarea motoraselor pentru a nu se suprapune actiunea acestora (ex: al doilea motor sa deschida usa inainte ca primul motor sa inlature incuietoarea) | * a fost introdus un delay intre activarea motoraselor pentru a nu se suprapune actiunea acestora (ex: al doilea motor sa deschida usa inainte ca primul motor sa inlature incuietoarea) | ||
- | + | * la pornirea placutei incuietoarea este ridicata, usa adusa in pozitia de "inchis" si incuietoarea este lasata jos pentru a asigura faptul ca seiful porneste ca fiind incuiat | |
- | **Optimizari**: | + | |
- | * | + | |
===== Rezultate Obţinute ===== | ===== Rezultate Obţinute ===== | ||
- | <note tip> | + | Ca rezultat am obtinut un seif cu deschidere/inchidere automata si cu un nivel de securitate marit datorita codului temporar (acesta fiind aproape imposibil de ghicit - probabilitate 1 la un milion). In acelasi timp, acesta este foarte usor de folosit, deoarece codul se afla permanent pe telefon si poate fi adaugatfoarte usor, doar scanand codul QR. |
- | Care au fost rezultatele obţinute în urma realizării proiectului vostru. | + | |
- | </note> | + | <html> |
+ | <iframe width="800" height="450" | ||
+ | src="https://youtube.com//embed/5Rv_Cynij14" | ||
+ | frameborder="0" | ||
+ | allow="autoplay; encrypted-media" | ||
+ | allowfullscreen> | ||
+ | </iframe> | ||
+ | </html> | ||
===== Concluzii ===== | ===== Concluzii ===== | ||
+ | Proiectul a indeplinit asteptarile initiale si se comporta cum ar trebui. Implementarea software a fost relativ simpla, partea dificila fiind conectarea tuturor componentelor si functionarea simultana a acestora. Totodata proiectul a aratat ca se poate face ceva util si interesant folosind o placuta Arduino si niste componente. | ||
===== Download ===== | ===== Download ===== | ||
Line 144: | Line 238: | ||
===== Bibliografie/Resurse ===== | ===== Bibliografie/Resurse ===== | ||
- | <note> | + | [[https://github.com/s1koO/2FA-Vault/tree/main|Github]] |
- | Listă cu documente, datasheet-uri, resurse Internet folosite, eventual grupate pe **Resurse Software** şi **Resurse Hardware**. | + | |
- | </note> | + | |
<html><a class="media mediafile mf_pdf" href="?do=export_pdf">Export to PDF</a></html> | <html><a class="media mediafile mf_pdf" href="?do=export_pdf">Export to PDF</a></html> | ||