Differences

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

Link to this comparison view

pm:prj2021:alazar:stabilizator_camera_selfie [2021/06/02 18:43]
teodora.moraru
pm:prj2021:alazar:stabilizator_camera_selfie [2021/06/02 19:07] (current)
teodora.moraru
Line 48: Line 48:
 \\ \\
  
-Componenta software corespunzatoare placii Arduino e reprezentata de //​projectPM.ino//​. 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.\\+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 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: In cele ce urmeaza, algoritmul e impartit in doua cazuri:
Line 54: Line 54:
   - **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.\\   - **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//​ 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//.\\+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.\\ 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. Iesirea din interfata si inchiderea programului se face prin apasarea tastei //ESC//. Tot atunci se inchide camera si protocolul serial.
Line 90: 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>​
pm/prj2021/alazar/stabilizator_camera_selfie.1622648585.txt.gz · Last modified: 2021/06/02 18:43 by teodora.moraru
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