Controlul unei drone folosind dispozitive bazate pe gesturi [302202]
UNIVERSITATEA “LUCIAN BLAGA” DIN SIBIU
FACULTATEA DE INGINERIE
DEPARTAMENTUL DE CALCULATOARE ȘI INGINERIE ELECTRICĂ
PROIECT DE DIPLOMĂ
Absolvent: [anonimizat]: Calculatoare
Sibiu, 2017 –
UNIVERSITATEA “LUCIAN BLAGA” DIN SIBIU
FACULTATEA DE INGINERIE
DEPARTAMENTUL DE CALCULATOARE ȘI INGINERIE ELECTRICĂ
Controlul unei drone folosind dispozitive bazate pe gesturi
Îndrumător științific: Asistent Dr. Ing. Alexandru Butean
Absolvent: [anonimizat]: Calculatoare
Sibiu, 2017 –
1. Introducere
1.1 [anonimizat], domeniul de aplicare
Titlul.
Acest proiect de diplomă urmărește implementarea unei nou mod de a interacționa cu diferite dispozitive teleghidate. [anonimizat]. Dispozitivul cu care am lucrat în realizarea acestei lucrări de diplomă este o mini dronă, o jucărie, [anonimizat].
Domeniul de aplicare.
[anonimizat] a interacționa cu acestea.
1.2 [anonimizat], internetul lucrurilor și robotica. De asemenea am vrut să lucrez cu cele mai noi tehnologii apărute în aceste domenii și căutam un proiect potrivit și destul de complex pentru a le pune în aplicare.
[anonimizat], trebuie să evolueze și modurile prin care interacționăm cu aceasta. Astfel, evoluând, de la apăsatul butoanelor am ajuns în ziua de astăzi ca standardul să fie ecranele tactile. [anonimizat]. [anonimizat], doresc să găsesc o soluție ca în loc să țin în mână o [anonimizat], să avem mâinile libere și să ne controlăm dispozitivul prin gesturile realizate.
[anonimizat] o dexteritate ridică la nivelul degetelor pentru a putea opera o telecomandă obișnuită dar totuși doresc să interacționeze cu astfel de dispozitive telecomandate.
1.3 [anonimizat], în care blocurile structurale ale soluției de față să poată fi ușor schimbate sau modificate pentru a fi adaptate noilor cerințe care pot apărea în viitor.
Astfel, [anonimizat].
De asemenea dorim ca utilizatorul să poată să folosească soluția noastră cât mai ușor și să poată începe interacțiunea cu dispozitivul în cauză cât mai repede după pornirea aplicației software
1.4 Utilitate
Utilitatea acestei soluții constă in faptul ca este facilă schimbarea dispozitivului ce vrem sa îl controlăm prin intermediul gesturilor. Soluția de față nu se resumă doar asupra dronei ce a [anonimizat]. De asemenea poate fi folosită în controlul oricărui dispozitiv ce este controlat printr-o telecomandă.
2. Considerații teoretice 20 -25 pagini
– aici puneți toate subiectele de teorie pe care v-am rugat sa le documentați
2.1 Drone
2.2 Leap Motion
Controlerul Leap Motion este un periferic USB lansat în vara anului 2013. Acesta a fost proiectat să fie așezat cu fața în sus pe o suprafață fizică. De asemenea poate fi atașat unor ochelari pentru realitate virtuală. Folosind două camere infra roșu monocrome, acest dispozitiv poate observa o zonă emisferica [Figura 1]. Distanța maxima la care dispozitivul percepe mediul este de aproximativ un metru. Un studiu realizat in 2013 acuratețea acestui controler s-a dovedit a fi de 0.7 milimetri .
Alt dispozitiv care folosește o tehnologie asemănătoare este Kinect, dezvoltat de cei de la Microsoft. Diferența dintre cele două dispozitive constă în faptul că Leap Motion are o zonă observabilă mai mica dar rezoluția mai bună, fiind adecvat pentru urmărirea mișcării mâinilor în special, pe când Kinect are o zonă observabila de dimensiunea unei sufragerii și urmărește mișcarea întregului corp.
In prezent, kit-ul de dezvoltare oferit suportă o multitudine de limbaje de programare (C, C++, C#, Java, Objective-C, Python, JavaScript) cat și integrarea cu diferite motoare grafice (Unity, Unreal Engine) .
2.2.1 Leap Motion API
Sistemul Leap Motion recunoaște si urmărește mâna și degetele utilizatorului. Senzorii dispozitivului sunt direcționați în sus de-a lungul axei-Y atunci când acesta este în poziția standard de operare. Detecția și urmărirea mișcării se realizează cel mai bine atunci când senzorii au o vedere clară și contrast ridicat asupra siluetei obiectului.
Sistemul de coordonate folosit de Leap Motion este unul definit de regula mâinii drepte. Originea sistemului de coordonate se află deasupra dispozitivului fizic. Axele X si Z se află în planul orizontal iar axa Y in planul vertical. Axa X se află de-a lungul laturii mai lungi a controlerului. Valorile axei Z cresc înspre utilizator iar cele ale axei Y cresc în sus [Figura 2].
Mărimile fizice măsurate de către Leap Motion sunt: distanță, timp, viteză și unghi. Unitățile de măsura folosite sunt milimetri pentru distanță, microsecunde pentru timp, milimetri/secundă pentru viteză și radiani pentru unghi.
Controlerul Leap Motion urmărește mâinile și degetele, oferind actualizări regulate a datelor aferente obiectelor din câmpul de vizualizare sub forma unui cadru. La baza API-ului controlerului Leap Motion stă clasa Frame, care detaliază proprietățile modelului de date ale obiectelor capturare la un moment de timp.
Modelul de date a mâinii este reprezentat de către clasa Hand. Această clasă conține informații despre identitatea mâinii, poziția acesteia, de care braț este atașată, lista degetelor asociate palmei respective, viteza de mișcare cât și alte caracteristici. Orientarea mâinii este dată de proprietățile PalmNormal și Direction [Figura 4]. Atunci când anumite părți ale mâinii nu sunt vizibile, sistemul Leap Motion se folosește de un model intern al unei mâini umane pentru a prezice mișcarea acestora. În acest fel, lista degetelor asociate unei mâini va conține tot timpul informație despre toate cele cinci degete. Predicția parților ascunse ale mâinii se face pe baza zonelor vizibile a mâinii, modelul intern și pe baza observațiilor anterioare. De reținut este faptul că mișcările subtile ale degetelor ascunse sub palmă în timp ce aceasta se află cu fața în jos, de exemplu, nu vor putea fi detectate. De asemenea, o palmă cu fața în sus poate fi confundată cu o palmă cu fața în jos în cazul unor întoarceri bruște a palmei. Test. O alta proprietate importantă a clasei Hand este Confidence. Aceasta indică cât de bine datele observate se încadrează în modelul intern.
În lista de obiecte de tip Hand a obiectului Frame pot exista mai mult de doua elemente în cazul în care în câmpul de vizualizare al dispozitivului Leap Motion sunt vizibile și mâinile altui utilizator sau obiecte care au forma asemănătoare mâinilor. Pentru o urmărire optimala a obiectelor se recomandă prezența a cel mult două mâini în zona de observare.
Pentru reprezentarea brațului, sistemul Leap Motion folosește clasa Arm. Aceasta furnizează informații despre orientarea, lungimea, lățimea și capetele unui braț. Atunci când cotul utilizatorului nu este vizibil în cadru, sistemul aproximează poziția acestuia bazându-se pe observațiile anterioare și pe proporțiile tipice ale corpului uman.
Sistemul Leap Motion oferă informații despre fiecare deget al fiecărei mâini din cadru. Degetele sunt reprezentate de către clasa Finger. Asemănător celorlalte obiecte urmărite de către sistem, caracteristicile degetelor sunt la rândul lor aproximate în cazul în care acestea nu sunt vizibile. Degetele sunt identificate după tipul lor: degetul mare, arătător, mijlociu, inelar si cel mic (respectiv: thumb, index, middle, ring, and pinky).
Poziția vârfului și direcția generală înspre care un deget este îndreptat este dată de către proprietățile TipPosition și Direction [Figura 3]. De asemenea, clasa Finger deține informații despre cele 4, respectiv 3 în cazul degetului mare, oase anatomice din care este format un deget. Fiecare os este reprezentat de către un obiect de tipul Bone. Acestea sunt, în ordine de la baza mâinii spre vârful degetelor:
metacarpal(metacarpian),
proximal (falangă proximală),
intermediate (falangă medială)
distal (falangă distală).
De observat este faptul că modelul sistemului Leap Motion diferă de modelul anatomic al unei mâini în cazul degetului mare. În realitate, degetul mare este format doar din 3 oase, lipsind falangele medial. Cu toate acestea, pentru ușurință în programare, modelul degetului mare conține încă un os de tip metacarpian de lungime 0 pentru ca toate degetele indiferent de tipul acestuia să conțină câte 4 oase componente. În urma acestui lucru, osul metarpian din punct de vedere anatomic este de tipul proximal iar cel anatomic proximal este de tipul medial în cadrul modelului Leap Motion.
Înafara de mâinile unui utilizator, sistemul Leap Motion mai poate urmări și diferite instrumente. Acestea trebuie să aibă forma cilindrică și să fie subțiri, mai bine zis, să semene cu un creion. În comparație cu un deget, aceste instrumente trebuie să fie mai lungi, mai subțiri și mai drepte. Instrumentele sunt definite de clasa Tool.
Folosind toate datele de pana acum, sistemul Leap Motion poate recunoaște diferite gesturi făcute cu mâna sau cu degetele [Figura 5]. Acestea sunt observate pentru fiecare deget sau instrument în parte, prezent în scenă. La momentul actual, patru mișcări sunt recunoscute de către sistem:
Cerc – o mișcare circulară a unui deget
Glisare – o mișcare liniară lungă a mâinii și degetelor acesteia
Apăsare a tastei – o mișcare a unui deget asemănătoare cu apăsarea unei taste a unei tastaturi
Apăsarea ecranului – o mișcare de apăsare asemănătoare atingerii unui ecran tactil vertical
Fiecare din cele patru gesturi are câte o clasă specifică derivată din clasa Gesture. Pentru a activa această funcționalitate, la inițializarea sistemului Leap Motion trebuie specificat că se dorește și detecția gesturilor.
Dacă nu se dorește o detecție exactă a elementelor din scenă ci doar o aproximație a mișcărilor de bază. Aceste mișcări presupun scalare, rotație și translație. Aceste mișcări sunt calculate între doua obiecte de tip Frame sau Hand. Aceste date sunt folositoare atunci când vrem ca utilizatorul să poată aplica diferite transformări asupra unor obiecte din aplicație și nu dorim să urmărim fiecare mână și deget din scenă.
Pe lângă datele prelucrate de către sistemul Leap Motion, se pot prelua imaginile neprelucrate direct de la senzorii și camerele dispozitivului. Aceste imagini conțin date pentru corecția distorsiunii imaginii cauzate de lentile sub forma unor puncte de calibrare. Formatul imaginilor este alb-negru, reprezentând valorile intensității luminoase infraroșu.
2.3 Microcontrolere
Un microcontroler este un mini calculator într-un singur circuit integrat. Mai sunt numite și sistem pe un cip. Un astfel de dispozitiv conține unul sau mai multe procesoare, memorie și intrări/ieșiri programabile. Microcontrolerele sunt folosite in sisteme dedicate cât și în dispozitive autonome de mici dimensiuni cum ar fi dispozitive medicale implantabile, telecomenzi, jucării, diferiți roboti și utilaje. Cum plaja de aplicabilitate este mare, și performanțele acoperă o gamă largă de specificații, începând de la frecvente de 4 kHz până la peste 1 GHz.
Un microcontroler este de obicei caracterizat de numărul de pini generali de intrare/ieșire (GPIO – general purpose input/output). De asemenea, pinii uni microcontroler sunt împărțiți în pini analogici sau digitali. Acești pini sunt programabili software într-una din cele doua stări, de intrare sau de ieșire. În cele mai multe cazuri sunt folosiți ca și pini de intrare pentru citirea diferitor senzori. În modul de ieșire pot fi controlate LED-uri, motoare sau indirect, alte dispozitive de putere mare. Cum mulți senzori produc semnale analogice, un microcontroler are nevoie și de un convertor analog digital. O caracteristică mai puțin întâlnită este prezența unui convertor digital analog. Pe lângă convertoare, multe microcontrolere au incorporate cronometre folosite la generarea de întreruperi la intervale regulate de timp. Un altă trăsătură importantă este prezența unui bloc PWM, care reduce presiunea asupra procesorului atunci se dorește comanda unor motoare de exemplu. De multe ori, valorile analogice la ieșire sunt generate sub forma semnalelor PWM, eliminând astfel nevoia unui convertor digital analog. Pentru comunicația cu alte dispozitive, microcontrolere au incluse și un bloc UART ( Universal Asynchronous Receiver/Transmiter), reducând astfel resursele necesare procesorului pentru realizarea acestui lucru. Acest lucru permite comunicarea in diferite formate digitale cum ar fi USB, I2C, SPI, folosite de alte dispozitive.
La început, programarea acestora se făcea in cod mașină, dar cu timpul s-a trecut la limbaje de nivel înalt cum ar fi C/C++, Python, JavaScript etc. Mulți dintre producătorii microcontrolerelor produc și oferă programele necesare programării dispozitivelor proprii pentru o adopție mai ușoară de către programatori. Microcontrolere recente oferă funcții de depanare cat și manipularea stării interne a acestuia în timp ce rulează.
Printre cele mai cunoscute și ușor accesibile microcontrolere ce pot fi folosite la o gamă foarte largă de aplicații sunt Arduino și Raspberry Pi. Cu acestea s-au realizat proiecte de la automatizarea locuințelor , roboți autonomi și până la televizoare deștepte.
2.3.1 Arduino
Arduino este o platforma open-source de electronice bazată pe o folosire ușoară, pentru a putea fi accesibile și unor persoane începătoare. Programarea se face într-un limbaj foarte asemănător și bazat pe C/C++. De asemenea se oferă si propriul IDE, Arduino Software (IDE) [Figura 7] care este disponibil pe cele 3 sisteme de operare, Windows, Linux și Macintosh OSX. De asemenea, este disponibil și un editor online, accesibil dintr-un browser. În cazul în care nu dorim să programăm în Arduino Software (IDE) și dorim un editor cu mai multe funcționalități, există de exemplu plug-inul Visual Micro pentru Visual Studio sau extensia Platform IO pentru editorul Atom.
Fiind o platformă open-source, se găsesc o mulțime de librării și exemple de folosire a diferitor senzori și dispozitive compatibile cu plăcile Arduino în mediul online, lucru ce ajută în special persoanele care abia au intrat în acest ecosistem.
Fișierele sursa pentru Arduino au extensia .ino și sunt denumite schițe (sketch). Acest fișier trebuie să conțină cele doua funcții importante pentru a putea fi compilat, acestea fiind setup() și loop() [Figura 7]. Funcția setup() este apelată o singură data la inițializarea plăcii, iar funcția loop(), după cum îi spune și numele, rulează în continuu la nesfârșit, fiind apelată după terminarea funcției setup().
Setarea unui pin digital în modul de intrare sau de ieșire se face cu ajutorul funcției pinMode() care primește ca parametrul numărul pinului din fișa tehnica (ex ‘2’ pentru pinul nr. 2) și modul în care dorim, definit de constantele INPUT și OUTPUT. Pentru citirea și scrierea pinilor digitali avem funcțiile digitalRead() și respectiv digitalRead(). Asemănător pentru pinii analogici avem funcțiile analogRead() și respectiv analogWrite(). Funcția analogWrite() este suportată doar de anumiți pini ai plăcilor Arduino deoarece aceasta generează un semnal de tip PWM. Foarte puține plăci de dezvoltare Arduino suportă generarea unor semnale cu adevărat analogice din cauza lipsei convertoarelor digital analogic.
Prin folosirea funcțiilor delay() și delayMicroseconds() se pot introduce întârzieri în sistem. Cu funcțiile milis() și micros() se află informații despre timpul sistemului, având ca și referință momentul în care placa a fost alimentată sau resetată.
Plăcile Arduino suportă activarea și dezactivarea întreruperilor. Dezactivarea întreruperilor va face ca anumite funcții legate de contorizare și timp să nu mai funcționeze corect și comunicația poate fi ignorată în cazul în care aceasta este bazată pe întreruperi. Cu toate acestea, dezactivarea întreruperilor permite executarea cât mai rapidă a unei secțiuni critice din program. Pentru activarea și dezactivarea întreruperilor se folosesc funcțiile interrupts() și respectiv noInterrupts().
O altă proprietate a plăcilor Arduino este suportul pentru întreruperile externe. În funcție de tipul de placă Arduino, doar anumiți pini suportă întreruperi externe. Acest lucru permite atașarea unei rutine fără parametri și care nu returnează nimic unui pin cu suport pentru întreruperi externe care să se execute atunci când valoarea pinului respectiv îndeplinește o anumita condiție. Constantele predefinite care specifică când o rutină de întrerupere să se execute sunt: LOW, CHANGE, RISING, FALLING și HIGH. Atașarea unei rutine de întrerupere se face folosind funcția attachInterrupt(). Rutinele de întrerupere nu pot fi întrerupte la rândul lor decât în cazul în care permiten noi acest lucru folosind funcția interrupts(). În interiorul acestor rutine de întrerupere valoarea returnată a funcției milis() nu se va mai incrementa iar funcția delay() nu va mai funcționa. Pentru a partaja datele între rutina de întrerupere și programul principal se folosesc variabile globale declarate sa și volatile. Pentru detașarea unei rutine de întrerupere se folosește funcția detachInterrupt().
2.3.2 Raspberry Pi
Raspberry Pi reprezintă o serie de calculatoare integrate pe o singură placă de dezvoltare, fiind dezvoltate în Regatul Unit de către Fundația Raspberry Pi pentru a promova știința calculatoarelor în scoli. Modelul original a fost mult mai popular decât se așteptau, fiind cumpărat și în alte piețe decât cea țintă. Dimensiunea acestor calculatoare sunt apropiate de cele ale unui card bancar. Cele mai actuale modele sunt Raspberry Pi 3 [Figura 8] și Raspberry Pi Zero W. Succesul acestora este datorat și prețului mic, fiind de 35$ pentru Raspberry Pi 3 și respectiv 10$ pentru Raspberry Pi Zero W.
Hardware-ul acestor placi este performant, putând fi considerat un mini calculator, având posibilitatea rulării unui sistem de operare, conectarea oricărui dispozitiv pe interfața USB a acestuia, accesarea internetului cat și conectarea unui display.
Primul model Raspberry Pi avea un procesor ARM cu un singur nucleu de 700 MHz și procesor grafic dedicat pe când Raspberry Pi 3 are un procesor ARM pe 64 de biți cu patru nuclee, funcționând la o frecvență de până la 1.2GHz. Procesoarele plăcilor Raspberry Pi suportă over-clocking-ul, dar fiind nevoie și de o metodă răcire. Capacitatea memoriei RAM variază de la 256 MB până la 1GB, fiind partajată atât CPU-ului cat și GPU-ului. Conexiunea la internet se realizează prin conectarea prin USB a unor adaptoare Ethernet sau WiFi pentru modelele vechi, sau direct prin portul Ethernet sau chipul WiFi integrat în cazul modelelor noi. Chipul WiFi integrat permite și conexiunea Bluetooth. Controlerul video generează rezoluții și poate decoda video-uri până la HD și Full HD, conexiunea cu monitorul fiind prin intermediul portului HDMI. Scăzând frame-rate-ul se pot obține și rezoluții mai mari decât Full HD, dar asta nu presupune că GPU-ul poate decoda video-uri la astfel de rezoluții. Până în momentul actual, nici un model Raspberry Pi nu conține un ceas de timp real integrat. Pentru aceasta, Raspberry Pi poate prelua acest timp de pe un server în cazul prezenței unei conexiuni la internet sau poate fi introdus de către utilizator la pornirea acestuia. Pentru stocare a datelor și a sistemului de operare este folosit un slot pentru un card MicroSDHC iar de la modelul Raspberry Pi 3 se poate încărca sistemul de operare și direct de pe un dispozitiv USB. Pentru conectarea senzorilor și a altor dispozitive hardware de nivel jos, plăcile Raspberry Pi au cate 40 de pini dintre care 24 sunt GPIO pentru I/O, restul având funcții specifice pentru interfețe de comunicație și alimentare sau împământare. Fiecare pin GPIO poate fi configurat ca și pin de întrerupere, în funcție de evenimente, sensibil la nivelul de tensiune sau cand acesta tranzitează din HIGH în LOW.
Fundația Raspberry Pi recomandă folosirea a Raspbian, o distribuție de Linux, ca și sistem de operare. Alte sisteme de operare populare pentru Raspberry Pi sunt Ubuntu MATE și Windows 10 IoT Core. Pe lângă aceastea, mai sunt o mulțime de sisteme de operare mai mult sau mai puțin generale sau dedicate unui anumit scop cum ar fi imprimarea 3D, server, desktop sau network routing.
Cum Raspberry Pi folosește un sistem de operare, programarea acestuia, presupune de fapt scrierea unei aplicații software ce rulează sub acel sistem. Acest lucru permite folosirea diferitor limbaje de programare, IDE-uri și SDK-uri pentru acest lucru.
Pentru alimentarea sistemului Raspberry Pi este nevoie de o sursa de curent de 5V la 2.5A pentru a putea alimenta atât placa cât și dispozitivele periferice conectate la aceasta.
2.4 Windows 10 IoT
2.5 SPI interface?
3. Rezolvarea temei de proiect 40 – 50 pagini
3.1 Cercetări în domeniu
3.1.1 Gesture Control of Drone Using a Motion Controller
Autori:
Ayanava Sarkar, Ganesh Ram R.K, Ketul Arvindbhai Patel, Geet Krishna Capoor
Ideea principală:
În acest studiu, prezentăm punerea în aplicare a utilizării unui controler de mișcare pentru a controla mișcarea unei drone prin simple gesturi umane. Pentru această implementare am folosit Leap Motion ca și controler de mișcare și drona Parrot AR 2.0. Drona Parrot AR este un rotor cu patru elice, gata de a fi folosită după ce a fost cumpărată și care are un sistem Wi-Fi la bord. Drona Parrot AR este conectat la calculator prin Wi-Fi, iar controlerul Leap Motion este conectat direct la calculator prin portul USB. Controlerul de mișcare Leap Motion recunoaște gesturile mâinilor utilizatorului și le transmite calculatorului. Calculatorul rulează ROS (Robot Operating System) în Linux, care este folosit ca și platformă pentru această implementare. Python este limbajul de programare utilizat în interacțiunea cu drona Parrot AR pentru a transmite gesturile simple ale mâinii. În implementarea noastră, am scris cod Python pentru a interpreta gesturile mâinilor capturate de controlerul Leap Motion și le transmitem pentru a controla mișcarea dronei Parrot AR prin aceste gesturi .
Rezultate:
3.2 Proiectarea sistemului – 10 pagini
3.2.1 Analiza și specificarea cerințelor
Detecția gesturilor utilizatorului aplicației se va face cu ajutorul controlerului Leap Motion. Acest lucru va presupune implementarea SDK-ului aferent controlerului Leap Motion într-o aplicație desktop care să interpreteze, să prelucreze comenzile utilizatorului și să le transmisă mai departe dronei.
Drona pe care dorim să o controlăm cu controlerul Leap Motion este o dronă ieftină, accesibilă oricui și de asemenea fabricată în China. Ca multe astfel de drone, cum a fost prezentat și în capitolul 2.1 al acestei lucrări de diplomă, aceasta are un protocol personalizat de control radio. Aceste protocoale personalizate nu sunt documentate în mediul online și acest lucru face grea implementarea acestora. Chiar daca am reuși acest lucru, vom reuși doar controlul unui singur model de dronă sau dispozitiv comandat prin radio. O altă piedică pe care am întâlnit-o în această direcție de dezvoltare este că pe piață există mai multe modele de circuite radio folosite în fabricarea dispozitivelor comandate prin radio. Dacă am fi continuat în această direcție, pentru a putea satisface una din cele mai importante cerințe, aceea de a putea adapta ușor soluția curentă la dispozitivele actuale, ar fi trebuit sa implementez cât mai multe din acele protocoale specifice fiecărui dispozitiv, inclusiv prezența mai multor circuite radio și acest lucru nu ar mai fi fost în temă cu titlul lucrării.
Astfel, direcția de dezvoltare în care am mers a fost găsirea unei soluții ce presupune o ușoară modificare a telecomenzii dispozitivului. În acest mod, prin câteva operații, oricare telecomandă poate fi ușor modificată pentru a putea fi interfațată cu modulul de comandă prin gesturi.
Telecomenzile uzuale ce se găsesc în comerț au la bază de preluarea comenzilor de la utilizator prin intermediul a două joystick-uri [Figura 10]. Fiecare dintre acestea permit mișcarea pe doua axe. Principul ce stă la baza acestora este o rezistență variabile care este modificată, în mod mecanic, de către utilizator [Figura 9]. Mai bine zis, circuitul electric al unei axe al joystick-ului este de fapt un divizor de tensiune [Figura 11]. Uitându-ne la Figura 11, putem considera rezistența R1 ca fiind partea de deasupra acului albastru, iar rezistența R2 partea de sub acul albastru. Cum (R1 + R2) și tensiunea U1 vor fi constante, tensiunea U2 va fi proporțională cu rezistența R2 . Ideea de bază a soluției prezentate în lucrarea de față va consta, de fapt, în înlocuirea acestor joystick-uri cu potențiometre digitale.
Cum nu vom putea comanda acele potențiometre digitale direct cu ajutorul calculatorului, vom avea nevoie de un microcontroler care să realizeze acest lucru. Acest microcontroler va prelua comenzile de la calculator și va comanda potențiometrele digitale. De asemenea dorim ca acest microcontroler să poată comunica ușor, fără fir, atât cu un calculator cât și cu un alt dispozitiv mobil, cum ar fi un smartphone sau smartwatch.
Ca și concluzie al acestui subcapitol, vrem:
Să înlocuim joystick-urile telecomenzii dronei cu potențiometre digitale
Să realizăm o aplicație desktop care să interpreteze și să prelucreze comenzile utilizatorului, care apoi să fie transmise microcontrolerului
Să realizăm o aplicație pentru un microcontroler care să primească comenzile de la calculator și sa comande mai departe potențiometrele digitale
Comunicația între cele două aplicații să fie fără fir
3.2.2 Logica implementării
Hardware.
În primul rând trebuie să alegem cu ce potențiometre vom lucra. Din păcate, singurele potențiometre digitale accesibile au fost modelul MCP4131 [Figura 12], fabricate de către Microchip Technology. Fiecare dintre acest chip conține câte o singură rețea de rezistoare rezultând că vom avea nevoie de 4 astfel de chip-uri. Aceste potențiometre digitale sunt comandate printr-o interfață SPI și nu suportă daisy-chaining. Ieșirea fiecărui potențiometru va fi legată la intrările corespunzătoare joystick-urilor telecomenzii. Acestea vor corespunde celor patru comenzi ce caracterizează controlul dronei: throttle, roll, pitch și yaw.
În cazul modului de comunicație fără fir avem de ales doar între Wi-Fi sau Bluetooth, din moment ce acestea sunt suportate nativ de orice calculator. Din moment ce dorim ca microcontrolerul nostru să poată fi conectat și la alte dispozitive decât calculatorul, vom alege Bluetooth-ul ca și mod de comunicare fără fir. Un microcontroler care îndeplinește toate aceste cerințe – Bluetooth, interfață SPI – fără plăci de extensie adiționale este Raspberry Pi 3.
Pentru a putea realiza ușor prototipul magistralei SPI dintre Raspberry Pi 3 și a celorlalte conexiuni necesare celor 4 potențiometre digitale, vom folosi o placă breadboard și fire de legătură tată-tată și tată-mamă. De asemenea vom mai avea nevoie și de accesul facil la pinii controlerului Raspberry Pi 3 din moment ce acesta se va afla într-o carcasă, și pentru aceasta vom folosi un cablu de extensie.
Software.
Sistemul de operare ce va rula pe Raspberry Pi 3 este Windows 10 IoT. Acest lucru va permite folosirea aceluiași limbaj atât pentru aplicația ce va rula pe Raspberry Pi cât și pentru aplicația ce va rula pe calculator. Limbajul în care vom programa este C#.
Din moment ce pe Raspberry Pi, de cele mai multe ori nu vom avea acces la interfața vizuală cu utilizatorul, aplicația de pe acesta va trebui să fie cât mai simplă. Din acest motiv, aplicația ce rulează pe Raspberry Pi [Figura 13] va accepta orice cerere de conexiune prin Bluetooth. Aceasta va funcționa ca un server ce așteaptă conectarea unui singur client. Când un client s-a conectat, acesta va începe să preia mesajele primite, le va decodifica și apoi va comanda mai departe cele patru potențiometre digitale prin interfața SPI.
Aplicația de pe calculator [Figura 14] va trebui să se conecteze la microcontrolerul Raspberry Pi. După ce conexiunea s-a realizat, aceasta va începe să interpreteze comenzile primite sub formă de gesturi de la utilizator și să le transmită mai departe microcontrolerului. De la controlerul Leap Motion avem nevoie de poziția mâinii, normala și direcția acestea. Aceste date trebuie prelucrate astfel încât să reprezinte o comandă validă pentru cele 4 potențiometre digitale.
3.2.3 Arhitectura sistemului
În primul rând trebuie să realizăm arhitectura hardware a sistemului. Sistemul hardware va fi alcătuit din microcontrolerul Raspberry Pi 3, cele patru potențiometre și telecomanda modificată a dronei. Astfel trebuie realizată magistrala SPI și alimentarea celor patru potențiometre digitale. Cum potențiometrele folosite nu suportă daisy-chaining, vom avea nevoie de câte un pin de CHIP SELECT pentru fiecare dintre acestea. Pinii corespunzători fiecărui potențiometru sunt cei din Tabelul 1.
Tabelul 1
Cum tensiunile de pe pinii microcontrolerul Raspberry Pi sunt de 3.3V cu excepția unor pini de ieșire pentru alimentare de 5.0V, potențiometrele noastre vor trebui alimentate tot la 3.3V pentru a funcționa corect. Astfel pinii 8 al fiecărui potențiometru vor fi conectați la o ieșire de 3.3V PWR iar pinii 4 la un GND al microcontrolerului Raspberry Pi.
Microcontrolerul Raspberry Pi 3 are 2 interfețe pentru magistrale SPI [Figura 15], SPI0 și SPI1. Vom alege magistrala SPI1 a acestuia. Această magistrală SPI are nativ doar un singur pin de CS, SPI1 CS0 respectiv pinul GPIO 16. Cum în proiectul nostru avem nevoie de patru pini pentru CS, înseamnă că nu vom putea folosi acest pin. Toți pinii 2 ai potențiometrelor vor fi conectați la pinul GPIO 21 iar pinii 3 la pinul GPIO 20, care reprezintă SPI1 SCLK respectiv SPI1 MOSI. Pinul GPIO 19 nu este folosit deoarece nu vom citi nimic de la cele patru potențiometre. În continuare, mai avem nevoie de încă patru pini pentru pinii CS, de exemplu, GPIO 5, GPIO 6, GPIO 13 și GPIO 26.
Tensiunea între terminalele PA0 și PB0 ale potențiometrelor este independentă de tensiunea de alimentare a acestora. Tensiunea acesta va depinde de tensiunea cu care sunt alimentate joystick-urile telecomenzii. Pentru a afla această tensiunea, ea trebuie măsurată cu un voltmetru la bornele unei axe ale unui joystick. Tensiunea aceasta în cazul telecomenzii cu care am realizat acest proiect este de 3.3V. De aceea, vom lega pinul 5 al potențiometrului tot la unul din pinii 3.3V PWR al microcontrolerului Raspberry Pi, iar pinul 7 la GND.
Pinii 6 ai potențiometrelor, respectiv PW0 vor reprezenta ieșirile acestora ce vor fi conectate la intrările telecomenzii pentru cele patru comezi: throttle, roll, pitch și yaw.
Pentru a avea același nivel de tensiunea între telecomandă și controlerul Raspberry Pi 3, mai trebuie încă o conexiunea între un pin GND al acestuia și GROUND-ul telecomenzii.
Realizând toate conexiunile electrice de mai sus, schema rezultată este cea din Figura 16. În schema respectivă se poate observa magistrala SPI, modul de alimentare al potențiometrelor digitale și cele 5 fire care vor fi conectate la telecomandă. Schema a fost realizată folosind programul Fritzing. Legenda schemei este următoarea:
Fir roșu – 3.3V
Fir negru – GROUND
Fir alb – CS pentru fiecare dintre cele patru potențiometre digitale
Fir albastru – SPI1 SCLK
Fir portocaliu – SPI1 MOSI
Fir verde – semnalul de ieșire al potențiometrelor digitale
– Arhitectură module software
– software pe pc
– diagrama clase
– explicatii cu ce face fiecare metoda in mare
– software pe R PI
– diagrama clase
– explicatii cu ce face fiecare metoda in mare
– shared code between the two projects
– diagrama clase
– explicatii cu ce face fiecare metoda in mare
3.3 Dezvoltarea aplicației – 20 pagini
3.3.1 Mediul de dezvoltare – min 5 pagini (ce tool-uri, ce limbaje, )
– Git pentru versionare
– instalare SDK Leap Motion
– instalare componente necesare pentru dezvoltarea pentru windows iot
– Visual Studio 2017 & Resharper plugin
– configurare proiect desktop
– include Leap Motion sdk
– include windows RT sdk
– configurare proiect R Pi + include IoT sdk
– configurare proiect cod comun intre cele doua aplicatii
– Windows IoT pentru R Pi
– instalare windwos iot pe R PI
3.3.2 Structura modulelor – cod , explicatii
– aplicație desktop
– cum am folosit Leap Motion sdk
– implementarea unui Bluetooth client
– implementare procesarea datelor de la leap motion
– secvente cod
– aplicație R pi
– implementarea unui Bluetooth server
– configurarea pinilor, magistralei SPI
– trimiterae comenzilor pe magistrala SPI
– secvente cod
– poze la partea hardware
– explicarea cum funcționează un breadboard
3.3.3 Interfata cu utilizatorul (print screen-uri)
– momentan aplicatie de pe R Pi nu are UI
– aplicatie de pe PC e doar consola
3.4 Experimente si rezultate (optional)
– putin delay
– raspuns intarziat
– depinde de tipul, configurația și complexitatea dronei
4. Concluzii 3 pagini
4.1 Gradul de indeplinire a obiectivelor
– momentan fara UI pentru aplicatia desktop, aplicatia este consola
4.2 Dificultăți întâmpinate
– none so far
4.3 Dezvoltări ulterioare
– conectarea la un telefon mobil si controlarea dronei cu accelerometrul
– smartwatch
– control de la distanta mare prin internet
5. Bibliografie și Referințe
5.2 Imagini
[Figura 1] https://www.leapmotion.com/product/vr/#113
https://www.leapmotion.com/product/desktop#107
[Figura 2]
https://developer.leapmotion.com/documentation/csharp/devguide/Leap_Overview.html
[Figura 4], [Figura 3] https://developer.leapmotion.com/documentation/csharp/devguide/Leap_Overview.html
[Figura 5] https://developer.leapmotion.com/documentation/v2/csharp/devguide/Leap_Overview.html
[Figura 6] https://www.arduino.cc
[Figura 7] personal
[Figura 8] https://www.raspberrypi.org
[Figura 9] https://www.quora.com/What-is-the-function-of-a-variable-resistor
[Figura 10] https://www.sparkfun.com/products/9032
[Figura 11] http://www.rasfoiesc.com/inginerie/electronica/Divizorul-rezistiv13.php
[Figura 12] https://cdn.sparkfun.com/datasheets/Components/General%20IC/22060b.pdf
[Figura 13] personal
[Figura 14] personal
[Figura 15] https://developer.microsoft.com/enus/windows/iot/docs/pinmappingsrpi
[Figura 16] personal
6. Anexe
Copyright Notice
© Licențiada.org respectă drepturile de proprietate intelectuală și așteaptă ca toți utilizatorii să facă același lucru. Dacă consideri că un conținut de pe site încalcă drepturile tale de autor, te rugăm să trimiți o notificare DMCA.
Acest articol: Controlul unei drone folosind dispozitive bazate pe gesturi [302202] (ID: 302202)
Dacă considerați că acest conținut vă încalcă drepturile de autor, vă rugăm să depuneți o cerere pe pagina noastră Copyright Takedown.
