Proiectarea Unui Detector de Gesturi Bazat pe Senzori Ultrasonici

Cuprins

1.Definirea temei……………………………………………………………………………………………….4

2.Introducere………………………………………………………………………………………………………5

3.Elemente teoretice………………………………………………………………………………………..7

3.1Circuite FPGA……………………………………………………………………………………………7

3.2 Proiectarea cu circuite FPGA……………………………………………………………………12

3.3 Medii de proiectare cu circuite FPGA……………………………………………………….16

3.4 Limbaje HDL(Verilog)……………………………………………………………………………..18

3.5 Senzori ultrasonici…………………………………………………………………………………….22

3.6 Sisteme de detectare a gesturilor……………………………………………………………….23

4. Implementarea practică a sistemului…………………………………………………26

4.1 Prezentarea generală sistemului………………………………………………………………..26

4.2 Prezentarea componentelor hardware folosite…………………………………………..28

4.2.1 Modulul Digilent Zybo și circuit FPGA Zync7010………………………….. 28

4.2.2 Senzorul cu ultrasunete MAXSONAR……………………………………………..33

4.2.3 Afișorul PmodOLED………………………………………………………………………36

4.3 Mediu de dezvoltare XILINX ISE DESIGN SIUTE WEBPACK………………38

4.4 Implementarea sistemului utilizând Verilog HDL…………………………………….44

4.4.1 Proiectarea modulului de citire a datelor primite de la senzor…………45

4.4.2 Implementarea blocului de detetare a gesturilor…………………………….48

4.4.3 Implementarea aplicației de test…………………………………………………….52

4.4.4 Implementarea controllerului pentru dispozitivul PmodOLED……….54

4.4.5 Conectarea celor 3 module principale…………………………………………….56

5.Rezultate…………………………………………………………………………………………………………57

6. Concluzii………………………………………………………………………………………………………..60

7. Bbliografie…………………………………………………………………………………………………….61

1.Definirea temei

Tema proiectului: Să se proiecteze, cu ajutorul unui circuit FPGA, un detector de gesturi bazat pe senzori ultrasonici.

2.Introducere

Trăim într-o epocă în care totul este în schimbare, în fiecare zi apar noi dispozitive, care mai de care mai inovative și mai folositoare. Putem spune că trăim intr-o epocă în care tehnologia avansează atât de repede încât ceea ce acum câțiva ani era science-fiction acum e science-reality. Acum nu ne putem imagina trăind într-o lume fără internet, telefonie sau computere. Dar chiar și acest tip de dispozitive sunt diferite de ceea ce erau cu ceva timp în urmă. De exemplu, primele telefoane mobile aveau taste drept interfața între om și mașină, dar acum acest tip de dispozitive sunt istorie, aproape fiecare telefon nou are un touchscreen în loc de butoane, acest lucru a permis dezvoltarea unui nou tip de telefoane, smartphone-urile.

Această evoluție tehnologică este alimentată de noi și noi descoperiri în domeniul semiconductoarelor, descoperiri ce au dus la un grad din ce în ce mai mare a dispozitivelor electronice ducând în același timp ți la crearea unor noi tipuri de circuite numerice și anume circuitele FPGA. Un alt factor extraordinar de progres îl reprezintă dezvoltarea tehnologiilor de detectare a gesturilor. Primul pas în acest sens a fost făcut de ecranele tactile. Acestea sunt în două variante constructive, detectând gesturile fie prin detectarea unei modificări a rezistenței pe suprafața unei pelicule active, fie prin sesizarea modificărilor capacității dintre 2 armături. Acest dispozitiv a dus practic la o explozie tehnologică deoarece a făcut posibilă integrarea pe aceeași suprafață atât a ecranului, unde este implementată o interfață GUI, cât și a interfeței om-mașină.

În urma acestei descoperiri a început și o revoluție în ceea ce privește detectarea gesturilor, mai precis în domeniul metodelor de detectare a gesturilor. Acest fapt a dus la dezvoltarea unor noi dispozitive, ce fac legătura dintre om și mașină, bazate integral pe detectarea de gesturi. O categorie de astfel de dispozitive ce cunosc o reală evoluție, în ultimii ani, sunt detectoarele de gesturi ce nu necesită contact direct. Acest tip de controllere pot fi implementate folosind diferite principii și concepte de detectare a gesturilor. Dintre aceste metode amintim detectoarele de gesturi bazate pe camere video, senzori cu infraroșu, radio frecvență, senzori ultrasonici, etc.

Dintre aceste metode, una dintre cele mai interesante atât ca raport calitate-preț cât și ca raport performanță-consum este metoda de detecție a gesturilor folosind ultrasunetele. Această metodă de detectare a gesturilor este abia la început, iar posibilitățile de evoluție pe care le poate oferi sunt foarte mari deoarece ultrasunetele sunt imune la majoritatea factorilor perturbatori ce pot face ca celelalte sisteme să nu mai funcționeze așa cum s-ar dori, un exemplu elocvent fiind dat de faptul că acest sistem este imun la interferențele luminoase, iar asta nu se poate spune despre metoda de detectarea a gesturilor utilizând senzori cu infraroșu sau camere video.

În această lucrare voi aborda exact cum se poate implementa un astfel de sistem de detecție ce utilizează senzori cu ultrasunete, circuite de tip FPGA și facilitățile oferite de limbajele de descriere hardware. Lucrarea este împărțită în două mari capitole, primul oferind o descriere a elementelor teoretice necesare implementării unui astfel de sistem, iar al doilea capitol prezintă sistemul creat de mine, de la algoritm de detectare a gesturilor până la o aplicație de testare a acestuia.

Primul capitol este constituit din 6 subcapitole ce prezintă concepte teoretice despre circuitele de tip FPGA, limbajul Verilog-HDL, medii de dezvoltare pentru circuite FPGA, dar și elemente teoretice de ordin general referitoare la modalități de detecție a gesturilor și principii de măsurare cu ultrasunete.

Al doilea capitol este reprezentat de prezentarea sistemului de detecție a gesturilor proiectat de mine, plecând de la o scurtă prezentare a sistemului și ajungând în cele din urmă la descrierea detaliată a particularităților de implementare ale sistemului.

Lucrarea va fi încheiată de două capitole unde voi analiza rezultatele la care am ajuns și voi prezenta concluziile referitoare la proiectarea sistemelor de detecție a gesturilor ce utilizează senzori cu ultrasunete și circuite FPGA. Tot în cadrul acestor capitole se vor prezenta și problemele pe care le-am întâmpinat cu scopul de a oferi o mână de ajutor celor ce doresc să proiecteze astfel de sisteme.

Notă: Referințele bibliografice vor fi trecute între paranteze pătrate([i]), unde „i” este numărul de identificare al sursei în lista de referințe bibliografice prezentată în capitolul 7.

3.Elemente teoretice

În acest capitol se vor prezenta o serie de elemente teoretice folosite la proiectarea dispozitivului de detectarea a gesturilor realizat. Deoarece pentru implementarea sistemului am folosit circuite FPGA se va pune în principal accent pe structura unui circuit FPGA și etapele ce trebuiesc urmărite atunci când se proiectează cu astfel de circuite.

În ultima parte a acestui capitol se vor atinge elemente teoretice referitoare la măsurarea cu ultrasunete, senzori cu ultrasunete și câteva date generale referitoare la modalități de implementare a dispozitivelor de detecție a gesturilor.

3.1 Circuite FPGA

Circuitele FPGA(Field Programmable Gate Array) sunt circuite numerice alcătuite dintr-un număr mare de blocuri logice interconectate intre ele prin intermediul unor elemente de legatura ce pot fi reconfigurate in fincție de nevoile utilizatorului. Aceste blocuri sunt răspândite pe toata suprafața cipului și sunt inconjurate de zone de interconexiuni programabile, apoi ansamblul blocuri logice-conexiuni este inconjurat de un inel de porturi de intrare/ieșire.

Fig3.1.1 Arhitectura generală a circuitelor FPGA[1]

Părțile componente ale unui circuit FPGA sunt urmatoarele:

Blocurile logice se pot realiza in diverse moduri:

a)rețele de perechi de tranzistoare NMOS și PMOS, acestea pot fi configurate in structura de multiplexor unde intrările de selecție vor ține loc de intrări de date iar intrările de date ale multiplexorului vor fi utilizate pentru programarea circuitului;

b)rețele de porți logice combinaționale, in cazul acesta, fiecare bloc logic este alcătuit din mai multe porți logice NAND interconectate intre ele in așa fel încat să poată implementa o anumită funcție logică dorită de utilizator;

c)multiplexoare această implementare se bazează pe faptul că în cazul unui multiplexor dacă intrările de date sunt conectate la semnale cu valoare fixă cunoscută atunci prin modificarea valorii intrării de selecție se pot implementa diverse funcții;

d)rețele asociative cu mai multe intrări acestea sunt constituite din multiplexoare cu 3 intrări si ieșirile conectate la o serie de porți AND cu 3 intrări, ieșirile porților comandând o câte un tranzistor ca in schema de mai jos:

Fig3.1.2 Tabelă asociativă cu 3 intrări;[2]

e)structuri AND-OR.

Conexiuni între blocuri logice-aceasta componentă a circuitelor FPGA este cea care dă versatilitatea și rapiditatea in programare dar si stabilitatea sistemului. Deși tipul acestor conexiuni diferă foarte mult de la o companie la cealaltă, cea mai folosită modalitate de realizare a circuitelor de interconectare este tehnica cross-bar.

Fig3.1.3 Structură de interconectare de tip cross-bar.[2]

Acest mod de interconectare are ca puncte de conexiune intercalările dintre liniile orizontale si cele verticale, acolo realizându-se conexiuni permanente sau temporare, in funcție de metoda si tehnologia de implementare.

În cazul conexiunilor permanente se pot utiliza elemente de conexiune bazate pe circuite anti-fuse, in cazul conexiunea dintre 2 blocuri este stabilita prin aplicarea temporară a unei tensiuni ridicate acesta ca in figura Fig3.1.4

Fig3.4 Conexiune permanenta prin contact de tip anti-fuse[2]

În cazul in care se dorește stabilirea de conexiuni temporare aceasta se poate face utilizând tranzistoare cu poartă flotantă Fig3.1.5-această tehnologie este in fapt tehnologia de realizare a circuitelor EEPROM, cu canal indus sau de tip NMOS Fig3.6- avantajul acestei tehnologii este data de posibilitatea reconfigurării dar are dezavantajul unei dimensiuni mari.

Fig3.1.5 Circuit de conectare cu tranzistor cu poartă flotantă[2]

Fig3.1.6 Circuit de conectare cu tranzistor NMOS[2]

Din punct de vedere structural circuitele FPGA pot veni în 3 configurații structurale:

Structura simetrică-în această structură blocurile logice sunt distribuite uniform având intre ele circuitele de conectare si la periferia circuitului se afla blocul de intrare-ieșire. Nucleul de blocuri logice programabile este înconjurat de blocurile de intrare-ieșire, care asigură  conexiunile cu terminalele conectate la mediul extern. Blocurile de comutatoare programabile asigură  implementarea traseelor pe care se propagă semnalele între blocurile logice, pe de‐o parte, blocurile logice și blocurile de intrare’ieșire, pe de altă  parte. Traseele din interiorul blocurile logice au întârzieri mici, în timp ce traseele dintre doua blocuri diferite au întârzieri sensibil mai mari.

Fig3.1.7 Structura simetrică[2]

Structurile organizate  pe linii sunt formate din module logice, organizate liniar, care alternează cu trasee orizontale de interconectare. Blocurile de intrare-iesire sunt plasate la extremități. Liniile adiacente se pot   interconecta prin fire verticale. Modulele logice au un caracter pur combinațional  și pot implementa diferite funcții logice. Pentru realizarea unor circuite secvențiale, pe lângă  modulele logice mai sunt necesare  și bistabile. Traseele de interconectare sunt constituite din segmente scurte    interconectate prin intermediul unor comutatoare de tip “anti‐fuse”.

Fig3.1.8 Structura liniară[2]

Structurile ierarhice posedă la nivelul superior numai blocuri logice și trasee de interconectare. Blocurile logice sunt alcătuite din module logice, care, la rândul lor, posedă unități capabile sa efectueze funcții logice și de stocare a informației. Fiecare unitate este controlată cu ajutorul unei memorii al cărei conținut este stabilit de către proiectant.    Conexiunile    între blocuri sunt asigurate cu ajutorul unor rețele  de interconectare. Ca și în cazurile precedente, blocurile de I/E sunt plasate la periferia structurii, în vederea asigurării legăturii cu mediul extern.

Fig3.1.9 Structura ierarhică[2]

3.2 Proiectarea cu circuite FPGA

Proiectarea cu circuite FPGA necesită un studiu amănunțit asupra cerințelor sistemului proiectat, aceasta datorită faptului ca acest gen de circuite sunt limitate de numărul de celule dedicate pentru fiecare parte a sistemului(de exemplu în cazul în care ai nevoie sa proiectezi o memorie dimensiunea ei va fi limitată de numărul de celule alocate proiectării de memorii). După ce s-a ales dispozitivul pe care urmează sa se dezvolte sistemul se va alege CAD (Computer Aided Design) potrivit (spre exemplu daca se folosesc circuite Xilinx se va alege mediul de proiectare Xilinx ISE), acest mediu de dezvoltare are rolul de a ușura semnificativ munca proiectatului și oferă următoarele funcții:

Specificarea sistemului digital;

Sinteza descrierii – translarea programului in porți logice elementare si conexiunile dintre ele;

Simularea funcționalității sistemului, această funcție in fapt testează funcționarea sistemului obținut după sinteză;

Optimizarea și apoi implementarea circuitului în așa fel încât acesta să ocupe cât mai puține resurse;

Configurarea circuitului in vederea obținerii funcționalității dorite.

Pentru a ilustra pașii ce sunt urmați atunci când se proiectează un circuit cu ajutorul FPGA m-am folosit de figura următoare Fig3.2.1:

Fig3.2.1 Fluxul de proiectare utilizând circuite FPGA[3]

3.2.1Descrierea sistemului

În această primă etapă a fluxului de proiectare se face proiectarea circuitului dorit fie cu ajutorul limbajelor de descriere hardware, fie cu ajutorul editoarelor schematice, fie prin diagrame de stare.

Atunci când alegem sa proiectăm circuitul cu ajutorul editorului schematic o prima etapă este constituită de calcularea ecuațiilor booleene ce descriu sistemul, în urma calculării acestor ecuații se va afla elementele logice elementare ce vor fi folosite in cadrul proiectului. După această etapa se aleg bibliotecile necesare și se selectează elementele dorite. În continuare se vor face conexiunile intre aceste elemente logice în conformitate cu funcționalitatea dorită. După ce s-au trasat conexiunile intre blocurile logice se trece la marcarea conexiunilor si la declararea porturilor.

Dacă proiectarea se va face utilizând limbaje de descriere hardware(HDL) se va putea face o descriere funcțională a sistemului, ceea ce va elimina etapa de calcul a ecuațiilor booleene și îi va permite proiectantului să creeze circuite de o complexitate superioară celor proiectate cu ajutorul editoarelor schematice. Un alt avantaj al proiectării cu limbaje de descriere hardware este constituită de faptul ca se pot face descrieri independente de tehnologie si astfel se va elimina lucrul cu biblioteci de funcții limitate. O altă caracteristica a descrierilor folosind HDL este aceea că se pot introduce comentarii in descriere și asta ușurează semnificativ etapa de documentare a proiectului.

Pentru descrierea circuitelor sub formă de automate finite se pot utiliza o multitudine de variante de proiectare. În principiu când se alege această variantă se determină clar stările in care se poate afla sistemul și apoi se determină condițiile necesare trecerii dintr-o stare în alta. Acest gen de descriere este folosit in principal atunci când se dorește implementarea unui sistem ce are un tabel de tranziții intre stări destul de strict și greu de implementat cu ajutorul celorlalte 2 metode precizate mai sus (de exemplu acest gen de descriere se folosește in cazul proiectării unor controlere pentru interfețe seriale).

3.2.2 Sinteza circuitelor

Această etapă constă intr-o translare a descrierii intr-o lista de conexiuni, această translare este efectuată de un generator textual prezent în fiecare CAD disponibil. În fapt acesta creează un fișier numit „netlist” ce va conține sub formă textuală blocurile folosite, legăturile dintre ele și legăturile exterioare, porturile. Acest fișier este in format EDIF, format ce reprezintă un standard industrial.

În cadrul acestei etape se va ține cont și de limitările impuse de proiectant limitări ce se referă la timpi, întârzieri intre semnale si chiar utilizarea unui număr redus de porți logice elementare.

3.2.3 Simularea funcțională

Pentru această etapă se folosește aplicația de simulare oferită de programul CAD pe care îl folosim. Aceste aplicații sunt specifice fiecărui producător și oferă facilități specifice, de la modul de descriere a vectorului de test până la metode automate de analiză.

În această etapă proiectantul are un rol important deoarece el specifică ce comportament îi este asociat sistemului și deci el specifică semnalele de intrare, stimulii la care este supus sistemul proiectat. Această etapă este foarte importantă deoarece acum proiectantul iși face o idee asupra timpilor de funcționare și a funcționalității sistemului.

3.2.4 Maparea tehnologică

Această etapă reprezintă adaptarea conexiunilor din lista de conexiuni obținută la pasul (4.2) in conformitate cu posibilitățile tehnologice ale circuitului utilizat. Tot în această etapă se face si verificarea numărului de pini utilizați in proiectare, verificându-se daca acest număr este in conformitate cu ceea ce poate să ofere circuitul folosit.

În timpul acestei etape proiectantul poate să mai selecteze tipul de capsulă folosită, diverse limitări temporale și, cel mai important, chipul folosit. Tot în cadrul acestei etape se face ți o listă a resurselor folosite dar si o listă de erori si avertismente privind comportamentul circuitului.

3.2.5 Plasarea și rutarea

Plasarea constă in alegerea blocurilor logice ce urmează a fi folosite, iar rutarea reprezintă procesul de alegere a conexiunilor dintre acestea, fiecare CAD este necesar sa ofere această funcție, fiind o funcție definitorie in cazul utilizării circuitelor FPGA. Acest proces poate fi efectuat automat sau manual, asta depinde de CAD folosit și de necesitățile sistemului proiectat.

Operațiile de plasare și rutare pot lua foarte mult timp in cazul proiectării unor sisteme complexe ți aceasta deoarece se efectuează o serie de analize temporare și de optimizare in scopul obținerii unui sistem ce rulează cât mai apropiat de ceea ce dorește proiectantul

3.2.6 Analiza de timp

Fiecare CAD existent pe piață oferă această funcționalitate, iar in cazul acestei etape se face o analiza a întârzierilor introduse atât de fiecare poartă logică în parte cat și de interconexiunile dintre blocuri. Aceste întârzieri pot fi afișate in diverse moduri în funcție de informațiile dorite.

3.3 Medii de proiectare cu circuite FPGA

Proiectarea cu circuite FPGA este un mod de proiectare ce necesită o foarte mare atenție la detalii deoarece se lucrează cu resurse limitate și cerințe foarte stricte în ceea ce privește limitările temporale. Pentru a ușura munca proiectantului au fost dezvoltate diverse CAD ce conțin o serie de elemente menite sa ajute la obținerea unui sistem ce funcționează la parametrii cât mai apropiați de cei doriți. Dintre aceste CAD-uri cele mai cunoscute sunt Xilinx ISE oferit de compania Xilinx și dedicat pentru dezvoltarea cu circuite FPGA produse de companie și Quartus II creat de Altera ți dedicat, de asemenea, produselor companiei.

Aceste CAD-uri sunt create în așa fel încât să acopere toate etapele prezentate în capitolul 4 și anume; unelte de descriere a proiectului, ambele medii oferă atât posibilitatea dezvoltării cu porți logice cât și posibilitatea dezvoltării cu limbaje HDL; unelte de sinteză ce au rolul de a transpune proiectul descris în blocuri logice și conexiuni ce apoi vor fi adaptate tehnologiei folosite de fiecare companie in parte; posibilitatea de simulare a circuitului realizat, această funcționalitate este foarte bine dezvoltată la ambele medii de dezvoltare prezentând o multitudine de facilități utilizatorilor.

Un alt avantaj major al acestor CAD-uri este acela că iți permit sa iți configurezi proiectul pentru un anumit chip produs de compania cea a creat softul. Acest fapt face ca, atunci când designul tău depășește anumite caracteristici ale circuitului FPGA folosit, să nu poți crea proiectul mai departe și asta încă din faza de proiectare. Pe lângă aceste avantaje aceste medii de dezvoltare vin cu anumite module predefinite ce au rolul de a te ajuta în implementarea sistemului gândit de tine.

Un astfel de mediu de dezvoltare trebuie să ofere următoarele facilități:

Facilități de proiectare a circuitului

Principala facilitate pe care un mediu de dezvoltare trebuie să o ofere este prezența unui editor schematic sau de limbaj HDL ce are rolul de a oferi un mediu prietenos în care să își pui in aplicare proiectul. Cu cât prezintă mai multe librării și module predefinite cu atât mediul este mai util în dezvoltarea de sisteme complexe.

Facilități de sinteză

Odată ce design-ul introdus, următorul pas pe calea implementării este sinteza. în al nostru caz, funcția de sinteză are rolul de a traduce descrierea Verilog a circuitului într-un circuit echivalent care cuprinde un set de componente de circuit primitive care pot fi puse în aplicare direct pe un FPGA. Într-un fel, instrumentul de sinteză este aproape ca un compilator. Produsul final al unui instrument de sinteză este un fișier netlist, un fișier text care conține o listă a tuturor instanțelor componentelor primitive în circuit de tradus și o descriere a modului în care sunt interconectate.

Facilități de mapare și rutare

Următorul pas în fluxul de implementare este de a lua netlist-ul de componente generate

de instrument de sinteză și a-l transforma în secțiuni necesare pentru a configura LUTS, comutatoarele de conectare dintre blocurile logice, bistabilii, și alte resurse configurabile în FPGA. Apoi se aleg blocurile de circuite logice reconfigurabile în așa fel încât întârzierile să fie cât mai mici posibil.

Facilități de programare a dispozitivelor FPGA

Această funcție are rolul de a transporta fișierul de configurare pe dispozitivul dorit.

Fig 3.3.1 Succesiunea proceselor efectuate pentru a implementa un proiect pe FPGA

3.4 Limbaje HDL(Verilog)

Limbajele HDL sunt limbaje ce ajuta la proiectarea circuitelor VLSI(Very Large Scale Integration), aceste circuite apărând din nevoia ușurării muncii proiectanăților. Primul astfel de limbaj de proiectare hardware a apărut in anul 1983, acesta a fost limbajul VHDL, acest limbaj a apărut în urma unui workshop organizat de Departamentul American al Apărării. Acest limbaj de proiectare a fost adoptat definitiv în anul 1987 devenind standardul IEEE 1076. Un al doilea limbaj de proiectare hardware este limbajul Verilog, acest limbaj a fost dezvoltat iîn 1984 de compania Gateway Design Automation si a devenit standard IEEE in 1992 fiind definit ca standardul IEEE 1364.

Limbajul Verilog, desși a fost standardizat mai târzu, este folosit în egală măsură ca limbajul VHDL reprezentând o unealta vitală in proiectarea de circuite VLSI. Acest limbaj oferă proiectanților posibilitatea de a crea atât circuite simple formate din cateva porți logice cat si circuite complexe având și avantajul faptului ca are o sintaxă foarte asemănătoare cu cea a limbajului de programare C. Totusi acest limbaj diferă de C atât prin elemente de sintaxă cat și prin elementele oferite dezvoltatorilor dintre care amintim: utilizează begin/end pentru delimitarea blocurilor de cod, utilizează constante definite pe dimensiuni de biți, nu are structuri, pointeri și subrutine recursive și lucrează cu conceptul de timp, important pentru sincronizare. Un proiect Verilog este structurat ierarhic și este compus din mai multe module interconectate intr-o ordine logică, tocmai această structurare modular fiind unul dintre marile avantaje ale proiectarii cu Verilog. La inceputul fiecarui modul se instantiază porturile iar acesf fapt ajuta la o mai bună identificare a modului in care modulul respectiv tratează ieșirea sau intrarea respectivă. In interiorul modulelor se descriu register și fire de legatură iar relatia dintre ecestea se realizează prin intermediul unor constructii concurente sau secvențiale ce determină comportamentul modului.

Stiluri de proiectare cu ajutorul limbajului Verilog:

Proiectare bottom-up presupune ca tot proiectul să fie realizat la nivel de porți logice, utilizând porți logice standard, această proiectare fiind specifică in principiu circuitelor simple deoarece pentru cele mai complexe, care contin cateva milioane de tranzistoare ar fi imposibilă o astfel de proiectare. Atunci când se utilizează acest tip de proiectare intâi se identifică blocurile disponibile și apoi se folosesc pentru a contrui un nou modul mai complex. Procesul continua până când se ajunge la modulul final.

Fig.3.4.1 Proiectare bottom-up[4]

Proiectrea top-down reprezintă stilul de proiectare care presupune ca atunci când dorim sa proiectăm un sistem întâi plecăm de la specificațiile de sistem și apoi detaliem în continuare până la specificațiile de sistem. In cazul acestui mod de proiectare se pleacă de la blocul principal și apoi se identifică urmatoarele blocuri necesare și tot așa până se ajunge la blocurile ce nu mai pot fi divizate.

Fig3.4.2 Proiectrea top-down[4]

Având în vedere ca limbajul Verilog descrie un sistem numeric ca un set de module trebuie să se țină seama de anumite reguli de proiectare și interfațare intramodulară. Pentru o bună proiectare a sistemului trebuie ca fiecare modul să fie foarte bine delimitat si descris cu ajutorul unor funcții cat mai simple pentru a nu ocupa un număr foarte mare de tranzistori si asta fiindcă in proiectarea VLSI este important ca fiecare tranzistor sa fie folosit cât mai eficient.

Pentru proiectarea unui circuit limbajul Verilog ii lasa proiectantului libertatea de a alege intre proiectarea structurală si cea comportamentală, permitand chiar și folosirea ambelor metode de descriere chiar și in interiorul aceluiași modul. În cazul descrierilor structurale descrierea circuitelor se face utilizând porți logice primare puse la dispozitie de limbaj, acestea purtând numele de primitive. Pentru o descriere comportamentlă se folosesc funcții de tipul, if sau for, acest tip de descriere fiind recomandat in cazul descrierii unor circuite foarte complexe.

Limbajul Verilog suportă următoarele nivele de abstractizare:

Nivelul comportamental

Nivelul comportamental descrie un sistem prin algoritmi concurenți. Fiecare algoritm este el însuși secvențial, ceea ce înseamnă că el constă dintr-un set de instrucțiuni care se execută una după cealaltă. Elementele principale sunt funcțiile, “task”-urile și blocurile “initial” și “always”.

Nivelul RTL

Proiectarea la nivel RTL specifică toate caracteristicile unui circuit prin operații și transferuri de date între registre. Se utilizează un semnal explicit de ceas. Proiectele RTL conțin delimitări exacte de întârzieri: operațiile sunt planificate să apară la anumite momente de timp. O definiție modernă a codului RTL este: Orice cod care este sintetizabil este numit cod RTL.

Nivelul poartă (structural)

La nivel poartă logică, caracteristicile unui sistem sunt descrise prin semnale logice și întârzierile lor. Toate semnalele pot avea doar valori logice de tipul “0”, “1”, “X” și “Z”. Operațiile uzuale sunt predefinite ca primitive logice (porți AND, OR, NOT, etc). Utilizarea modelării la nivel de poartă poate să nu fie cea mai bună idee pentru orice nivel al proiectării logice. Codul de nivel poartă este generat de “tool”-uri precum cel de sinteză iar lista de legături generată este utilizată pentru simularea la nivel de porți.

Nivelul fizic (al tranzistoarelor)

Descrierea fizică furnizează informații privind modul de construcție al unui circuit particular descris din punct de vedere comportamental și structural; descrierea fizică este asociată cu descrierea la nivel de măști tehnologice. Această descriere cuprinde mai multe niveluri de abstractizare: nivelul modul (descrie limitele geometrice externe pentru circuit), un set de submodule (librării de primitive fizice), nivelul porturilor (corespund unei conexiuni de intrare/ieșire din descrierea structurală a 36 componentei pentru care se specificå poziția, stratul, numele și lățimea) iar la nivelul cel mai de jos se află apelările de tranzistoare, fire și la conexiuni.

3.5 Senzori ultrasonici

Făcând o analiză completă asupra unui sistem se poate observa foarte ușor faptul că deși microprocesorul ii determină viteza de reacție și posibilitățile de prelucrare, pentru ca acesta să fie informat cu privire la procesul pe care trebuie sa îl controleze este necesar ca acesta sa fie echipat cu senzori. Deci senzorii reprezintă o parte foarte importantă a uni sistem dictându-i capacitatea de a percepe mediul in care lucrează. Acești senzori pot fi din cei mai diverși, specializași pe procesul ce urmează a fi analizat și controlat de către microprocesor. Avem senzori de presiune, temperatură, proximitate, umiditate, iluminare și așa mai departe. Acești senzori pot fi realizați folosind diverse principii și tehnologii.

Dintre aceste tipuri de senzori și aplicații eu o să mă opresc asupra senzorilor de proximitate și asta deoarece ei sunt elocvenți in contextul acestui proiect. Acești senzori se pot realiza prin metode optice, metode sonice, etc. Senzorii de proximitate ce utilizează metode optice, de obicei detectare prin radiație luminoasă infraroșie, sunt senzori ce au o precizie extraordinar de bună fiind extraordinari pentru detectarea distanțelor mici. Dar acești senzori au dezavantajul ca sunt foarte sensibili la interferențele luminoase și la modul în care reflectă lumina, suprafața in raport cu, care se face măsurarea.

O metodă foarte folosită de detectare a proximității și a distanței este metoda bazată pe unde sonore. Dintre aceste unde sonore cele mai folosite sunt ultrasunetele. Ultrasunetele sunt unde acustice cu o frecvență mai mare de 16 kHz. Aceste unde au proprietatea de a avea o lungime de undă foarte mică ceea ce permite emiterea lor sub formă de fascicule, spre deosebire de sunetele obișnuite care se dispersează in toate direcțiile, iar aceasta reprezintă un foarte mare avantaj pentru măsurarea distanței și a proximității. În afară de aceasta proprietate, o altă proprietate importantă a ultrasunetelor este legata de faptul ca având o lungime de undă mică fenomenul de difracție la întâlnirea unui obstacol nu este la fel de semnificativa ca in cazul sunetelor, acestea din urma ocolind fără probleme orice obstacol.

În continuare o să discutăm despre metodele ce pot fi folosite pentru a crea ultrasunete și în acest sens vom analiza generatorul piezoelectric. Efectul piezoelectric consta practic în apariția unor sarcini electrice pe suprafața unui cristal atunci când acesta este supus la anumite procedee de inducere a stresului mecanic, tracțiuni sau comprimări. Pentru emiterea undelor ultrasonore se folosește efectul invers, adică se aplică o serie de stimuli electrici ce comprimă sau dilată cristalul, astfel apărând u o undă sonoră de o frecvență egală cu frecvența aplicării stimulilor electrici.

Principiul de funcționare al acestor senzori este bazat pe emiterea unor pulsații acustice scurte, de înaltă frecvență, la intervale de timp regulate. Aceste unde se propaga prin aer cu viteza sunetului iar atunci când întâlnesc un obstacol ele sunt reflectate și ajung din nou la receptor. Receptorul in momentul in care a emis pulsul își setează un numărător și in momentul in care sunetul este receptat el calculează, pe baza acestui timp, distanța la care se află obiectul. Această metodă de determinare a distanței ajută foarte mult la eliminarea interferențelor de fundal, asta deoarece nu măsoară intensitatea sunetului reflectat ci distanța dintre emisie ți recepție.

Fig 3.5.1 Principiul de detecție a distanței folosind senzori ultrasonici[5]

Principalul avantaj al senzorilor ultrasonici este reprezentată de faptul că ei pot detecta orice fel de obiecte indiferent de formă sau textură, de la obiecte opace la obiecte transparente, de la obiecte groase la obiecte subțiri.

3.6 Sisteme de detectare a gesturilor

Tehnologia avansează din ce in ce mai mult și acaparează și analizează din ce in ce mai multe aspecte ale vieții noastre, dezvoltându-se în domenii in care nici măcar nu ne+am fi putut gândi vreodată. Noile tehnologii sunt din ce in ce mai interactive și prezintă din ce în ce mai multe funcții ce vin să imite din ce in ce mai mult funcțiile pe care creierul uman le execută. O astfel de tehnologie ce se impune din ce in ce mai mult este aceea de recunoaștere a gesturilor și comportamentelor persoanelor umane. În acest sens s-a dezvoltat atât sisteme de recunoaștere facială din ce în ce mai precise cât și sisteme de recunoaștere a gesturilor ce sunt folosite ca interfețe intre om și mașină, aceste interfețe fiind din ce în ce mai performante.

Sistemele de recunoaștere a gesturilor reprezintă, în ultimul timp o realitatea din ce in ce mai prezentă în viețile noastre impunându-se in aplicații din ce în ce mai complexe. Aceste sisteme sunt realizate prin intermediu diverselor tehnologii, de la procesoare video ce folosesc camere de luat vederi in scopul recunoașterii gesturilor la sisteme realizate cu senzori ultrasonici sau cu analiza în radio frecvență.

Un astfel de sistem constă dintr-o serie de senzori, unul sau mai mulți în funcție de tehnologie și de sensibilitatea dorită. De exemplu daca folosim procesarea video pentru recunoașterea gesturilor atunci vom folosi o singură cameră, deci un singur senzor, in timp ce la implementările cu senzori cu ultrasunete se folosesc cel puțin 2. O altă parte importantă a sistemului este nucleul de recunoaștere a gesturilor. Acesta diferă foarte mult de la o tehnologie la alta, având cerințe de procesare corespunzătoare cui tehnologia folosită. De exemplu în cazul procesării video este clar că avem nevoie de un chip puternic ce poate face o procesare a informației in timp real și asta deoarece procesarea video este un algoritm complex ce necesită foarte multe calcule, deci procesorul este folosit intr-o măsură foarte mare. Comparativ cu acest procesor, un procesor utilizat pentru detecția gesturilor folosind ultrasunete nu trebuie sa fie foarte rapid fiindcă el nu trebuie decât să compare o serie de valori primite de la senzori și să identifice cazurile în care succesiunea de valori pe fiecare senzor este egală cu cea definită într-un patern.

Dificultățile care apar în implementarea unor tehnici de recunoaștere sunt:

Detecția prezenței și a poziției mâinii în scenă;

Identificarea clasei de gesturi căreia îi aparține forma mâinii din scenă;

Determinarea deplasării în scenă a obiectului identificat;

Latența sistemului;

Stabilitatea urmăririi: variația poziției măsurate să fie cât mai mică, dacă obiectul măsurat nu se mișcă.

În ceea ce privește domeniile în care se pot folosi detectoarele de gesturi nu putem spune decât că sunt foarte diverse, de la televizoare și telefoane inteligente până la dispozitive medicale și industriale. Diversitatea domeniilor în care se poate aplica acest tip de interfață om-mașină este motivată de faptul că atât timp cât intr-un dispozitiv nu sunt componente în mișcare și se limitează contactul direct cu mașina, durata de viață a acesteia va crește considerabil. Un alt motiv foarte important este evitarea transmiterii anumitor viruși și bacterii, atunci când vorbim de dispozitive medicale. Acest fapt se motivează prin faptul ca atât timp cât nici pacientul și nici doctorul nu intră în contact direct, cu aparatul, riscul de transmitere a diverșilor agenți patogeni este semnificativ redus.

4. Implementarea practică a sistemului

În acest capitol se va prezenta implementarea unui detector de gesturi utilizând senzori ultrasonici și o platformă de dezvoltare Digilent Zybo board echipată cu un circuit SoC Zync7010. Pentru început voi face o descriere generală a sistemului și apoi o descriere detaliată a componentelor hardware folosite, urmând ca în a doua jumătate a capitolului să pun accent pe implementarea detectorului de gesturi utilizând limbajul Verilog-HDL.

4.1 Prezentarea generală sistemului

În acest subcapitol va voi face o prezentare generală a sistemului proiectat de mine. Pentru a pune în practică principiile teoretice prezentate mai sus, am ăproiectat un detector de gesturi ce utilizează un modul de detecție cu ultrasunete implementat cu ajutorul unui circuit FPGA. Pentru a demonstra funcționalitatea sistemului am proiectat și o aplicație pur hardware, ce permite utilizatorului sa execute operații simple asupra unui set de imagini stocate intr-o memorie ROM internă ce a fost construită integral de mine. În continuare în figura Fig4.1.1 va fi prezentată schema bloc a sistemului.

Fig 4.1.1 Diagrama bloc a sistemului

Componentele sistemului sunt următoarele:

3 senzori Pmod MAXSONAR-folositi pentru sesizarea gesturilor;

O platformă de dezvoltare Digilent Zybo Board cu procesor Zync7010 pentru implementarea algoritmului de detecție a gesturilor și a aplicației de testare;

Un display Pmod OLED utilizat pentru a oferi date referitoare la starea modulului de detecție a gesturilor;

Un monitor conectat la portul VGA pus la dispoziție de platforma de dezvoltare Zybo.

Sistemul va funcționa în felul următor:

Cei trei senzori Pmod MAXSONAR vor cerceta continuu dacă în zona de sensibilitate(10inch-20inch) se află un obiect, în cazul nostru mâna.

În momentul în care mana va fi detectată in zona de sensibilitate, se va seta un indicator intern iar dacă la setarea acestui indicator, in sistem mai există un alt indicator setat atunci se va semnala detectarea unui gest. În caz contrar sistemul va aștepta ca un nou indicator să fie setat.

În momentul în care un gest a fost detectat, modulul de detecție va fi dezactivat pentru 3 secunde, iar acest aspect va fi semnalat prin intermediul unui mesaj WAIT ce va fi afișat pe displayul Pmod OLED atașat.

Pentru a putea observa mai concret funcționarea sistemului s-a mai implementat și o aplicație de afișare a unor imagini pe un monitor, aplicație controlată în totalitate cu ajutorul detectorului de gesturi.

Acest sistem a fost implementat ca să poată funcționa cu o zonă de sensibilitate de 22 inch având capacitatea de a detecta 3 gesturi, acest fapt din pricina faptului că senzorii aleși nu sunt foarte preciși. Între fiecare 2 gesturi trebuie să aștepți un timp de 3 secunde pentru a evita interpretarea unui gest nedorit.

O particularitate a sistemului este faptul că este implementat integral in limbaj de descriere hardware ceea ce ii permite să facă procesare paralelă, ceea ce face ca sistemul să fie mai rapid deoarece se măsoară în același timp distanțele detectae de fiecare senzor. Pe lângă acest avantaj mai putem menționa și faptul că acest design poate fi implementat într-un chip integrat ce poate funcționa independent fiind compatibil cu orice sistem de procesare cu microprocesor.

Caracteristicile sistemului sunt următoarele:

Gama activă de detectare gest: 6-10 inch;

Tip de gest: mișcări ale mâinii;

Timp de așteptare minim între gesturi: 3s;

Dimensiuni: 100 x 50 cm;

Opțiuni GUI: port de ieșire VGA pentru aplicația ce controlează afițarea unor imagini;    128 x 32 display OLED de informații în modul dispozitiv.

4.2 Prezentarea componentelor hardware folosite.

4.2.1 Modulul Digilent Zybo și circuit FPGA Zync7010

În realizarea acestui proiect una dintre cele mai mari provocări a fost constituită de folosirea cât mai eficientă a platformei de dezvoltare pe care am avut-o la dispoziție și anume placa de dezvoltare Zybo produsă de compania americană Digilent. Alegerea acestei plăcuțe de dezvoltare a venit din nevoia unui mediu de dezvoltare foarte performant care să ofere atât facilități de logică programabilă cât și posibilitatea de a instala un sistem de operare pentru o a doua fază a proiectului. În continuare voi prezenta atât placa de dezvoltare Zybo cât și chipul Xilinx Zync7010.

Zybo reprezintă o placă de dezvoltare produsă de Digilent ce este echipată cu un sistem SoC de la Xilinx și anume circuitul Zync7010, circuit ce face parte din familia Zync7000. Acest chip oferă atât o zonă de FPGA pentru implementarea proiectelor descrise cu ajutorul unui limbaj HDL sau a altor modalități de dezvoltare de circuite numerice cât și două nuclee ARM Cortex A9 dedicate aplicațiilor embedded și implementărilor de sisteme ce sunt create pentru a rula in cadrul sistemului de operare Linux OS. Această placă de dezvoltare prezintă o multitudine de facilități fiind echipată cu placă de sunet, placă de rețea, convertoare analog-numerice, porturi de intrare-ieșire video, slot de card microSD și in plus prin porturile compatibile Pmod capabilitățile acestei plăci de dezvoltare pot fi extinse la o multitudine de dispozitive.

Această platformă de dezvoltare este compatibilă atât cu mediul de dezvoltare Xilinx Vivado dar și cu pachetul ISE/EDK, acest fapt făcând din Zybo o platformă ușor de programat și reconfigurat fiind foarte utilă într-o gamă largă de aplicații.

Caracteristicile acestei platforme sunt următoarele:

Procesor dual-core Cortex-A9 ce funcționează la frecvența de 650 MHz

Memorie RAM DDR3 ce prezintă un controller DMA cu 8 canale

Controlere pentru dispoț

Dispozitive periferice de mare viteză: 1G Ethernet, USB 2.0, SDIO

Dispozitive periferice de mică viteză: SPI, UART, CAN, I2C

Logică programabilă echivalentă cu cea a circuitului Artix-7 FPGA

4,400 de blocuri logice, fiecare cu cate un circuit LUT cu 6 intrări și 8 bistabili

240 KB de memorie RAM

Două blocuri ce controlează semnalul de tact, fiecare cu o buclă de tip PLL și un sistem mixt de control a semnalului de clock MMCM

80 de blocuri DSP

Clock intern ce depășește 450MHz

Convertor analog-numeric integrat on chip (XADC)

ZYNQ XC7Z010-1CLG400C

512MB x32 DDR3 w/ 1050Mbps bandwidth

port HDMI

Port VGA cu o rezoluție de 16 biti per pixel

Trimode (1Gbit/100Mbit/10Mbit) Ethernet PHY

Slot card MicroSD ce oferă suport pentru fișierele de configurare pentru Linux OS

OTG USB 2.0 PHY

EEPROM extern (programmed with 48-bit globally unique EUI-48/64™ compatible identifier)

Circuit audio cu o intrarea de micrifin, una de date preluat de la un alt dispozitiv audio plus o ieșire audio

128Mb Serial Flash w/ QSPI interface

On-board JTAG programming and UART to USB converter

GPIO: 6 pushbuttons, 4 slide switches, 5 LEDs

Six Pmod connectors (1 processor-dedicated, 1 dual analog/digital, 3 high-speed differential, 1 logic dedicated)

Fig 4.2.1.1 Platforma de dezvoltare Digilent Zybo-componente[6]

Tabel 4.2.1.1 Componentele prezente pe platforma de dezvoltare Zybo[6]

Pentru dezvoltarea acestui proiect am utilizat doar o mica parte din facilitățile oferite de platforma de dezvoltare mai sus precizată. Aceste componente sunt: sistemul SoC Zync7010, portul VGA și conectorii Pmod. În continuare voi face o scurta descriere a acestor componente.

Zynq AP SoC este împărțit în două subsisteme distincte: sistemul de procesare (PS) și Programmable Logic (PL). Figura Fig 4.2.1.2 prezintă o privire de ansamblu asupra arhitecturii Zynq AP SoC, culoarea verde semnalează partea PS și PL este prezentat folosind culoarea galben. Rețineți că PCIe controler Gen2 și multi-gigabit transceivere nu sunt disponibile pe chipul Zynq-7010.

PL este aproape identic cu un Xilinx 7 serie Artix FPGA, cu excepția faptului că acesta conține mai multe porturi dedicate și magistrale care formează o pereche de PS.PL, de asemenea, nu conține același hardware de configurare ca un FPGA Seria 7 clasic, și trebuie să fie configurat fie direct de către procesor sau prin intermediul portului JTAG.

PS format din mai multe componente, inclusiv unitatea de aplicație de procesare (APU, care include 2 procesoare Cortex A9-), Advanced Microcontroller Bus Architecture (AMBA) Interconnect, controler de memorie DDR3, și diverse controllere pentru dispozitivele periferice cu intrările și ieșirile lor multiplexate la 54 de pini dedicați (numite Multiplexed I / O, sau pini MIO).

Controlere periferice care nu au intrări și ieșiri conectate la pinii MIO pot în schimb ruta fi rutate la I/ O prin PL, prin intermediul (EMIO) interfața-MIO Extended. Controllerele periferice sunt conectate la procesoare ca slave-uri prin interconectare AMBA, și conțin registrele de control care pot fi citite / scriere ce sunt adresabile în spațiu de memorie a procesoarelor.

Fig4.2.1.2 Arhitectura sistemului Zync 7010[6]

Portul VGA are structura fizică prezentată în figura Fig4.2.1.3.

Fig10.3 Structura fizică a conectorului VGA[6]

ZYBO folosește 18 pini ai logicii programabile pentru a crea un port de ieșire VGA analogic. Acest lucru se traduce printr-o rezoluție de 16 biți și două semnale de sincronizare standard (HS – orizontal Sync, și VS – Vertical Sync).Conversia digital-analog se face cu ajutorul unei simple trepte de rezistențe R-2R. Scara funcționează împreună cu rezistența de terminare 75 ohm a ecranului VGA pentru a crea 32 și 64 de niveluri de semnal analogic semnale roșu, albastru, verde și VGA. Cu 5 biți pentru culorile roșu și albastru și 6 biți pentru culoarea verde se pot crea 65.536 (32 × 32 × 64) culori diferite. Pentru ca acest conector să poată fi folosit trebuie creat, în cadrul logicii programabile, un controller video ce are rolul de a genera semnalul de sincronizare orizontală HS și semnalul de sincronizare verticală VS.

Conectorii Pmod sunt formați din 12 pini de tip mamă ordonați cate 6 pe rând având structura din figura Fig4.2.1.4. Primii doi pini de pe fiecare rând sunt perechi GND-VCC ce pot furniza o tensiune de 3.3 V și o putere de până la 1 A. Următorii pini sunt pini de date ți in cazul acestei platforme de dezvoltare sunt prezenți atât pini standard cât și de mare viteză.

Fig4.2.1.4 Conectorul Pmod [6]

In proiectul nostru vom folosi 3 porturi de mare viteză de Zybo: JB, JC și JD pentru a conecta senzori Pmod MAXSonar.

4.2.2 Senzorul cu ultrasunete MAXSONAR

Pmod MAXSONAR este un detector de proximitate ce folosește ultrasunete pentru detectarea distanței dintre senzor și un obiect anume, ce are la bază senzorul sonar MaxBotix LV-MaxSonar-EZ1. LV-MaxSonar-EZ poate fi folosit atât pentru detectarea distanțelor mici cât și pentru detectarea distanțelor mari, toate acestea fiind împachetate intr-o capsulă redusă ca dimensiuni. LV-MaxSonar-EZ detectează obiecte ce se află la distanțe ce variază între 0-inch și 254-inch (6.45 metri)-și furnizează informații in gam 6 inch – 254 inch cu rezoluție de 1 inch. Obiectele ce se află la o distanță cuprinsă intre 0 inch și 6 inch nu sunt detectate cu exactitate. Pentru a obține informațiile colectate de senzor se pun la dispoziție 3 ieșiri diferite ca protocol, o ieșire PWM, o ieșire în tensiune și o ieșire ce comunică pe protocolul RS232 .

Caracteristicile senzorului MAXSONAR sunt următoarele:

Poate fi alimentat atât cu tensiuni variind între 2.5 V și 5V cu un consum de curent de 1mA

Se pot face citiri la intervale mai mari de 50mS, (20-Hz rate)

Poate măsura continuu

Se pot face citiri și cu ajutorul unor triggeri, în momentul în care se dorește ca senzorul să nu funcționeze permanent

Cele 3 interfețe sunt active simultan

Serial, 0 to Vcc, 9600 Baud, 81N

Analog, (Vcc/512) / inch

Pulse width, (147uS/inch)

Sensor operates at 42 KHz

Senzorii cu ultrasunete sunt senzori capabili să detecteze obiecte fără a intra în contact direct cu ele. Acești senzori nu sunt afectați de culoare sau alte caracteristici vizuale ale obiectului detectat. Senzori cu ultrasunete folosesc sunet de înaltă frecvență pentru a detecta si localiza obiectele într-o varietate de medii. Senzori cu ultrasunete măsoară timpul de deplasare a sunetului, care a fost transmis și reflectat înapoi de obiectele din apropiere. Pe baza acestui timp se determină distanța dintre obiect ți senzor. Pentru a obține informațiile colectate de senzor se pun la dispoziție 3 ieșiri diferite ca protocol, o ieșire PWM, o ieșire în tensiune și o ieșire ce comunică pe protocolul RS232 . Determinarea se face prin emiterea a 13 fascicule de frecvență 42kHz, variind factorul de umplere de la un puls la altul pentru obținerea unei precizii mai ridicate.

Pentru a obține o precizie foarte bună este indicat ca acești senzori să fie utilizați pentru detecția obiectelor aflate la o distanță de minim 6 inch, în caz contrar nu se va putea obține un rezultat ce este în conformitate cu realitatea.

Din cauza efectelor de fază acustică în domeniul apropiat, obiecte între 6-inch și 20-inch pot suferi un efect de anulare de fază acustică a formei de undă la întoarcere iar de aici rezultă inexactități de până la 2 inci. Aceste efecte devin mai puțin răspândite pe măsură ce crește distanța ținta, și nu a fost observat deloc la detectarea obiectelor plasate la o distanță mai mare de 20-inch.

Rezultatele obținute pe model pentru măsurarea cu fascicul sunt afișate pe o grilă de 30 cm. Modelul de detecție este indicat pentru dibluri de diferite diametre, care sunt plasate în partea din față a senzorului.

A. 6.1 mm (0,25 inch) diametru dibluri

B. 2,54 cm (1 inch) diametru dibluri

C. 8.89 cm (3,5 inci) cu diametrul de dibluri

D. o placă de 11 inch este mutată la stânga la dreapta cu placa paralelă cu fața senzorului.

Fig4.2.2.1 Gama de detectare a senzorului MAXSONAR[7]

Interfața de comunicare cu iețire PWM a PmodMAXSONAR folosește un factor de scalare de 147μs per inch. Dupăce ce pulsurile de frecvență 42 KHz sunt trimise, pinul PWM este setat HIGH. PIN-ul PWM este resetat după ce PmodMAXSONAR detectează o țintă. Lățimea impulsului nu va depăși 37.5ms. Dacă pulsul depășește 37.5ms , niciun obiectiv a fost detectat.

În figura 12.2 se va prezenta forma de undă pe care o va avea la ieșire, acest senzor, la un moment dat. Primul puls v-a semnala faptul că nu a găsit niciun obiect, pulsul de 37.5 ms, iar celălalt, de durată 10 ms, indică faptul că un obiect a fost identificat la distanța de 68 inch.

Fig 4.2.2.2 Exemplu formă de undă prezentă la iețirea PWM a senzorului.[7]

4.2.3 Afișorul PmodOLED

Fig4.2.3.1 Structura fizică a afișorului PmodOLED

Afișorul PmodOLED este un dispozitiv de afișare foarte compact perfect pentru aplicațiile integrate ce nu necesită afișarea unui volum mare de informații. Acest dispozitiv este complet compatibil cu interfețele de conectare Pmod fiind perfect pentru platforma de dezvoltare Digilent Zybo board.

Caracteristici:

Un afișor grafic 128×32 pixel 0,9'' WiseChip/Univision UG-23832HSWEG04 OLED

Interfață standard SPI

Viteze de tact de până la 10MHz

Buffer display intern

PmodOLED utilizează un conector standard de 12-pini pentru a afișa ieșire pe un panou LED organic 128×32 pixeli (OLED).Panoul de afișaj grafic este comandat de un circuit Solomon Systech SSD1306. O interfață SPI este utilizat pentru a configura afișajul, precum și pentru a trimite datele bitmap către dispozitiv .PmodOLED afișează ultima imagine desenat pe ecran până când este oprit sau o noua imagine este trimisă spre afișare . Resetarea afișării este tratată intern.

PmodOLED are două tranzistoare cu efect de camp (FETs), care controlează două surse de alimentare a ecranului. Controlul VDDC comută puterea pentru partea logica a ecranului. Controlul VBATC comută puterea afișorul OLED .

Ecranul are un conector D/C(afișare sau comanda selecta), care determină dacă bytes trimiși spre display sunt interpretați ca fiind comenzi sau date de afișare. Conectorul D/C este setat HIGH pentru acces la tamponul de afișare și LOW pentru acces la partea de comandă. Conectorul RES este folosit pentru a reseta controlerul de afișare SSD1306.

Conectorul RES este trecut în starea LOW pentru reset și în starea HIGH pentru funcționarea normală. Pulsul de resetare trebuie sa dureze minim 3us (microsecunde) pentru a reseta corect. Display-UG2832 este un dispozitiv serial care este accesat folosind SPI. Este un dispozitiv numai de scriere, deci nu este posibil să citești conținutul tamponului de afișare sau starea afișorului.

Frecvența maximă pe care o poate lua tactul este de 10Mhz. Conectorul CS trebuie să fie setat LOW pentru ca afișorul să primească date prin interfața SPI. Digilent are biblioteci pentru PmodOLED care oferă funcții pentru inițializarea ecran și redare text simplu și grafică pe ecran.

4.3 Mediu de dezvoltare XILINX ISE DESIGN SIUTE WEBPACK

Pachetul de programe WebPACK ISE al firmei Xilinx reprezintă un mediu integrat pentru proiectarea sistemelor digitale utilizând circuite FPGA sau CPLD produse de această firmă. Acest pachet conține un subset al sistemului de proiectare Xilinx Foundation ISE. Pentru descrierea sistemelor digitale, proiectantul poate utiliza scheme, limbaje de descriere (VHDL sau Verilog pentru circuitele FPGA, ABEL pentru circuitele CPLD), sau diagrame de stare. Este posibilă utilizarea combinată a acestor metode pentru descrierea diferitelor componente ale aceluiași sistem digital. Pachetul de programe WebPACK este disponibil gratuit de pe paginile Web ale firmei Xilinx. Pentru transferul pachetului este necesară înregistrarea în prealabil la adresa de mai jos, respectând toate termenele și condițiile impuse: http://www.xilinx.com/xlnx/xil_entry2.jsp?sMode=login&group=webpack. Mai departe se va alege un identificator și o parolă, după care va fi permis accesul la pagina de pe care se poate transfera pachetul, adresa acestei pagini fiind: http://www.xilinx.com/webpack/index.html Pentru simularea descrierilor, sistemul WebPACK conține o versiune a simulatorului ModelSim al firmei Model Technology (http://www.model.com), denumită MXE (ModelSim Xilinx Edition). Acest simulator permite simularea funcțională a descrierilor înainte de sinteză, sau simularea după procesul de implementare pentru verificarea întârzierii semnalelor.

Sistemul WebPACK conține de asemenea o interfață grafică pentru specificarea unor vectori de test. Pe baza acestora se generează un banc de test sub forma unui fișier HDL, care va fi compilat împreună cu descrierea sistemului digital pentru simularea funcționării acestuia. Sistemul WebPACK permite utilizarea următoarelor tipuri de circuite FPGA și CPLD Xilinx: • Circuite FPGA din familia Spartan: Spartan-2, Spartan-2E; • Circuite FPGA din familia Virtex: Virtex, Virtex-E, Virtex-2, Virtex-2 Pro; • Circuite CPLD din familia XC9500: XC9500, XC9500XL, XC9500XV;

Figura Fig4.3.1 prezintă principalele module software ale sistemului de proiectare WebPACK.

Fig 4.3.1 Structura sistemului de proiectare Xilinx WebPACK.[3]

Pentru proiectarea unui sistem digital cu ajutorul pachetului WebPACK, trebuie să se creeze mai întâi un proiect. Acestuia i se asociază un fișier care va conține informațiile principale despre sistemul proiectat: fișierele care conțin descrierea sistemului digital, tipul circuitului care va fi utilizat pentru implementare etc. Toate fișierele care conțin descrierea sistemului digital și cele care vor fi generate în diferitele etape ale procesului de proiectare se păstrează într-un director separat pe disc.

Programele care compun sistemul de proiectare WebPACK pot fi lansate din fereastra unei interfețe grafice, numită Project Navigator, care coordonează procesele și fișierele asociate cu un anumit proiect. Acest “navigator” vizualizează fișierele de intrare ale proiectului, fișierele intermediare sau de ieșire generate pe parcursul etapelor de proiectare, procesele care pot fi executate asupra diferitelor fișiere și mesajele generate de programele executate. Ecranul interfeței grafice Project Navigator este împărțit în patru ferestre principale, după cum se ilustrează în Figura Fig4.3.2. În fereastra fișierelor sursă se afișează toate fișierele sursă care au fost incluse în proiectul curent. Prin execuția unui clic dublu pe numele unui fișier din această fereas-tră se va deschide fișierul respectiv de către modulul CAD corespunzător. Fereastra proceselor indică toate procesele care sunt disponibile pentru un anumit tip de fișier sursă. Execuția unui clic dublu pe numele unui proces va lansa în execuție procesul respectiv. Fereastra editorului HDL afișează conținutul fișierului sursă selectat, conținând descrierea unei componente digitale într-un limbaj de descriere hardware. Conținutul fișierului poate fi editat în această fereastră. În fereastra consolei se afișează toate mesajele care indică starea execuției unui proces, inclusiv mesajele de avertisment sau de eroare care sunt generate în urma execuției.

Pe lângă aceste ferestre principale, interfața Project Navigator poate deschide și alte ferestre necesare pentru unele aplicații.

Fig4.3.2 Ecranul principal al interfeței grafice Project Navigator.[3]

Modulele pentru descrierea sistemului digital cuprind editorul schematic ECS (Engineering Capture System), editorul HDL pentru limbaje de descriere hardware și editorul pentru diagrame de stare StateCAD. Editorul schematic utilizează un modul care conține primitivele de bibliotecă pentru circuitele FPGA și CPLD care pot fi utilizate pentru implementarea sistemului digital. Editorul HDL permite editarea fișierelor sursă care conțin descrierea sistemului digital în limbajul VHDL sau Verilog. Editorul StateCAD permite descrierea unor automate cu stări finite utilizând diagrame de stare. Utilizatorul poate desena stările automatului, tranzițiile între stări și poate specifica semnalele de ieșire care trebuie generate în fiecare stare. Sistemul digital poate fi descris utilizând mai multe metode, de exemplu, prin scheme și limbaje de descriere hardware. Schemele și diagramele de stare vor fi compilate în descrieri HDL care pot fi simulate pentru verificarea funcțională a sistemului proiectat. Aceste descrieri vor fi utilizate în următoarele etape de proiectare.

Modulul HDL Bencher permite testarea mai simplă a sistemului digital. Cu ajutorul acestui modul, utilizatorul poate introduce semnalele de intrare sub formă grafică, ca diagrame de timp. Pe baza acestor semnale se va genera un banc de test (“testbench”) sub forma unei descrieri HDL, descrere care poate fi utilizată pentru simularea funcționării sistemului digital. Utilizatorul poate specifica și rezultatele așteptate ale simulării, ceea ce permite simulatorului să afișeze mesaje de avertisment dacă rezultatele obținute prin simulare nu coincid cu cele așteptate.

Simulatorul ModelSim Xilinx Edition (MXE) permite atât o simulare funcțională a sistemului digital proiectat, cât și o simulare care ține cont de întârzierile semnalelor. Acest simulator utilizează biblioteci pentru circuitele programabile care pot fi utilizate pentru implementare, aceste biblioteci fiind precompilate. Descrierea sistemului digital care trebuie testat și bancul de test generat pe baza vectorilor de test sunt compilate, rezultatul compilării fiind utilizat pentru simularea sistemului. Simularea funcțională a sistemului digital este executată înainte de etapa de sinteză. După implementarea într-un circuit programabil se poate realiza o simulare temporală, adăugând informațiile despre întârzierile introduse de către blocurile logice și cele datorate interconexiunilor. Pentru simularea funcționării automatelor de stare descrise cu ajutorul editorului StateCAD se poate utiliza simulatorul StateBench. Acest simulator permite și crearea unor bancuri de test, fie în mod interactiv, fie în mod automat. După crearea unui banc de test, se poate simula funcționarea automatului utilizând bancul de test creat.

Aceste module realizează sinteza descrierii sistemului digital, generând o reprezentare internă a sistemului sub forma unei liste de conexiuni. Rezultatele sintezei sunt controlate prin specificarea diferitelor proprietăți (opțiuni). Una din proprietățile specificate în mod obișnuit este cea care indică modul în care se dorește optimizarea rezultatelor sintezei, din punct de vedere al resurselor utilizate sau al vitezei de funcționare. O altă proprietate este cea care indică efortul de optimizare, afectând timpul care va fi necesar pentru execuția procesului de sinteză. Modulul de sinteză care este integrat în cadrul sistemului WebPACK este XST (Xilinx Synthesis Technology). Pe lângă acest modul, se pot utiliza următoarele module de sinteză pentru care există interfețe integrate în cadrul sistemului: FPGA Express (Synopsys, Inc.), Synplify/Synplify Pro (Synplicity, Inc.) sau LeonardoSpectrum (Exemplar Logic, Inc.). Aceste module nu fac parte însă din sistemul WebPACK și trebuie instalate separat.

O parte din modulele utilizate pentru implementarea sistemului digital sunt diferite în funcție de tipul circuitului programabil utilizat: CPLD sau FPGA. Pentru ambele tipuri de circuite, prima etapă de implementare este cea de translatare. În această etapă se rulează programul NGDBuild, care prelucrează lista de conexiuni obținută în etapa de sinteză (sau listele de conexiuni în cazul în care descrierea sistemului digital este conținută în mai multe fișiere sursă). Aceste liste de conexiuni, care pot fi în format XNF sau EDIF, sunt convertite în formatul Xilinx Native Generic Database (NGD). Pe lângă această conversie, programul NGDBuild realizează verificarea constrângerilor de temporizare specificate de proiectant și verificarea regulilor de proiectare (DRC – Design Rule Check). Programul generează un raport care conține eventualele mesaje de eroare sau de avertismente despre rezultatele acestor verificări.

În cazul proiectării cu circuite CPLD, următoarea etapă de implementare este cea de adaptare (“Fitting”), executată de modulul CPLD Fitter. Acest modul minimizează logica utilizată pentru descrierea sistemului și realizează adaptarea acesteia la particularitățile circuitului CPLD din familia XC9500 sau CoolRunner, astfel încât să se utilizeze numărul minim de macrocelule și termeni produs. Modulul CPLD Fitter poate genera și un raport conținând caracteristici de timp ale semnalelor, raport care indică și frecvența maximă a semnalului de ceas la care poate funcționa sistemul proiectat. În cazul proiectării cu circuite FPGA, următoarea etapă de implementare după cea de translatare este maparea tehnologică, executată de programul MAP. Acest program execută mai întâi verificarea regulilor de proiectare pentru descrierea din fișierul în format NGD, iar apoi realizează adaptarea logicii la resursele disponibile în circuitul FPGA din familia Spartan sau Virtex utilizat pentru implementare. Rezultatul mapării tehnologice este un fișier în format NCD (Native Circuit Description), care specifică elementele fizice care vor fi utilizate din circuitul FPGA. Programul MAP generează un raport cu rezultatele operațiilor efectuate. Raportul conține mesajele de eroare și de avertisment care au fost afișate, logica eliminată în urma optimizărilor efectuate, numărul și procentul de utilizare a blocurilor logice, a blocurilor de I/E și a bistabilelor.

După maparea tehnologică, se rulează programul PAR, care execută operațiile de plasare și rutare a circuitului FPGA. Acest program prelucrează fișierul în format NCD obținut în urma mapării tehnologice și generează un fișier în același format care conține și informațiile de rutare. Programul PAR generează mai multe rapoarte care conțin: numărul semnalelor care nu au putut fi rutate complet, caracteristici de timp ale semnalelor, pinii circuitului sortați mai întâi după numele semnalelor, iar apoi după număr, frecvența maximă de funcționare a circuitului.

După implementare, se poate genera un model al sistemului proiectat conținând și întârzierile semnalelor, aceste informații fiind adăugate prin operația de adnotare inversă. Modelul generat poate fi utilizat pentru simularea temporală a sistemului. Pentru generarea acestui model, se rulează (în mod automat sau la comanda utilizatorului) programul NGDAnno și unul din programele NGD2VHDL, NGD2VER sau NGD2EDIF, în funcție de fluxul de proiectare utilizat (XST VHDL, XST Verilog, respectiv EDIF).

După executarea etapelor de implementare, se poate genera un fișier care va fi utilizat pentru configurarea circuitului programabil astfel încât acesta să execute funcțiile dorite ale sistemului digital proiectat. Fișierul de configurare este sub forma unui șir de biți (“bitstream”), conținând toate informațiile din fișierul NCD care definesc logica internă și interconexiunile circuitului utilizat pentru implementare, plus alte informații din unele fișiere asociate cu acest circuit. Asemenea informații sunt, de exemplu, cele care indică asignarea semnalelor la pinii circuitului. Fișierul de configurare este generat de programul BitGen. Acest fișier poate fi utilizat apoi pentru configurarea circuitului sau pentru crearea unui fișier necesar programării unei memorii PROM cu informațiile de configurare ale circuitului.

Pentru circuitele CPLD, fișierul de configurare este creat în formatul JEDEC (Joint Electron Device Engineering Council) și are extensia .jed. Ulterior, se poate crea un fișier în formatul SVF (Serial Vector Format) cu ajutorul modulului iMPACT. Pentru circuitele FPGA, fișierul de configurare creat este un fișier binar și are extensia .bit.

Modulul iMPACT permite configurarea sau programarea circuitului CPLD sau FPGA utilizat pentru implementare. Pentru aceasta trebuie conectat un cablu paralel sau un cablu JTAG la portul paralel al calculatorului (în unele cazuri, se poate utiliza un cablu serial sau un cablu USB). Fișierul care conține șirul de biți pentru configurare va fi transferat la circuitul programabil.

Modulul iMPACT conține și un program (PROM File Formatter) pentru generarea fișierului necesar programării unei memorii PROM. O asemenea memorie nevolatilă poate fi utilizată pentru păstrarea informațiilor de configurare necesare circuitelor CPLD sau FPGA care se bazează pe tehnologia SRAM și necesită configurarea după fiecare întrerupere a tensiunii de alimentare. Fișierul generat de modulul iMPACT poate avea formatul MCS-86 (Intel), EXORMACS (Motorola) sau TEKHEX (Tektronix). Se poate genera și un fișier HEX, care conține reprezentarea hexazecimală a șirului de configurare. Fișierul generat poate fi utilizat pentru programarea unei memorii PROM cu ajutorul unui echipament de programare.

Pentru circuitele CPLD, modulul ChipViewer poate fi utilizat pentru vizualizarea în mod grafic a structurii macrocelulelor după configurare, a semnalelor de intrare și de ieșire, a ecuațiilor semnalelor a modului de asignare a pinilor de I/E și a întârzierii semnalelor între doi pini. De asemenea, modulul ChipViewer permite asignarea semnalelor la anumiți pini de I/E înaintea etapelor de implementare.

4.4 Implementarea sistemului utilizând Verilog HDL

În cadrul acestui subcapitol voi face o prezentare detaliată a moduluimîn care am implementat detectorul de gesturi pe care a trebuit să îl proiectez. Această prezentare va fi făcută etapizat într-o prezentare logică și cronologică.

Înainte de a ajunge la prima etapă, cea a implementării modulelor de citire a distanței detectate de un senzor PmodMAXSONAR, este important de precizat faptul câ înainte de a alege modul în care am făcut citirea datelor de la senzor am implementat module atât pentru a citi datele de la senzor utilizând ieșirea sa serială cât și pentru ieșirea sa în semnale PWM și amobservat că ultima variantă este cea optimă.

4.4.1 Proiectarea modulului de citire a datelor primite de la senzor

Având în vedere faptul că am ales să detectez dacă un obiecta intrat în raza de ațiune a unuia dintre senzori utilizând ieșirea pwm a acestuia, a trebuit să proiectez un periodmetru. Datele de care a trebuit să țin cont atunci când l-am proiectat au fost următoarele:

Perioada minimă pe care o poate avea semnalul pwm oferit de senzorul PmodMAXSONAR este de 147 µs, la o rezoluție de 147 µs așa că am decis să implementez un periodmetru cu o rezolutie de 1 µs.

Pentru a obține această rezoluție a trebuit să construiesc un divizor de tact care să dividă tactul de 125MHz, de care dispune Zybo, până la frecvența de 1MHz.

Am setat raza de acțiune la o distanță cuprinsă între 6 inch și 10 inch, asta pentru a evita zgomotul produs de detectarea unei miscări la o distață prea indepărtată pe de o parte și pe de altă parte pentru a mai economisi din resursele circuitului. Am făcut acest lucru limitând capacitatea de numărare a numărătorului la 1470.

Pentru a explica mai bine funcționarea modulului de sesizare a distanței vom arunca o privire asupra schemei bloc a modulului(Fig. 4.4.1.1).

PWM

CLK

Fig4.4.1.1 Schema bloc a circuitului de interpretare a datelor furnizate de PmodMAXSONAR

Logica de funcționare a circuitului este următoarea:

La intrarea CLK, a sistemului, se aplică un semnal de frcvență 125 MHz ce este mai apoi divizat cu 125 pentru a obține semnalul de referința dorit, în speță 1MHz;

La intrarea PWM a circuitului se aplica ieșirea PWM a senzorului;

Când semnalul PWM este în HIGH numărătorul num_pwm începe să numere;

Când semnalul PWM este în starea LOW numărătorul încetează să mai numere și își intră în rol blocul df, bloc ce reprezintă logica de comandă a sistemului, acest bloc dă în acest moment semnalul de incărcare a memoriei tampon memorie și imediat după, dă și semnalul de resetare a numărătorului;

La o nouă stare de HIGH a semnalului PWM se reia procesul.

Pentru a face și mai multă lumină asupra acestui circuit, în continuare, voi explica rolul și funcționarea fiecărui bloc în parte.

Numărătorul „num_pwm” este un numărător binar pe 11 biți ce poate lua 1470 de stări, ce este activ pe perioada în care semnalul de reset este setat în „1” logic. La setarea semnalului de reset în „0” logic numărătorul se va încărca automat cu valoarea 0.

Memoria tampon „memorie” reprezintă o memorie pe 11 biți, ce are rolul de a reține valoarea pe care numărătorul a înregistrt-o cu o perioadă de numărare în urmă. Este folosit pentru stocarea temporară a valorilor citite de la senzor.

Numărătorul cpe 7 biți „divizor” este folosit pentru adaptarea semnalului de tact la frecvența de 1MHz necesară obținerii rezoluției dorite.

Blocul „df” reprezintă logica de comandă a circuitului, aceasta având rolul de a da semnalele de load pntru memorie și reset pentru numărător. Funcționarea acestui bloc este foarte bine exemplificată de figura Fig. 4.4.1.2:

Fig4.4.1.2 Diagrama de funcționare a blocului df (logica de comandă)

Din câte se poate observa în figura de mai sus, după ce un cilcu de numărare se încheie, după un timp egal cu jumătate din perioada semnalului de tact al sistemului(1/2*125000000) se emite semnalul de încărcare a memoriei. După un timp de așteptare se emite și semnalul de resetare al numărătorului „num_pwm”.

Pentru a testa funcționalitatea sistemului, am creeat un banc de test unde am aplicat o serie de semnale PWM cu diferiți factori ed umplere. Succesiunea de aplicare a semnalului este următoarea: prima dată am aplicat un semnal cu un factor de umplere de 1730 de µs, apoi un semnal cu un factor de umplere de 3100 µs, apoi un semnal cu o perioadă de 1310 µs ca mai apoi să aplic un semnal cu o perioadă de 3000 µs. Rezultatele acestei simulări sunt prezentate în figura Fig 4.4.1.3.

Fig 4.4.1.3 Rezultatele obținute în urma simulării funcționării circuitului de sesizare

După cum se poate observa mai sus, rezultatele sunt foarte apropiate de valoarea dorită, eroarea fiind nesemnificativă în raport cu rezoluția senzorului. De asemenea se poate observa și că în cazul în care se aplică un semnal cu o perioadă mai mare de 1470 µs, la ieșirea blocului de sesizare vom avea 1470, capacitatea maximă a numărătorului.

După ce am creat acest modul, l-am multiplicat de 3 ori și am citit informațiile cu ajutorul unui afișor PmodOLED. Așa am început să căutăm configurații optime pentru cei 3 senzori PmodMAXSONAR folosiți ca elemente de sesizare în cadrul acestui proiect. Configurația optimă la care am ajuns este ilustrată în figura Fig 4.4.1.4.

Această configurație are avantajul de a face ca pentru o zonă activă de 10 inch cei 3 senzori să nu se influențeze între ei, astfel oferind o precizie acceptabilă a masurătorilor. Un alt avantaj îl reprezintă faptul că oferă posibilitatea executării gesturilor pe 2 axe.

Fig 4.4.1.4 Dispunerea optimă a senzorilor

4.4.2 Implementarea blocului de detetare a gesturilor

După implementarea modulului ce face citirea datelor de la senzor, am trecut la implementarea blocului de detecție a gesturilor. Acest bloc este capabil să detecteze un număr de 3 gesturi. Acest bloc este constituit dintr-un nucleu ce face efectiv detecția gesturilor, „gesture_detection” și în plus mai conține și o serie de blocuri de comandă atât internă, cât și externă.

Schema bloc a acestui modul este prezentată în figura Fig 4.4.2.1 prezentată mai jos:

Fig 4.4.2.1 Schema bloc a detectorului de gesturi.

Acest modul funcționează în felul următor:

Se aplică acestui bloc ieșirile celor 3 blocuri de sesizare a distanșei;

Acestea se aplică blocului „gesture_detection”, iar aici în virtutea unei logici interne se face sesizarea unui gest;

Dacă un gest este detectat intră în acțiune circuitul „delay_gest”, care asigură perioada de inactivitate dintre 2 gesturi;

Apoi se aplică un semnal, corespunzător fiecărui gest, unuia dintre blocurile „adr_img” sau „adr_zoom” blocuri ce sunt vitale în funcționarea aplicațiilor de testare proiectate;

După 3 secunde operațiunea se repetă.

În continuare voi dscrie mai pe larg rolul fiecărui modul din acest sistem.

Blocul „div_1ms” are rolul de a diviza semnalul de tact până ajunge să aibă o frecvență de 1kHz. Este folosit ca bază de timp pentru circuitul ce menține starea inactivă, obligatorie, dintre 2 gesturi.

Blocul „delay_gest” este în fapt un numărător cu 3000 de stări ce are rolul de a asigura o perioadă de 3s între două gesturi consecutive, necesar unei bune funcționări a sistemului.

Bocul „gesture detection” este blocul ce face detectarea gestuilor după o logică prezentată în figura Fig 4.4.2.2. Pentru a înțelege mai bine schema logică prezentată în figura Fig 4.4.2.2 voi menționa faptul că am făcut următoarele notații: activ = semnal de validare generală a blocului, acest semnal este setat în „1” logic atunci când blocul este funcțional și în „0” logic atunci când blocul este deconectat sau în primele 3 secunde după ce a fost recunoscut un gest; s1,s2,s3 = reprezintă rezultatele citite de la senzor; f1,f2,f3 = sunt 3 indicatoare, câte unul pentru fiecare senzor, acestea sunt setate în „1” atunci când senzorul înregistrează un obiect în zona de sensibilitate și apoi sunt setate în „0” logic în momentul în care semnalul „activ” este setat în „0” logic.

Acest bloc funcționează în felul următor:

Dacă semnalul „activ” este setat în „1” logic atunci se interoghează cele 3 intrări de date, date ce conțin informații privind pătrunderea unui obiect în zona de proximitate, s1,s2,s3;

Dacă unul dintre semnale indică faptul că un obiect a pătruns în zona de sensibilitate se setează indicatorul corespunzător;

Dacă nu mai este niciun indicator setat atunci se trece din nou la interogarea informațiilor primite de la cei 3 senzori.

Dacă este setat un alt indicator, în momentul activării unui senzor, un indicator diferit de cel al senzorului respectiv, atunci se setează un indicator de gest ce este folosit ca element de control pentru blocurile de comandă a aplicației de afișare a imaginilor;

Tot în acest moment, dupa o perioadă de tact, blocul de detectare a gesturilor este dezactivat pentru 3 secunde;

Apoi operațiunea se reia de la început.

Fig 4.4.2.2 Diagrama logică de funcionare a detectorului de gesturi

Blocul „adr_img” servește ca generator de semnale de control pentru aplicația ce face afișarea imaginilor pe monitor. Practic acesta este un numărător bidirecțional ce este incrementat sua decrementat în funcție de gestul detectat.

Blocul „adr_zoom” reprezintăun numărător unidirecțional ce va controla dimensiunea imgainii afișate pe monitor. Acesta reprezintă un semnal de control pentru aplicația ce face afișarea imaginilor pe monitor.

4.4.3 Implementarea aplicației de test

Pentru a vedea dacă detectorul de gesturi proiectat de mine funcționează așa cum ar trebui, am construit o aplicație ce face afișarea unor poze pe monitor. Pentru aceasta am construit 3 memorii ROM unde am stocat 3 imagini, căte o imagine per ROM, imagini cu o rezoluție de 320×200. Această aplicație face tranziții între poze și rescalarea pozelor cu ajutorul semnalelor de control primite de la blocul de detecție a gesturilor. Pentru a putea comenta mai detaliat funcționarea acestei aplicații am atașat în figura Fig4.4.3.1 schema de implementare a aplicației.

Practic acest modul este alcătuit din două multiplexoare, 3 blocuri de memorie ROM și 3 blocuri de scalare a imaginilor. Funcționarea acestui bloc este bazată pe multiplexarea unor adrese în vederea alegerii imaginii ce urmează a fi afișate iar ca mai apoi imaginea să fie scalată la dimensunile dorite, înainte de a ajunge spre ieșirea VGA, mai este multiplexară o dată. Adresele de control ale acestor multiplexoare sunt generate de blocul de detectare a gesturilor.

În continuare voi trece la explicarea funcționării fiecărui bloc în parte, prezentând elemente de detaliu privitoare la logica de construcție a acestora.

Blocurile img1, img2, img3 reprezintă 3 memorii ROM având o capacitate de memorare de 64Kb per bloc de memorie. În aceste memorii sunt stocate poze, cu extensia .COE. Aceste blocuri sunt conectate la multiplexorul „mux_adreses” și doar una dintre acestea va fi citită de sistem la un moment dat. Cele 3 imagini sunt în format 320×200 cu o rezoluție de 8 biți per pixel, am ajuns la aceste limitări din pricina faptului că circuitul FPGA folosit nu pferă decât 256kb disponibili pentru proiectarea blocurilor de memorie.

Fig4.4.3.1 Schema de implementare a aplicației

Blocul „divizor25” reprezintă un divizor de semnal ce are rolul de a duce la obținerea unui semnal optim pentru buna funcționare a sistemului. Tactul la care lucrează acest bloc este de 25MHz, deci având în vedere că modulul Zybo oferă un tact de 125 MHz, pentru blocurile logice, acest bloc are un factor de divizare egal cu 5.

Blocul „v1” reprezintă un controller VGA ce face afișarea imaginii în format 320×200. Practic acesta dă adreselse de citire din memorie, adrese ce se leagă la multiplexorul „mux_adrese” și emite semnale de sincronizare orizontală și verticală. Citirea adreselor se face în ordine crescătoare începând de la prima adresă până la ultima, afișarea imaginii facându-se la dimensiunea inițială.

Blocul „v3” reprezintă un controller VGA ce face afișarea imaginii în format 640×400. Având în vedere faptul că imaginile sunt în format 320×200 pentru afișarea imaginilor acest controller dă adresele către memorie un pic diferit față de modul în care o făcea blocul anterior. Practic fiecare pixel este, în speță fiecare locație de memorie, este accesat o dată pe fiecare două rânduri și coloane consecutive.

Blocul „v4” reprezontă un controller VGA ce face afișarea imaginilor la dimensiune a de 160×100, ceea ce înseamnă că o afișează la jumătate din dimensiunea ei inițială. Pentru a face asta controllerul accesează memoria din două în două locații de memorie. Și acest bloc la rândul său este conectat la blocul „mux_adrese”.

Blocul „mux_adrese” reprezintă un multiplexor ce face selectarea blocului de memorie accesat și în speța a imaginii ce urmează a fi afișată. Acest bloc este controlat printr-un semnal extern generat de blocul „adr_img” din cadrul generatorului de adrese. Corespondența adresă, imagine este afișată este următoarea: 0-img1, 1-img2, 2-img3.

Blocul „mux_out” reprezintă multiplexorul ce selectează dimensiunea imaginii afișate pe ecran, acest bloc practic legând partea de control a afișării prin interfața VGA cu însăși interfața VGA. Acest bloc este controlat prin semnale externe generate de blocul „adr_zoom” din cadrul detectorului de gesturi. Corespondența dintre adresă și imaginea afișată este următoarea: 0-320×200, 1-640×400, 2-160×100.

4.4.4 Implementarea controllerului pentru dispozitivul PmodOLED

Pentru implementarea acestui modul am folosit biblioteca oferită de cei de la Digilent pentru dispozitivul PmodOLED folosit. Partea în care a venit contribuția mea la realizarea acestui modul este reprezentată de dezvoltarea unor matrici de pixeli pentru o un număr de 7 litere, aceasta deoarece meoria ce conține matricile de pixeli pentru toate cifrele și literele, oferite de Digilent, este mult prea mare pentru circuitul FPGA folosit de mine.

Acest bloc este folosit pentru a afișa starea în care se află detectorul de gesturi și este controlat de semnalul de un semnal ce reprezintă în fapt semnalul „activ” din logica de funcționarea a detectorului de gesturi.

În cele ce urmează vă voi face o prezentare detaliată a blocurilor ce compun acest modul având în față schema de implementare a acestui modul(Fig 4.4.4.1)

Fig4.4.4.1 Diagrama de implementare a blocului de control a afișării pe OLED

Blocul SpiCtrl utilizează tactul de 125 MHz a Zybo pentru a genera un semnal de tact SCLK 3.906 MHz (Serial Clock) utilizat pentru sincronizarea interfeței SPI folosită oentru comunicarea cu afișorul. Acest bloc așteaptă până SPI_EN este activ iar apoi face tranzitia spre starea de trimitere a datelor către afișor. Controlerul trage CS (Chip Select) în „0” logic și apoi începe deplasarea în octetul prezent în SPI_DATA, bufferul de date al SDO (Serial Data Out), această deplasare făcându-se pe fiecare front crescător al semnalului SCLK. După ce toți cei 8 biți au fost trimiși controllerul așteaptă câteva perioade de tact în scopul de a menține CS în „0” logic pentru durata de timp necesară afișării datelor. Când transmisia s-a terminat se trece în starea Done și semnalul SPI_FIN este tra în „0” logic.

Blocul Delay utilizează tactul de 125 MHz a lui Zybo pentru a genera un contor cu o frecvență de 1kHz care este folosit pentru a număra milisecunde. Acest bloc așteaptă până DELAY_EN este avtic, adică este în starea „1” logic iar apoi face tranzitia în starea Hold. Pentru început numărătorul începe să numere cu o rezoluție de 1kHz până când egalează valoarea registrului DELAY_MS iar apoi trece starea bitului DELAY_FIN în „1” logic.

4.4.5 Conectarea celor 3 module principale

După ce am realizat aceste module le-am unit într-un modul comun ce are ca face detectarea a 3 gesturi, iar cu acestea controlează afișarea a 3 imagini pe monitor. În același timp pentru a putea vedea în orice moment starea în care se află sistemul, se va afișa pe ecranul PmodOLED starea sistemului pe ecran se va afișa mesajul: ON-pentru cayul în care detectorul de gesturi este pornit, OFF-dacă detectorul de gesturi este oprit și WAIT-dacă detectorul de gesturi este în starea de așteptare dintre 2 gesturi. Pornirea sistemului se face cu ajutorul unui switch. În diagrama Fig 4.4.5.1 este reprezentată forma finală a sistemului.

Fig 4.4.5.1 Schema bloc finală a sistemului

În această figură blocul de detectare a gesturilor este blocul „afișare_pwm” acesta generează semnale de comandă pentru blocurile „display” și „afișare_oled”. Blocul „afisare_oled” este blocul ce face afișarea stării nucleului de detectare a gesturilor iar moulul „display” este modulul ce controlează afișarea imaginilor pe monitor. Implementarea modulului „afisare_pwm” este prezentată în subcapitolele 4.4.1 și 4.4.2, cea a modulului „display” este prezentată în subcapitolul 4.4.3, iar implementarea modulului „afisare_oled” este prezentată în subcapitolul 4.4.4

5.Rezultate

În urma parcurgerii pașilor prezentați în capitolele anterioare am realizat un detector de gesturi funcțional ce recunoaște un nmăr de 3 gesturi și care este conectat în același timp la o aplicație ce face afișarea unor imagini pe un monitor. Acest sistem a fost realizat în totalitate cu ajutorul limbajelor de descriere hardware, mai precis limbajul Verilog, fiind implementat cu jutorul circuitului FPGA XILINX Zync7010 disponibil pe platforma de dezvoltare DIGILENT Zybo board.

La acest moment sistemul este complet funcțional fiind aplicat pe un profil de plexiglass ce permite o deplasare mai ușoară a dispozitivului.

În continuare vă voi prezenta modul de funcționare al sistemului, prezentând, pas cu pas, toate setările ce trebuiesc făcute pentru a folosi sistemul. Primul pas este constituit de încărcarea fișierului de configurare pe Zybo, folosind programul, oferit de cei de la XILINX, IMPACT. După acest pas sistemul este configurat așă că se poate comuta switch-ul de activare al sistemului de recunoaștere a gesturilor, primul swith sin partea dreaptă a platformei de dezvoltare Zybo.

Dpuă ce s-au executat pașii de mai sus, pe ecranul monitorului, se va afișa prima imagine. Ordinea imaginilor este definită de figura Fig 5.1.

Fig 5.1 Ordinea inițială a imaginilor

Acum că totul este inițializat, se poate folosi sistemul, executând unul dintre cele 3 gesturi ce vor fi prezentate in cele ce urmează:

Primul gest recunocut de sistem este o trecere a mâinii de la senzorul din stânga spre cel din dreapta. Acest gest este prezentat în figura Fig 5.2 și are ca rezultat, dacă neraportăm la aplicația de afișare a imaginilor, schimbarea imaginii ce este afișată pe monitor, această schimbare este prezentată în figura Fig 5.3.

Fig 5.2 Gest de la stânga spre dreapta recunoscut de sistem

Fig 5.3 Rezultatul executării gestului reprezentat în figura(Fig 5.2)

Al doile gest detectat este o trecere a mâinii de la dreapta spre stânga, această mișcare se va face de deasupra senzorului din dreapta până se va ajunge deasupra senzorului din stânga. Acest gest este prezentat în figura Fig 5.4 și are ca efect schimbarea imaginii afișate pe monitor, ordinea imaginilor fiind schimbată conform figurii Fig 5.5.

Fig 5.4 Gest de la dreapta spre stânga recunoscut de sistem

Fig 5.5 Rezultatul executării gestului reprezentat în figura(Fig 5.4)

Al treilea gest recunoscut este reprezentat de o mișcare a mâinii de deasupra senzorului aflat în centru sus până deasupra senzorului aflat în dreapta. Această mișcare va avea ca efect schimbarea dimensiunii imagii afișate pe monitor, acest gest este prezentat în figura Fig 5.6.

.

Fig 5.6 Gest din centru sus spre dreapta recunoscut de sistem.

6. Concluzii

Dispozitivele de detectare a gesturilor bazate pe ultrasunete sunt dispozitive de interfațare între om și mașină ce pot fi implementate foarte ușor, având o serie importantă de avantaje. Dintre aceste avantaje precizăm faptul că sunt imune la interferențele luminoase, nu necesită purtarea unor senzori pe corp, au un consum redus de energie, dacă sunt aleși senzorii potriviți poate prezenta și o precizie foarte bună esigurând în același timp o mare diversitate de gesturi.

Dintre toate metodele de implementare ale acestui tip de dispozitive, una dintre cele mai eficiente metode este aceea a implementării cu circuite FPGA. Aceasta deoarece acestea pot face procesare paralelă ceea ce permite citirea valorilor primite de la toți senzorii, în același timp, nu necesită un soft pentru a rula și pot oferi facilități de integrare on-chip. Pe lângă aceste avantaje, utilizarea unei platforme de dezvoltare Digilent Zybo board mai oferă posibilitatea integrării dispozitivului creat, în cadrul unui sistem de operare Linux OS de tip real time.

În ceea ce privește problemele ce pot să apară atunci când se implementează un astfel de sistem, pot spune ca principala problemă este legată de precizia senzorului. Dacă aceasta nu este prea bună, așa cum a fost și cazul senzorilor folosiți de mine, atunci numărul de gesturi ce pot fi recunoscute de sistem scade foarte mult. O altă problema identificată este legată de proiectarea cu circuite Zync7010 și aceasta se referă la faptul că spațiul alocat pentru implementarea blocurilor de memorie este foarte mic, iar cei care vor dori să implementeze un sistem ce necesită implementarea unor blocuri de memorie mari ar fi indicat să iși aleagă alt circuit de tip FPGA, atfel vor fi nevoiți să folosească memorii externe.

7. Bbliografie

[1] Daniel Mic și Ștefan Oniga-„Proiectarea asitată de calculator cu circuite logice programabile”;

[2] Nirvana Popescu și Adrian Petrescu-„Curs Calculatoare Numerice 1”;

[3] Baruch Zoltan Francisc-„Arhitectura Calculatoarelor-Lucrarea de laborator6”

[4]Cornel Popescu –„Curs de calculatoare numerice 1”

[5] http://www.senzori-ultrasonici.ro/principiul-ultrasonic

[6] https://www.digilentinc.com/Data/Products/ZYBO/ZYBO_RM_B_V6.pdf;

[7]https://www.digilentinc.com/Data/Products/PMODMAXSONAR/PmodMAXSONAR_rm2.pdf;

Similar Posts

  • Curbe de Sarcina

    CUPRINS Declarație originalitate ANEXA 1.1. Consumatori ANEXA 1.2. Shema elecrică Etaj Depozit Iluminat ANEXA 1.3. Schema electrică Etaj Depozit Prize ANEXA 1.4. Scema electrică Parter Birouri iluminat ANEXA 1.5. Schema electrică Parter Depozit Iluminat ANEXA 1.6. Schema electrică Parter Depozit Prize ANEXA 2.1. Calcul energiei consumate în iunie ANEXA 2.2 Calcul energiei consumate în decembrie…

  • Solutionarea Problemei Comis Voiajorului cu Ajutorul Algoritmilor Genetici Implementari în Limbajul Java Si Tehnologia J2ee

    Cuprins Introducere …………………………………………………………………………………….7 1. Noțiuni teoretice…………………………………….………………………….…11 1.1 Algoritmi genetici……………………………………………………………………………………..11 Teoria Schemelor………………………………………………………………………………..11 Operațiunea Selecție…………………………………………………………………………….14 Asignarea valorii numerice de conformitate bazată pe rang………………………14 Selecția bazată pe ruletă………………………………………………………………………16 Selecția universală stohastică ……………………………………………………………….17 Selecția locală……………………………………………………………………………………..17 Selecția prin trunchiere…………………………………………………………………………18 Selecția prin tururi……………………………………………………………………………….18 Operațiunea Combinarea (Încrucișarea) ……………………………………………….19 Operațiunea Mutația…………………………………………………………………………….25 Înserarea………………….………………………………………………………………………..26 Tehnologia Enterprise Java Beans ……………………………………………………….28 Noțiuni generale……………………………………………………………………………………28 Conceptele de baza EJB………………………………………………………………………..28…

  • Managementul Calitatii Si Sigurantei Alimentare

    4. Managementul calității și siguranței alimentare In perioada pe care o parcurgem, consumatorii devin din ce în ce mai conștienți de aspectele Igienice ale vieții șl alimentației lor și de aceea a devenit absolut obligatoriu ca toți producătorii de alimente să respecte atât exigențele tehnologice, cât și pe cele de ordin igienico-sanitar. Ce este calitatea…

  • Sistem Mecatronic Pentru Automatizarea Mobilierului Destinat Unei Camere de Student

    Introducere Interesul la nivel global în domeniul sistemelor mecatronice au sporit activitățile de cercetare și dezvoltare a structurilor automate, cu răsfrângere în numeroase domenii importante: medicină, agricultură, industria de mobilier, ș.a.m.d. Progresul acestora este în interdependență cu evoluția societății din zilele noastre, și vizează tehnologiile ce pot fi întrebuințate în societate, dar și dorința de…

  • Actionare Masini Electrice

    Introducere 1. Perspective privind aplicarea convertoarelor performante la acționarea podurilor rulante 1.1 Probleme generale 1.2 Utilizarea magistralelor și rețelelor de calculatoare pentru sistemele de conducere 1.3 Magistrale de computer 1.4 Implementarea interfeței pentru INTERBUS 2. Principiile procesului de control cu moduri alunecătoare și aplicațiile în acționări electrice. 2.1 Introducere 2.2 SM în VSS 2.3 Metode…