Sign Language Glove

Nume: Olteanu Maria-Teona

Grupa: 331CA

Introducere

Proiectul reprezinta o modalitate prin care un utilizator poate sa invete si sa exerseze limbajului semnelor, sa dobandeasca abilitatea de a comunica intr-un nou limbaj.

Utilizatorul primeste cuvinte sau fraze in format text pe care trebuie sa le traduca in limbajul semnelor. Sistemul implementat verifica daca acesta a folosit semnele corespunzatoare.

Interpretarea semnelor se realizeaza cu ajutorul unui device wearable de recunoastere bazat pe senzori. Mai exact, device-ul propus consta intr-o manusa care identifica miscarile unei maini si a celor 5 degete. In momentul utilizari, senzorii vor detecta gesturi care corespund cu fraze sau cuvinte din American Sign Language (ASL).

Descriere generală


Utilizatorul poarta o manusa pe care se afla componentele descrise in diagrama de mai sus. Fiecare senzor de indoire este cusut pe un deget al manusii si conectat la un pin analogic. De asemenea, modulul giroscop si accelerometru este cusut pe manusa si conectat la pinii I2C. Acest modul ofera informatii despre orientare mainii in spatiu care sunt transmise catre Arduino.

Cand sunt inregistrate gesturi, microntrollerul determina daca miscarile se pot traduce in cuvinte sau fraze din limbajul semnelor, folosind date stocate in prealabil.

Prin intermediul unei aplicatii mobile si a modulului Bluetooth vom trimite un input text catre microcontroller. Acesta astepta inputul utilizatorului si il va interpreta cu ajutorul celor 5 senzori de indoire si a modulului MPU9250. Daca gesturile procesate in limbajul semnelor au acelasi inteles cu inputul primit din aplicatie, atunci microcontroller-ul asteapta urmatorul input, altfel utilizatorul va fi notificat de greseala si va trebui sa incerce din nou.

Hardware Design

  • Arduino UNO
  • 5 senzori de indoire
  • Modul Bluetooth HC-05
  • Modul cu 9 axe MPU9250
  • Modul multiplexor 16 canale
  • Placa de prototipare
  • 5 condensatoare 100nF
  • 2 rezistente (2.2K & 1.2K)
  • Fire

Senzori de indoire

Initial, am incercat sa confectionez senzorii de indoire pornind de la un tutorial. Ideea acestuia este de folosi grafitul de la creion ca material rezistiv si folie aluminiu pentru a conduce curent: o foaie hasurata pe ambele fete cu grafit intre doua bucati de aluminiu. Insa, nu am reusit sa obtin un senzor cu rezistenta variabila utilizand indicatiile si materialele propuse.

Pentru a obtine o componenta rezistiv am incercat mai multe combinatii de materiale, iar cea mai buna varianta a fost sa folosesc grafit pur pe foaie de calc. Am reusit sa obtin un senzor care daca este indoit (particulele conductive se apropie) isi mareste rezistenta, aceasta modificandu-se uniform cu nivelul de flexare.

Problema senzorului de mai sus este ca nu are valori consecvente ale rezistentei in momentul in care este drept - variaza intre 30k si 50k, deorece se realizeaza trasee conductive diferite pe grafit. Senzorul legat la un divizor de tensiune va genera valori greu de interpretat.

In final, am folosit senzori de indoire cumparati care actioneaza ca un divizor de tensiune si care in principiu au valori fixe care semnaleaza atat indoirea, cat si intinderea.

Senzorii au o impedanta de iesire foarte mare (aprox. 110K - 120K), iar in momentul in care vreau sa citesc la rand mai multi senzori conectati la pinii analogici am nevoie de un delay destul mare (cel putin o secunda) pentru a face esantionari corecte. Acest lucru este cauzat de faptul ca ADC-ul ATmega328P este optimizat pentru semnale analogice de maxim 10K Ohm, iar daca impedanta este mai mare timpul de esantionare depinde de durata de incarcare a condensatorului intern (vezi datasheet - 23.6.1 Analog Input Circuitry).

Am rezolvat aceasta problema conectand la fiecare iesire a senzorilor un condensator de 100nF legat la masa pentru a micsora impedanta.

Modul Bluetooth

Am conectat Rx si Tx ai modulului la pinii digitali 2, respectiv 3 pentru a avea disponibila comunicarea UART dintre arduino si laptop pentru debugging.

Pentru ca modulul HC-05 si Arduino functioneaza la nivele logice diferite am folosit un divizor de tensiune. O solutie mai buna ar fi un Convertor de nivel logic.

Mici probleme :)

La inceput, proiectul a fost gandit cu Arduino Nano pentru ca are mai multi pini analogici si deoarece ar fi fost mult mai usor de atasat pe manusa. Dar, am avut o problema cu driver-ul, nu am putut sa incarc pe placuta.

Am ars multiplexorul din greseala cu 2 zile inainte, deci device-ul va citi date doar pentru 4 degete. Am ales sa nu esantionez inelarul si sa folosesc datele degetului mijlociu, pentru ca nu am gesturi care sa presupuna stari diferite ale acestora.

Software Design

Senzori de indoire

Am incercat sa mapez gradul de indoire al degetelor in functie de outputul analog al senzorilor, stiind rezistenta acestora si tensiunea de intrare, dar senzorii nu permit acest lucru: aproximativ pentru orice tip de flexare acestia au aceleasi valori.

Asadar, am stabilit daca degetele sunt indoite sau nu, calculand valorile medii primite de la senzori si determinand daca acestea se afla peste un prag care semnaleaza flexarea.

MPU9250

Inainte de a utiliza manusa pentru a traduce gesturile, se realizeaza conexiunea I2C si senzorul accelerometru si giroscop este calibrat. De fiecare data cand sezorul inregistreaza date noi acestea sunt interpretate.

Pentru a determina ce valori ale accelerometrului trebuie sa folosesc pentru a traduce anumite semne am testat si esantionat mai multe miscari in prealabil.

Bluetooth

Pentru a realiza conexiunea dintre Arduino si telefonul mobil am folosit aplicatia Serial Bluetooth Terminal.
Interpretarea comenzilor primite de la telefon este implementata in serial_com.h.

Flow

Device-ul functioneaza pe baza unui FSM, acesta se poate afla in urmatoarele stari:

  • STATE_WAIT_INPUT: Asteapta sa primeasca input de la modulul Bluetooth.
  • STATE_TRANSLATE: Inregistreaza gesturile utilizatorului si verifica daca acestea corespund inputului primit. Traducerea semnelor se realizeaza tot prin intermediul unui FSM: daca secventa de miscari se potriveste cu secventa de stari atunci semnul este potrivit (STATE_CORRECT), altfel utilizatorul a folosit gesturile gresite (STATE_UNDEFINED).
  • STATE_CORRECT: Utilizatorul este anuntat ca a folosit semnul potrivit. Device-ul trece in starea de recalibrare.
  • STATE_UNDEFINED: Utilizatorul ste anuntat ca a folosit semnul gresit. Device-ul trece in starea de recalibrare
  • STATE_RECALIBRATE: In urma unei traduceri, device-ul este recalibrat timp de 4 secunde pentru a asigura faptul ca senzorii de indoire nu vor fi afectati de semnul anterior. Device-ul asteapta un nou input (STATE_WAIT_INPUT).

Rezultate Obţinute

Am implementat un device ce recunoaste daca un utilizator a folosit sau nu semnul/semnele corecte pentru un input dat. Acest proiect isi indeplineste rolul de instrument educativ - se pot exersa urmatoarele cuvinte/fraze:

  • Thank You
  • Hello
  • I love you
  • Yes
  • Welcome
  • You

Concluzii

Proiectul faciliteaza invatarea limbajului semnelor. Acesta este util pentru oamenii care folosesc limbajul semnelor in viata de zi cu zi, cum ar fi profesori, kinetoterapeuti sau cei ce au persoane cu nevoi speciale in familie.

De asemenea, acest device este un prototip de recunoastere a miscarii, ce poate fi folosit atat in medicina, cat si industria jocurilor sau pentru control automat.

Bibliografie/Resurse

pm/prj2023/gpatru/maria_teona.olteanu.txt · Last modified: 2024/04/01 10:16 by maria_teona.olteanu
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