Differences

This shows you the differences between two versions of the page.

Link to this comparison view

pm:prj2021:alazar:bluetooth_door_lock [2021/04/25 22:02]
irina.popescu0706
pm:prj2021:alazar:bluetooth_door_lock [2021/05/30 01:09] (current)
irina.popescu0706 demo
Line 1: Line 1:
-[[https://​ocw.cs.pub.ro/​courses/​pm/​prj2021/​alazar/​bluetooth_door_lock|Popescu Irina-Elena Bluetooth ​Door Lock]] +[[https://​ocw.cs.pub.ro/​courses/​pm/​prj2021/​alazar/​bluetooth_door_lock|Popescu Irina-Elena Bluetooth ​and RFID door lock]] 
-====== Bluetooth ​Door Lock ======+====== Bluetooth ​and RFID door lock ======
 ===== Autor ===== ===== Autor =====
-Popescu Irina-Elena 331CB+  * nume: Popescu Irina-Elena ​331CB 
 +  * grupa: ​331CB
 ===== Introducere ===== ===== Introducere =====
 +Door lock-ul se poate deschide atat prin RFID, folosindu-se de un tag, cat si prin modul de bluetooth, folosindu-se de o aplicatie de telefon. Exista doua functii: lock si unlock door. Cand se va apela una dintre aceste functii, se vor porni led-ul si buzzer-ul, si un servomotor se va roti 180 de grade, pentru a trage de un zavor. Am vrut sa fac un door lock pentru a mi-l pune la usa mea, deoarece daca imi inchid usa, mereu trebuie sa ma ridic sa o deschid pentru altcineva; dar acum, pot sa fac totul de pe telefon. :-P
 +
 +===== Descriere generală =====
 +  * Cand se va da lock, led-ul rosu se va aprinde de 2 ori, si buzzer-ul va suna tot de 2 ori, pe o anumita frecventa; la final, servomotorul se va roti cu 180 de grade.
 +  * Cand se va da unlock, led-ul verde se va aprinde de 3 ori, si buzzer-ul va suna tot de 3 ori, pe o alta frecventa; la final, servomotorul se va roti cu 180 de grade, in sens opus.
 +  * Daca tag-ul este gresit, led-ul albastru se va aprinde de 5 ori, si buzzer-ul va suna tot de 5 ori, pe o alta frecventa.
 +  * Aplicatia de mobil a fost creata cu MIT App Inventor.
 +
 +<​note>​
 +Pentru a putea da comenzile de lock/unlock din aplicatia de mobil, trebuie sa se introduca o parola in aplicatie.
 +</​note>​
 +
 +<​note>​
 +Exista un unic tag care va porni functiile de lock/unlock folosind modulul de RFID, tag identificat prin numarul sau serial de 4 bytes.
 +</​note>​
 +
 +Schema bloc:
 +
 +{{ :​pm:​prj2021:​alazar:​diagram.png?​600 |}}
 +
 +===== Hardware Design =====
 +Lista de componente:
 +  * Arduino UNO ATmega328p
 +  * Breadboard
 +  * Modul Bluetooth Master Slave HC-05
 +  * Modul Tag RFID-RC522
 +  * Micro servo motor SG90
 +  * Led RGB cu catod comun
 +  * Buzzer activ
 +  * Fire tata-tata/​mama-tata
 +  * Rezistoare
 +  * Tag RFID
 +
 +Schema electrica:
 +
 +{{ :​pm:​prj2021:​alazar:​schema-electrica-ip.png?​600 |}}
 +
 ===== Software Design ===== ===== Software Design =====
-TODO+ 
 +Am folosit [[https://​www.arduino.cc/​en/​software|Arduino IDE]] pentru a dezvolta programul. Bibliotecile folosite au fost: 
 +  * [[https://​github.com/​addicore/​AddicoreRFID|AddicoreRFID.h]] pentru modulul RFID-RC522. 
 +  * [[https://​www.arduino.cc/​en/​reference/​SPI]|SPI.h]] pentru modulul RFID-RC522 - acest comunica prin SPI. 
 +  * [[https://​www.arduino.cc/​reference/​en/​libraries/​servo/​|Servo.h]] pentru micro servo motor SG90. 
 + 
 +Variabilele globale sunt: 
 +  * recv_bluetooth:​ este 1 daca s-au primit date de la bluetooth, si 0 daca nu s-a primit nimic. 
 +  * data_bluetooth:​ byte-ul primit de la modulul de bluetooth. 
 +  * door_locked:​ reprezinta starea actuala a usii; ia valoarea 1/0 daca usa este inchisa/​deschisa. 
 +  * i, state: variabile auxiliare. 
 +  * checksumRFID,​ strRIFD: variabile folosite in functiile pentru RFID. 
 +  * myRFID: obiectul de tip AddicoreRFID. 
 +  * myServo: obiectul de tip Servo. 
 + 
 +__**Functii:​**__ 
 + 
 +**setPins()** 
 + 
 +Setez pinii pe care voi lega componentele de arduino pe **OUTPUT**:​ 
 +  * 7, 8, 9 pentru led-ul RGB. 
 +  * 2 pentru buzzer 
 +  * 5, 10 pentru RFID 
 +si ii atasez obiectului de tip servo pinul PWM 3. 
 + 
 +**activatePins()** 
 + 
 +Scriu pe pinul 10 valoarea LOW si pe pinul 5 valoarea HIGH, pentru a activa RFID-ul. 
 + 
 +**setupComponents()** 
 + 
 +Initializez variabilele globale. Folosind //​AddicoreRFID_Init()//​ initializez obiectul myRFID. Folosind //write// setez servo motorul la 0 grade, si variabila //​door_locked//​ este 0, adica usa este deschisa. In plus, variabila //​recv_bluetooth//​ este setata la 0 initial, pentru ca nu se primesc date de la bluetooth la setup. 
 + 
 +**setupBluetoothInterrupt()** 
 + 
 +Setez variabilele corespunzatoare pentru intreruperea pe USART, deoarece modulul de bluetooth comunica pe USART. Dezactivez intreruperile prin //cli()//. Setez //UBRR0// pe 103, pentru a configura baud rate-ul la 9600bps. Setez bitii //UCSZ01// si //UCSZ00// pe 1 in //UCSR0C// pentru a seta ca voi recepta/​transmite date de 8 biti. Pentru a activa receptia/​transmiterea,​ setez in //UCSR0B// biii //​RXEN0//​(activeaza receptia pe USART), //​TXEN0//​(activeaza transmiterea pe USART) si //RXCIE0// pe 1. 
 +La final, activez interuperile prin //​sei()//​. 
 + 
 +**setup()** 
 + 
 +Pornesc libraria SPI, deoarece este folosita de RFID. Apelez cele 3 functii descrise anterior si setez bitii corespunzatori pentru a activa interuperea pentru modulul de bluetooth. 
 + 
 +**set_RGB_led(int red_light, int green_light,​ int blue_light)** 
 + 
 +Pornesc led-ul RGB, folosind //​analogWrite(pin,​ freq), unde freq = [0, 255], pin = {7, 8, 9}//. 
 + 
 +**servo_lock(int startp, int endp)** 
 + 
 +Pornesc servo motorul, care face o rotire de la unghiul startp la endp, folosindu-se de functia //write//. Pentru a fi o miscare lina, folosesc un for, pentru a trece prin fiecare unghi de la startp la endp, si dupa fiecare miscare fac un //​delay//​. 
 + 
 +<​note>​ 
 +Daca as face doar un write(endp),​ s-ar misca prea repede. 
 +</​note>​ 
 + 
 +**servo_unlock(int startp, int endp)** 
 + 
 +Aplic aceeasi idee ca la functia anterioara, doar ca in sens opus. 
 + 
 +**door_routine(int redl, int greenl, int bluel, int delayt, int flickert, int freqb)** 
 + 
 +Rutina care se executa cand se da lock/​unlock. De //​flickert//​ ori, se executa: 
 +  * se porneste led-ul RGB 
 +  * se porneste buzzer-ul la o frecventa //freqb//, folosind functia //tone// 
 +  * delay 
 +  * se opreste led-ul RGB 
 +  * se opreste buzzer-ul 
 +  * delay 
 + 
 +**lock()** 
 + 
 +Functia care se apeleaza cand se inchide usa. Se apeleaza functia //​door_routine//,​ pentru a porni led-ul si buzzer-ul, si se porneste servo motorul. 
 + 
 +**unlock()** 
 + 
 +Functia care se apeleaza cand se deschide usa. Se apeleaza functia //​door_routine//,​ pentru a porni led-ul si buzzer-ul, si se porneste servo motorul. 
 + 
 +**wrong_tag()** 
 + 
 +Daca tag-ul pus la RFID este cel gresit, se apeleaza doar //​door_routine//,​ dar nu se actioneaza si servo motorul. 
 + 
 +**check_tag()** 
 + 
 +Se verifica daca tag-ul pus este cel corect. Se verifica fiecare byte din codul tag-ului cu numarul din tag-ul meu. In plus, ca o verificare extra, se verifica si checksum. 
 + 
 +<​note>​ 
 +Reader-ul de RFID returneaza un numar pe 5 bytes: primii 4 bytes reprezinta numarul unic al tag-ului, iar al 4-lea este checksum. 
 +</​note>​ 
 + 
 +**RFID_routine()** 
 + 
 +DUpa ce s-a detectat un tag, daca tag-ul este cel corect, se da lock/​unlock. Daca tag-ul este gresit, se apeleaza functia corespunzatoare. Daca inainte se da lock, se apeleaza unlock, si invers. 
 + 
 +**ISR(USART_RX_vect)** 
 + 
 +Rutina de tratare a interuperii USART pentru bluetooth. Retin byte-ul primit prin //URD0//, si setez variabila //​recv_bluetooth//​ pe 1, asta insemnand ca am primit date de la telefon.  
 + 
 +<note important>​ 
 +Variabila //​recv_bluetoot//​ este [[https://​www.arduino.cc/​reference/​en/​language/​variables/​variable-scope-qualifiers/​volatile/​|volatila]] pentru a ma asigura ca valoarea ei se schimba imediat.  
 +</​note>​ 
 + 
 + 
 +**loop()** 
 + 
 +Se verifica daca s-a gasit vreun tag, sau daca se primesc date de la telefon pe bluetooth. Daca s-a gasit tag, se verifica ce tag s-a gasit, si se verifica manual checksum. Dupa ce se apeleaza functia //​RFID_routine()//,​ se da //halt// la modul. Daca s-au primit date de la telefon, se verifica ce functie s-a primit (lock/​unlock),​ se apeleaza functia specifica, si se trimite inapoi la telefon valoarea corespunzatoare (1/0). 
 + 
 +<note important>​ 
 +In rutina de intrerupere doar am setat variabila //​recv_bluetooth//​ pentru ca lock()/​unlock() contin **delay** si nu e bine sa ai delay in interuperi. 
 +</​note>​ 
 + 
 +**Functionare:​** 
 + 
 +Prin RFID, cand se citeste tag-ul bun, automat se da lock(daca starea anterioara a fost unlock), sau unlock(daca starea anterioara a fost lock). Prin bluetooth(folosindu-se de o aplicatie de mobil pe Android), se poate alege daca se doreste lock sau unlock. 
 + 
 +<​note>​ 
 +La bluetooth, daca se da lock, desi usa este locked, nu se intampla nimic. (la fel si pentru unlock). 
 +</​note>​ 
 + 
 +<​note>​ 
 +Se retine starea usii printr-o varabila cu valorile posibile **0(unlocked)** sau **1(locked)**. 
 +</​note>​ 
 + 
 +Indiferent daca s-a dat lock/unlock prin RFID sau bluetooth, se apeleaza aceeasi **rutina** pentru pornit led-ul, buzzer-ul si servo motorul. 
 + 
 +**Aplicatia de mobil pentru comunicarea cu modulul de bluetooth** 
 + 
 +Am folosit [[https://​appinventor.mit.edu/​|MIT App Inventor]] pentru a crea aplicatia de mobil ce comunica cu modulul de bluetooth. 
 + 
 +Partea de frontend: 
 + 
 +{{ :​pm:​prj2021:​alazar:​frontend-ip.png?​300 |}} 
 + 
 +Partea de backend: 
 + 
 +{{ :​pm:​prj2021:​alazar:​backend-ip.png?​800 |}} 
 ===== Rezultate Obţinute ===== ===== Rezultate Obţinute =====
-TODO+ 
 + 
 +Asa arata proiectul, cu toate componentele:​ 
 + 
 +{{ :​pm:​prj2021:​alazar:​bluetooth_lock_pi_poza1.jpeg?​600 |}} 
 + 
 +{{ :​pm:​prj2021:​alazar:​bluetooth_lock_pi_poza2.jpeg?​600 |}} 
 + 
 + 
 +Demo-ul care arata cum functioneaza proiectul:​[[https://​drive.google.com/​file/​d/​1-a-eM0CwmazW_RFdytdrfh9KYTh73WLN/​view?​usp=sharing|demo]] 
 + 
 ===== Concluzii ===== ===== Concluzii =====
-TODO+ 
 +**REUSITE** 
 + 
 +  * Am reusit sa implementez tot ce mi-am propus, si a iesit exact cum mi-am dorit. 
 +  * Am reusit sa fac o aplicatie de mobil functionala. 
 + 
 +**PROBLEME INTAMPINATE** 
 + 
 +  * Am avut probleme la a face interuperea pentru USART pentru bluetooth. In rutina de interuperea apelam si lock()/​unlock(),​ care contin **delay()**,​ si din cauza asta, nu se executau corect. 
 +  * Nu am reusit inca sa fac un log in care sa retin pe aplicatia de mobil cand s-a deschis/​inchis usa mereu. Am creat o baza de date in aplicatie, dar nu le afisez inca cum vreau eu. 
 + 
 +**CE AM INVATAT DIN PROIECT?​** 
 + 
 +  * Am invatat sa folosesc modulul de bluetooth, si in acelasi timp, am inteles mai bine cum se face o intrerupere. 
 +  * Am invatat sa citesc mai bine datasheet-ul pentru placa Arduino UNO. 
 +  * Am invatat sa fac o logica pentru un proiect pe Arduino ce contine mai multe module. 
 + 
 ===== Download ===== ===== Download =====
-TODO+ 
 +Arhiva cu codul sursa si README este: {{:​pm:​prj2021:​alazar:​bluetooth_rfid_door_lock_popescu_irina-elena_331cb.zip|arhiva_cod}} 
 ===== Jurnal ===== ===== Jurnal =====
-TODO+  * 25.04.2021: am ales proiectul si am creat pagina. 
 +  * 03.05.2021 - 26.05.2021: lucrat la proiect. 
 +  * 26.05.2021: update la pagina + adaugat schema electrica. 
 +  * 27.05.2021: modificat functiile din software design + concluzii. 
 +  * 30.05.2021: adaugat link demo + arhiva cod + bibliografie 
 + 
 ===== Bibliografie/​Resurse ===== ===== Bibliografie/​Resurse =====
-<​html><​a class="​media mediafile mf_pdf"​ href="?​do=export_pdf">​PDF</​a></​html>​+  * [[https://​ocw.cs.pub.ro/​courses/​pm/​lab/​lab0-2021|PM-laborator 0]] - scrieri/​citiri digitale 
 +  * [[https://​ocw.cs.pub.ro/​courses/​pm/​lab/​lab1-2021|PM-laborator 1]] - Intrerupere 
 +  * [[https://​ocw.cs.pub.ro/​courses/​pm/​lab/​lab2-2021|PM-laborator 2]] - USART 
 +  * [[https://​ocw.cs.pub.ro/​courses/​pm/​lab/​lab3-2021|PM-laborator 3]] - PMW - led RGB, servomotor 
 +  * [[https://​create.arduino.cc/​projecthub/​muhammad-aqib/​arduino-rgb-led-tutorial-fc003e|LED RGB]] 
 +  * [[https://​create.arduino.cc/​projecthub/​SURYATEJA/​use-a-buzzer-module-piezo-speaker-using-arduino-uno-89df45|BUZZER]] 
 +  * [[https://​www.instructables.com/​Arduino-Servo-Motors/​|Servomotor]] 
 +  * [[https://​randomnerdtutorials.com/​security-access-using-mfrc522-rfid-reader-with-arduino/​|RFID]] 
 +  * [[https://​howtomechatronics.com/​tutorials/​arduino/​arduino-and-hc-05-bluetooth-module-tutorial/​|Bluetooth HC-05]] 
 +  * <​html><​a class="​media mediafile mf_pdf"​ href="?​do=export_pdf">​PDF</​a></​html>​
pm/prj2021/alazar/bluetooth_door_lock.1619377322.txt.gz · Last modified: 2021/04/25 22:02 by irina.popescu0706
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