This shows you the differences between two versions of the page.
pm:prj2021:alazar:stabilizator_camera_selfie [2021/06/02 15:32] teodora.moraru |
pm:prj2021:alazar:stabilizator_camera_selfie [2021/06/02 19:07] (current) teodora.moraru |
||
---|---|---|---|
Line 47: | Line 47: | ||
- README | - README | ||
\\ | \\ | ||
+ | |||
+ | Componenta software corespunzatoare placii Arduino e reprezentata de //projectPM.ino// si a fost scrisa in Arduino IDE. Pentru a putea lucra cu functiile necesare controlului servomotorului, am inclus biblioteca //Servo.h//. Algoritmul incepe cu initializarile paramatrilor de stare si cei ai servomotorului, apoi continua cu cele doua functii: setup si loop. In functia **setup**, setez rolul pinilor de intrare si de iesire, starea initiala a celor doua LED-uri (verde aprins, rosu stins), atasez servomotorul pinului 9 de tip PWM si pornesc protocolul de comunicare prin seriala.\\ | ||
+ | In functia **loop**, incep prin a face toggle pe butonul de switch: compar starea butonului cu cea anterioara si, daca aceasta difera, atunci se interschimba modurile de functionare ale stabilizatorului, respectiv se interschimba starile LED-urilor. Tot la apasarea butonului de switch, se porneste buzzer-ul, pentru a anunta auditiv utilizatorul ca s-a schimbat modul de utilizare. Salvez apoi starea curenta a butonului de switch pentru a fi folosita la urmatoarea iteratie. | ||
+ | In cele ce urmeaza, algoritmul e impartit in doua cazuri: | ||
+ | - **modul manual**: se citesc starile celor doua butoane (//left// si //right//). Daca unul dintre ele este apasat, se modifica gradul servomotorului in sensul dorit, fiind intotdeauna constrans de intervalul (-180, 180). | ||
+ | - **modul automat**: se primeste prin seriala (de la algoritmul camera.py explicat mai jos) o valoare care este convertita la int. Aceasta valoare reprezinta un cod pentru unul dintre cele doua cazuri: necesitatea deplasarii la stanga sau la dreapta. In functie de caz, se seteaza gradul servomotorului, cu o granularitate de 5 grade.\\ | ||
+ | |||
+ | Pe de alta parte, //camera.py// (scris in PyCharm) reprezinta componenta software responsabila de pornirea camerei web, captarea si afisarea imaginilor, detectia fetei si transmiterea comenzilor corecte catre placa Arduino, prin protocolul de comunicare seriala. Pentru inceput, se seteaza portul si baudrate-ul pe care se va realiza comunicarea, cu ajutorul bibliotecii //serial//. Apoi, pentru a putea facilita detectia fetei, am incarcat o baza de date publica numita //haarcascade_frontalface_default.xml//. Captarea si afisarea imaginilor de la camera web se face cu ajutorul bibliotectii //cv2//.\\ | ||
+ | Pasii de procesare sunt urmatorii: se capteaza imaginea, se salveaza coordonatele fetelor detectate, se itereaza prin ele pentru a gasi fata cea mai apropiata (metoda de eliminare a zgomotului), si apoi se deseneaza pe imagine un patrat cu acele coordonate. Se compara centrul patratului cu intervalul din mijloc de pe latimea imaginii, iar daca se afla in stanga sau in dreapta acestuia, se transmite prin seriala codul corespunzator deplasarii. Un aspect interesant este ca aceasta transmisie e asincrona, asa ca, pentru a ma asigura ca algoritmul continua abia dupa ce mesajul a fost primit la destinatie, astept un raspuns inapoi de la placa (aka //ack// - cu riscul micsorarii framerate-ului interfetei catre utilizator). La finalul buclei, dau flush serialei pentru a ma asigura ca nu ramane nimic in buffer.\\ | ||
+ | Iesirea din interfata si inchiderea programului se face prin apasarea tastei //ESC//. Tot atunci se inchide camera si protocolul serial. | ||
+ | |||
====== Rezultate obtinute====== | ====== Rezultate obtinute====== | ||
Line 67: | Line 78: | ||
\\ | \\ | ||
====== Concluzii====== | ====== Concluzii====== | ||
+ | Mi-a placut foarte mult sa lucrez la acest proiect, deoarece am avut sansa sa aprofundez cunostintele acumulate la curs si la laborator pentru a realiza un prototip interesant si foarte util. Sunt constienta ca functionalitatile sale nu sunt extrem de avansate, asa ca imi propun ca in viitorul apropiat sa dezvolt si mai mult acest prototip (sa creez o interfata grafica mai prietenoasa, sa mai adaug un servomotor pentru deplasarea verticala etc.) | ||
====== Download====== | ====== Download====== | ||
+ | De aici se poate descarca arhiva:\\ | ||
+ | {{:pm:prj2021:alazar:teodora_moraru:stabilizator.zip?linkonly}} | ||
====== Jurnal====== | ====== Jurnal====== | ||
* 25.04.2021 - Alegerea temei si crearea paginii de wiki | * 25.04.2021 - Alegerea temei si crearea paginii de wiki | ||
Line 76: | Line 90: | ||
* 02.06.2021 - Finalizarea paginii de wiki | * 02.06.2021 - Finalizarea paginii de wiki | ||
====== Bibliografie/Resurse====== | ====== Bibliografie/Resurse====== | ||
+ | [[https://ocw.cs.pub.ro/courses/pm/lab/lab0-2021|Laborator 0 PM]]\\ | ||
+ | [[https://ocw.cs.pub.ro/courses/pm/lab/lab2-2021|Laborator 2 PM]]\\ | ||
+ | [[https://ocw.cs.pub.ro/courses/pm/lab/lab3-2021|Laborator 3 PM]]\\ | ||
+ | [[https://www.arduino.cc/en/Tutorial/BuiltInExamples/Debounce|Button Debounce Example]]\\ | ||
+ | [[https://towardsdatascience.com/face-detection-in-2-minutes-using-opencv-python-90f89d7c0f81#:~:text=Face%20detection%20using%20Haar%20cascades,with%20other%20classifiers%20as%20well.|Face Detection Example]]\\ | ||
+ | [[https://create.arduino.cc/projecthub/ansh2919/serial-communication-between-python-and-arduino-e7cce0|Serial Communication in Python Example]]\\ | ||
+ | [[https://ocw.cs.pub.ro/courses/icalc/laboratoare/lab5|Laborator EAGLE]]\\ | ||
+ | |||
+ | <html><a class="media mediafile mf_pdf" href="?do=export_pdf">Export to PDF</a></html> |