Table of Contents

Hand Wave Cinema

Introducere

Proiectul se foloseste de Arduino si Python pentru a controla comportamentul unei aplicatii prin diferite gesturi.

Se utilizeaza doi senzori ultrasonici pentru a detecta pozitia mainii si a controla un media player (VLC) in functie de aceasta. Este utilizat un buton pentru pornirea/oprirea interpretarii gesturilor, un display OLED pentru afisarea comenzii curente care se executa si un LED pentru feedback vizual.

Concepte aflate la baza dezvoltarii proiectului:

Principalul scop al acestui proiect este de a demonstra versatilitatea si potentialul platformelor hardware si software open-source si de a oferi un nou mod de a interactiona cu un media player, prin gesturi, fara a fi nevoie de a folosi tastatura sau o telecomanda. Folosind senzorii cu ultrasunete pentru a detecta pozitia mainii, utilizatorii pot controla aplicatia prin gesturi simple, cum ar fi apropierea sau departarea mainii pentru actiuni precum Rewind/Fast-Forward sau micsorarea/marirea volumului.

Printre utilizarile si beneficiile acestui proiect mentionam accesibilitatea si inovatia. Oferind o modalitate alternativa de a controla o aplicatie precum VLC prin gesturi ale mainii, acest proiect poate fi deosebit de util pentru persoane cu dizabilitati motorii, care au dificultati in a utiliza metodele de control traditionale. De asemenea, acest proiect are potentialul de a constitui o modalitate distractiva si captivanta de a interactiona cu diverse tehnologii si de a experimenta cu acestea.

Schema bloc

Hardware Design

Lista de componente:

Montajul electronic:

Schema electrica:

Software Design

Descrierea codului aplicaţiei (firmware):

  • algoritmi şi structuri pe care plănuiţi să le implementaţi
  • (etapa 3) surse şi funcţii implementate

Biblioteci:

  1. Arduino:
    • Adafruit_GFX.h
    • Adafruit_SSD1306.h
  1. Python:
    • serial
    • time
    • vlc

Functii:

  1. Arduino:
    • void setup():
      • seteaza viteza pentru transmisia de date;
      • configureaza pinii I/O pentru senzori, buton si led;
      • initializeaza si configureaza display-ul OLED;
    • void loop():
      • detecteaza daca butonul a fost apasat si face toggle la variabila de stare a interpretarii gesturilor;
      • daca interpretarea gesturilor este blocata, ecranul nu afiseaza niciun mesaj si led-ul de pe placuta Arduino este aprins;
      • altfel:
        • se calculeaza distantele dintre senzori si maini;
        • se verifica detectia ambelor maini, si daca comanda EXIT a fost detectata, se inchide programul;
        • daca o singura mana a fost detectata, se interpreteaza gesturile mainii respective;
    • int compute_distance(int trigger, int echo):
      • calculeaza distanta pana la obiect pe baza formulei: time_taken * 0.034 / 2;
      • returneaza valoarea distantei, distanta maxima acceptata fiind 50cm;
    • void get_hands_distances():
      • calculeaza, pentru fiecare mana, distanta pana la senzor;
    • void display_message(const char *message):
      • afiseaza centrat mesajul pe display;
    • int detect_both_hands():
      • daca ambele maini se afla la o distanta intre 40-50cm, se afiseaza (ecran, serial) mesajul “Play/Pause” si returneaza 0;
      • daca ambele maini se afla la o distanta mai mica de 12cm, se afiseaza (ecran, serial) mesajul “EXIT” si returneaza 1;
    • void detect_left_hand():
      • face lock pe mana stanga, daca se afla la o distanta intre 12-17cm;
      • cat timp mana nu se departeaza la mai mult de 40cm de senzor:
        • daca mana s-a apropiat, este afisata comanda “Volume DOWN”;
        • daca mana s-a departat, este afisata comanda “Volume UP”;
    • void detect_right_hand():
      • face lock pe mana dreapta, daca se afla la o distanta intre 12-17cm;
      • cat timp mana nu se departeaza la mai mult de 40cm de senzor:
        • daca mana s-a apropiat, este afisata comanda “Rewind”;
        • daca mana s-a departat, este afisata comanda “Forward”.
  2. Python:
    • se creeaza o noua instanta de VLC Player;
    • se seteaza filmul in functie de inputul utilizatorului si se porneste playback-ul;
    • citeste mesajul de pe serial, afiseaza si executa comanda.

Pasi de utilizare:

  1. Se pozitioneaza corespunzator senzorii, deasupra display-ului laptopului, si se conecteaza placuta Arduino.
  2. Se incarca sursa in microcontroler.
  3. Din directorul in care se afla scriptul de python, se porneste programul prin rularea comenzii:
     python3 home_wave_cinema.py 2> nul 
  4. Utilizatorul alege unul dintre filmele disponibile, prin introducerea numarului corespunzator.
  5. Utilizatorul interactioneaza cu media player-ul prin gesturi:
    • Play/Pause - pozitionarea ambelor maini la o distanta cuprinsa intre 40-50cm;
    • Volume DOWN - pozitionarea mainii stangi la o distanta 12-17cm si apropierea ei de senzor;
    • Volume UP - pozitionarea mainii stangi la o distanta 12-17cm si departarea ei de senzor;
    • Rewind - pozitionarea mainii drepte la o distanta de 12-17cm si apropierea ei de senzor;
    • Forward - pozitionarea mainii drepte la o distanta de 12-17cm si departarea ei de senzor.
  6. Daca in orice moment al rularii aplicatiei utilizatorul se decide sa opreasca interpretarea gesturilor, acesta trebuie sa apese butonul. Se va afisa un mesaj sugestiv in consola aplicatiei, nu se vor mai afisa mesaje pe display-ul OLED si led-ul de pe placuta Arduino va fi aprins. La inca o apasare de buton, interpretarea gesturilor va fi reluata.
  7. Atunci cand utilizatorul apropie ambele maini la o distanta mai mica de 12cm de senzori se primeste comanda de EXIT si programul este inchis.

Rezultat

Un scurt demo al proiectului poate fi urmarit la urmatorul link:

https://youtu.be/IDsWs87Uzd8

Jurnal

Resurse

Medii de dezvoltare:

Export to PDF