This shows you the differences between two versions of the page.
|
pm:prj2021:alazar:bluetooth_door_lock [2021/05/26 12:30] irina.popescu0706 Updated introducere/descriere generala/lista compnente |
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 and RFID door dock ====== | + | ====== Bluetooth and RFID door lock ====== |
| ===== Autor ===== | ===== Autor ===== | ||
| * nume: Popescu Irina-Elena 331CB | * nume: Popescu Irina-Elena 331CB | ||
| Line 23: | Line 23: | ||
| Schema bloc: | Schema bloc: | ||
| - | {{ :pm:prj2021:alazar:diagram.png?800 |}} | + | {{ :pm:prj2021:alazar:diagram.png?600 |}} |
| ===== Hardware Design ===== | ===== Hardware Design ===== | ||
| Line 37: | Line 37: | ||
| * Rezistoare | * Rezistoare | ||
| * Tag RFID | * 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 ===== | ||
| * 25.04.2021: am ales proiectul si am creat pagina. | * 25.04.2021: am ales proiectul si am creat pagina. | ||
| - | * 26.05.2021: update la 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> | ||