Cuprins:

Telecomanda ESP32 Bluetooth BLE: 8 pași
Telecomanda ESP32 Bluetooth BLE: 8 pași

Video: Telecomanda ESP32 Bluetooth BLE: 8 pași

Video: Telecomanda ESP32 Bluetooth BLE: 8 pași
Video: Control your Arduino and ESP32 remote car using the Bluetooth Joystick app 2024, Noiembrie
Anonim
Telecomanda ESP32 Bluetooth BLE
Telecomanda ESP32 Bluetooth BLE
Telecomanda ESP32 Bluetooth BLE
Telecomanda ESP32 Bluetooth BLE
Telecomanda ESP32 Bluetooth BLE
Telecomanda ESP32 Bluetooth BLE
Telecomanda ESP32 Bluetooth BLE
Telecomanda ESP32 Bluetooth BLE

Acest proiect este un exemplu de conectare a unui joystick Bluetooth BLE ieftin la un ESP32. Codul a fost scris folosind Arduino IDE Ver 1.8.5 cu complementul ESP32. Joystick-ul BLE utilizat este un dispozitiv comercial pe care îl puteți achiziționa de pe Internet pentru mai puțin de 20,00 USD sau de la magazinul dvs. local de cinci BELoW pentru 5,00 USD.

Joystick-ul pe care l-am folosit pentru acest proiect este un telecomand Spektrum VR Control Bluetooth. Acesta este comercializat ca funcționând cu tablete Android și IOS ca joystick / mouse pentru utilizare cu căști VR.

Telecomanda Bluetooth VR Control are un singur joystick cu axa X și Y, două butoane de declanșare în față și șase butoane pe mâner. Două dintre butoane sunt pentru pornire / oprire și controlul modului. Celelalte patru butoane pot fi utilizate pentru orice doriți. Acest proiect este un schelet sau cadru care gestionează toate interfețele Bluetooth și decodarea butoanelor și joystick-ului. Tot ce trebuie să faceți este să adăugați apeluri funcționale pentru a gestiona ceea ce doriți să facă butoanele și joystick-ul. Nu trebuie să știți nimic despre Bluetooth pentru a utiliza acest cadru.

Există numeroase site-uri web cu instrucțiuni detaliate pentru instalarea Arduino IDE și a suplimentului ESP32. Nu voi încerca să repet acea informație aici. Google-l și urmați instrucțiunile.

Cadrul este o adaptare a unui exemplu de client BLE publicat de IoT Sharing. O puteți găsi aici. Puteți studia acest cod pentru a vă face o idee despre cum funcționează BLE. Expressif are un exemplu complet pentru un client GATT BLE și explică detaliat operațiunea (nu este scrisă pentru Arduino IDE). O puteți obține aici.

Acesta nu este un tutorial BLE. Nu voi explica cum funcționează codul în detaliu. Voi folosi terminologia BLE pentru a descrie unele dintre caracteristicile joystick-ului. Partea de cod pe care trebuie să o modificați pentru proiectul dvs. va fi explicată în detaliu pentru a vă ajuta să o modificați. Domeniul de aplicare este limitat pentru a menține acest instructabil scurt și concentrat pe utilizarea joystick-ului.

Pasul 1: puțin despre Bluetooth cu consum redus de energie (BLE)

Acesta nu este destinat să fie un tutorial despre BLE. Când am început acest proiect, nu știam diferența dintre BLE și Bluetooth clasic. Voiam doar să văd dacă pot obține joystick-ul pe care l-am cumpărat pentru a lucra cu ESP32. În textul următor, folosesc terminologia BLE pentru a oferi o prezentare simplificată a modului în care funcționează BLE.

BLE utilizează o arhitectură client / server. Un dispozitiv este un server care furnizează servicii. Celălalt dispozitiv este un client care consumă servicii. Pentru a menține cerințele de energie scăzute, BLE transmite pachete mici de informații numai atunci când are loc o modificare. În cazul joystick-ului, dispozitivul joystick este un server. Ca server, se face publicitate și va transmite o listă a serviciilor pe care le oferă atunci când este solicitat. Dispozitivul joystick promovează cinci servicii. Singurul serviciu care ne interesează este serviciul BLE HID (Human Interface Device). Un serviciu BLE are ceea ce este cunoscut sub numele de Caracteristici asociate acestuia. O caracteristică este de obicei o sursă de date. Serviciul HID al joystick-ului are zece caracteristici. Unele dintre caracteristici sunt duplicate și sunt ignorate. Ne interesează doar caracteristicile raportului BLE care au capacități de citire și notificare. Trei dintre caracteristici îndeplinesc aceste cerințe și oferă date despre poziția joystick-ului și starea butoanelor. Când notificarea este activată, serverul va trimite pachete de date atunci când se detectează o modificare asupra caracteristicii asociate.

Cadrul verifică dacă serverul pe care îl găsește are serviciul BLE HID și va activa apoi Notificări pentru cele trei caracteristici ale raportului care furnizează informații despre joystick și starea butoanelor. Apoi, atunci când un buton este apăsat sau eliberat sau joystick-ul este mutat, ESP32 primește un pachet de date care îi spune care este noua poziție a joystick-ului și / sau starea unor butoane.

Pasul 2: Indicatori de scanare și conexiune

Cadrul definește două LED-uri, GREENLED și BLUELED și le atribuie la doi dintre pinii GPIO ai ESP32. GREENLED este aprins când ESP32 caută joystick-ul BLE. Când joystick-ul este găsit, GREENLED este oprit și BLUELED este aprins pentru a indica faptul că conexiunea a fost stabilită și că sunteți gata să mergeți. Dacă conexiunea se pierde, BLUELED este oprit, ESP32 este resetat, GREENLED este aprins și scanarea începe din nou. Dacă joystick-ul nu este găsit în decurs de treizeci de secunde, scanarea se oprește și GREENLED se oprește. După cinci secunde, scanarea începe din nou și GREENLED este pornit.

Rezultatul final este că ESP32 va continua să caute joystick-ul până îl va găsi. Odată realizată conexiunea, dacă se pierde, ESP32 se va reseta singur și va începe scanarea din nou. ESP32 este resetat deoarece nu există funcții SDK ESP32 pentru a reseta stiva Bluetooth pentru a reporni scanarea.

Pasul 3: Descifrarea evenimentelor Joystick și Buton

Un eveniment de apel invers pe ESP32 primește trei pachete de date diferite de la server pentru cele trei caracteristici care au fost configurate pentru a furniza notificări. Un pachet are o lungime de patru octeți. Trei dintre octeți conțin poziția axei X, poziția axei Y și butoanele de declanșare, care sunt mapate pe biți în octet. Celelalte două pachete au câte doi octeți și au un singur octet care are starea butonului mapat pe biți. Pachetele primite sunt decodate și copiate într-o matrice de octeți din memorie. Datele axei joystick-ului intră în octeții de date X și Y și fiecare dintre octeții de butoane mapate pe trei biți este direcționat în octetul corespunzător pentru acele butoane.

O sarcină FreeRTOS este creată pentru a gestiona datele primite de notificări. O sarcină pentru joystick și butoanele de declanșare, o sarcină pentru butoanele A & B și o sarcină pentru butoanele C & D. Fiecare dintre aceste sarcini are zone clar marcate în care ar trebui să adăugați cod pentru a face ceea ce doriți cu evenimentul. Căutați comentariul „// ===== adăugați codul dvs. aici =====” în corpul sarcinii și adăugați codul după acesta. Fiecare sarcină are un comentariu care indică pentru ce este utilizată și folosește un Serial.println () pentru a imprima un mesaj despre evenimentul care a avut loc.

Iată un exemplu din sarcina butonului A / B;

void taskButtonAB (parametru void *) {butoane uint8_t;

// ===== dacă sarcina necesită o inițializare unică, puneți-o aici =====

while (adevărat) {// renunțați la procesor, așteptați date noi vTaskSuspend (NULL); // tocmai ne-am trezit, date noi sunt disponibile butoane = VrBoxData [VB_BTNAB]; Serial.printf ("Butoane A / B:% 02X / n", butoane); if (butoane & VB_BUTTON_A) {// butonul A apăsat sau este ținut apăsat Serial.println („Butonul A”); // ===== adăugați codul aici =====}

if (butoane și VB_BUTTON_B)

{// butonul B apăsat sau este ținut apăsat Serial.println („Butonul B”);

// ===== adăugați codul aici =====

}} // pentru} // taskButtonAB

Pasul 4: Funcționarea casetei VR: joystick-ul

Dacă joystick-ul este lăsat în poziția centrală, nu sunt trimise notificări ale joystick-ului. Odată ce joystick-ul este deplasat în afara centrului, un mesaj de notificare cu date joystick și date buton declanșator este trimis aproximativ la fiecare 15mS. Când joystick-ul este mutat înapoi în centru, nu se trimite o notificare că s-a mutat în centru. Cu alte cuvinte, vă spune că joystick-ul s-a mutat din centru, dar nu că s-a mutat în centru. Rezultatul final este că primiți mesaje care indică faptul că joystick-ul se deplasează spre centru, dar nu că a ajuns la centru. Foarte enervant. Cele două butoane de declanșare sunt incluse cu datele joystick-ului. Apăsarea unuia dintre butoanele de declanșare după readucerea joystick-ului în centru va actualiza poziția joystick-ului la zero. Cadrul are încorporat un temporizator de expirare care simulează automat un mesaj de notificare joystick la scurt timp după ce toate mesajele de notificare joystick / buton declanșator încetează să sosească. Cronometrul setează joystick-ul la zero. Joystick-ul are o gamă de aproximativ +/- 25 pe fiecare axă.

Pasul 5: Funcționare VR Box: Butoane de declanșare

Butoanele de declanșare vor trimite un mesaj de notificare o dată când sunt apăsate și din nou când sunt eliberate. Mesajul de notificare apăsat va indica butonul care a fost apăsat. Mesajul de notificare de eliberare indică faptul că ambele butoane sunt eliberate.

Ținând apăsat butonul de declanșare inferior, împiedicați serverul să detecteze că butonul de declanșare superior a fost apăsat. Ținând apăsat butonul de declanșare superior și apăsând butonul de declanșare inferior, serverul trimite un mesaj de notificare că butonul de declanșare inferior este apăsat (butonul de declanșare superior va fi zero!). Eliberarea butonului declanșator inferior va determina serverul să trimită o notificare că butonul declanșator superior este apăsat și declanșatorul inferior este eliberat.

Cu alte cuvinte, butonul de declanșare inferior este dominant peste butonul de declanșare superior și îl va suprascrie atunci când sunt apăsate ambele. Trebuie să determinați cum să gestionați cazul apăsării ambelor butoane.

Pasul 6: Funcționarea casetei VR: butoane A / B

Butoanele A și B acționează ca joystick-ul și trimit continuu mesaje de notificare atunci când sunt apăsate și ținute apăsate. Mesajele se opresc când butonul este eliberat. Butoanele A și B funcționează similar cu butoanele Trigger, deoarece butonul A domină butonul B la fel ca butonul de declanșare inferior care domină butonul de declanșare superior.

Pasul 7: Funcționarea casetei VR: butoane C / D

Butoanele C și D trimit un mesaj de notificare o dată când sunt apăsate și din nou când sunt eliberate. Dacă este ținut apăsat, nu sunt trimise alte mesaje până când nu sunt lansate. Ținând apăsat unul dintre butoanele C sau D, veți împiedica serverul să detecteze activitatea de pe celălalt buton.

Pasul 8: Concluzie

Funcționarea butoanelor este, în opinia mea, puțin cam ciudată. Cadrul prevede locuri pentru a pune codul pe care să acționeze atunci când este apăsat un buton. Dacă trebuie, de asemenea, să detectați lansările butoanelor, rămâne pentru a vă da seama cum să faceți.

Depinde în totalitate de dvs. să determinați ce doriți să facă fiecare buton și ce ar trebui să facă mișcarea joystick-ului. Depindeți de modul în care gestionați diferențele dintre declanșator, A & B și butoanele C & D.

Căutați în cod pentru; taskJoyStick (), taskButtonAB (), taskButtonCD () funcții și adăugați codul după comentariul "// ===== adăugați codul aici =====".

Veți avea nevoie de până la patru funcții pentru a gestiona joystick-ul (înainte, înapoi, dreapta și stânga) și până la șase funcții pentru a gestiona diferitele butoane. Implementați-le pe toate sau doar ceea ce aveți nevoie. Alegerea este a ta.

Dacă utilizați acest cadru. Mi-ar plăcea să strig despre ce l-ați folosit și dacă vi se pare ușor de utilizat.

Dacă aveți întrebări despre cum funcționează sau aveți nevoie de ajutor pentru ca acesta să funcționeze, contactați-mă.

Codul este disponibil pe GitHub aici.

Bucurați-vă.

Recomandat: