Platformă mobilă pentru fotografierea unei incinte comandată cu ajutorul unui telefon mobil [303597]

Platformă mobilă pentru fotografierea unei incinte comandată cu ajutorul unui telefon mobil

Proiect de diplomă

Prezentat ca cerință parțială pentru obținerea titlului de

Inginer în domeniul Electronică și Telecomunicații

Programul de studii de licență Electronică Aplicată

Conducător științific Absolvent

Ș.L.Dr.Ing. Bogdan Cristian FLOREA Anca Elena CONSTANTIN

LISTĂ FIGURI

Figura 1.1 Schema bloc a platformei robotice 17

Figura 2.1 Platforma robotică neasamblată [1] 19

Figura 2.2 Schema simplificată a unei punți H (S1-S4 : întrerupătoare, M : motor) [2] 20

Figura 2.3 Stările întrerupătoarelor S1-S4 [2] 21

Figura 2.4 Modulul L298N [2] 21

Figura 2.5 Schema bloc a integratului L298[3] 22

Figura 2.6 Schema electrică a modulului L298N[4] 23

Figura 2.7 Motor DC cu reductor de turație 1:48[2] 24

Figura 3.1 Placa de dezvoltare IOIO OTG[5] 25

Figura 3.2 Circuitul de încărcare al unui dispozitiv Android[7] 26

Figura 3.3 Pinii de alimentare ai plăcii de dezvoltare IOIO OTG[5] 27

Figura 3.4 Schema electrică a secțiunii de alimentare a plăcii de dezvoltare IOIO OTG[7] 27

Figura 3.5 Diagrama bloc a microcontrolerului PIC24FJ256DA2[10] 29

Figura 3.6 Implementarea microcontrolerului PIC24FJ256DA206 în schema electrică a plăcii de dezvoltare IOIO OTG[7] 30

Figura 3.7 Pinout IOIO OTG[5] 31

Figura 4.1 Actualizare firmware IOIO OTG 35

Figura 4.2 Comandă Windows pentru actualizare firmware IOIO OTG 36

Figura 4.3 Versiune actualizată a software-ului 36

Figura 4.4 Picorețele cu un a) singur master și un singur slave; b) [anonimizat]. c) Rețea de tip scatternet[15] 39

Figura 4.5 [anonimizat] 40

Figura 5.1 Structura unui proiect realizat folosind mediul de dezvoltare Android Studio 41

Figura 5.2 Exemplu de fișier AndroidManifest.xml 42

Figura 5.3 Mediul de dezvoltare Android Studio 43

Figura 6.1 Import al unei librării 46

Figura 6.2 Tabelul versiunilor Android 47

Figura 7.1 Platformă robotică asamblată 51

Figura 7.2 Platformă robotică asamblata 52

Figura 7.3 [anonimizat] 53

Figura 7.4 Setarea unei parole pentru accesarea meniului IOIO 53

Figura 7.5 Afișare adresă IP prin intermediul telefonului IOIO 54

Figura 7.6 Introducerea adresei IP și a parolei pentru accesarea meniului Controller 54

Figura 7.7 Accesarea meniului Controller 54

Figura 7.8 Realizarea unei fotografii prin intermediul telefonului IOIO 55

Figura 7.9 Salvarea unei fotografii în memoria internă a dispozitivului Android 55

LISTĂ TABELE

Tabel 2.1 Lista de pini ai integratului L298[3] 22

Tabel 2.2 Stările unui motor conectat la puntea H 23

Tabel 3.1 Pinout-ul conectorului Micro USB[6] 25

Tabel 4.1 Clasificarea dispozitivelor Bluetooth[15] 37

[anonimizat] – Aplicație de programare a interfeței cu utilizatorul;

APK – [anonimizat];

DC – [anonimizat];

EDR – [anonimizat] – Frequency Hopping Spread Spectrum;

GPIO – General-Purpose input/output – Pini de intrare/ieșire cu scop general;

I2C – Inter-Integrated Circuit;

IP – Internet Protocol;

LCD – [anonimizat];

LED – Light-[anonimizat];

Mbps – Mega bits per second;

MCLR – Master Clear Enable;

OTG – On The GO;

PWM – Pulse Width Modulation;

RAM – Random Access Memory;

SCL – Clock Signal;

SDA – Data Signal;

SDK – Software Development Kit – Kit de dezvoltare software;

SMD – Surface Mounted Device – Dispozitive montate pe suprafață;

SPI – Serial Peripheral Interface – Interfață periferică serială;

TQFP – Thin Quad Flat Pack;

TTL – Tranzistor Tranzistor Logic;

UART – Universal Asynchronous Receiver/Transmitter;

USB – Universal Serial Bus – Magistrală Serială Universală;

V – Volt;

Introducere

În această lucrare va fi

Capitolul 1 : SCHEMA BLOC A PLATFORMEI ROBOTICE

Figura 1.1 Schema bloc a platformei robotice

Alimentarea platformei mobile este asigurată de o carcasă de patru baterii ce oferă o tensiune de alimentare de 6 volți.

Tensiunea generată de acestea este folosită pentru alimentarea punții H de tip L298N. Această componentă electronică permite celor două motoare de tip curent continu să funcționeze în ambele sensuri de deplasare.

Deoarece puntea H poate genera la pinii conectorilor tensiunea externă de 5V, alimentarea plăcuței IOIO OTG se va efectua prin intermediul punții H.

Pentru a realiza conexiunea Bluetooth între dispozitivul mobil ce înregistrează și dispozitivul mobil de control, ce primește imaginile filmate, plăcii de dezvoltare IOIO i s-a atașat un adaptor Bluetooth de clasa a doua. Acesta funcționează la frecvența de 2,4GHz și poate menține conexiunea între cele două dispozitive pentru o distanță maximă de 10 metri.

Capitolul 2 : PLATFORMA ROBOTICĂ

Figura 2.1 Platforma robotică neasamblată [1]

Platforma robotică este alcătuită dintr-un șasiu din material plastic ce permite asamblarea pe suprafața acestuia a tuturor componentelor necesare pentru funcționarea robotului.

Pe lângă componentele electronice, platforma mobilă mai conține și două roți conectate direct la motoarele de curent continuu pentru deplasarea înainte, înapoi cât și o a treia roată ce permite platformei mobile realizarea mai ușoară a virajelor.

Placa de dezvoltare IOIO OTG a fost fixată pe șasiul de plastic prin intermediul a trei șuruburi de dimensiuni M3, astfel oferindu-se o stabilitate mai bună a conexiunilor realizate prin cabluri.

Pentru realizarea fotografiilor se va folosi un al doilea telefon mobil cu sistemul de operare Android montat pe suprafața platformei prin intermediul unor componente mecanice de prindere și fixare.

Alimentarea platformei robotice

Pentru a asigura buna funcționare a platformei se vor folosi patru baterii de tip AA ce însumate vor asigura tensiunea de alimentare de 6V. Grupul de patru baterii va alimenta prin intermediul unor cabluri, puntea-H (Figura 2.5 Schema electrică a modulului L298N). Deoarece spațiul disponibil pe platforma robotică este limitat și pentru a nu folosi o a doua sursă de tensiune, alimentarea plăcii de dezvoltare IOIO OTG, se va face prin intermediul pinilor de ieșire plasați pe puntea H. Aceștia asigură tensiunea constantă de ieșire de 5V, necesară pentru alimentarea modulului.

Puntea dublă – H L298N

Cele două motoare care asigura deplasarea platformei robotice (2.3 Motorul de curent continuu) necesită un curent de o intensitate mare, astfel ele nu pot fi conectate direct la pinii de ieșire ai microcontroler, deoarece acesta nu poate genera un curent cu o asemenea intensitate. Valoarea maximă a curentului ce se poate regăsi la pinii microcontrolerului PIC24FJ256 este de aproximativ 18 mA, în timp ce pentru acționarea unui motor sunt necesari până la 2 amperi.

Astfel, este necesară separarea semnalelor de comandă de circuitul de putere și acest lucru se realizează prin folosirea unei punți – H

„O punte H este un circuit electronic ce permite aplicarea unei tensiuni pe o sarcină în orice sens. Aceste circuite sunt adesea folosite în robotică pentru a permite motoarelor de curent continuu să ruleze înainte și înapoi.

Denumirea de puntea H derivă de la modul de desenare al circuitului, așa cum se poate observa în Figura 2.2. Aceasta este singura cale de tip solid state de a comanda un motor în ambele direcții de deplasare.

Figura 2.2 Schema simplificată a unei punți H (S1-S4 : întrerupătoare, M : motor) [2]

Modul general de funcționare al punții H este : atunci când întrerupătoarele S1 și S4 sunt închise și S2 și S3 sunt deschise o tensiune pozitivă va fi aplicate la nivelul motorului, generând o mișcare de rotație a motorului într-un sens.. Prin deschiderea întrerupătoarelor S1 și S4 și închiderea întrerupătoarelor S2 și S3, această tensiune este inversat, astfel se permite funcționarea inversă a motorului.

De obicei, întrerupătoarele S1 și S4 sunt conectate la un semnal comun de control „In1” în timp ce întrerupătoarele S2 și S3 sunt conectate la un alt semnal comun de control „In2”.

Pentru a evita provocarea unui scurt-circuit la sursa de tensiune, oricare două întrerupătoare aflate pe aceeași linie (S1 și S2 sau S3 și S4) nu trebuie să fie închise în același timp. De asemenea nici cele două semnale de control In1 și In2, care selectează sensul de rotație al motorului nu trebuie să fie ambele active la același moment de timp. ”[2]

Stările în care se pot afla cele patru întrerupătoare sunt prezentate în Figura 2.3.

Figura 2.3 Stările întrerupătoarelor S1-S4 [2]

Pentru acest proiect, s-a ales puntea H dublă L 298N, având întrerupătoarele realizate din tranzistoare bipolare, de tipul npn.

Figura 2.4 Modulul L298N [2]

Circuitul integrat ce se găsește pe acest modul electronic are aceeași denumire, L298. Driverul L298 este un circuit integrat, monolitic de voltaj și curent mare, ce este disponibil în capsulele Multiwatt15 (L298N) și PowerSO20(L298P).

Pentru această componentă electronică s-a folosit capsula Multiwatt15. Deoarece curentul maxim până la care se asigură buna funcționare a integratului este de 3-4 amperi, iar tensiunea de alimentare poate ajunge până la 46V, producătorul a ales folosirea unui radiator pentru a asigura o răcire rapidă a integratului.

În cadrul acestui proiect, modulul L298N va fi alimentat la tensiunea constantă de 6 volți, iar pentru funcționarea celor două motoare de curent continuu vor fi necesari aproximativ 3 amperi. Pentru determinarea puterii maxime folosim formula :

=6*3=18W

Astfel, am determinat că puntea H va genera o putere de 18W, valoare aflată sub nivelul de 25W, dat de producător ca fiind nivelul unde răcirea este necesară.

Acest modul reprezintă o punte H dublă (poate controla două motoare de curent continuu) proiectată să accepte nivele logice standard TTL pentru control. Circuitul integrat poate fi folosit pentru a controla relee și motoare în curent continuu sau pas cu pas.

Denumirea pinilor și funcționalitatea fiecăruia se poate observa în Tabelul 2-1.

Tabel 2.1 Lista de pini ai integratului L298[3]

Figura 2.5 Schema bloc a integratului L298[3]

Fiecare punte a circuitului integrat L298 prezentată în Figura 2.5 este controlată de patru porți logice care au ca semnale de intrare : In1, In2, EnA și In3, In4, EnB. Cele două semnale de intrare denumite In1 și In2 setează starea punții atunci când semnalul En respectiv este pus în 1 logic. Altfel, dacă En este în starea 0 logic, puntea nu funcționează.

Semnalele din emitorul fiecărui tranzistor din partea de jos a schemei electrice sunt conectate împreună și au asociate un pin extern unde se poate conecta un rezistor. În acest fel se poate măsura curentul de ieșire.

De asemenea circuitul integrat prezintă un pin de alimentare adițional în cazul în care se dorește conectarea la o tensiune mai joasă.

Un motor conectat la puntea H poate fi în următoarele faze:

Tabel 2.2 Stările unui motor conectat la puntea H

În Figura 2.5 se poate observa schema electrică a modulului L298N.

Figura 2.6 Schema electrică a modulului L298N[4]

Pe lângă circuitul integrat L298N, modulul mai conține 8 diode cu răspuns rapid. Tensiunea de ieșire măsurată la pinii 1 și 15 (Pinii SenseA respectiv SenseB) poate fi folosită pentru a controla amplitudinea curentului de ieșire, limitând semnalul de intrare sau poate fi folosit pe post de protecție la supracurent, în acest caz punând pinul EnA sau EnB în 0 logic.

Pe lângă componentele menționate și conectori de legătură, modulul mai conține și un regulator de tensiune 78M05 fabricat de compania ON Semiconductor, cu rolul de a asigura funcționarea modulului și la tensiuni mai mici de 12V.

Acesta poate fi alimentat la tensiuni de până la 24V, iar la ieșire asigură tensiunea constantă de 5V.

Cu ajutorul rezistenței R1, în valoare de 1K, s-a setat curentul de ieșire de 5mA, necesar pentru a aprinde LED-ul D9, care are rolul de a asigura utilizatorul că regulatorul de tensiune funcționează.

Condensatoarele electrolitice C1 și C2 au rolul de a filtra tensiunea de intrare VCC.

Motorul de curent continuu

Pentru a asigura deplasarea platformei robotice s-au folosit motoarele de curent continuu. Acestea convertesc energia electrică în lucru mecanic.

„Viteza de rotație a unui motor este proporțională cu tensiunea de alimentare de la bornele acestuia, iar direcția de rotație depinde de polaritate (conectarea celor două fire de alimentare ale motorului la +VCC și GND, sau vice-versa).

Motoarele au cutie de viteze (reductor de turație) cu raport de 1:48, ceea ce înseamnă că pentru o rotație completă a axului extern se efectuează de fapt 48 de rotații ale motorului electric. Folosirea unui reductor are avantajul că mărește forța de acționare, cu costul vitezei. ”[2]

Figura 2.7 Motor DC cu reductor de turație 1:48[2]

Capitolul 3 : COMANDA DIGITALĂ

Placa de dezvoltare IOIO OTG

„IOIO OTG este o placă de dezvoltare, realizată special pentru a le permite utilizatorilor să adauge noi funcționalități și capabilități aplicațiilor Android, atât pentru mobil cât și pentru aplicațiile pentru sistemele desktop.”[8]

Abrevierea OTG vine de la expresia „On-The-Go”. Expresia face referire la dispozitivele USB, tablete sau telefoane inteligente, ce pot funcționa pe post de „gazdă”, permițând dispozitivelor precum carduri de memorie, camere digitale sau tastaturi să se conecteze la acestea.

Această caracteristică permite dispozitivelor electronice să-și schimbe continuu rolul de transmițător sau emitor în cadrul unei transmisii de date. De exemplu, un telefon mobil poate citi datele de pe un card de memorie și în același timp poate fi el însuși un mediu de stocare a datelor atunci când este conectat la un calculator personal.

În timpul transmisiei de date, între cele două dispozitive electronice se creează o legătură de comunicare. Dispozitivul care controlează această legătură este numit dispozitiv principal sau „master” în timp ce celălalt este denumit dispozitiv secundar sau „slave”.

Figura 3.1 Placa de dezvoltare IOIO OTG[5]

Placa de dezvoltare IOIO conține un conector Micro USB. Acesta este folosit pentru a conecta diferite dispozitive la placa de dezvoltare.

În cadrul acestui proiect, un adaptor Bluetooth (Subcapitolul 4.2 Comunicația wireless Bluetooth 2.0+EDR) a fost conectat la acest port USB.

Aranjamentul pinilor și rolul acestora în cadrul conectorului fac parte dintr-o implementare standard, așa cum se poate observa și în Tabel 3-1 Pinout-ul conectorului Micro USB .

Tabel 3.1 Pinout-ul conectorului Micro USB[6]

„Interfața USB folosește un mod de comunicare serial. Aceasta folosește două semnale diferențiale pentru a realiza conexiunea (Data – și Data + ).

Transmisia este de tip half-duplex(transmisia se poate realiza în ambele direcții, de la transmițător la receptor sau invers, dar nu simultan), lucru ce ajută la combaterea interferențelor electromagnetice în cazul în care se folosesc cabluri de lungimi foarte mari.”[6]

Conectorul USB montat pe placa de dezvoltare este de tipul AB. Acesta suportă inserarea atât a conectorului de tip micro-A cât și a conectorului de tip micro-B. Astfel, în cazul în care este inserat un conector de tip A, placa de dezvoltare se va comporta ca un dispozitiv de tip gazdă („master”), iar în cazul unui conector de tip B, aceasta va fi ca un dispozitiv periferic („slave”).

Cum conectorii de tipul micro-A nu sunt ușor de găsit, placa de dezvoltare poate fi pusă în modul „master”, forțat, prin acționarea întrerupătorului prezent pe placă, mutându-l din poziția A în poziția H. În această situație, producătorul sugerează ca placa de dezvoltare să nu fie conectată la un calculator personal.

Identificarea tipul de conector se face prin pinul numărul 4, pinul ID.

Un alt mod de a selecta tipul de dispozitiv, gazdă sau periferic, este prin implementare software.

Pentru a realiza conexiunea cu un dispozitiv Android, un cablu USB de tip „mamă” va fi necesar, în acest caz placa va acționa ca o gazdă, va fi un dispozitiv de tip „master” și în cazul în care va fi necesar va putea chiar încărca dispozitivul Android.

Placa de dezvoltare poate asigura prin intermediul conectorului USB, tensiunea constantă de +5V. În cadrul schemei electrice, această tensiune de +5V poartă denumirea de VBUS:

Circuitul de alimentare al unui dispozitiv Android este realizat din două tranzistoare MOSFET ce asigură faptul că atunci când semnalul HOST are nivelul logic de 1 și ieșirea circuitului care reprezintă tensiunea de alimentare a unui dispozitiv Android este tot 1, deci dispozitivul se poate încărca.

De asemenea, rezistența R2 s-a ales de valoare foarte mare, 100KΩ, pentru a elimina posibilitatea ca semnalul HOST să fie într-o stare logică incertă pentru baza tranzistorului astfel încât tranzistorul Q2 să se deschidă accidental. Potențiometrul R3 are rolul de a asigura valoarea parametrilor de ieșire necesari pentru o încărcare la tensiune și curent constant.

Dioda Schottky D1 și siguranța F1 au rol de protecție în cazul în care apar curenți mai mare de 750mA sau în cazul unei cablări greșite a conectorului de alimentare. Căderea de tensiune pe dioda D1 este de aproximativ 0,3V.

Figura 3.2 Circuitul de încărcare al unui dispozitiv Android[7]

Alimentarea plăcii de dezvoltare IOIO OTG

Alimentarea plăcii de dezvoltare IOIO OTG se poate realiza prin mai mult moduri.

Figura 3.3 Pinii de alimentare ai plăcii de dezvoltare IOIO OTG[5]

„Atunci când placa de dezvoltare are statutul de „slave” în cadrul unei transmisii de date (de exemplu atunci când este conectată la un calculator personal), aceasta poate fi alimentată prin intermediul conectorului USB sau de la o sursă de tensiune externă. În cazul în care sunt conectate ambele, prioritatea mai mare în cazul alimentării o are sursa externă de tensiune.

Însă, în cazul în care placa este conectată ca un dispozitiv „master” (de exemplu când este conectată la un adaptor Bluetooth), placa IOIO trebuie alimentată folosind o sursă de tensiune externă și trebuie să asigure valorile necesare de curent și tensiune pentru conectorul USB astfel încât să poată asigura alimentarea dispozitivului conectat prin interfața USB:

Modul cel mai frecvent utilizat pentru a asigura alimentarea corectă a plăcii de dezvoltare, este prin conectarea unei surse externe de tensiune la conectorul de alimentare. Conectorul SMD cu doi pini, suportă o tensiune de intrare cuprinsă între 5V și 15V.”[9]

De asemenea, se pot folosi și pinii plasați pe marginea plăcii de dezvoltare. Acolo putem găsi nouă pini cu potențialul de 0V (planul de masă al plăcii de dezvoltare), trei pini de ieșire având tensiunea de 3,3V, trei pini de ieșire cu tensiunea de 5V sau un rând de trei pini de intrare care pot fi folosiți drept alternativă la conectorul de alimentare SMD .

În timpul alimentării, o diodă LED de control, de culoare roșie, se va aprinde, pentru a evidenția buna funcționare a circuitelor.

Figura 3.4 Schema electrică a secțiunii de alimentare a plăcii de dezvoltare IOIO OTG[7]

Integratul U2, TPS62133, este un convertor coborâtor de tensiune, de tip buck, produs de compania Texas Instruments.

Acesta suportă o tensiune de intrare cuprinsă între minim 3V și maxim 17V și un curent maxim de 3 Amperi și oferă la ieșire tensiunea constantă de 5V.

La pinii de ieșire ai integratului s-a adăugat un filtru LC cu rolul de filtrare al tensiunii de ieșire.

De asemenea, condensatoarele C8, C9 și C11 plasate lângă pinii de intrare ai integratului au rolul de a filtra tensiunea de intrare și de a proteja integratul în cazul unor vârfuri de tensiune peste maximul suportat de acesta.

Tensiunea de 5V este disponibilă de asemenea și la pinii plasați pe marginea plăcii (în dreptul marcajului „5V” .În cazul în care un dispozitiv este conectat prin interfața USB, acesta poate consuma până la 500mA, rămânând astfel aproximativ 2,5 amperi pentru dispozitivele periferice.

Dioda D2 are rolul de a proteja convertorul de tensiune în cazul aplicării unei tensiuni inverse la pinii conectorului SMD.

Deoarece microcontrolerul PIC24FJ funcționează la tensiunea de 3,3V, s-a folosit un al doilea convertor de tensiune, U3, MIC5216. Acesta generează la ieșire un curent de 500mA.

Pentru funcționarea microcontrolerul PIC24FJ în parametrii normali sunt necesari aproximativ 30mA, astfel rămânând peste 400mA pentru diferitele dispozitive periferice ce pot fi alimentate de la această tensiune.

Precum în cazul tensiunii de 5V, și tensiunea de 3,3V este disponibilă la pinii plasați pe marginea plăcii de dezvoltare, în dreptul marcajului „3.3V”. Acești pini pot fi folosiți exclusiv ca pini de ieșire. În cazul în care sunt conectate la tensiunea de 3,3V foarte multe dispozitive periferice, regulatorul de tensiune se poate încălzi foarte repede. Cu toate că acesta este protejat intern împotriva curenților prea mari sau a temperaturilor mari, și se va închide automat, producătorului componentei sugerează utilizatorilor să nu conecteze dispozitive ce pot consuma mai mult de 100 de mA.

Microcontrolerul PIC24FJ256DA206

Placa de dezvoltare conține un microcontroler PIC24FJ256DA206 produs de compania Microchip. Acesta are rolul de a face legătura între aplicația Android instalată pe dispozitivul utilizatorului și perifericele conectate la placa IOIO prin interfețele GPIO, I2C SPI, UART.

Microcontrolerul PIC24FJ este alimentat la tensiunea de 3,3V și este asamblat pe placa de dezvoltare într-o carcasă de tip TQFP cu 64 de pini.

Lățimea magistralei de date a microcontrolerului este de 16 biți iar lățimea magistralei de adrese este de 24 de biți, cu posibilitatea de a muta informațiile între blocurile de date și de memorie.

PIC24FJ256 are integrat modul de control grafic ce permite microcontrolerului să comunice cu un display LCD și conține o memorie RAM de 96Kbiți și o memorie flash programabilă de 256Kbiți ce poate suporta până la 10 000 de cicluri de ștergere, scriere.

Acesta suportă tehnologia USB 2.0 împreună cu opțiunea OTG (On-The-Go). În acest fel, modulul USB poate trece în mod dinamic între stările de master sau slave. De asemenea, microcontrolerul are integrat în chipul său un regulator de tensiune ce asigura voltajul de 1,V și un regulator de tensiune de tipul boost, ce este activat în momentul în care microcontrolerul este în starea master în cadrul unei comunicații de date și este necesară încărcarea unui dispozitiv periferic.

Viteza cu care se pot transmite datele variază de la 1,5Mbps și poate ajunge până la 12 Mbps.

Din punct de vedere al transmisiei seriale a datelor, microcontrolerul încorporează trei module independente de comunicație I2C, ce suportă atât modul de operare atât de master cât și de slave. De asemenea, pune la dispoziția utilizatorului patru canale de comunicație UART și trei module de comunicație prin intermediul interfeței SPI.

Figura 3.5 Diagrama bloc a microcontrolerului PIC24FJ256DA2[10]

De asemenea, o altă caracteristică importantă a microcontrolerul o reprezintă rezoluția convertorului analogic digital, care este de 10 biți. Rezoluția convertorului reprezintă numărul de valori discrete pe care aceste le poate genera la ieșirea sa în intervalul de măsură.

Deoarece rezoluția convertorului este de 10 biți, atunci el poate furniza 210 = 1024 valori diferite. Dacă gama de măsura este de la 0V la 3,3V, acest lucru înseamnă că rezoluția de măsurare va fi :

0.0032V=3.2mV

Arhitectura microcontrolerului este de tip Harvard modificată și de asemenea are un set redus de instrucțiuni.

„Arhitectura Harvard modificată se obține prin realizarea unei căi hardware suplimentare, de legătură între magistrala de instrucțiuni și magistrala de date.

Aceasta permite memoriei de program să stocheze și blocuri de date, care nu se modifică în timpul execuției programului. Ele pot fi doar citite de către microcontroler prin instrucțiuni speciale.

Se elimina astfel un dezavantaj major al arhitecturii Harvard, putându-se inițializa memoria de date la începutul programului, la valori predefinite din memoria de program.” [11]

Figura 3.6 Implementarea microcontrolerului PIC24FJ256DA206 în schema electrică a plăcii de dezvoltare IOIO OTG[7]

Pentru a asigura o tensiune de alimentare constantă, s-au adăugat patru condensatoare cu rol de filtrare pe pinii de alimentare ai microcontrolerului.

În Figura 3.6 se poate observa conexiunea dintre microcontroler și conectorul micro USB de tip AB, conector ce respectă implementarea standard a pinilor prezentată în Tabel 3.1.și de asemenea legătura realizată între pinul de identificare a stării microcontrolerului (master sau slave) și un întrerupător ce poate forța intrarea într-una din aceste stări.

Deoarece PIC24FJ256 poate genera până la 18mA pe pinii de intrare sau ieșire, la pinul 39, denumit boot, s-a adăugat o diodă LED de culoare galbenă conectată la tensiunea de alimentare de 3,3V prin intermediul unei rezistențe de limitare a curentului de 750Ω, pentru a evidenția momentul în care microcontrolerul este în starea de actualizare a software-ului, capitolul 4.1 Actualizare software microcontroler IOIO OTG.

Pentru funcționarea corectă a regulatorului intern de tensiune, producătorul sugerează adăugarea unui condensator electrolitic pe pinul VCAP, iar acesta nu trebuie să fie conectat la tensiunea de alimentare de 3,3V.

Pinul MCLR al microcontrolerului este de tipul active low, acesta va fi activ doar în momentul în care va fi conectat la planul de masă al plăcii de dezvoltare, de 0V.

„Acest pin poate îndeplini două funcții : resetarea circuitului integrat și ajută la programarea și depanarea codului software. Astfel, în cazul în care nu s-ar fi dorit actualizarea software-ului microcontrolerului, pinul MCLR ar fi fost conectat direct la tensiunea de alimentare de 3,3V.”[10]

Însă, deoarece suportul software pentru placa de dezvoltare IOIO OTG este într-o continuă dezvoltare, noi versiuni de software apar la un timp regulat. Astfel a fost necesară o configurație de două rezistențe și un semnal de control, P7 conectat la un pin plasat pe placa de dezvoltare. În acest fel, atunci când se dorește actualizarea software a microcontrolerului sau o resetare a acestuia, simpla conectare a pinul P7 la planul de masă al plăcii de

Cele două valori pentru rezistențele R1 și R2 au fost alese din foaia de catalog a producătorului.

Aranjamentul pinilor pentru placa de dezvoltare IOIO OTG

Pe lângă pinii de alimentare plasați pe marginea plăcii de dezvoltare, mai putem găsii și 52 de pini de semnal, ce pot fi folosiți atât pe post de semnale de intrare, cât și ca semnale de ieșire.

Figura 3.7 Pinout IOIO OTG[5]

Numitorul comun pentru toți acești pini îl reprezintă faptul că toți pinii pot fi folosiți drept intrări sau ieșiri digitale având referința de 3,3V.

Pentru a putea folosi placa de dezvoltare mult mai ușor, producătorul a realizat un cod grafic pe partea din spate a plăcii, împreună cu legenda acestuia. Astfel :

„Pinii marcați cu un pătrat pot fi folosiți drept intrări analogice cu referința de 3,3V. Aceștia sunt în număr de 16 și pot măsura nivelurile de tensiune cuprinse în plaja de valori 0-3,3V cu o precizie de 3mA. În cazul în care acești pini se alimentează cu o tensiune mai mare, există riscul de a strica structura hardware a plăcii de dezvoltare.”[12]

„Pinii încercuiți cu un cerc pot suporta tensiunea de alimentare de 5V. Aceștia pot fi folosiți drept pini digitali de intrare pentru semnale cu referința de 5V sau pot genera nivelul logic de +5V folosind rezistențe de pull-up.

Starea în care se poate găsi unul dintre acești pini, 0 logic sau 1 logic se poate seta prin implementare software sau prin intermediul tensiunilor conectate. Astfel, starea logică de 0, se va obține prin conectarea pinului la planul de masă al plăcii de dezvoltare, în timp ce starea logică de 1, se va obține prin conectarea la 5V.”[13]

Pinii marcați cu litera „P” vor putea fi folosiți drept intrări sau ieșiri pentru semnale digitale cu factorul de umplere variabil, de exemplu semnale PWM .

Un semnal digital de tip PWM are o anumită structură, perioada semnalului este fixă. La fiecare început al unei perioade, semnalul trece din starea logica 0 în starea logică 1. Durata pentru care semnalul stă în starea logica 1 se numește lățimea semnalului. Raportul între perioada semnalului și lățimea acestuia reprezintă factorul de umplere al semnalului PWM și se exprimă în procente.

De asemenea, un alt aspect important al semnalelor PWM, îl reprezintă frecvența acestora. Frecvența reprezintă numărul de perioade realizate într-o secundă.

Având aceste specificații, semnalele PWM pot aproxima un semnal analogic.

De exemplu, în cazul unui semnal cu factorul de umplere de 10% și cuprins în plaja de valori 0-3,3V, tensiunea medie a semnalului va fi de 0,33V (factorul de umplere x tensiunea maximă a semnalului). În cazul în care se dorește comandarea unui LED cu un astfel de semnal, înseamnă că LED-ul va fi aprins pe o durată de 10% dintr-o perioadă și stins pentru 90% din perioadă. Dacă trecerea din starea 1 logic (în care LED-ul este aprins) în starea 0 logic (în care LED-ul este stins) este destul de rapidă, ochiul uman nu va percepe stingerile repetate ci va observa că LED-ul va avea o strălucire de 10% din strălucirea maximă.

Folosind același principiu, un semnal cu factorul de umplere de 50% aplicat unui motor DC (2.3 Motorul de curent continuu) va face ca motoarele să funcționeze la jumătate din viteza maximă pentru care au fost produse. Dacă în cazul LED-urile, acestea se pot conecta direct la un semnal de tip PWM, prin intermediul unei reziste pentru a limita curentul, în cazul motoarelor, este necesară folosirea unei punți de tranzistoare (2.2 Puntea dublă – H L298N) pentru a comanda turația și sensul de rotație al acestora.

Pinii marcați cu grupul de litere „Pi” pot fi folosiți doar drept pini de intrare pentru semnalele de tip PWM.

Pinii marcați cu grupurile de litere „DA” și „CL” pot fi folosiți pentru semnale de date sau semnale de ceas, folosind interfața I2C. Folosind acești pini, se poate realiza transferul serial de date în mod half-duplex. Oricare dintre dispozitivele ce iau parte la transferul de date pot fi atât „master” cât și „slave”, însă doar dispozitivele „master” vor putea începe transferul propriu-zis.

Placa de dezvoltare IOIO OTG se poate conecta simultan ca dispozitiv „master” la maxim trei magistrale de date. Aceasta poate efectua prin intermediul magistralei de date citirea sau scrierea informațiilor.

Fiecare dispozitiv de tip „slave” are o adresă de date unică în cadrul sistemului, astfel se poate face selecția de către dispozitivul transmițător, de tip „master” a dispozitiv „slave” căruia să trimită datele.

În mod standard, denumirea celor două semnale din cadrul interfeței I2C se numesc SDA (semnalul de date) și SDL(semnalul de ceas). În cazul ambelor semnale sunt necesare rezistențe de pull-up la tensiunea de 3,3V sau 5V.

Semnalul de ceas este controlat de către dispozitivul master, în timp prin intermediul semnalul SDA se transmit date.

Capitolul 4 : CONEXIUNEA BLUETOOTH

Pe lângă numărul foarte mare de pini disponibili, placa de dezvoltare IOIO OTG oferă posibilitatea utilizatorilor să adauge un adaptor Bluetooth prin intermediul conectorului USB prezentat în Capitolul 3.1 Placa de dezvoltare IOIO OTG.

Odată cu apariția versiunii de firmware 3.1, IOIO OTG a putut comunica cu dispozitivele Android prin intermediul comunicării Bluetooth.

Actualizare firmware microcontroler IOIO OTG

Deoarece placa de dezvoltare IOIO OTG a avut preinstalat un firmware anterior variantei 3.1 a fost necesar o actualizare a acestuia.

„Codul firmware al plăcii de dezvoltare IOIO este compus din două programe software, ambele instalate în memorie flash a microcontrolerului la adrese diferite. Unul dintre aceste două programe este denumit în manualul de utilizare drept „Aplicația”. Acest program rulează în mod curent, și permite realizarea conexiunii cu un dispozitiv Android. De asemenea, acest program poate fi actualizat în cazul în care o nouă versiune de software este disponibilă.

Al doilea program din cadrul codului firmware, îl reprezintă programul Bootloader. Singurul rol al acestui program este de a actualiza partea de firmware denumită „Aplicația” .

De fiecare dată când placa de dezvoltare IOIO este alimentată, microcontrolerul prin intermediul programului Bootloader verifică dacă semnalul de la pinul 39, boot, este conectat la planul de masă, și în cazul în care nu este conectat la 0V, acesta rulează codul din firmware denumit „Aplicația”. Această verificare se realizează atât de repede, încât nu este sesizabilă de utilizator.

Însă, în cazul în care se dorește o actualizare a firmware-ului, semnalul boot este conectat cu ajutorul unui cablu la orice pin prezent pe placa de dezvoltare marcat cu textul „GND” . Astfel, la conectarea plăcii de dezvoltare la un calculator personal, microcontrolerul va intra într-o stare de actualizare și va putea suprascrie codul firmware, „Aplicația”, instalat deja cu cel actualizat.”[14]

Primul pas din cadrul actualizării firmware-ului îl reprezintă descărcarea ultimei versiuni de software recomandate de către producător. În cazul acesta, este vorba de versiunea 5.06.

Figura 4.1 Actualizare firmware IOIO OTG

Cu ajutorul unui cablu de tipul mamă-mamă, pinul boot este conectat la semnalul GND și placa de dezvoltare IOIO OTG este conectată la un port USB al calculatorului personal. În acest moment ambele LED-uri prezente pe placa de dezvoltare se vor aprinde (semnalul boot este conectat de asemenea și la dioda LED de culoare galbenă și prin conectarea semnalului la GND este forțată aprinderea diodei LED).

După ce cablul de conectare a fost îndepărtat, dioda LED de culoare galbenă a clipit, acest lucru indicând faptul că microcontrolerul a intrat în starea de actualizare a firmware-ului. După acest pas, placa de dezvoltare va apărea de asemenea și în meniul Device Manager al calculatorului, având asignată un port USB de comunicație.

Pentru suprascrierea codului firmware, folosind fereastra Windows de comandă, s-a folosit comanda : “ioiodude –port=<număr_port> –reset write <versiune_nouă_firmware>.ioioapp”.[5]

Figura 4.2 Comandă Windows pentru actualizare firmware IOIO OTG

În Figura 4.3 se poate observa ultima versiune instalată, atât a software-ului bootloader, cât și pentru partea de firmware denumită „Aplicația” .

Figura 4.3 Versiune actualizată a software-ului

În acest mod s-a realizat actualizarea firmware-ului plăcii de dezvoltare IOIO OTG.

Comunicația wireless Bluetooth 2.0+EDR

„Tehnologia Bluetooth este o conexiune radio pentru distanțe scurte (de la câțiva metri, până la zeci de metri), realizată pentru a înlocui cablurile ce conectează dispozitivele fixe sau dispozitivele electronice portabile. Principalele atuuri ale tehnologiei sunt : robustețea, consumul redus de energie, prețul redus al modulelor Bluetooth și complexitatea scăzută a realizării conexiunilor. Multe caracteristici ale tehnologiei Bluetooth diferă în funcție de implementările folosite de producătorii de dispozitive electronice.

Fiecare dispozitiv ce poate comunica folosind tehnologia Bluetooth este încadrat într-una din clasele din Tabelul 4 .1.

Tabel 4.1 Clasificarea dispozitivelor Bluetooth[15]

Nucleul tehnologiei Bluetooth îl reprezintă conexiunea realizată între emițător și transmițător în banda de frecvențe radio, stiva de protocoale și banda de bază.

Comunicațiile Bluetooth funcționează la frecvența de bază de 2,4 GHz. Pentru a diminua interferențele în timpul transmisiei de date, se folosesc dispozitive electronice de tipul transceivere. Acestea sunt alcătuite dintr-un emițător și un receptor de bandă care realizează salturi de frecvență. Transmisia de date se realizează pe mai multe canale de comunicație.

Rata maximă de transfer a informațiilor este de 1 Mbps iar în cazul în care modulul Bluetooth dispune și de tehnologia EDR, rata de transfer poate ajunge până la 3 Mbps.

Modulația datelor transmise este o modulație cu deplasare în frecvență, în care filtrul trece jos folosit pentru limitarea spectrului este de tip Gaussian.

În timpul unei transmisii de date, canalul de comunicații radio este împărțit de un grup de dispozitive electronice sincronizate după un semnal de ceas. Dispozitivul „master” din cadrul grupului oferă sincronizarea cu semnalul de ceas. Restul dispozitivelor fiind de tipul „slave”.

Statutul de dispozitiv „master” este atribuit dispozitivului electronic care inițializează transferul de date.

Semnalul de ceas este format din 28 de biți și are o frecvență de 3,2 KHz.

Unele module Bluetooth pot fi configurate în așa măsură încât să poată funcționa într-o singură stare, „master” sau „slave”, însă majoritatea dispozitivelor își pot schimba starea, în funcție de modul de transmisie la care iau parte.

Un dispozitiv de tip „master” poate comunica cu până la șapte dispozitive de tip „slave” și cu până la 250 de dispozitive „slave” aflate în starea de „așteptare”.

Schimbarea frecvenței în timpul comunicațiilor Bluetooth, trecerea de la un canal de comunicație la alt canal, într-un spectru apropiat de banda de origine poartă numele de „frequency hopping spread spectrum”, FHSS.

Folosind această tehnologie, în Europa banda disponibilă se încadrează între 2400MHz și 2483,5 MHz și sunt valabile 79 de canale de comunicație spațiate la 1 MHz, iar după fiecare transmisie sau recepție, dispozitivul comută către o nouă frecvență, urmând un model de transfer dat de către dispozitivul „master”.

Canalul de comunicație este împărțit în unități de timp, denumite sloturi. Informația transmisă între două dispozitive Bluetooth este formată din pachete de date. Acestea sunt trimise folosind sloturile. Pentru transmiterea unui pachet de date se pot atribui sloturi consecutive. Transmisia datelor prin tehnologia Bluetooth este de tip full-duplex (fiecare dispozitiv poate transmite și primi date simultan).

Starea de dispozitiv „master” se referă doar la modul de realizare al sincronizării comunicației, folosind tehnologia FHSS. Astfel, dispozitiv master este cel care stabilește tiparul salturilor între canalele de frecvență (folosindu-se de adresa sa Bluetooth) și faza secvenței de salt ( folosind frecvența semnalului de ceas). În timpul unei transmisii de date între un dispozitiv master și mai multe dispozitive de tip „slave”, toate dispozitivele își schimbă frecvența simultan.

Un grup format din dispozitive electronice, sincronizate între ele formează o rețea de date de tipul picorețea. Acest tip de rețea constituie forma de bază a comunicațiilor prin intermediul tehnologiei Bluetooth. Toate dispozitivele ce alcătuiesc o picorețea își schimbă simultan frecvența de transmisie a datelor.

Avantajul folosirii acestei tehnologii, FHSS, față de o singură frecvență fixă, constă în interferențe radio reduse deoarece toate dispozitivele realizează acest salt la o frecvență aleatoare foarte repede. În cazul în care două dispozitive ajung pe același canal de frecvență, și apar coliziuni, datele pierdute constau într-un singur pachet de date și chiar și acela poate fi retransmis pe o altă frecvență.

De asemenea, un alt avantaj al folosirii tehnologiei FHSS reprezintă securitatea transferului datelor. Nivelul ridicat de securitate vine de la faptul că doar receptorul știe tiparul urmat de dispozitivul slave în timpul salturilor de la o frecvență la alta și modul de asamblare în final al tuturor pachetelor primite în cadrul unui mesaj.

În aceeași arie în care funcționează picorețeaua, mai pot exista dispozitive electronice ce nu comunică cu dispozitivul master, acestea aflându-se în starea de „așteptare”. De asemenea, un dispozitiv poate face parte din mai multe picorețele în același tip. În momentul în care două sau mai multe picorețele se suprapun în aceeași arie, chiar și parțial, se formează o rețea de tipul scatternet.

La fel ca și în cazul unei picorețele individuale, aceleași principii de funcționare se regăsesc și în cazul unei picorețele din cadrul unui scatternet.

Prin urmare, fiecare rețea are un singur dispozitiv master și mai multe dispozitive de tipul slave, care pot fi active sau în starea de „așteptare”.

Un dispozitiv de tip slave poate face parte din mai multe picorețele la anumite momente de timp, și în aria de acoperire poate stabili conexiuni și se poate sincroniza cu mai multe dispozitive „master”.

Figura 4.4 Picorețele cu un a) singur master și un singur slave; b) un master și multi-slave. c) Rețea de tip scatternet[15]

De asemenea, este posibil ca același dispozitiv să fie de tip slave într-o picorețea și de tip master într-o altă picorețea.

Topologia rețelei scatternet constituie un avantaj al tehnologiei Bluetooth, deoarece astfel dispozitivele realizează conexiuni multiple între ele.

De la momentul lansării tehnologiei Bluetooth (1998) și până în prezent, au fost publicate mai multe versiuni ale acestei tehnologii. Fiecare nouă versiune a adus îmbunătățiri și a rezolvat problemele cunoscute ale versiunilor anterioare.”[15]

Pentru această aplicația s-a ales un adaptor Bluetooth 2.0 având tehnologia EDR. Față de versiunile anterioare (v1.0, v1.1, v1.2), 2.0 aduce modul EDR ce suportă viteze de transfer între dispozitivele conectate de până la 3 Mbps, față de 1Mbps în versiunile anterioare.

Bluetooth Pairing

Pentru ca o aplicație Android să poată identifica placa de dezvoltare IOIO OTG și să înceapă transferul de date, mai întâi trebuie să se realizeze legătura prin Bluetooth între dispozitivul mobil pe care este instalată aplicația și adaptorul Bluetooth conectat la placa de dezvoltare.

Realizarea acestei legături poartă numele de pairing. Acest proces se realizează o singură data, prima dată, apoi dispozitivul mobil Android va putea inițializa transferul de date cu placa de dezvoltare.

Fiecare adaptor Bluetooth are propria adresă pentru realizarea comunicațiilor folosind tehnologia Bluetooth. Aceasta reprezintă ultimele patru cifre din denumirea dispozitivului atunci când se face o căutare de dispozitive Bluetooth disponibile în aria de acoperire.

Dacă s-ar fi folosit un alt adaptor Bluetooth, adresa s-ar fi schimbat, deoarece placa de dezvoltare IOIO nu reține adresele dispozitivelor Bluetooth și de asemenea, nu are o adresă proprie Bluetooth.

În cazul de față, adresa adaptorului este 76:54

Figura 4.5 Realizarea legăturii IOIO-dispozitiv Android

Pentru a finaliza legătura dintre dispozitivul Android și placa de dezvoltare a trebuit să introduc numărul PIN aferent plăcii.

Pentru această placă codul de securitate a fost 4545.

După realizarea legăturii între dispozitivul Android și placa de dezvoltare IOIO, se poate trece la realizarea software a aplicației Android ce va controla atât platforma robotică prezentată în Capitolul 2 cât și dispozitivul Android ce va fi fixat pe această platformă și va realiza fotografii.

Capitolul 5 : MEDIUL DE DEZVOLTARE ANDROID STUDIO

„Mediul de dezvoltare Android Studio este mediul oficial de dezvoltare pentru realizarea aplicațiilor Android, bazat pe editorul de cod IntelliJ IDEA. Printre avantajele mediului de dezvoltare, regăsim:

un mediu unic de dezvoltare cu suport pentru toate dispozitivele cu sistemul de operare Android.

Utilizatorul are posibilitatea de a încărca aplicația în dispozitivul mobil folosind funcția „Instant Run” fără a crea kitul de instalare, APK-ul acesteia.

Suport pentru limbajul de programare C++.

Posibilitatea de a folosi modele prestabilite de program pentru a ușura etapa creare a aplicației.

Structura unui proiect în Android Studio

Fiecare proiect realizat în mediul de dezvoltare Android Studio, conține unul sau mai multe module realizate din codul sursă și fișiere necesare pentru buna funcționare a aplicației. Aceste module sunt de forma unor librării sau module predefinite pentru aplicațiile Android sau aplicațiile Google.

Figura 5.1 Structura unui proiect realizat folosind mediul de dezvoltare Android Studio

În mod implicit, structura fiecărui proiect se poate observa în fereastra Android View. La fel ca în Figura 5.1, acest mod de vizualizare este organizat în funcție de modulele incluse în proiectul Android, astfel oferindu-se un acces rapid la fișierele importante din cadrul proiectului.

Fiecare proiect realizat în Android Studio, include modulele manifest, java și res.

Primul modul, manifest, conține fișierul AndroidManifest.xml. Fișierul trebuie să aibă exact acest nume. Prin intermediul acestuia sunt descrise informații esențiale mediului de dezvoltare, sistemului de operare Android și magazinului de aplicații Google Play. Una din informațiile din cadrul modului îl reprezintă numele aplicației, care în momentul creări pachetului de instalare se va înlocui cu un număr de identificare unic, care mai târziu va fi folosit de sistemul Android și magazinul de aplicații Google Play drept identificator unic pentru această aplicație.

De asemenea, modulul conține și componentele ce formează aplicația. Acestea includ activitățile, serviciile și furnizorii conținuturilor. Fiecare componentă trebuie să descrie informațiile tehnice și configurațiile dispozitivelor Android pe care urmează să fie instalată aplicația. Tot în cadrul acestui modul, sunt declarate și permisiunile de sistem de care va avea nevoie aplicația pentru a rula pe dispozitivul Android.

Figura 5.2 Exemplu de fișier AndroidManifest.xml

Cel de-al doilea modul din corpul principal al aplicației este denumit java. Acesta conține codul sursă al aplicației

Cel de-al treilea modul, îl constituie modulul res. Acesta include resursele aplicației ce nu reprezintă codul sursă, adică informații referitoare la interfața cu utilizatorul, imaginile sau animații din cadrul aplicației.

De asemenea, în cazul în care aplicația va putea fi instalată pe o gamă largă de dispozitive Android (telefoane inteligente sau tablete), în acest modul trebuie incluse fișiere de resurse adiționale. Aceste resurse adiționale conțin informații și configurări privind diferite rezoluții pentru ecranele dispozitivelor sau tipuri de caractere specifice anumitor limbi internaționale. Astfel, în momentul instalării aplicației pe unul dintre aceste dispozitive, aplicația trebuie să apeleze la aceste resurse adiționale și să se adapteze cerințelor sistemului Android.

Interfața cu utilizatorul

Fereastra principală a mediului de dezvoltare Android Studio este alcătuită din câteva blocuri care vin în ajutorul utilizatorului pentru a realiza aplicația Android dorită.

Figura 5.3 Mediul de dezvoltare Android Studio

În Figura 5.3 Mediul de dezvoltare Android Studio sunt evidențiate principalele blocuri și bare de navigație. Astfel regăsim:

Reprezintă bara de unelte care permite utilizatorului să realizeze diferite acțiuni, incluzând lansarea aplicați.

Bara de navigație ajută la navigarea printre documentele deja deschise și la editarea acestora mult mai repede. Aceasta oferă o alternativă mai compactă la fereastră Android View prezentată în subcapitolul anterior.

Fereastra de editare este zona unde se scrie și se editează codul sursă. Această fereastră se poate modifica în funcție de tipul fișierului în care se află utilizatorul. De exemplu, în cazul în care utilizatorul este în fișierul de editare al aspectului aplicației, fereastra de editare va fi în modul Layout Editor.

Bara de editare, plasată pe marginea mediului de dezvoltare, ajută utilizatorul să acceseze diferite unelte pentru editarea codului sursă și de asemenea în cazul în care sunt erori sau avertismente din partea mediului de dezvoltare privind codul sursă, în această zona vor fi afișate.

Cele două ferestre, oferă utilizatorului o serie de unelte ce ajută la îndeplinirea anumitor sarcini, cum ar fi gestionarea proiectului, realizarea de căutări în cadrul codului sursă sau verificarea și controlul versiunii codului. În cazul în care utilizatorul nu dorește să acceseze aceste funcții, cele două ferestre pot fi restrânse astfel obținându-se o zonă mai mare pentru fereastra de editare.”[16]

Capitolul 6 : IMPLEMENTARE SOFTWARE

Java

„Java este un limbaj de programare obiect-orientat, de uz general, bazat pe clase. Java rulează în prezent pe 3 miliarde de dispozitive conform Oracle, care a achiziționat limbajul de programare Java.

Kitul de dezvoltare Java este oferit gratis de cei de la Oracle și poate rula pe orice platformă sau sistem de operare. Programele scrise în Java pot executa instrucțiuni în mod concomitent în thread-uri și pot fi rulate pe orice platformă care suporta Java, după ce au fost compilate.

Limbajul de programare Java este bazat pe C++, însă s-au eliminat multe din noțiunile ce fac C++ să fie mai greu de folosit: pointeri, operator overloading – un caz particular de polimorfism, moștenire multiplă.

Java este un limbaj obiect orientat ceea ce înseamnă că toate elementele programate se găsesc în interiorul claselor. Clasele instanțiază obiecte care au diferite comportamente, stări și prin care se execută toate operațiunile (numite metode).”[17]

„O clasă este un tip de date special, un șablon după care pot fi construite obiecte cu diferite particularități. O clasă poate conține oricare dintre următoarele tipuri de variabile:

Variabile locale: se creează în interiorul unei metode sau unui constructor. Acestea sunt distruse după terminarea rulării metodei în interiorul căreia au fost create.

Variabile de instanță: se creează în interiorul unei clase, dar nu în interiorul unei metode. Pot fi folosite în cadrul unei clase de orice metodă sau constructor.

Variabile de clasă: se creează în interiorul clasei, în afara oricărei metode și sunt declarate cu specificatorul “static” ceea ce înseamnă că există o singură copie a acestei variabile, indiferent câte instanțe ale acelei clase există.”[18]

„Un constructor este o metodă al cărei rol este să construiască obiecte ( să aloce spațiu pentru ele) și să inițializeze variabilele de instanță (atribute) cu valori prestabilite.”[19]

Un obiect este o instanță a unei clase. El este creat în trei pași :

Se declară o variabilă cu un nume;

Se instanțiază obiectul folosind cuvântul „new”;

Inițializare: cuvântul „new” este urmat de numele metodei constructor create anterior.

Astfel se va crea a o instanță a clasei cu argumentele declarate în constructor și care va putea folosi metodele create în interiorul clasei.

Librăriile Android

„O librărie este o colecție de definiții de clase. Motivul pentru care se folosesc librării este posibilitatea refolosirii codului scris de alți dezvoltatori. Clasele și metodele pe care acestea le conțin definesc operații într-un domeniu specific de lucru.

Putem da ca exemplu librăriile pentru operații matematice pe care un programator le poate folosi fără a rescrie implementarea algoritmului matematic folosit: „commons math”.”[20]

Importul librăriilor în mediul de dezvoltare Android Studio

Pentru a folosi codul scris în librării externe unui proiect, aceste librării trebuie importate inițial.

Procesul de import și folosire a unei librării din cadrul acestui proiect – exemplificare pentru librăria „IOIOLib”, care conține clase necesare utilizării plăcii de dezvoltare IOIO OTG într-un proiect Android.

Pașii realizați sunt următorii:

Descărcarea librăriei din locația aleasă de dezvoltator: https://github.com/ytai/ioio/wiki/IOIOLib-Basics ;

Dezarhivarea fișierului ;

În fereastra View Project, în sub-meniul „External libraries”, se adaugă librăria conform Figurii 6.1.

Figura 6.1 Import al unei librării

În fișierul „build.gradle” se adaugă legătura cu aceasta librărie:

dependencies {

//

compile 'com.github.ytai.ioio:IOIOLibAndroid:5.05'

//

}

Pentru a permite importul librăriilor în proiect, trebuie date permisiuni pentru import. Acest lucru se face adăugând în fișierul AndroidManifest.xml, prezentat în subcapitolul 5.1 următorul tag:

<uses-permission android:name="android.permission.INTERNET" />

Librării Android

Odată importate librăriile necesare, ne putem folosi de clasele expuse de acestea și implicit, de metodele lor. În acest proiect am folosit librăriile:

Android Support

„Librăriile Android Support specifică pentru ce versiuni ale sistemului de operare Android va funcționa aplicația, precum și un set de caracteristici pe care le va avea aplicația. Am ales versiunea v4-22.2.1 (conform cu Figura 6.1) deoarece conține cel mai mare set de API-uri în comparație cu alte versiuni și include suport pentru componentele aplicației, elemente de interfață cu utilizatorul, elemente de accesibilitate și conectivitate.”[21]

Importul librăriei s-a realizat după modul prezentat în subcapitolul 6.2 . În fișierul „build.gradle” am adăugat dependenta:

compile 'com.android.support:support-v4:22.2.1'

Pentru a specifica cea mai veche versiune de Android compatibilă cu această aplicație, în același fișier se fac următoarele precizări:

android {

defaultConfig {

applicationId "app.anca.ioiorobot"

minSdkVersion 14

targetSdkVersion 25

}

//

}

Astfel, folosind tabelul versiunilor SDK pus la dispoziție de dezvoltatorii Android (prezentat în Figura 6.2), versiunea minimă a sistemului de operare Android necesară pentru instalarea aplicației este Android v4.0. Însă versiunea ideală, pentru rularea optimă este Android („Nougat”) 7, versiunea dispozitivului folosit pe post de controller.

Figura 6.2 Tabelul versiunilor Android

IOILibAndroid

IOIOLib este o colecție de librării care facilitează controlul asupra plăcii de dezvoltare IOIO.

„Librăriile expun un set de clase Java care acoperă diferite funcționalități ale plăcii. Când o aplicație trece prin procesul „Build”, librăria IOIOLib este împachetată într-un fișierul cu extensia .jar sau .apk generat de mediul de dezvoltare Android Studio. Așadar, aplicația nu necesită instalarea altor componente pentru a controla placa.”[22]

Librăria este împărțită în mai multe pachete de clase, următoarele pachete fiind folosite în acest proiect:

ioio.lib.api contine – API-urile necesare controlului plăcii de dezvoltare IOIO. Subpachetul ioio.lib.api.exception conține excepțiile aruncate de IOIO API, iar aceste excepții se folosesc pentru a depana eventuale probleme sau pentru a primi informații de la placă. Clasele din acest pachet sunt folosite direct de aplicație.

ioio.lib.impl – conține implementările funcționalităților și nu este folosit în mod direct în crearea aplicației.

ioio.lib.util – descrie arhitectura IOIOLib. Conține pachete de clase specifice platformei de dezvoltare utilizate: ioio.lib.util.android conține clase specifice pentru Android care facilitează procesul de creare al aplicației și de integrare cu placa IOIO. Pentru aplicațiile desktop aceste clase se găsesc în pachetul: ioio.lib.util.pc.

IOIOLibAndroidBluetooth

IOIOLibandroid oferă facilități de conectare pe mai multe canale, însă nu și pentru Bluetooth. Pentru a realiza conexiunea Bluetooth am importat pachetul IOIOLibAndroidBluetooth .

După importul librăriei este necesar să acordăm permisiunea de a accesa funcționalității de către aplicație. Astfel, în fișierul AndroidManifest.xml am adăugat:

<uses-permission android:name="android.permission.BLUETOOTH" />

La această dată nu este posibilă conexiunea unui dispozitiv la mai multe plăci IOIO prin Bluetooth, așadar înainte de rularea aplicației trebuie să ne asigurăm că telefonul mobil este în starea “paired” cu o singura placă IOIO.

Spre deosebire de conexiunea fizică hardware , conexiunea Bluetooth transmite date mai lent, cu un ordin de zeci de milisecunde.

Metode de control al plăcii de dezvoltare IOIO OTG

În acest subcapitolul vor fi prezentate pachetele de clase pentru controlul plăcii IOIO folosite în acest proiect.

Din librăria ioio.lib.util.android s-au folosit următoarele pachete de clase pentru control:

import ioio.lib.util.BaseIOIOLooper;
import ioio.lib.util.IOIOLooper;
import ioio.lib.util.android.IOIOActivity

Clasele din aceste pachete sunt realizate la rândul lor din clase predefinite de dezvoltatorul plăcii IOIO pentru controlul acesteia. Dintre aceste clase se disting: setup() și loop(), ambele din IOIOLooper.

Când IOIOLooper este folosită, se creează implicit un thread pentru fiecare metodă invocată.

Acest thread funcționează urmând pașii:

1. Așteaptă să se creeze conexiunea (Bluetooth) cu placa IOIO;

2. Verifică dacă versiunea de firmware care rulează pe placa de dezvoltare IOIO este compatibilă cu versiunea de IOIOLib folosită;

3. Dacă sunt compatibile :

a. metoda setup() este invocată în cadrul unei instanțe IOIOinterface pentru a lucra cu ioio cât timp este conectată. Prin această metodă se deschide și conexiunea la pinii de intrare, ieșire.

b. se apelează în mod repetat metoda loop() care conține și execută acțiuni pentru IOIO.

4. Dacă nu sunt compatibile se apelează metoda incompatible() care anunță utilizatorul de acest lucru. În acest proiect am implementat trimiterea unui mesaj în aplicație cu textul „incompatible firmware”.

Când conexiunea cu IOIO este întreruptă, ca rezultat al închiderii conexiunii din telefonul pe care este folosită aplicația sau prin închiderea aplicației, se apelează metoda disconnected(). Instanța creată anterior pentru lucrul cu IOIO nu va mai putea fi folosită din acest moment. În acest proiect am implementat trimiterea unui mesaj în aplicație cu textul „Disconnected”.

Comunicarea între cele două telefoane

Comunicarea dintre cele doua telefoane pe care rulează aplicația se realizează prin Sockets.

Un socket este un endpoint software care stabilește comunicare bidirecțională între un program server și unul sau mai multe programe client.

Socket-ul asociază programului server un port hardware pe mașina pe care rulează astfel încât orice program client oriunde în rețea să poată comunica cu programul server atâta timp cât folosește un socket asociat cu același port.[23]

În cadrul acestui proiect am folosit un singur client la server.

Pentru a putea folosi în cadrul unei rețele o conexiune bazată pe accesarea unui port este necesar ca pentru router-ul rețelei să implementăm port forwarding, ceea ce ar face ca aplicația să nu funcționeze în orice rețea. Pentru a putea fi independenți de rețeaua wi-fi folosită, am lucrat cu o rețea locală în felul următor:

dispozitivul pe care rulează aplicația în modul controler este conectat la internet printr-o rețea mobilă 4G;

dispozitivul pe care rulează aplicația în modul controler oferă hotspot dispozitivului pe care rulează aplicația în modul IOIO;

dispozitivul IOIO se conectează la rețeaua controlerului;

cu o aplicație mobilă de tip Port Scanner disponibilă în magazinul Google Play găsim portul folosit de aplicație și îl folosim în codul sursă prezentat în Anexa 1, în modul descris în continuare.

Implementarea software cu clasa Socket:

socket = new Socket();
socket.connect((new InetSocketAddress(InetAddress.getByName(ipAddress), PORT)), TIMEOUT);

Clasa InetSocketAddress implementează o adresă IP formată din IP+port. Portul este cel găsit de aplicația PortScanner și este declarat în felul urmator: public static final int PORT = 8081 înainte de a fi folosit de metoda de tip socket.

Capitolul 7 : REALIZAREA PLATFORMEI ROBOTICE

Hardware

După cum s-a prezentat și în Capitolul 2, platforma robotică a fost realizată atât din componente mecanice de fixare cât și electronice.

Pentru fixarea telefonului mobil Android folosit pentru înregistrarea video am folosit componente mecanice din metal pentru a evita eventuale desfaceri ale acestuia din suport în timpul funcționării.

Figura 7.1 Platformă robotică asamblată

Deoarece spațiul disponibil pe partea de sus a platformei robotice nu a fost suficient, am ales asamblarea punții H prezentate în subcapitolul 2.2 pe partea inferioară a platformei. Astfel a fost necesară folosirea unor cabluri de lungimi mai mari între puntea H și placa de dezvoltare IOIO OTG.

Figura 7.2 Platformă robotică asamblata

Software

Aplicația software realizată folosind mediul de dezvoltare Android Studio a fost programată astfel încât să realizeze legătura între cele două dispozitive cu sistemul de operare Android.

Astfel, în cadrul acestei aplicații unul dintre dispozitive, cel care va fi plasat pe platforma robotică și va realiza fotografiile va accesa opțiunea IOIO al aplicației, iar celălalt dispozitiv opțiunea CONTROLLER.

În acest subcapitol, pentru a ușura modul de prezentare, am folosit următoarele denumiri :

Dispozitivul pe care rulează aplicația în modul IOIO poartă denumirea de „telefon IOIO”, iar dispozitivul care rulează aplicația în modul CONTROLLER, se numește „controller”.

După realizarea conexiunii Bluetooth, prezentată în subcapitolul 4.3 Bluetooth Pairing, între telefonul IOIO și placa de dezvoltare, se realizează conectarea telefonului IOIO la reteaua wi-fi furnizată de controller prezentată în subcapitolul 6.6.

Figura 7.3 Realizarea conexiunilor Bluetooth și Wi-fi

La momentul accesării meniului IOIO, aplicația Android va cere utilizatorului setarea unei parole. Acest lucru oferă siguranță aplicației, în cazul în care se încearcă accesarea dispozitivul de către alte persoane.

Figura 7.4 Setarea unei parole pentru accesarea meniului IOIO

După acest pas de securitate, telefonul IOIO accesează camera foto a dispozitivului Android și pregătește un preview pentru controller. De asemenea, acesta convertește imaginile înregistrare în matrici de bytes (byte array) și le va trimite prin socket-uri.

Pentru a se asigura faptul că cele două dispozitive sunt conectate, telefonul IOIO afișează și adresa IP prin intermediul căreia se realizează conexiunea.

Figura 7.5 Afișare adresă IP prin intermediul telefonului IOIO

Pentru a se realiza conexiunea și cu controlerul, în modul CONTROLLER, utilizatorul trebuie să introducă adresa IP a telefonului IOIO și parola setată anterior.

Figura 7.6 Introducerea adresei IP și a parolei pentru accesarea meniului Controller

După apăsarea butonului „Log In”, controlerul va primi imagini sub formă de matrice de bytes, pe care le afișează pe ecran.

Figura 7.7 Accesarea meniului Controller

Pentru realizarea unei fotografii de către utilizator, se apasă butonul cu pictogramă din colțul din dreapta jos, „Take Picture”.

Telefonul IOIO primește această comandă, realizează o fotografie și o trimite către controller la o locație din memoria telefonului pentru a fi salvată.

Controllerul primește imaginea și o salvează în memoria sa internă.

Figura 7.8 Realizarea unei fotografii prin intermediul telefonului IOIO

Figura 7.9 Salvarea unei fotografii în memoria internă a dispozitivului Android

Pentru deplasarea platformei robotice se va utiliza de către utilizator elementul de tip joystick afișat de către controler în colțul din stânga jos.

Acesta va indica pe ecran direcția de deplasare, telefonul IOIO va primi comanda și o va traduce în comandă digitală pentru placa de dezvoltare IOIO. Pentru realizarea acestei comenzi s-a folosit instrucțiunea setDutyCycle , comandă ce va fi trimisă prin Bluetooth plăcii de dezvoltare.

La rândul ei, placa IOIO primește această comandă și o trimite sub formă de semnale de comandă către puntea H.

Puntea H transmite semnal către motorul corespunzător, realizând mișcarea platformei robotice.

Concluzii

În acest proiect s-a urmărit realizarea

Bibliografie

[1] – https://www.aliexpress.com/item/Transparent-Motor-Smart-Robot-Car-Chassis-Kit-Speed-Encoder-Battery-Box-For-Arduino-DIY/32757637772.html – accesat la data:

[2] – http://users.utcluj.ro/~rdanescu/pmp-lab09.pdf – accesat la data:

[3] – https://filafill.com/img/cms/L298_H_Bridge_1.pdf – accesat la data:

[4] – https://ardushop.ro/en/electronics/84-dual-h-bridge-for-dc-and-stepper-motors.html – accesat la data:

[5] – https://learn.sparkfun.com/tutorials/ioio-otg-hookup-guide/all – accesat la data:

[6] – http://pinouts.ru/PortableDevices/micro_usb_pinout.shtml – accesat la data:

[7] – https://github.com/sparkfun/IOIO-OTG/tree/master/Hardware – accesat la data:

[8] – https://github.com/ytai/ioio/wiki – accesat la data:

[9] – https://github.com/ytai/ioio/wiki/Power-Supply-OTG – accesat la data:

[10] – http://ww1.microchip.com/downloads/en/DeviceDoc/39969b.pdf – accesat la data:

[11] – https://www.scribd.com/document/98393769/Conspect-subiecte-microcontrollere – accesat la data:

[12] – https://github.com/ytai/ioio/wiki/Analog-Input – accesat la data:

[13] – https://github.com/ytai/ioio/wiki/Digital-IO – accesat la data:

[14] – https://github.com/ytai/ioio/wiki/The-IOIO-Manager-Application – accesat la data:

[15] –http://grouper.ieee.org/groups/802/15/Bluetooth/core_10_b.pdf – accesat la data:

[16] – https://developer.android.com/studio/intro/ – accesat la data:

[17] – https://www.edureka.co/blog/what-is-java/ – accesat la data:

[18] – https://www.tutorialspoint.com/java/java_object_classes.htm – accesat la data:

[19] – http://www.itcsolutions.eu/2011/06/12/tutorial-java-scjp-16-constructori/ – accesat la data:

[20] – https://www.programcreek.com/2011/09/what-is-the-difference-between-a-java-library-and-a-framework – accesat la data:

[21] – https://developer.android.com/topic/libraries/support-library/packages) – accesat la data:

[22] – https://github.com/ytai/ioio/wiki/IOIOLib-Basics – accesat la data:

[23] – http://www.oracle.com/technetwork/java/socket-140484.html#top – accesat la data:

[24] – – accesat la data:

ANEXE

Anexa 1 – Codul sursă

package app.anca.ioiorobot.controller;

import …

public class ConnectionManager {
public static final int PORT = 8081; //portul care este folosit impreuna cu ip-ul pentru a permite conectarea la app in modul ioio

public static final int TIMEOUT = 5000;
private Activity activity;
private ConnectionListener connectionListener;
private IOIOResponseListener responseListener;

private OutputStream outputStream;
private DataOutputStream dataOutputStream;
private InputStream inputStream;
private DataInputStream dataInputStream;

private Socket socket;
private boolean isTaskRunning = false;

private String ipAddress;
private String password;
Runnable readThread = new Runnable() {
public void run() {
try {
socket = new Socket();
socket.connect((new InetSocketAddress(InetAddress.getByName(ipAddress), PORT)), TIMEOUT); //Socket este clasa folosita pentru a implementa conexiunea via wi-fi a celor 2 telefoane. Aceasta clasa a fost detaliata in cap 6

outputStream = socket.getOutputStream();
dataOutputStream = new DataOutputStream(outputStream);

inputStream = socket.getInputStream();
dataInputStream = new DataInputStream(inputStream);
sendCommand(password);

while (isTaskRunning) {
try {
int size = dataInputStream.readInt();
final byte[] buffer = new byte[size];
dataInputStream.readFully(buffer);

activity.runOnUiThread(new Runnable() {
@Override
public void run() {
if (buffer.length > 0 && buffer.length < 20) {
if (new String(buffer).equalsIgnoreCase(Command.SNAP)) {
if (responseListener != null)
responseListener.onPictureTaken();
} else if (new String(buffer).equalsIgnoreCase(Command.WRONG_PASSWORD)) {
if (connectionListener != null)
connectionListener.onWrongPassword();
} else if (new String(buffer).equalsIgnoreCase(Command.ACCEPT_CONNECTION)) {
if (connectionListener != null)
connectionListener.onIOIOConnected();
} else if (new String(buffer).equalsIgnoreCase(Command.FLASH_UNAVAILABLE)) {
if (responseListener != null)
responseListener.onFlashUnavailable();
}
} else if (buffer.length > 20) {
if (responseListener != null) {

Bitmap bitmap = BitmapFactory.decodeByteArray(buffer, 0, buffer.length);
FileOutputStream fileOutputStream = null;

try {
//se creeaza fisier
String path = Environment.getExternalStorageDirectory().getAbsolutePath() + "/aaaa.png"; //numele fisierului, configurabil din aceasta linie de cod
File image = new File(path);
fileOutputStream = new FileOutputStream(image);

fileOutputStream.write(buffer);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fileOutputStream != null)
try {
fileOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
responseListener.onCameraImageIncoming(bitmap, buffer);

}
}
}
});
} catch (EOFException e) {
e.printStackTrace();
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
if (connectionListener != null)
connectionListener.onConnectionDown();
}
});
isTaskRunning = false;
} catch (NumberFormatException | IOException e) {
e.printStackTrace();
}
}
} catch (NumberFormatException | UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
if (connectionListener != null)
connectionListener.onConnectionFailed();
}
});
}
}
};

public ConnectionManager(Activity activity, String ipAddress, String password) {
this.activity = activity;
this.ipAddress = ipAddress;
this.password = password;
}

public void setConnectionListener(ConnectionListener listener) {
this.connectionListener = listener;
}

public void setResponseListener(IOIOResponseListener listener) {
this.responseListener = listener;
}

public void start() {
if (!isTaskRunning) {
new Thread(readThread).start();
isTaskRunning = true;
}
}

public void stop() {
isTaskRunning = false;
try {
socket.close();
outputStream.close();
dataOutputStream.close();
} catch (IOException | NullPointerException e) {
e.printStackTrace();
}
}

public boolean sendCommand(final String str) {
try {
new Thread(new Runnable() {
public void run() {
try {
dataOutputStream.writeInt(str.length());
dataOutputStream.write(str.getBytes());
outputStream.flush();
} catch (IOException e) {
e.printStackTrace();
}

}}).start();
return true;

} catch (NullPointerException e) {
e.printStackTrace();
}
return false;
}

public void sendMovement(final String str) {
new Thread(new Runnable() {
public void run() {
try {
byte[] data = str.getBytes();
DatagramSocket datagramSocket = new DatagramSocket();
InetAddress inetAddress = InetAddress.getByName(ipAddress);
DatagramPacket datagramPacket = new DatagramPacket(data, data.length, inetAddress, PORT);
datagramSocket.send(datagramPacket);
datagramSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
}

public interface ConnectionListener {
public void onConnectionDown();

public void onConnectionFailed();

public void onWrongPassword();

public void onIOIOConnected();
}

public interface IOIOResponseListener {
public void onPictureTaken();

public void onFlashUnavailable();

public void onCameraImageIncoming(Bitmap bitmap, byte[] image); //
}

}

Similar Posts