SPECIALZIAREA:ăELECTRONICĂăAPLICATĂ I SISTEME INTELIGENTE [619686]
UNIVERSITATEAăTEHNICĂ “GHEORGHEăASACHI”ăDINă IA܇I
FACULTATEA DE ELECTRONIC Ă, TELECOMUNICA ܉IIă܇ I TEHNOLOGIA
INFORMA ܉IEI
SPECIALZIAREA:ăELECTRONICĂăAPLICATĂ ܇I SISTEME INTELIGENTE
LUCRARE DE DIPLOM Ă
Coordonatoră܈tiin܊ ific,
Prof. Univ. Dr. Ing. Dobrea Dan
Student: [anonimizat]
2
UNIVERSITATEAăTEHNICĂ“GHEORGHEăASACHI”ăDINă IA܇I
FACULTATEA DE ELECTRONIC Ă, TELECOMUNICA ܉IIă܇ I TEHNOLOGIA
INFORMA ܉IEI
SPECIALZIAREA:ăELECTRONICĂăAPLICATĂ ܇I SISTEME INTELIGENTE
Achizi ție de date de la un dispozitiv care
comunicăăprinăBluetoothălowăenergyășiă
clasificareaădatelorăînăfuncțieădeămișcare
IA܇I
2016
3
4
1.Cuprins
2.Memorium justificativ ……………………………………………………………………….5
3.Prezentare dispozitiv …………………………………………………………………………6
3.1 SensorTag CC2541 ………………………………………………………………..6
3.2 Accelerometru …………………………………..…………………………………8
3.3 Giroscop …………………………………………………………………………… 11
3.4ăCC2541…………………………………………………………………………… 15
4. Prezentare programe folosite ………………………………………… .……………………16
4.1 LabWindows CVI …………………………………………………………………16
4.2 Visual Studio C++ …………………………………………………………………16
5. Bluetooth Low Energy(BLE) ………………………………………………………………17
5.1 BLE ………………………………………………………………………..………17
5.2 BLE vs Bluetooth Clasic ……………………………………………………..……21
6. Achizi܊ ie………………………………………………………………………………….…24
6.1 Conectarea BLE ……………………………………………………………………24
6.2 Colectarea datelor ………………………………………………………………….34
7. Clasificator ………………………………………………………………………………….37
8.ăModulădeăfunc܊ ionare ……………………………………………………………………….43
8.1 Primul mod de func܊ ionare …………………………………………………………43
8.2 Al 2- leaămodădeăfunc܊ ionare …………………………………………………….…44
9. Rezumat ………………………………………………………………………………..……4 7
10. Bibliografie ……………………………………………………………………………..…. 48
11.Anexă…………………………………………………………………………………..….. 50
5
2.Memorium justificativ
Conexiunea între dispozitive a luat amploare î nă ultimiiă ani,ă datorităă dezvoltăriiă
electroniciiă ܈ i dorin܊ ei utilizatorului de a fi conect ată cuă dispozitiveleă dină jurulă să u. Datorită
necesită܊ ii de a crea o c onexiuneă întreă două dispozitive p eă pia܊ă a aparut Bluetooth low
energy(BLE), care trans miteădateădeădimensiuniăreduseă܈ i cu un consum redus de energie.
Proiectulădeăfa܊aăareăcaătemăăprincipalăăcontrolulăuneiăma܈ ini cu ajutorul unui dispozitiv
careă con܊ineă ܈apteă senzori . Conexiunea se realizeaza prin BLE(Bluetooth low energy), între
dispozitiv ܈i ma܈ină . Controlul se va realiza cuă ajutorulă dispozitivuluiă ata܈ată deă mână care va
prelua date, acestea fiind a nalizateă siă clasificateă ină func܊ieă deă mi܈ carea utilizatorului. Se vor
utilizaădouăămoduriădeăfunc܊ionare.ăUnulădintreăacesteămoduriănecesităăcolectareaădatelorădeălaă
doiăsenzori(accelerometruă܈iăgiroscop),ă܈iăclasificareaălorăînăclaseleăalocate.
Avândă înă vedereă căă înă oricareă domeniuă avemă dateă careă trebuieă culeseă ܈iă interpretate,ă
lucrarea de fa܊ăă dore܈teă săă introducă,ă no܊iuniă despreă achizi܊iaă deă dateă ܈iă despreă cumă potă fiă
interpretateă ܈iă clasificateă acestea.ă Acestă domeniuă esteă unulă vastă ܈iă înă continuăă dezvoltare,ă
deoareceăesteădeăinteresăpentruădezvoltatoriăsăăin܊eleagăădateleăcareăleăauăînăjurulăloră܈iămaiă ales
săădescopereăcumăsăăleăcoreleze între ele.
Proiectulăaăfostădezvoltatăpentruăaăîn܊elegeăcumăseărealizeazăăoăconexiuneăprezentatăămaiăsusă܈iă
cumăseăpotăinterpretaădateleăcareăsuntălaădispozi܊iaădezvoltatorului.
6
3. Prezentare dispozitiv
3.1 SensorTag CC2541
SensorTagăCC2541ăconstruitădeăcă tre compania Texas Instruments este un dispozitiv care
înglobeazăă܈aseăsenzoriăceiămaiăfolosi܊ i:
– Senzor de IR temperature;
– Senzor de umiditate;
– Accelerometru ;
– Giroscop ;
– Barometru;
– Magnetometru;
Acestădispozitivănecesită o baterie de 3V. Comunicarea cu dispozitivul se face prin Bluetooth
Low Energy (Bluetooth Smart). BLE este o tehnologie utilizatăă înă ultimaă perioadăă maiă alesă î n
industriaătelefoanelorămobileă܈iăapreciată pentru consumul redus de energie.
Fig.1 Diagrama bloc a dispozitivului SensorTag [9]
7
Senzoriiăfolosi܊iăpeăaceastăăplacăăauădimensiuniăreduseă܈iăpre܊ulădeăfabrica܊ie redus.
Acest dispozitiv poate fi conectat p rinăBluetoothăcuăoriceăplatformăăcareăde܊ine Bluetooth
Low Energy, cum sunt: Android, Ios, Windows Phone, Windows.
Fig. 2 Dispozitivul SensorTag
8
– Senzorul de IR temperature ă:ămăsoară temperaturaăobiectelorăa܈ezateăînăfa܊ a luiăcuăoăacurate܊ e
de +/- 1°C (produs de Texas Instruments TMP006)
– Accel erometru:ă măsoarăă accelera܊ ia pe 3 axe (x,ă yă ܈iă z) cuă oă rezolu܊ieă deă până la 14
bits.(produs de Kionix KXTJ9)
– Senzorulădeăumiditate:ămăsoară umiditateaăcuăoărezolu܊ieădeă12ăbitsă܈iătemperaturaădinăjurulălui
cu o rezolu܊ieădeă14ăbits .(produs de Sensirion SHT21)
– Magnetometru:ămăsoarăăcâ mpul magnetic pe 3 axe.(produs de Freescale MAG3110)
– Barometru:ămăsoarăăpresiuneaăbarometrică a aerului.(produs de Epcos T5400)
– Giroscop:ămăsoarăărataărota܊ieiăpe toateăceleă3ăaxeă(X,ăYă܈iăZ)ăcuăoărezolu܊ ie de 16 bits.(produs
de Invensense IMU-3000)
3.2 Accelerometru
Este un senzor careă măsoarăă accelera܊ia.ă Accelera܊iaă reprezintă rata de schimbare a
vitezei a unuiădispozitivă܈iăseămăsoarăăînămetriăpeăsecundăălaăpătratăsauăînăfor܊aăgăcareăesteăegală
cu 9.8 m/ ݏଶ. Accelerometrele sunt des folosite în aplica܊iiă înă careă esteă deă interesă pozi܊ ia unui
obiect (înăacestăcazăseăfolose܈teă܈i un girosco păpentruăoăprecizieămaiăridicată),ădară܈i înăaplica܊iileă
de detectare a vibra܊ii lor, a mi܈cări lor sau a altor parametri (în limita posibi lită܊iloră ܈ i a
parametrilor pe care îi po ateămă sura).
Fig. 3 Accelerometru KXTJ9 [10]
9
Accelerometrul folosit în acest proiect, de pe dispozitivul SensorTag, este KXTJ9 de la
firmaăKionix.ăAcestaămăsoară accelera܊ia pe celeătreiăaxeăx,ăyă܈iăz.ăCuăajutorulăacestorădateăseă
poate identifica înăceăpozi܊ieăseăaflă dispozitivul la un anumit timp.
Fig. 4 Axele accelerometrului
Fig.5 Diagrama funcțională pentru senzorul KXTJ 9 [10]
10
Fig.6 Calculare accelerometru [10]
DupăăcumăseăpoateăobservaăînăFig 6.ăpentruăaăseăputeaăafi܈ a datele corecte a accelerometrului
trebuie ,ălaădateleănegative,ăsăăseăaplice complementăfa܊ăădeă2.ă
Senzorul KXTJ9ăseăprezintăăîntr -oăcapsulăădeă3x3x0.9ămmă܈iă opereaza de la 1.8 V – 3.6 V.
AcestaăcomunicăăpeăI2Cădigitalăserial,ăcuăavantajulăcăăpermiteău܈orăintegrareaăsistemuluiăprină
eliminarea convertorului analog-digital ܈iăcomunicareaădirectăăcuămicrocontroller.
Fig. 7 Multiple conexiuni I2C a senzorului KXTJ9 [10]
11
float calcAccel(int rawX)
{
float v, sign;
sign = 1.0;
if ( (rawX >= 128) && (rawX <= 255))
{
rawX = (rawX ^ 0x00ff) | 0x01;
sign = -1.0;
}
//calcul accelerometric, interval -1, +1
v = (sign * rawX) / (16);
return v;
}
Tabel 1 Func ție accelerometru
Func܊ia, prezentatăă înă Tableă 1, careă calculeazăă ܈iă returnează valoarea accelerometrului,
returneazăă oă valoareă întreagăă peă 8ă bită pentruă fiecareă axă.ă Aceastăă valoareă seă preiaă ܈iă seă
converte܈te înăfor܊ a G pen truăaăaveaăoăgamă de +/- 2 găpentruăoăprecizieăbună .
3.3 Giroscop
Giroscopulă măsoarăă rota܊iaă ܈ i orientarea unui obiect. Introducereaă luiă înă electronicăă aă
permisă măsurareaă multă maiă precisăă aă mi܈căriiă unuiă obiectă înă 3Dă decâtă folosireaă unică a
accelerometrului.
Înăprezentăpentruăacurate܊ e se fo losescăsenzoriăaccelerometriciă܈iăsenzor i giroscop, pentru
aăaveaăoăprecizieămărită asupraăpozi܊ieiăunuiăobiectăsauăaămi܈că rii acestuia. Ace astăăconfigura܊ie
seănume܈ te IMU( inertial measurement unit ).
12
Fig. 8 Sensor giroscop [11]
În acestăălucrare , giroscopul folosit IMU-3000 în SensorTag returne azăăinforma܊iiădespreă
rota܊iiăpe cele trei axe (x ,y ,z), măsurateăînăgradeăpeăsecundă . Intervalul în care este utilizat acest
senzor este de ±250 grade/sec,ă careă oferăă oă precizieă bunăă pentruă ceaă maiă 12ica schimbare a
rota܊iei.
Fig. 9 Axele giroscopului
Fig. 10 Diagrama bloc pentru senzorul IMU-3000 [11]
13
Senzorul IMU-3000 esteădeădimensiuniăreduse,ă4x4x0.9ămm,ă܈iăvineăpeăpia܊ăăcuăperforman܊eă
ridicate,ăzgomotămic,ă܈iăcuăunăpre܊ădeăproduc܊ieăscazut,ădedicatăpentruăoămareăvarietateădeăă
dispozitive electronice.
Float calcGyro(int rawLSB, int rawMSB)
{
float v, sign,val;
if ( (rawMSB >= 128) && (rawMSB <= 255) )
{
sign = – 1.0;
val = ((((rawMSB<<8) + rawLSB) ^ 0xffff) | 0x0001);
} else{
sign = 1.0;
val = (rawMSB<<8) + rawLSB;
}
// calcul giroscop, interval -,+ 250
v = (sign * val) / (65536/500);
return v;
}
Tabel 2 Func ție giroscop
Func܊ia, ,ăprezentatăăînăTabelă2,ă folosităăpentruăaăcitiădateleădeălaăgiroscopă܈iăapoiăpentruă
aăleăafi܈a ܈i a le interpreta, constăăînădouăăvariabile întregi pentru fiecar eăaxăăaăcâ te 8 bit. Deci
fiecareă valoareă aă ficăreiă axeă reprezintăă ună î ntreg pe 16 b it.ă LSB(leastă significantă bit)ă ܈ i
MSB(most significa ntăbit)ăsuntăceiădoiăint8ăcareăvorăfiăalipi܊ i pentru a forma valoarea pe care o
returneazăă giroscopul.ă Această valoare se împarte la 65536( 2ଵ6)/500ă (reprezintă totalul
intervalului pe care se întinde +/- 250).ăSeăreturneazăăvaloareaăob܊inută,ăseăafi܈eazăă܈iăseălucrează
apoi cu ea.
14
Complementăfațăădeă2
Aceasta este oămetoda,ăprinăcareăseăreprezintăăbinarănumereleăîntregiănegative.
Înăaceastăălucrareăs -aăfolosit,ămetodaăcomplementăfa܊ăădeădoiădeoarece,ăesteădeăinteres,ăsăăseă
observeăschimbareaăpozi܊ieiăaxeiăx,ăyă܈iăz.ăDupaăcumăseăpoateăobservaă܈iădinăFig. 6 datele sunt cu
+ă܈iăcuă -.
rawX = (rawX ^ 0x00ff) | 0x01;
Dupăăcumăseăpoateăobservaăs -a preluat numarul pe 8 bit, dupa care s- aăfăcutăunăxorăintreănumarulă
preluată܈iăvaloareaă0xffăpentruăcaă0ălogicăsăădevinăă1ălogic,ăiară1ălogicăsăădevinăă0ălogic.ă
UrmătoareaăetapăăaăfostăunăSAU(OR)ăîntreănumărulăob܊inutăă܈iă0x01.
܇tim ca MSB reprezinta bitul de semn.
Bitulădeăsemnăareădouăăstări:ă
– 0 reprezint ăăvalaoare pozitive;
– 1ăreprezintăăvaloareaănegative ;
15
3.4 CC2541
BLE folosit în acest dispozitiv este CC2541. Acesta este optimizat pentru a avea un consum
redusădeăenergie.ăEsteăconstruităcuămaterialeăcareăauăcosturiăreduse,ădeciăpre܊ulăluiăesteăredus.
CC2541ăcombinăăperforman܊eleăunuiăemmi܊ătoră– receptorăRFăcuăunăMCUă8051ăîmbunătă܊it,ă
8KBăRAM,ă܈iămulte alte caracteristici.
Esteăfoarteăfolosită܈iăseădescurcăăînăsistemeăcareănecesităăconsumămicădeăenergie.ăEsteăposibilăună
consumămicădeăenergieădatorităămodurilorădeăoperareăvariate,ă܈iătimpulăscurtădeăschimbareăîntreă
modurile de operare.
BLE-ul este încapsulat într-o capsula de 6×6 mm QFN40.
Fig. 11 Diagrama bloc CC2541 [14]
16
4. Prezentare programe folosite
4.1 LabWindows CVI
LabWindows CVI este un mediu de dezvoltare softwar e,ăpentruăprogrameăcareănecesităăoă
interfa܊areăgrafică Windows. Ca limbaj de programare este folosit ANSI C.
Esteăunămediuădeălucruăprietenosă܈iăcareăvineăînăajutorulăprogramatorilorăînălimbajulăCăcuă
oăbibliotecăăcuăfunc܊ ii diverse car eăauăoăinterfa܊ăănumităăpanoulăfunc܊ieiă܈ i permite utilizatorului:
generare de cod 16ucre16 iv,ădetaliiădespreăfunc܊ieă܈ i care sunt parametrii necesari de introdus,
etc. În mare parte, CVI a fost dezvoltat pentru crearea, cu ajutorul bibliotecilor pe c are le
de܊ine , de programe care include : interfa܊ are cu utilizatorul, a chizi܊ ii de date, analiza datelor.
Înă concluzieă CVIă îmbină modul 16ucre16ive deă generareă aă uneiă aplica܊iiă cuă biblioteciă
utileă܈iădiverse,ărealizâ nd un mediu de dezvoltare pu ternică܈iău܈ or de folosit.
4.2 Visual Studio
Visual Studio este un mediu de lucru care este folosit pentru dezvoltarea programelor
careănecesităăoăinterfa܊ăăcuăutilizatorul,ă܈ i nu numai, dar plusul peăcareăîlăareăfa܊ăădeăCVIăesteăcăă
se pot folosi mai multe limbaje de programare pentru a scrie un program cum ar fi : C, C++, C#
etc.
Acest mediu d eădezvoltareăesteăcreatădeăMicrosoftă܈ i este un mediu foarte utilizat.
17
5. Bluetooth Low Energy(BLE)
5.1 Bluetooth Low Energy
Bluetooth low energy (BLE sau Bluetooth Smart) a fost prima 17ucr proiectat de cei de la
Nokia, nu pe acee a܈i idee cu Bluetooth- ulăexistent,ăciăauădorităsăăvinăăcuăcevaănou. A fost gandit
de la început, proiectarea unui radio standard cu cel mai micăconsum,ăoptimizatălaăunăpre܊ăredus,ă
putereăredusăă܈iăcomplexitateăredusă .
Aăfostăintrodusăpeăpia܊ăăînăanulă2010ă܈iăs -aăbucuratădeăoă cre܈tereă rapidă,ămul܊iăproducă tori de
dispozitiveăfolosindăaceastă tehnologie.
Pentruă aă în܊elegeă cumă func܊ionează BLE,ă trebuieă săă în܊elegemă GAPă (Generică accessă
profile)ă܈ i GATT (Generic attributeăprofile).ăAcesteădouăăprofileăsuntă fundamentale pentru BLE
deoareceăodatăăîn܊elesărolulăloră܈iăfunc܊ ionalitatea, se poate lucra cuăaceastă tehnologie.
Fig. 13 BLE [7]
18
Generic access profile(GAP)
Acestăprofilăseăocupă de utilizare a protocoalelor de radio de nivel inferior pentru a defini
rolurile,ăprocedurileă܈ i modurile pr inăcareăpermitădispozitivelorăsăădifuzezeădate,ăsăăstabileascăă
conexiuni între dispozitivele descoperite,ăsăăgestionezeăconexiunileă܈iăsăăstabileas că nivelul de
securitate.ă GAPă reprezintăă înă esen܊ă , stratul superior de control din BLE. Acest profil este
obligatoriu pentru toate dispozitivele BLE.
Generic attribute profile(GATT)
Acest profil s eăocupăădeăschimbulădeădateăînăBLE.ăGATTădefine܈ te un mod elădeădateă܈iă
proceduriăcareăpermiteădispozitivelorăsăădescopere,ăsăăcitească,ăsăăscrieă܈iăsăăîmpingăăelementeădeă
dateăîntreăele.ăGATTăreprezintă stratul superior de date din BLE.
În prezenta lucrare s-a utilizat si a fost de interes profilul GATT pentru a accesa da tele ܈iă
a stabili conexiunea cu dispozitivul SensorTag.
GATTăstabile܈ te in detaliu modul de a face schimb de date printr-o conexiune BLE. In
contrast cu GAP care lucreaza la nivel de conexiune intre dispozitive, Generic attribute profile se
ocupa doar de proceduri si transfer de date.
GATTăfolose܈teăATT(AttributeăProtocol)ăcaă܈ i protocol de transport pentru a face schimb de date
intre dispositive. Datele suntăorganizateăierarhicăinăfi܈ iere numite servicii care la randul lor sunt
fragmentate in fragmente de date denumite caracteristici.
Attribute Protocol(ATT)
ATT reprezinta un simplu protocol client/server bazat pe atributele prezentate de dispozitiv. Î n
BLE,ă fiecareă dispozitivă reprezintă un client, un server, sau ambele. Clientul cere date de l a
server, iar server-ul furnizeaza date c atreăclient.ăFiecareăserverăcon܊ ine date organizate sub forma
de atribute având 16- bytes, un UUID(universally unique ide ntifier),ă ună setă deă permisiuniă ܈iă oă
valoare. Cei 16- bită atribui܊iă nuă reprezintăă altcevaă decâ t un identificator folosit pentru a avea
acces la o valoare de atribut.
19
UUID(universally unique identifier)
UnăUUIDăreprezintăăunănumărădeă128ădeăbit (16 bytes), careăareăoămareăprobabilitateăsă fie unic
la nivel global. El este utilizat in multe protcoale s iăaplica܊ ii.
Pentruăaăin܊elegeămaiăbineăceăsemnificăă UUID-ul folosit de catre dispozitivul CC2541 seăprezintăă
următorul exemplu.
Ex: Pentru accelerometru, UUID este: F000AA10-0451-4000-B000-000000000000
UUID de 128-bit este reprezentat de F000XXXX-0451-4000-B000-000000000000
AA10 – reprezintă adresa Serviciului care este accesat(in acest caz accelerometru)
Fig. 14 Tabel atribute [ 13]
20
Permisiune de acces
ATT si GATT definescădacaăclientulăpoateăsăăcitească,ăsă scrie sau ambele o valoare de atribut.
Fiecare atribut poate avea urmatoarele permisiuni de acces:
None : Atributul nu poate fii citit si nici nu se poate scri eădeăcă tre client;
Readable : Atributulăpoateăfiiăcititădeăcă tre client;
Writable : Atribultul p oateăfiiăscrisădeăcă tre client;
Readable and Writable : Atributul poate f iiăcitităsiăseăpoateăscrieădeăcă tre client.
Fig. 15 Etaje de acces BLE [7]
21
Atribute si ierarhizarea datelor
Atributele in GATT server sunt grupate in servicii, fiecare putand contine 0 sau mai mai multe
caracteristici. Caracteristicile pot include la rândul lor 0 sau mai multe descrieri.
Servicii
Reprezintăă oă sec܊iuneă comunăă aă informa܊ iilor a unui anumit serviciu pe care îl putem accesa.
Pentru dispozitivul prezentat inălucrareăServiciileăsuntăreprezentateădeăsenzoriiăpeăcareăîiăde܊ine.ă
Caracteristici
Reprezintaă ună “container”ă pentruă dateleă utilizatorului.ă Acesteaă seă împartă ină două ramuri:
declararea caracteristicilor si valoarea caracteristicilor.(characteristic declaration and
characteristic value)
Characteristic declaration : clientulăareăpermisiuneaădoarăsăăprimeascăăvaloriăfără a le modifica.
Characteristic val ueă:ăclientulăareăpermisiuneaădeăaăpreluaăvaloriă܈ i de a schimba valori in acest
câmp, pentru a putea accesaăceeaăceăesteădeăinteres(ex:ăinăcazulădeăfa܊ a a fost folosit pentru a
permite accelerometrului sa furnizeze datele).
5.2 BLE vs Bluetooth classic
Înainte de a se vorbi mădespreăproiectulădeălicentaătrebuiăsăăprezentămăcareăesteădiferen܊aădintreă
celeădouăăcomunica܊ ii amintite in titlu, care sunt avantajele si dezavantajele folosirii unuia sau
alteia si cel mai impor tantădeăceăaăfostănecesaraăapari܊ ia BLE.
Pentru inceput se va prezenta cateva aspect generale despre fiecare in parte dupa care se va
continuaăcuăasemănă rieleă܈iădeosebirileădintreăaceste .
Bluetooth:
Este o tehnologie standard wireless, care a fost conceput ă pentru a schimba date intre dispositive
peă oă distantăă scurtă fara a fi iă necesară vreoă conexiuneă fizică (ex. fir). Nu s-a pus problema de
consuml bateriei sau aspectul economic. El a fost concep utăpentruă aăputeaătransfera/impărtă܈iiă
22
intreăutilizatoriăfi܈ iere, video-uri, poze, de a putea con ectaăoăcascaăsauăoăperecheădeăcă܈ ti la un
dispozitiv imediat si fara prea mult efort, fara a fi necesa răconectareăfizică .
Bluetooth low energy:
Aă fostă lansată peă pia܊ă in 2011 sub denumirea de Blueto othă 4.0,ă siă aă avută ideeaă deă bază,ă ună
consumăcâtămaiămic.ăAăfostăgândităpentruăaplica܊ ii care au trans ferădeădateăredusăsiăauănevoieă܈iă
de un raspunsărapid.ăOădiferen܊ă intre ele este ca BLE ramane in mo dulădeă“sleep”ăpânăăcândăesteă
ini܊ializat,ătransferăădateădupăăcareărevineăinămodulă“sleep” pentru a putea avea un consum redus.
Acesta a fos tăganditămaiămultăpentruăaplica܊iiăde monitorizare a unui dispozitiv sau transferul de
informa܊ii(date,ămasură tori) i ntreădouă dispositiveăcareăcomunică prin BLE.
Tabel 3 BLE vs Bluetooth Clasic BLE CLASIC
SECURITATE SCHIMB DE
“CHEIE” IMPERECHERE
PRINTR- UN
PROTOCOL
SECURIZAT
TRANSFER DATE 0.2 Mbit/s 2-3 Mbit/s
DISTANTA 10 – 30 m 50 – 100 m
CONSUM DE PUTERE 0.01 pana la 0.5
W 1W
RAPIDITATEA
CONEXIUNII 0.1s 5s
DIMENSIUNEA FOARTE MIC MIC
PRET ~2$ la 5000 buc ~7$ la 5000 buc
23
Fig. 16 Obiecte conectate cu BLE și Bluetooth Clasic [7]
BLE vs Bluetooth:
Deci,ădacaăseăvorbe܈teădespreăBLEă܈iăBluetoothăClasic , seăîn܊elegeăcă fiecare a fost creat pentru
activită܊ i diferite. Bluetoothă poateă transferaă inform܊ ie de dimensiune mare, dar va consuma
baterie maiărepedeăsiăcostulădeăfabrica܊ ie e mai ridicat, iar BLEăesteăfolosităpentruăaplica܊ iile care
nu a uă nevoieă deă transferă deă cantită܊ i mariă deă date,ă iară ină consecin܊ăă vaă consumaă maiă pu܊ină
baterie,ăprelugindăvia܊ a acesteia chiar si la ani de zile.
24
6.ăAchiziț ie
6.1 Conectare BLE
Dupăăcumă s-a prezentat intru-un capitolădeămaiăsusăBLEăesteăimpăr܊ it pe mai multe etaje(profile)
careă trebuieă accesateă caă programatorulă săă ajungă la datele dorite si pentru a putea lucra cu
acestea. Aceste etaje sunt :
– Servicii;
– Caracteristici;
– Valori Caracteristici;
– Descrieri;
– Valori Descrieri.
Înăcontinuareăseăvaădescreiăfunc܊ iile utilizate si cum le putem accesa.
Seădefine܈ te UUID-ul senzorului care este de interes de accesat :
#define UUID_ACC_SERV (L"{f000aa10-0451-4000-b000-000000000000}")
– UUID se gase܈teăinăfi܈ ierul specific dispozitivului.
CLSIDFromString(UUID_ACC_SERV, &DevClass);
– CLSIDFromStringăconverte܈teăstring -ulăcareăîlăde܊ineă UUID în CLSID(este un
indentifica torăunicăcareăindentificăăComponentăObjectăModel(COM)ă)ă܈iăîlăstochează
intr-o valoare de tip GUID(globally unique identifier)
HANDLE GetBLEHandle(__in GUID AGuid);
hLEDevice = GetBLEHandle(DevClass);
25
– Prinăaceastăăfunc܊ieăseăstabile܈ te conexiunea intre cal culatoră܈iădispozitivăpeăcareăîlădorimă
săăîlăaccesăm.ăÎnăcazulădeăfa܊ăăprinăaceastăăfunc܊ieăs -a accesat SensorTag-ul si s-a stabilit
conexiuneaădirectă cu senzorul accelerometru;
În continuare tr ebuieăaccesatăServiciileăcareăseăgăsescălaăaceastăăadresă :
Fig. 17 Tabel atribute [ 13]
pServiceBuffer = GetGattService(hLEDevice, pServiceBuffer, &numServices);
PBTH_LE_GATT_SERVICE GetGattService(HANDLE hLEDevice,
PBTH_LE_GATT_SERVICE pServiceBuffer, unsigned short *numServices)
{ unsigned short serviceBufferCount;
//Determin dimensiunea buffer-ului Serviciilor
HRESULT hr = BluetoothGATTGetServices(hLEDevice, 0, NULL,
&serviceBufferCount, BLUETOOTH_GATT_FLAG_NONE);
if (HRESULT_FROM_WIN32(ERROR_MORE_DATA) != hr) {
return NULL;
}
if (pServiceBuffer) free(pServiceBuffer);
pServiceBuffer =
(PBTH_LE_GATT_SERVICE)malloc(sizeof(BTH_LE_GATT_SERVICE)*
serviceBufferCount);
if (NULL == pServiceBuffer) {
return NULL;}
else {
26
SecureZeroMemory(pServiceBuffer, sizeof(BTH_LE_GATT_SERVICE)*
serviceBufferCount);}
//Primesc Serviciile
hr = BluetoothGATTGetServices(hLEDevice, serviceBufferCount, pServiceBuffer,
numServices, BLUETOOTH_GATT_FLAG_NONE);
if (S_OK == hr) {
return pServiceBuffer;}
else
return NULL;
}
Tabel 4 Func ția de accesare Servicii
– Dupăăaceastăăapelareăseăva returna Serviciul Accelerometrului;
Acumăseăvaăapelaăfunc܊ iaăpentruăCaracteristiciăaăseăvedeaăceăcaracteristiciăde܊ ine acest
Serviciu;
pCharBuffer = GetGattCharacteristics(hLEDevice, pServiceBuffer, pCharBuffer, &numChar);
PBTH_LE_GATT_CHARACTERISTIC GetGattCharacteristics(HANDLE hLEDevice,
PBTH_LE_GATT_SERVICE hService,PBTH_LE_GATT_CHARACTERISTIC
pCharBuffer, unsigned short *numCharacteristics)
{ unsigned short charBufferCount;
// Determinare dimensiune buffer a Caracteristicilor
HRESULT hr = BluetoothGATTGetCharacteristics( hLEDevice,hService,0,NULL,
27
&charBufferCount,BLUETOOTH_GATT_FLAG_NONE);
if (HRESULT_FROM_WIN32(ERROR_MORE_DATA) != hr) {
return NULL;
}
if (charBufferCount > 0) {
pCharBuffer = (PBTH_LE_GATT_CHARACTERISTIC)
malloc(charBufferCount * sizeof(BTH_LE_GATT_CHARACTERISTIC));
if (NULL == pCharBuffer) {
return NULL;}
else {
SecureZeroMemory(pCharBuffer,charBufferCount*sizeof(BTH_LE_GATT_CHARACTERISTI
C));
}
// Primesc Caracteristici
hr = BluetoothGATTGetCharacteristics(hLEDevice,hService,charBufferCount,
pCharBuffer,numCharacteristics,BLUETOOTH_GATT_FLAG_NONE);
if (S_OK == hr) {
return pCharBuffer;
}
if (*numCharacteristics != charBufferCount) {
return NULL; }
}
return NULL;}
Tabel 5 Funcția de accesare Caracteristici
28
– după apelare aăacesteiăfunc܊iiăseăvorăafi܈aăCaracteristicileăcareăleăde܊ ine Serviciul
Fig. 18 Tabela atribute[ 13]
Fig. 19 Reprezentare adrese caracteristici accelerometru VS
CeleătreiăCaracteristiciăgăsiteăreprezintă :
– AA11 – valorile datelor ale accelerometrului pe cele 3 axe;
– AA12 – configurareaăaccelerometruluiăînăfunc܊ ie de cum dorim s ă avem intervalul datelor
citite : “01”ăpentruăă2G,ă“02”ăpentruăă4G,ă“03”ăpentruăă8Gă܈iă“00”ăpentruăaărestric܊ ion
accesul la date;
– AA13 – configurarea perioadei accelerometrului;
Înăcontinuareăseădore܈te Descrierile pentru Caracteristicile de interes.
Deăexempluădacăăseădore܈teăafi܈areaădatelor acce lerometruluiăpeăecranătrebuieăsăăseăfoloseascăă
următoareaăfunc܊ ie pentru am puteaăschimbaăvalaoreaăpresetată .
29
pCharValue_1 = GetCharacteristicValue(hLEDevice, currGattChar_1, pCharValue_1,
charValueDataSize);
pDescriptorBuffer_0 = GetDescriptor(hLEDevice, currGattChar_0, pDescriptorBuffer_0,
descriptorBufferSize);
//Seteaza o noua descriere
RtlZeroMemory(&newValue, sizeof(newValue));
newValue.DescriptorType = ClientCharacteristicConfiguration;
newValue.ClientCharacteristicConfiguration.IsSubscribeToNotification = TRUE;
HRESULT hr = BluetoothGATTSetDescriptorValue(
hLEDevice,
pDescriptorBuffer_0,
&newValue,
BLUETOOTH_GATT_FLAG_NONE);
Tabel 6 Funcția de acces valoare caracteristici
Fig. 20 Tabel atribute [ 13]
Odatăăaccesată, Descrierea se poate modifica valoarea care seăaflă la acea adresa.
InămodăasemănătorăseăacceseazăăDescriereaă܈iăpentruăperioadă,ăseămodificăăînăfunc܊ieădeăcî t de
repede seădore܈teăafi܈areaădatelor .
pCharValueBuffer = GetCharacteristicValue(hLEDevice, currGattChar_0, pCharValueBuffer,
charValueDataSize);
30
PBTH_LE_GATT_CHARACTERISTIC_VALUE GetCharacteristicValue(HANDLE
hLEDevice,PBTH_LE_GATT_CHARACTERISTIC
hCharrPBTH_LE_GATT_CHARACTERISTIC_VALUE pCharValueBuffer, unsigned short
charValueDataSize)
{
if (hCharr->IsReadable){
// Determinarea dimensiunii buffer-ului Valoare Caracteristicii
HRESULT hr = BluetoothGATTGetCharacteristicValue(hLEDevice,hCharr,0,NULL,
&charValueDataSize, BLUETOOTH_GATT_FLAG_FORCE_READ_FROM_CACHE
);
if (HRESULT_FROM_WIN32(ERROR_MORE_DATA) != hr) {
return NULL;
}
if (pCharValueBuffer)
free(pCharValueBuffer);
pCharValueBuffer =
(PBTH_LE_GATT_CHARACTERISTIC_VALUE)malloc(charValueDataSize);
if (NULL == pCharValueBuffer) {
return NULL; }
else {
RtlZeroMemory(pCharValueBuffer, charValueDataSize);
}
// Primire Valoare Caracteristici
31
hr = BluetoothGATTGetCharacteristicValue(hLEDevice,hCharr,
(ULONG)charValueDataSize,pCharValueBuffer,NULL,
BLUETOOTH_GATT_FLAG_FORCE_READ_FROM_CACHE );
if (S_OK == hr) {
return pCharValueBuffer;
}else
return NULL;
}
else
return NULL;}
Tabel 7 Funcț ie de acces Descrieri
Aceastăăfunc܊ ie preia valorile accelerometrului care le putem stoca într- unăîntregă܈iăcareăseăpoateă
accesa pentru a putea fi vizualizate.
Aiciăesteădeămen܊ionatăcă se vor citi valorile direct din memoria CACHE p entruăoăviteză mai
mare de preluare a datelor. (BLUETOOTH_GATT_FLAG_FORCE_READ_FROM_CACHE)
Prezentarea de mai sus s- aăfăcutăpeăunăsingurăsenzor (accelerometru).
Înămodăsimilarăseăacceseazăăsiă giroscopul, dar avem c âtevaădiferen܊eă careăleăvomăprezentaăînă
randurileăcareăurmează .
Giroscopul are ca UUID :
#define UUID_GIRO_SERV (L ”{f000aa50-0451-4000-b000-000000000000} ”)
32
Diferenta dintre UUID-ul accelerometrului si al giroscopului e steăaceeaăcăăunulăseăaflăălaăadresaă
aa10(accelerometru)ă܈iăcelălaltălaăadresaăaa50(giroscop).
Serviciile, caracteristicile, valoare caracteristici, descrieri , valoare descrieri se acceseaza cu
acelea܈iăfunc܊iiăprezentateăînăacestăcapitol.
Fig. 12 Caracteristici giroscop
INTRARE PRELOARE DATE DE PE AXE
1 AXA X
2 AXA Y
3 AXAăXă܇IăY
4 AXA Z
33
Tabel 8 Numarul de intrare pentru accesarea axelor giroscopului
Pentruăpreluareaădatelorădeălaăgiroscopăavemămaiămulteăposibilită܊iăcândăaccesămăCaracteristiciă
pentru configurare(aa52).
Dateleăcareăsuntăîntoarseădeăcătreăgiroscopăsunt:ă
*aa = calcGyro(pCharValueBuffer_Giro->Data[0],pCharValueBuffer_Giro->Data[1]);
*bb = calcGyro(pCharValueBuffer_Giro->Data[2],pCharValueBuffer_Giro->Data[3]);
*cc = calcGyro(pCharValueBuffer_Giro->Data[4],pCharValueBuffer_Giro->Data[5]);
La prima vedere se poate zice, intuitive c ă:
– “aa”ăreprezintă x;
– “bb” reprezintăăy ;
– “cc”ă reprezint ăăz.ă
Dar dac ăăseăcite܈teăcuăaten܊ieădatasheet -ulădispozitivuluiăseăvaăobservaăcăăordineaănuăeăceaă
prezentatăăanterior,ăciăesteăpu܊inădiferitaădatorităăunorăreduceriădeăliniiădeăcomunicareăînă
interiorul dispozitivului.
Deci ordinea corecta este re prezentatăăde :
– aa reprezint ăăy;
– bbăreprezintăăx; 5 AXAăXă܇IăZ
6 AXAăYă܇IăZ
7 AXAăX,ăYă܇IăZ
34
– ccăreprezintăăz.
Acestea ar fi cateva diferente dintre cei doi senzori la accesarea datelor lor.
Înămodăsimilarăseăpotăaccesaăsiăceilal܊iăsenzoriădeăpeădispozitiv,ădarăcuăcatevaădiferen܊eăcareăvorăfiă
în܊eleseădacăăseăstudiazăăcuăaten܊ieădatasheet -ul dispozitivului.
6.2 Colectarea datelor
Datele colectate de la SensorTag sunt :
– datele de la giroscop;
– datele de la accelerometru.
Pentru acest lucru, am folosit programul de dezvoltare LabWindows CVI de la National
Instruments.ăAceastăăplatformăădeălucruăfolose܈ te ca drept limbaj de programare C.
Primulă pasă înă dezvoltareaă acesteiă licen܊ e aă fostă deă aă cercetaă despreă BLEă ܈iă cumă se conectez ăă
dispozitivul SensorTag cu un calculator pentru a putea prelua datele de interes.
Dupăăcumăs -a prezentat într- unăcapitolămaiăsus,ăachizi܊ ia de date de la dispozitiv prin BLE se
face prin accesarea de: servicii, caracteristici, valorile caracteristicilor si descriptor.
Acest mod de organizare a datelor este unul eficient, pentru un software developer deoarece toate
sunt aranjate intr- oăordineăbineăpusă la punct.
In continuare se va pr ezentaăunulădintreăprogrameleăfăcuteăpentruăachizi܊ionareaădatelor.
35
Fig. 22 Interfață creată pentru înțelegerea senzorului SensorTag
Prezentareăinterfată:
Aceastăă interfa܊ăă aă fostă facutăă pentruă aă puteaă in܊ elegeă cumă func܊ioneazăă dispozitivulă ină modă
intuitiv.ă Ini܊ializareaă dispozitivuluiă seă faceă ină modă automată câ nd deschid eă fi܈ierulă executabil,ă
a܈teptândăcaăsă permităădatelorăsăăfieăafi܈ ate.
1 – Este butonul de pornire si oprire a programului. Acestaă permiteă dateloră săă fieă afi܈ateă înă
căsu܊eleă corespunzătoareă ܈iă ină graficulă dină parteaă dreaptă.ă Func܊iaă implementatăă constăă intr -o
verificareăconstantăă܈iăcontinuă a setului de date aflat in blocul de valori a caracteristicilor.
2 – Butonulă deă “Achizi܊ie”ă reprezintă un buton care salve azaă dateleă deă laă accelerometruă ܈iă
giroscopăinămomentulăînăcareăesteăpornit.ăAcestaăajutăălaăpreloareaădatelorăcuăcareăurmeazăăsă se
antreneze clas ificatorulăpentruăaăputeaăsăăclasificeăcîtămaiăprecis.ăÎ n partea drea ptăăaăbutonuluiăseă
aflăă܈ i un led pentru a putea avertizaăcandăaăinceputăachizi܊ia (acesta va fi aprins) si când s- aăsfîr܈ită
achizi܊ ia(acesta va fi stins).
3 – Acesta este gr aficulăcareăaratăăinătimpărealăcumăseămodifică valoarea a celor 3 axe x, y si z a
accelerometrului. A fost implementa tăpentruăaăobservaămaiăintuitivăevolu܊iaă܈iămi܈careaăplacu܊ ei
cu senzori.
36
4 – Suntă afi܈ ate datele celor 3 c oordonateă pentruă accelerometruă ܈ i pentru giroscop. Se poate
observaăcă aceste date sunt de tip float pentru a avea o precizie cat mai buna.
Acest program a fost dezvoltat pentruăaăin܊elegeăfunc܊ ionalitatea BLE, a senzorilor din dispozitiv
܈i modul de utilizare a acestui dispozitiv SensorTag.
37
7. Clasificator
În acest capitol se va vorbi despre Clasificatorul Mahalanobis, care a fost ales pentru a
clasificaăsetulădeădateăob܊inutăînăurmaărotiriiămâinii.
Acest clasificator este deă faptă ună clasificatoră deă minimaă distan܊ăă ceă folose܈teă distan܊aă
Mahalanobis.
Formula acestui clasificator este : ݎଶ=(a-)*(1/) *(a- ),ăundeă“a”ăreprezintăăvectorulădeă
clasificat, reprezintăămediaăclaselorădeătipă܈ablon,ăiară repre zintăămatriciaădeăcovarian܊ăăaleă
acestora.
Fundamentulăteoreticăpeăcareăseăbazeazăăacestăclasificator:
Vectorulă“a”ăesteăvectorulăcareătrebuieăatribuităuneiăclase,ăaăcareiăseă܈tieămediaă܈iămatriceaădeă
covarian܊ă.ăCuăajutorulăacestoraăseămăsoarăădistan܊aădeălaămediaăclasei,ălaăvectorulănecunoscută܈iă
seăclasificăăînăfuc܊ieădeăcelămaiămică ݎଶ.
Fig. 23 Clasificator de minima distan ță cu metrica Mahalanobis
38
Table 9 Date de clasificare
Dupăăcumăseăvedeă܈iăînătabelulădeădedesuptăpeăcoloanăăsuntămediaăaăceloră܈aseăvectori,ăiarăpeă
linie avem vectorul necunoscut de intrare.
Claseleăreprezintăămediaăaă܈aseăvectori,ăfiecareăvectorăavândă܈aseăelemente.
Aceste ܈ase elemente au fost determinate inăurmaăaflăriiăcoeficien܊ ilor AR( Autoregressive) din
vectoriiădeădateăcolecta܊iădeălaădispozitivulăSensorTagăinătimpulămi܈cariiămâinii.
Dateleă dină vectoriiă colecta܊iă deă laă dispozitivă auă fostă ină numără deă 180ă deă valori(ă 30ă deă valoriă
pentru fiecare axa, x, y si z de la accelerometru deci un total de 90 de valori si 30 de valori
pentru fiecare axa, x, y si z de la giroscop deci un total de 90 de valori).
Aceste valori, cum s- aăprezentată܈iămaiăsus,ăauăfostăprocesateăpentruăaăseăgăsiăcoeficien܊iiăARă܈iăă
s-a con statatăcăă܈aseăcoeficien܊iăARăsuntăsuficien܊iăpentruăaăputeaămergeămaiădeparteăsiăaăclasificaă
fiecare clasa.
CLASIFICATOR MAHALANOBIS
CLASA
DREAPTA CLASA
STÂNGA CLASA
FA܉A CLASA
SPATE
FISIER
NECUNOSCUT
DREAPTA 16.6817 24.7448 41.8530 22.4274
FISIER
NECUNOSCUT
STÂNGA 50.7813 3.3481 27.8035 40.5789
FISIER
NECUNOSCUT
SPATE 44.4871 21.5013 19.6702 3.3926
FISIER
NECUNOSCUT
FA܉A 38.2468 7.1958 3.6523 23.6254
39
Fig.24 Coeficienți AR [ 8]
Fig. 25 Reprezentare grafică a cîți coeficienți AR sunt necesari [ 8]
Seăpoateăobservaădinăgraficăcăăaxaăaăinceputăsăăscadăălaăvaloareaă܈ase.
Aceastăă determinareă aă coeficien܊iloră ARă s -aă făcută pentruă ܈aseă vectoriă aă fiecăreiă dină celeă patruă
clase(stânga,ă dreapta,ă fa܊a,ă spate)ă pentruă aă aveaă oă bazăă deă dateă cuă careă săă comparămă vec torii
necunoscu܊iăcareăvorăfiălaăintrare.
In continuare s- aădezvoltatăunăprogramăpentruăaătestaădacăăvectoriiănecunoscu܊iădeăintrareăsuntă
clasifica܊iă corect.
Acestăprogramăincarcăăfiecareădinăceiă܈aseăvectoriăcuăcoeficien܊iiăARăsiăvectorulănecunoscut.
40
Fig. 26 Program Clasificator Mahalanobis
Seăobservăădinăfigurăăceeaăceăesteădeăinteres.ăMatriceaădeăcovarian܊ăăaăclaselor,ămediaăc laseloră܈iă
rezultatulăclasificării.
Matriceaădeăcovarian܊ăăesteămediaătuturorămatriciilorădeăcovarian܊ăăaăvectorilorădin aceaăclasaă܈iă
afi܈atăăcaă1/Cx.
Mediaăreprezintăăsumaătuturorăvectoriloră܈iăimpar܊ităălaănumarulăvectorilor.
Modulădeăconstruc܊ieăaăprogramului.
Fi܈iereleă cuă vectoriă auă fostă salvateă ină formată .txtă ܈iă auă fostă incărcateă ină programă cuă ajutorulă
func܊iei:
FileToArray (fa1, b1, VAL_FLOAT, 6, 1, VAL_GROUPS_TOGETHER,
VAL_GROUPS_AS_COLUMNS, VAL_ASCII);
Dupăă aceeaă s -aă calculată pentruă fiecareă elementă ină parteă mediaă ܈iă s -a stocat in vectorul
media[6][1].ăb1,b2,b3.b4,b5,b6ăreprezintăăvectoriiăcuăcoeficien܊iiăincărca܊iăinăprogram.
41
for(int i=0;i<6;i++)
{
mediaDR[i][0]= (b1[i][0]+b2[i][0]+b3[i][0]+b4[i][0]+b5[i][0]+b6[i][0])/6;
}
Următorulă pasă aă fostă săă seă construiascăă matriceaă deă covarian܊ăă pentruă fiecareă vectoră pentruă aă
puteaă săă seă facaă sumaă acestoraă ܈iă aă seă folosiă maiă departe.ă NE1[6][0]ă reprezintăă (a -mx), iar
TE1[6][0]ă reprezintăă (a -mx)ă transpus.ă CDR1[6][6]ă reprezintăă matirceaă deă covarian܊ăă careă esteăă
(a-mx) * (a-mx)T.
NE1[o][0] = b1[o][0] – mediaDR[o][0];
TE1[0][o] = b1[o][0] – mediaDR[o][0 ];
CDR1[l][j] = NE1[l][0] * TE1[0][j];
Matriceaădeăcovarian܊ăătotalăăesteănotatăăcuăCDTOT[6][6]:
CDTOT[l][j] = 1/((CDR1[l][j] +CDR2[l][j]+CDR3[l][j]+CDR4[l][j]+CDR5[ l][j]+ CDR6[l][j])/6);
In continuare s-a determinat (a- mx)ăreprezentatădeăP1[6][1]ă܈iă( a-mx)T reprezentat de P2[1][6]
pentru vectorul necunoscut de intrare.
P2[0][y] = b7[y][0] – mediaDR[y][0];
P1[y][0] = b7[y][0] – mediaDR[y][0];
RezultatulăreprezintăăformulaăclasificatoruluiăMahalanobisăprezentatăăinăacestăcapitol.
R += (P2[0][t] * D[t][0]);
InăaceastăăformulăăD[6][1]ăreprezintăă(a -mx)*1/CDTOT[6][6].
Dupăăcumăseăvedeă܈iăinătabelulădinăacestăcapitolăclasificatorulărealizatăaăreu܈ităsăăclasificeăcorectă
vectoriiădeăintrare,ărezultatulăingro܈atăpeăcoloanăăreprezentatăfiindăcelămaiămic.
42
ProgramulăaăfostădezvoltatăinămediulădeălucruăLabWindowăCVIă܈iăaăfostăcreatăpentruăcaăautorulă
săăin܊eleagăăcumăfunc܊ioneazăăclasificatorulă܈iăpentruăaăputeaăvedeaădacăărezultateleăob܊inuteăsuntă
cele corecte.
43
8. Modul de fun cționare
In acest capitolă seă vaă prezentaă celeă douăă moduriă deă func܊ionare,ă deoareceă s -aă dezvoltată două
programe pentru pr ezentare.ăAcesteămoduriădeăfunc܊ionareănuăsuntădiferiteăcaă܈ i rezultat, dar sunt
diferite ca implementare. Un mod de lucru este reprezentat prin miscareaămâiniiăînădirec܊iaădorităă
pentruăaămi܈caăma܈inaăînădirec܊iaădorită,ăpeăcîndăî n al doi- leămodădeălucruăma܈inaăvaăfiămutată
prin cele cinci gesturi care se vor prezenta mai tarziu.
8.1 Primul mod de lucru:
Dupaăcumăamăzisă܈iămaiăsusăacestămodăeste func܊ionalădoarăprinăbalansareaămâiniiăpeăcareăseăaflăă
ata܈a t senzorulăinădirec܊iaăînăcareădorimăcaăma܈inaăsăăseădeplaseze .
Fig. 27 Mișcarea mîinii pentru deplasarea mașinii
44
Seăobservăăînă imagine cumăesteăata܈ at dispoziti vulădeămână . Acestaăareăunălocăspecial,ăpozi܊ionată
peăparteaădorsalăăaămâ iniiăpentruăaăputeaăsesizaămi܈ carea acestuiaă܈iăpentruăaăputeaădeplasaă
ma܈inaăînăfunc܊ieădeămi܈careaăefectuată .
Acesteămi܈căriăsuntă:ăînainte,ăînapoi,ăstângaă܈iădreaptaădupăăcumămi܈ cămămâna.ăÎnăpozi܊iaăinăcareă
seăobservăăînăfigură,ăma܈inaă este nemi܈cată .
Înăfunc܊ieădeăinclina܊iaămâiniiăma܈inaăvaăaveaăoăvitezăă mică dacă unghi ulădeăînclina܊ieăesteăredusă
܈iăvitezaăvaăcre܈teădacăăunghiulădeăinclina܊ ie seămăre܈te .
8.2 Al doi-lea mod de lucru
Al doi- le modădeălucruăconstăăprinămi܈careaămâiniiăinădirec܊iaădorită,ăsalvareaădatelorăînă
urmaăac܊iuniiă܈iăclasificareaăacestoraăcuăclasificatorulăprezentatăînăcapitolulă7.
Acesteă mi܈căriă suntă diferiteă deă celeă deă dinainteă deoarece,ă suntă mi܈căriă ample . Datele, în acest
caz,ăsuntăachizi܊ionateădeălaăaccelerometruă܈iădeălaăgiroscopăpentruăaăaveaădateămaiămulteăsiămaiă
diversificate pentru clasificare.
Aceste date sunt salvate într-un buffer si sunt accesate cand buffer-ul a ajuns la 180 de elemente
în interiorul lui.
Apoiăseăextragăcoeficien܊iiăARădinăacestăbufferă܈iăseămergeămaiădeparteăspreăclasificator.
Odatăăformatănoulăvectorănecunoscutăcuăcoeficien܊iă se compara cu clasele salvate in program si
seăclasifica,ădupăăcareăseătrimiteăoăcomandaăspreămotoareăinăfunc܊ieădeăceeaăceăaărezultatădupă ă
clasificare.
Aceastăăopera܊iuneăseăefectueazaăpanaălaăoprireaăprog ramului.
Interfata de utilizare a acestor moduri a fost dezvoltată în mediul de lucru Visual Studio 2013.
Aceastăă interfa܊aă nuă aă fostă dezvoltată deă cătreă autorulă acesteiă licen܊e,ă acestaă doară veniindă cuă
completărileănecesareăpentruădezvoltareaăaplica܊ieiănecesare.
45
Înăimagineaăcareăurmeazăăseăpoateăvedeaăinterfa܊aă܈iăseăvaăvorbiădespreăceeaăceăs -a lucrat la ea.
Fig.28 Interfață robot în VS
Prezentare interfa܊ă:
1 – Acesteaăsuntăbutoaneleădeăpornireăsiăoprireăaădatelorădeălaăaccelerometruă܈iăgiroscop.
2 – Înăacesteăcăsu܊eăseăobservaărezultatulădupaăclasificareă܈iăînămodăintuitivăneăputemădaă
seamaăcăăsuntăaranjateăînăa܈aăfelăsăăîn܊elegemăceăvaăfaceăma܈ina.
Înă func܊ieă deă ceă clasificareă vaă apareaă î n partea stanga procentajul motoarelor cum
ac܊ioneaza.
46
STANGA RIGHT ENG. 0.6
LEFT ENG. 0.2
DREAPTA RIGHT ENG. 0.2
LEFT ENG. 0.6
SPATE RIGHT ENG. -0.5
LEFT ENG. -0.5
FATA RIGHT ENG. 0.5
LEFT ENG. 0.5
STOP RIGHT ENG. 0.0
LEFT ENG. 0.0
Tabel 10 Valori motoare
3 – Înă acesteă treiă casu܊eă seă voră afi܈aă dateleă deă laă accelerometruă pentruă aă puteaă lucreă înă
modulă1ădeăfunc܊ionare.
4 – Reprezintăăbutonulădeăini܊ializareăaăBLEăpentruăaănuămaiăaveaănevoieăsăăîlăini܊ializămă
deăfiecareădată.
47
Rezumat
Înăconcluzieăacestăproiectăareălaăbazăăurmătoareleăetape:
– În܊elegereaădespreăBLEă܈iădiferen܊aăîntreăunăBLEă܈iăBluetoothăClasic;
– UtilizareaăunuiăBLEăînăaplica܊iileăcuătransferădeădateădeădimensiuniămici ;
– Conectareaă܈iăpreluareaădatelorădeăpeăunădispozitivăcareăstabile܈te transferul prin BLE;
– Dezvoltareaă programeloră deă interfa܊areă înă mediulă deă lucruă LabWindowă CVIă ܈iă Visuală
Studio;
– În܊elegereaă܈iădezvoltareaăuneiăaplica܊iiăcuăunăclasificatorădeăminimăădistan܊ăăceăfolose܈teă
ca metrica Mahalanobis(clasificatorul Mahalanobis);
Aceastăă lucrareă aă fostă deă mareă ajutoră pentruă autorulă ei,ă înă dezvoltareaă ܈iă în܊elegereaă anumitoră
principii în programare.
Programul dezvoltat se poate optimiza cuău܈urin܊ăădeoareceăauăfostăintroduseăcomentariiăpentruăaă
seăîn܊elege.
Unulădintreădomeniileăînăcareăseăîncadreazăă܈iăaceastăălicen܊ăăesteăconexiuneaăîntreădispozitiveă܈iă
esteă ună domeniuă înă continuăă cre܈tereă datorităă dori܊eiă utilizatoruluiă deă aă staă conectată ܈iă aă primiă
feedbackădeălaădispozitiveleăelectriceă܈iăelectroniceădinăjur.
Avândă înă vedereă conexiunea,ă transferulă deă dateă rapidă ܈iă consumulă redusă deă energieă aă
dispozitivului,ăaplica܊iileăcareăseăpotădezvoltaăpentruăîn܊elegereaăprincipiilorăsuntăpeăoăscareălarga.
48
Bibliografie
[1] https://en.wikipedia.org/wiki/Accelerometer , Accelerometru;
[2] https://en.wikipedia.org/wiki/Gyroscope , Giroscop;
[3] https://epxx.co/artigos/bluetooth_gatt.html , BLE -> GATT;
[4] http://www.codeproject.com/Articles/999279/Using-the-Generic-Attribute-Profile-
GATT- in-Blueto , BLE, GATT;
[5] https://msdn.microsoft.com/en-
us/library/windows.devices.bluetooth.bluetoothledevice.aspx?cs-save-lang=1&cs-
lang=cpp#code-snippet-1 , clase BLE pentru accesare;
[6] https://msdn.microsoft.com/en-us/library/windows/hardware/hh450825(v=vs.85).aspx ,
func țiiăajutătoareăpentruăconectareălaădispozitivăp rin BLE;
[7] Getting Started with Bluetooth Low Energy, by Robert Davidson, Akiba, Carles Cufí,
Kevin Townsend
[8] Dobrea Dan Marius, Dobrea Monica Claudia, Intelligent Methods and Algorithms with
Application in Electronics and Biomedical Engineering , vol. 1, pp. 450, Cermi Publishing
House,ăIași,ăRomânia,ăISBNă973 -667-168-2, 2009
[9] http://processors.wiki.ti.com/index.php/SensorTag_User_Guide ;
[10] http://www.kionix.com/product/KXTJ9-1007 ; Accelerometru KXTJ9
[11] https://store.invensense.com/datasheets/invensense/PS-IMU-3000A.pdf ; Giroscop
IMU – 3000;
[12] https://developer.microsoft.com/en-us/windows/iot/win10/samples/blegatt ; BLE
49
[13] http://processors.wiki.ti.com/images/a/a8/BLE_SensorTag_GATT_Server.pdf ; table
atribute
[14] http://www.ti.com/product/CC2541 ; CC2541
50
Anexa
Main.c
#include <cvirte.h>
#include <userint.h>
#include "licenta_V1.0.h"
#include "functiiBLE.h"
#include <utility.h>
#include <ansi_c.h>
#include <formatio.h>
#include "asynctmr.h"
static int panel;
// ––––- ASYNC TIMER start ––––––––- ––––-
int ID_async_timer; //for data acquisition ID async timer
int ID_async_timer_1;
// This is a user defined callback function for the asynchronous timer.
// It must follow the exact same syntax as a normal Interval Timer
// Control callback.
int CVICALLBACK MyTimerCallback (int reserved, int theTimerId, int event,
void *callbackData, int eventData1,
int eventData2);
int CVICALLBACK MyTimerCallback_1 (int reserved, int theTimerId, int event,
void *callbackData, int eventData1,
int eventData2);
51
// ––––- ASYNC TIMER end –––––––– –––––
int GetAccelerometerData (float *x, float *y, float *z);
int GetGyroData (float *aa, float *bb, float *cc);
float aa,bb,cc;
static int zx=0;
float dataAcc[3];
float x,y,z;
float a,b,c;
float buffer[300];
float buffer_1[20000];
float buffer_2[20000];
float bufferG[20000];
float bufferG_1[20000];
float bufferG_2[20000];
int m=0,w=0,r=0,j=0,v=0,k=0;
int val,val_1;
clock_t start, end;
double cpu_time_used;
unsigned short numServices;
52
unsigned short numChar;
USHORT charValueDataSize;
USHORT descriptorBufferSize;
USHORT descValueDataSize;
PBTH_LE_GATT_SERVICE pServiceBuffer;
PBTH_LE_GATT_CHARACTERISTIC pCharBuffer;
PBTH_LE_GATT_CHARACTERISTIC_VALUE pCharValueBuffer;
PBTH_LE_GATT_DESCRIPTOR pDescriptorBuffer;
PBTH_LE_GATT_DESCRIPTOR_VALUE pDescValueBuffer;
PBTH_LE_GATT_CHARACTERISTIC currGattChar;
PBTH_LE_GATT_DESCRIPTOR pDescriptorBuffer_0;
PBTH_LE_GATT_DESCRIPTOR_VALUE pDescValueBuffer_0;
PBTH_LE_GATT_DESCRIPTOR pDescriptorBuffer_1;
PBTH_LE_GATT_DESCRIPTOR_VALUE pDescValueBuffer_1;
PBTH_LE_GATT_CHARACTERISTIC_VALUE pCharValue_1;
PBTH_LE_GATT_DESCRIPTOR pDescriptorBuffer_2;
HANDLE hLEDevice ;
PBTH_LE_GATT_CHARACTERISTIC currGattChar_0;
PBTH_LE_GATT_CHARACTERISTIC currGattChar_1;
PBTH_LE_GATT_CHARACTERISTIC currGattChar_2;
53
BTH_LE_GATT_CHARACTERISTIC_VALUE newValue_2;
BTH_LE_GATT_CHARACTERISTIC_VALUE newValue_1;
UCHAR valueData;
UCHAR valueData_2;
HRESULT hr_2;
unsigned short numServices_Giro;
unsigned short numChar_Giro;
HRESULT hr_2_Giro;
USHORT charValueDataSize_Giro;
USHORT descriptorBufferSize_Giro;
USHORT descValueDataSize_Giro;
PBTH_LE_GATT_SERVICE pServiceBuffer_Giro;
PBTH_LE_GATT_CHARACTERISTIC pCharBuffer_Giro;
PBTH_LE_GATT_CHARACTERISTIC_VALUE pCharValueBuffer_Giro;
PBTH_LE_GATT_DESCRIPTOR pDescriptorBuffer_Giro;
PBTH_LE_GATT_DESCRIPTOR_VALUE pDescValueBuffer_Giro;
PBTH_LE_GATT_CHARACTERISTIC currGattChar_Giro;
PBTH_LE_GATT_DESCRIPTOR pDescriptorBuffer_0_Giro;
54
PBTH_LE_GATT_DESCRIPTOR_VALUE pDescValueBuffer_0_Giro;
PBTH_LE_GATT_DESCRIPTOR pDescriptorBuffer_1_Giro;
PBTH_LE_GATT_DESCRIPTOR_VALUE pDescValueBuffer_1_Giro;
PBTH_LE_GATT_CHARACTERISTIC_VALUE pCharValue_1_Giro;
PBTH_LE_GATT_DESCRIPTOR pDescriptorBuffer_2_Giro;
UCHAR valueData_Giro;
UCHAR valueData_2_Giro;
HANDLE hLEDeviceGiro;
PBTH_LE_GATT_CHARACTERISTIC currGattChar_0_Giro;
PBTH_LE_GATT_CHARACTERISTIC currGattChar_1_Giro;
PBTH_LE_GATT_CHARACTERISTIC currGattChar_2_Giro;
BTH_LE_GATT_CHARACTERISTIC_VALUE newValue_2_Giro;
BTH_LE_GATT_CHARACTERISTIC_VALUE newValue_1_Giro;
BTH_LE_GATT_DESCRIPTOR_VALUE newValue;
BTH_LE_GATT_DESCRIPTOR_VALUE newValue_Giro;
int main (int argc, char *argv[])
{
if (InitCVIRTE (0, argv, 0) == 0)
55
return – 1; /* out of memory */
if ((panel = LoadPanel (0, "licenta_V1.0.uir", PANEL)) < 0)
return – 1;
DisplayPanel (panel);
GUID DevClass;
GUID DevClassGiro;
GUID DevClassOAD;
// Convert the registry-formatted CLSID for the WEIUSB device
// class to a GUID structure.
CLSIDFromString(UUID_ACC_SERV, &DevClass);
CLSIDFromString(UUID_GYR_SERV, &DevClassGiro);
hLEDevice = GetBLEHandle(DevClass);
hLEDeviceGiro = GetBLEHandle_GIRO(DevClassGiro);
unsigned short numServices;
unsigned short numChar;
charValueDataSize = NULL;
descriptorBufferSize = NULL;
descValueDataSize = NULL;
pServiceBuffer = NULL;
pCharBuffer = NULL;
56
pCharValueBuffer = NULL;
pDescriptorBuffer = NULL;
pDescValueBuffer = NULL;
currGattChar = NULL;
pDescriptorBuffer_0 = NULL;
pDescValueBuffer_0 = NULL;
pDescriptorBuffer_1 = NULL;
pDescValueBuffer_1 = NULL;
pCharValue_1 = NULL;
pDescriptorBuffer_2 = NULL;
valueData = 1;
valueData_2 = 16;
unsigned short numServices_Giro;
unsigned short numChar_Giro;
charValueDataSize_Giro = NULL;
descriptorBufferSize_Giro = NULL;
descValueDataSize_Giro = NULL;
pServiceBuffer_Giro = NULL;
pCharBuffer_Giro = NULL;
pCharValueBuffer_Giro = NULL;
pDescriptorBuffer_Giro = NULL;
57
pDescValueBuffer_Giro = NULL;
currGattChar_Giro = NULL;
pDescriptorBuffer_0_Giro = NULL;
pDescValueBuffer_0_Giro = NULL;
pDescriptorBuffer_1_Giro = NULL;
pDescValueBuffer_1_Giro = NULL;
pCharValue_1_Giro = NULL;
pDescriptorBuffer_2_Giro = NULL;
valueData_Giro = 7;
valueData_2_Giro = 16;
if (hLEDevice)
{
pServiceBuffer = GetGattService(hLEDevice, pServiceBuffer, &numServices); // get service
if (pServiceBuffer)
{
for (int i = 0; i < numServices; i++)
{
pCharBuffer = GetGattCharacteristics(hLEDevice, pServiceBuffer,
pCharBuffer, &numChar); //get characteristics
}
58
currGattChar_0 = &pCharBuffer[0];
currGattChar_1 = &pCharBuffer[1];
currGattChar_2 = &pCharBuffer[2];
pDescriptorBuffer_1 = GetDescriptor(hLEDevice, currGattChar_1, pDescriptorBuffer_1 ,
descriptorBufferSize);
RtlZeroMemory(&newValue_1, (sizeof(newValue_1)));
newValue_1.DataSize = sizeof(valueData);
newValue_1.Data[0] = valueData;
// Set the new characteristic value
HRESULT hr_1 = BluetoothGATTSetCharacteristicValue(
hLEDevice,
currGattChar_1,
&newValue_1,
NULL,
BLUETOOTH_GATT_FLAG_NONE);
pCharValue_1 = GetCharacteristicValue(hLEDevice, currGattChar_1, pCharValue_1,
charValueDataSize);
pDescriptorBuffer_0 = GetDescriptor(hLEDevice, currGattChar_0, pDescriptorBuffer_0 ,
descriptorBufferSize);
//Set the new descriptor value
RtlZeroMemory(&newValue, sizeof(newValue));
newValue.DescriptorType = ClientCharacteristicConfiguration;
newValue.ClientCharacteristicConfiguration.IsSubscribeToNotification = TRUE;
59
HRESULT hr = BluetoothGATTSetDescriptorValue(
hLEDevice,
pDescriptorBuffer_0,
&newValue,
BLUETOOTH_GATT_FLAG_NONE);
//perioada
pDescriptorBuffer_2 = GetDescriptor(hLEDevice, currGattChar_2, pDescriptorBuffer_2 ,
descriptorBufferSize);
RtlZeroMemory(&newValue_2, (sizeof(newValue_2)));
newValue_2.DataSize = sizeof(valueData_2);
newValue_2.Data[0] = valueData_2;
// Set the new period value
hr_2 = BluetoothGATTSetCharacteristicValue(
hLEDevice,
currGattChar_2,
&newValue_2,
NULL,
BLUETOOTH_GATT_FLAG_NONE);
pDescValueBuffer_0 = GetDescriptorValue(hLEDevice, pDescriptorBuffer_0,
pDescValueBuffer_0, descValueDataSize);
}
}
if (hLEDeviceGiro)
60
{
pServiceBuffer_Giro = GetGattService(hLEDeviceGiro, pServiceBuffer_Giro,
&numServices_Giro); // get service
if (pServiceBuffer_Giro)
{
for (int q = 0; q < numServices_Giro; q++)
{
pCharBuffer_Giro = GetGattCharacteristics(hLEDeviceGiro,
pServiceBuffer_Giro, pCharBuffer_Giro, &numChar_Giro); //get characteristics
}
currGattChar_0_Giro = &pCharBuffer_Giro[0];
currGattChar_1_Giro = &pCharBuffer_Giro[1];
currGattChar_2_Giro = &pCharBuffer_Giro[2];
//perioada
pDescriptorBuffer_2_Giro = GetDescriptor(hLEDeviceGiro, currGattChar_2_Giro,
pDescriptorBuffer_2_Giro, descriptorBufferSize_Giro);
RtlZeroMemory(&newValue_2_Giro, (sizeof(newValue_2_Giro)));
newValue_2_Giro.DataSize = sizeof(valueData_2_Giro);
newValue_2_Giro.Data[0] = valueData_2_Giro;
// Set the new period value
hr_2_Giro = BluetoothGATTSetCharacteristicValue(
hLEDeviceGiro,
currGattChar_2_Giro,
&newValue_2_Giro,
NULL,
BLUETOOTH_GATT_FLAG_NONE);
61
pDescriptorBuffer_1_Giro = GetDescriptor(hLEDeviceGiro, currGattChar_1_Giro,
pDescriptorBuffer_1_Giro, descriptorBufferSize_Giro);
RtlZeroMemory(&newValue_1_Giro, (sizeof(newValue_1_Giro)));
newValue_1_Giro.DataSize = sizeof(valueData_Giro);
newValue_1_Giro.Data[0] = valueData_Giro;
// Set the new characteristic value
HRESULT hr_1_Giro = BluetoothGATTSetCharacteristicValue(
hLEDeviceGiro,
currGattChar_1_Giro,
&newValue_1_Giro,
NULL,
BLUETOOTH_GATT_FLAG_NONE);
pCharValue_1_Giro = GetCharacteristicValue(hLEDeviceGiro, currGattChar_1_Giro,
pCharValue_1_Giro, charValueDataSize_Giro);
pDescriptorBuffer_0_Giro = GetDescriptor(hLEDeviceGiro, currGattChar_0_Giro,
pDescriptorBuffer_0_Giro, descriptorBufferSize_Giro);
//Set the new descriptor value
RtlZeroMemory(&newValue_Giro, sizeof(newValue_Giro));
newValue_Giro.DescriptorType = ClientCharacteristicConfiguration;
newValue_Giro.ClientCharacteristicConfiguration.IsSubscribeToNotification = TRUE;
HRESULT hr_Giro = BluetoothGATTSetDescriptorValue(
hLEDeviceGiro,
pDescriptorBuffer_0_Giro,
&newValue_Giro,
BLUETOOTH_GATT_FLAG_NONE);
pDescValueBuffer_0_Giro = GetDescriptorValue(hLEDeviceGiro, pDescriptorBuffer_0_Giro,
pDescValueBuffer_0_Giro, descValueDataSize_Giro);
}
}
// A call to NewAsyncTimer will automatically spawn a new thread and use
//it to create a timer using the Windows multimedia timer functions. This
62
//function sets the attributes of the timer and declares the function,
//MyTimerCallback, to be used as the callback function for the timer.
ID_async_timer = NewAsyncTimer (0.150, -1, 0, MyTimerCallback, 0);
ID_async_timer_1 = NewAsyncTimer (0.150, -1, 0, MyTimerCallback_1, 0);
RunUserInterface ();
DiscardPanel (panel);
return 0;
}
int CVICALLBACK fPanel (int panel, int event, void *callbackData,
int eventData1, int eventData2)
{
switch (event)
{
case EVENT_GOT_FOCUS:
break;
case EVENT_LOST_FOCUS:
break;
case EVENT_CLOSE:
QuitUserInterface (0);
break;
}
return 0;
}
int CVICALLBACK fStart (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
int val;
switch (event)
63
{
case EVENT_COMMIT:
GetCtrlVal (panel, PANEL_Start_Butto, &val);
if(val)
{
SetAsyncTimerAttribute (ID_async_timer, ASYNC_ATTR_ENABLED, 1);
}else
{
SetAsyncTimerAttribute (ID_async_timer, ASYNC_ATTR_ENABLED, 0);
}
break;
}
return 0;
}
int CVICALLBACK MyTimerCallback (int reserved, int theTimerId, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event)
{
case EVENT_TIMER_TICK:
GetAccelerometerData (&x,&y,&z);
SetCtrlVal (panel, PANEL_NUMERIC_Acc_1, x);
SetCtrlVal (panel, PANEL_NUMERIC_Acc_2, y);
SetCtrlVal (panel, PANEL_NUMERIC_Acc_3, z);
GetGyroData (&a,&b,&c);
SetCtrlVal (panel, PANEL_NUMERIC_Gyro_1, b); //x
SetCtrlVal (panel, PANEL_NUMERIC_Gyro_2, a); //y
SetCtrlVal (panel, PANEL_NUMERIC_Gyro_3, c); //z
64
dataAcc[0] = x;
dataAcc[1] = y;
dataAcc[2] = z;
PlotStripChart (panel, PANEL_STRIPCHART, dataAcc, 3, 0, 0, VAL_FLOAT );
break;
}
return 0;
}
int CVICALLBACK MyTimerCallback_1 (int reserved, int theTimerId, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event)
{
case EVENT_TIMER_TICK:
GetCtrlVal (panel, PANEL_LED, &val);
if(val)
SetCtrlVal (panel, PANEL_LED, 0);
else
SetCtrlVal (panel, PANEL_LED, 1);
buffer[zx] = x;
zx++;
buffer[zx] = y;
zx++;
buffer[zx] = z;
zx++;
buffer[zx] = a;
zx++;
65
buffer[zx] = b;
zx++;
buffer[zx] = c;
zx++;
if(zx==180)
{
SetAsyncTimerAttribute (ID_async_timer_1, ASYNC_ATTR_ENABLED, 0 );
SetCtrlVal (panel, PANEL_LED, 0);
ArrayToFile ("c:\\Users\\BogdanT\\Desktop\\bogdan achizitie 30\\TEST_F T.txt", buffer, VAL_FLOAT, 180, 6,
VAL_DATA_MULTIPLEXED, VAL_GROUPS_AS_COLUMNS, VAL_CONST_WIDTH, 15, VAL_A SCII,
VAL_TRUNCATE);
}
break;
}
return 0;
}
int CVICALLBACK fButonStart (int panel, int control, int event, void *callbackData, int eventData1, int
eventData2)
{
switch (event)
{
case EVENT_COMMIT:
SetAsyncTimerAttribute (ID_async_timer_1, ASYNC_ATTR_ENABLED, 1) ;
break;
}
return 0;
}
int GetAccelerometerData (float *xx, float *yy, float *zz)
{
66
pCharValueBuffer = GetCharacteristicValue(hLEDevice, currGattChar_0, pCharValueBuf fer,
charValueDataSize);
*xx = calcAccel(pCharValueBuffer->Data[0]);
*yy = calcAccel(pCharValueBuffer->Data[1]);
*zz = calcAccel(pCharValueBuffer->Data[2]);
return 0;
}
int GetGyroData (float *aa, float *bb, float *cc)
{
pCharValueBuffer_Giro = GetCharacteristicValue(hLEDeviceGiro, currGattChar_0_Giro,
pCharValueBuffer_Giro, charValueDataSize_Giro);
*aa = calcGyro(pCharValueBuffer_Giro->Data[0],pCharValueBuffer_Giro- >Data[1]);
*bb = calcGyro(pCharValueBuffer_Giro->Data[2],pCharValueBuffer_Giro->Data[3]) ;
*cc = calcGyro(pCharValueBuffer_Giro->Data[4],pCharValueBuffer_Giro->Data[5] );
return 0;
}
Copyright Notice
© Licențiada.org respectă drepturile de proprietate intelectuală și așteaptă ca toți utilizatorii să facă același lucru. Dacă consideri că un conținut de pe site încalcă drepturile tale de autor, te rugăm să trimiți o notificare DMCA.
Acest articol: SPECIALZIAREA:ăELECTRONICĂăAPLICATĂ I SISTEME INTELIGENTE [619686] (ID: 619686)
Dacă considerați că acest conținut vă încalcă drepturile de autor, vă rugăm să depuneți o cerere pe pagina noastră Copyright Takedown.
