ZenWheels Micro Car – Maşinuţe şi Android

by donpedro

Am avut la începutul verii ocazia să îmi cadă în mână o maşinuţă tare simpatică, ZenWheels Micro Car de la Plantraco. Seamănă cu o jucărie pentru copii, o găseşti în diferite culori şi poate fi controlată printr-o aplicaţie Android gratuită direct de pe telefon sau tabletă.
Pe jumătate în joacă, pe jumătate serios (ca task pentru Şcoala de Vară din cadrul laboratorului Robolab, Facultatea de Automatică şi Calculatoare la care am participat), am scris propria mea aplicaţie Android pentru a mă juca cu maşinuţa.

Autor: Georgiana Diana Ciocîrdel – georgiana_diana.ciocirdel@cti.pub.ro

Maşinuţa celor de la ZenWheels măsoară în lungime 5cm şi jumătate, iar în înălţime are aproximativ 2cm şi jumătate. Am ataşat articolului o poză cu “organele interne” ale maşinuţei. Pentru alimentare, se foloseşte o baterie LiPo, astfel încât, pentru 30 de minute de încărcare cu ajutorul unui cablu micro USB, profităm în medie cam de 30-40 de minute de joacă. Şi ce mai joacă … pe lângă condusul propriu-zis şi încercarea de a parca lateral cu spatele (nici în viaţa reală nu îmi iese prea bine, ce-i drept), maşinuţa beneficiază de faruri (faza lungă şi faza scurtă), sirenă (cu 3 melodii diferite), semnalizator pe fiecare parte, avarii şi (o, da!) claxonează!

Lăsând la o parte stilul colocvial, care face articolul să sune ca o reclamă (off topic, maşinuţa costă doar 89.99$ – un chilipir, nu?), trebuie să adaug şi câteva detalii tehnice.
Maşinuţa poate fi controlată prin Bluetooth. După cum se observă şi în schemă, jucăria dispune de un modul de Bluetooth de la Microchip, RN42N-APL. Comunicarea se realizează destul de simplu între piesa în cauză şi orice dispozitiv ce conţine, la rândul său, un modul de Bluetooth, prin portul serial. Astfel, fiecare “acţiune” a maşinuţei este reprezentată printr-un cod de patru octeţi, înregistrat de modulul de Bluetooth. Decodificarea se realizează cu microcontrolerul PIC24H de la Microchip.
Aplicatia Android pe care am scris-o pentru maşinuţă este realizată în Java şi se bazează pe un model pus la dispoziţie de kit-ul de dezvoltare al celor de la Android (BluetoothChat). Aplicaţia se poate folosi, deci, pentru orice dispozitiv ce rulează Android (minimum API level 8).

Aplicaţia execută următorii paşi

:
0) Pentru a realiza transmisia de date între telefon/tabletă şi maşinuţă, trebuie mai întâi ca dispozitivul Android şi modulul Bluetooth al maşinuţei să se afle în starea paired.
1) În momentul deschiderii, este identificat modulul Bluetooth de bază al dispozitivului pe care se rulează aplicaţia. Codul Java instanţiază un obiect al clasei Bluetooth Adapter, pe

care îl foloseşte ulterior pe tot parcursul programului. În cazul în care mo­dulul de Bluetooth al aparatului nu este pornit, codul are grijă să rezolve problema.
2) Următorul pas în realizarea conexiunii este deschiderea unui socket de Bluetooth între dispozitiv şi modulul Bluetooth al maşinuţei, folosind UUID-ul celui din urmă. UUID se traduce prin Universally Unique Identifier, un identificator de 128 biţi, cu şanse extrem de mari să fie unic în raza de acţiune a transmi­siilor Bluetooth de care vorbim aici şi care ne garantează că mesajul de 4 octeţi pe care îl vom transmite prin acest socket va fi recepţionat şi interpretat doar de maşinuţa noastră. Protocolul ce va fi folosit la “schimbul” de date este RFCOMM, un port virtual pentru transport binar serial de date.
3) Am deschis socket-ul, deci totul este perfect. Acum putem să începem să transmitem ce date dorim.
Cred că este momentul să detaliez un pic aceste semnale de 32 de biţi despre care am tot pomenit.
Maşinuţa poate realiza o groază de nebunii, să vireze, să claxoneze, să meargă faţă-spate, cu viteză mai mare sau mai mică, în funcţie de ce i se transmite prin socket. Să zicem că aş vrea să merg înainte. Pentru aceasta, am la dispoziţie 64 de viteze, codate în hexa­zecimal, între 0x8200 şi 0x823F. Transmiţând unul dintre aceste coduri prin Bluetooth, voi obţine mişcarea spre înainte a maşinuţei.

Ceea ce deosebeşte aplicaţia mea de cea “clasică” este faptul că eu am abordat metoda tilting pentru a determina mişcarea faţă/spate sau virarea stânga/dreapta a maşinuţei. Pentru aceasta, am folosit senzorii de tip TYPE_ACCELEROMETER ai telefo­nului/tabletei. Accelerometrul dispozitivului Android va descompune pe cele trei axe, Ox, Oy şi Oz vectorul acceleraţie gravita­ţională, în funcţie de orientarea dispo­zitivului în mâna mea. După nenu­mărate teste, am decis să folosesc valorile de pe axa Ox pentru viteze (am considerat toate cele 64 de viteze faţă şi cele 64 de viteze spate ca un singur vector de viteze) şi Oy pentru viraje (similar ca şi la viteze, vectorul de viraje conţine 128 de poziţii). Să nu uităm, că telefonul trebuie ţinut în poziţie orizontală în tot acest timp (am considerat că aşa ar fi şi normal pentru un joc). Ca să nu mai lungesc vorba, am ataşat o bucată din codul folosit pentru înaintarea sau retragerea maşinuţei:

if(- INIT_Y + yValue > 0) {
steer = (int) Math.min((- INIT_Y + yValue) *
12.4, codes.STEER_RIGHT.length – 1);
byte[] send = ByteBuffer.allocate(4).putInt (codes.STEER_RIGHT[steer]).array();
mBtSS.write(send);
}
else {
steer = (int) Math.min(Math.abs(- INIT_Y + yValue) * 12.4, codes.STEER_LEFT.length – 1);
byte[] send = ByteBuffer.allocate(4).putInt (codes.STEER_LEFT[steer]).array();
mBtSS.write(send);
}

Similar, se pot transmite şi coduri pentru ca maşinuţa să claxoneze, să îşi aprindă farurile sau să semnalizeze avariile. De precizat faptul că, în cazul avariei sau semnalizării (“în cazul schimbării direcţiei de deplasare a automobilului”, citând codul rutier), este necesară iniţierea unui nou Thread, pentru a nu ne suprapune cu user interface, în Runnable-ul căruia vom transmite la distanţe egale de 0.4 secunde codurile pentru aprinderea LED-urilor pe faţă şi pe spate, după care codurile pentru stingerea lor. E simplu, nu?

Ce mi se pare, ca sa zic aşa, marveilleux, este faptul că maşinuţa poate fi controlată cu orice dispozitiv cu modul Bluetooth şi prin orice limbaj de programare ce deţine un stack de Bluetooth decent. Astfel, am experimentat un pic şi cu Python şi interfaţa Qt direct de pe laptop şi totul a mers formidable. Paşii urmaţi au fost aceiaşi: modulele de Bluetooth ale maşinuţei şi laptopului sunt paired, se deschide un socket de comunicare RFCOMM, se transmite mesajul hexazecimal pentru diverse acţiuni, având grijă să deschid un nou Thread de fiecare dată când se doreşte semnalizarea sau pornirea avariilor. Claxonul rămâne cel mai amuzant, totuşi.
Pentru aplicaţii Android, recomand, din nou, modelul propus de kit-ul de dezvoltare, BluetoothChat.
În cazul în care scrierea unei aplicaţii software pentru maşinuţă nu prezintă interes deosebit pentru deţinător, aceasta poate fi folosită şi doar pentru joacă. Ea vine la pachet cu 10 jaloane şi un jeton magnetic care face maşinuţa să claxoneze fericită de fiecare dată când automobilul trece pe deasupra.

Distracţie plăcută!

Referinţe:
http://zenwheels.com/zenwheels-micro-car-22/zenwheels-micro-car-green.html
http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1406&dDocName=en560432
http://www.rcgroups.com/forums/showthread.php?t=1781802
Google Images

S-ar putea să vă placă și