Indholdsfortegnelse:

ESP32 Bluetooth BLE fjernbetjening: 8 trin
ESP32 Bluetooth BLE fjernbetjening: 8 trin

Video: ESP32 Bluetooth BLE fjernbetjening: 8 trin

Video: ESP32 Bluetooth BLE fjernbetjening: 8 trin
Video: BLE with ESP32 tutorial part 1: the Server 2024, November
Anonim
ESP32 Bluetooth BLE fjernbetjening
ESP32 Bluetooth BLE fjernbetjening
ESP32 Bluetooth BLE fjernbetjening
ESP32 Bluetooth BLE fjernbetjening
ESP32 Bluetooth BLE fjernbetjening
ESP32 Bluetooth BLE fjernbetjening
ESP32 Bluetooth BLE fjernbetjening
ESP32 Bluetooth BLE fjernbetjening

Dette projekt er et eksempel på, hvordan man tilslutter en billig Bluetooth BLE -joystick til en ESP32. Koden blev skrevet ved hjælp af Arduino IDE Ver 1.8.5 med ESP32 -tilføjelsen. Det anvendte BLE -joystick er en kommerciel enhed, som du kan købe på Internettet for under $ 20,00 eller fra din lokale fiveBELoW -butik for $ 5,00.

Joysticket, jeg brugte til dette projekt, er en Spektrum VR -kontrol Bluetooth -fjernbetjening. Det markedsføres som arbejde med Android- og IOS -tablets som joystick/mus til brug med VR -headset.

VR -kontrol Bluetooth -fjernbetjeningen har et enkelt joystick med X- og Y -aksen, to udløserknapper foran og seks knapper på håndtaget. To af knapperne er til tænd/sluk og tilstandskontrol. De fire andre knapper kan bruges til hvad du vil. Dette projekt er et skelet eller en ramme, der håndterer alle Bluetooth -grænseflader og afkodning af knapperne og joysticket. Alt du skal gøre er at tilføje funktionsopkald for at håndtere det, du vil have knapperne og joysticket til at gøre. Du behøver ikke at vide noget om Bluetooth for at bruge denne ramme.

Der er mange websteder med detaljerede instruktioner til installation af Arduino IDE og ESP32 addon. Jeg vil ikke forsøge at gentage disse oplysninger her. Google det og følg anvisningerne.

Rammerne er en tilpasning af et BLE -klienteksempel udgivet af IoT Sharing. Du kan finde den her. Du kan studere denne kode for at få en idé om, hvordan BLE fungerer. Expressif har et komplet eksempel på en GATT BLE -klient og forklarer operationen i detaljer (ikke skrevet til Arduino IDE). Du kan få det her.

Dette er ikke en BLE -vejledning. Jeg vil ikke forklare, hvordan koden fungerer detaljeret. Jeg vil bruge BLE -terminologi til at beskrive nogle af funktionerne i joysticket. Den del af koden, du skal ændre for dit projekt, vil blive forklaret detaljeret for at hjælpe dig med at ændre den. Omfanget er begrænset til at holde denne Instructable kort og fokuseret på at bruge joysticket.

Trin 1: Lidt om Bluetooth Low Energy (BLE)

Dette er ikke beregnet til at være en tutorial om BLE. Da jeg startede dette projekt, vidste jeg ikke forskellen mellem BLE og Classic Bluetooth. Jeg ville bare se, om jeg kunne få det joystick, jeg købte, til at fungere med ESP32. I den følgende tekst bruger jeg BLE -terminologi til at give et forenklet overblik over, hvordan BLE fungerer.

BLE bruger en klient/server -arkitektur. En enhed er en server, der leverer tjenester. Den anden enhed er en klient, der bruger tjenester. For at holde strømkravene nede, sender BLE kun små pakker med information, når der sker en ændring. I tilfælde af joysticket er joystick -enheden en server. Som en server annoncerer den sig selv og sender en liste over de tjenester, den leverer, når den bliver spurgt. Joystick -enheden annoncerer fem tjenester. Den eneste service, vi er interesseret i, er BLE HID (Human Interface Device) -tjenesten. En BLE -service har det, der er kendt som egenskaber, forbundet med det. En karakteristik er typisk en datakilde. Joystickets HID -service har ti egenskaber. Nogle af egenskaberne er dubletter og ignoreres. Vi er kun interesseret i BLE -rapportens egenskaber, der har læse- og meddelelsesfunktioner. Tre af egenskaberne opfylder disse krav og giver data om joystickets position og knappernes tilstand. Når meddelelse er aktiveret, sender serveren datapakker, når der registreres en ændring i den tilhørende egenskab.

Rammerne verificerer, at den server, den finder, har BLE HID -tjenesten og aktiverer derefter meddelelser om de tre rapportkarakteristika, der giver joystick- og knapstatusinformation. Når der derefter trykkes på en knap eller slippes, eller joysticket flyttes, modtager ESP32 en pakke med data, der fortæller, hvad den nye joystickposition er og/eller tilstanden for nogle knapper.

Trin 2: Scannings- og forbindelsesindikatorer

Rammerne definerer to lysdioder, GRØNNED og BLUELED og tildeler dem to af ESP32s GPIO -ben. GRØNNED lyser, når ESP32 søger efter BLE -joysticket. Når joysticket er fundet, slukkes den GRØNNEDE, og BLUELED lyser for at angive, at forbindelsen er etableret, og du er klar til at gå. Hvis forbindelsen går tabt, slukkes BLUELED, ESP32 nulstilles, GRØNT lyser, og scanningen starter igen. Hvis joysticket ikke findes inden for tredive sekunder, stopper scanningen, og den GRØNNE slukkes. Efter fem sekunder starter scanningen igen, og den GRØNNE tændes.

Slutresultatet er, at ESP32 fortsætter med at scanne efter joysticket, indtil det finder det. Når forbindelsen er oprettet, og hvis den derefter går tabt, nulstiller ESP32 sig selv og begynder at scanne igen. ESP32 nulstilles, fordi der ikke er nogen ESP32 SDK -funktioner til at nulstille Bluetooth -stakken til genstart af scanningen.

Trin 3: Dekryptering af joystick- og knaphændelser

Én tilbagekaldshændelse på ESP32 modtager tre forskellige datapakker fra serveren til de tre egenskaber, der blev konfigureret til at give meddelelser. En pakke er fire bytes lang. Tre af bytes indeholder positionen for X -aksen, Y -aksens position og triggerknapperne, som er bitmappede i byte. De to andre pakker er to bytes hver og har en enkelt byte, der har bit -kortlagt knaptilstand. De modtagne pakker dekodes og kopieres til et byte -array i hukommelsen. Joystick -aksedataene går ind i X- og Y -databyte, og hver af de tre bit -knyttede knapbytes rettes ind i den relevante byte for disse knapper.

En FreeRTOS -opgave oprettes for at håndtere de data, der modtages af meddelelserne. En opgave til joystick- og triggerknapperne, en opgave for A & B -knapperne og en opgave for C & D -knapperne. Hver af disse opgaver har klart markerede områder, hvor du skal tilføje kode for at gøre, hvad du vil med begivenheden. Se efter kommentaren "// ===== tilføj din kode her =====" i opgavens brødtekst, og tilføj din kode efter den. Hver opgave har en kommentar, der angiver, hvad den bruges til, og bruger en Serial.println () til at udskrive en besked om den begivenhed, der opstod.

Her er et eksempel fra A/B -knapopgaven;

void taskButtonAB (void *parameter) {uint8_t knapper;

// ===== hvis opgaven kræver en initialisering én gang, skal du sætte den her =====

mens (true) {// opgive CPU'en, skal du vente på nye data vTaskSuspend (NULL); // vi vågnede lige, nye data er tilgængelige knapper = VrBoxData [VB_BTNAB]; Serial.printf ("A/B -knapper: %02X / n", knapper); hvis (knapper & VB_BUTTON_A) {// knap A trykkes eller holdes nede Serial.println ("Knap A"); // ===== tilføj din kode her =====}

hvis (knapper & VB_BUTTON_B)

{// knap B trykkes eller holdes nede Serial.println ("knap B");

// ===== tilføj din kode her =====

}} // for} // taskButtonAB

Trin 4: Betjening af VR -boks: joysticket

Hvis joysticket efterlades i midterpositionen, sendes der ingen joystick -meddelelser. Når joysticket flyttes fra midten, sendes der en meddelelse med joystickdata og triggerknapdata cirka hver 15. ms. Når joysticket flyttes tilbage til midten, sendes der ikke en meddelelse om, at det er flyttet til midten. Med andre ord fortæller det dig, at joysticket er flyttet fra midten, men ikke at det er flyttet til midten. Slutresultatet er, at du modtager meddelelser, der angiver, at joysticket bevæger sig mod midten, men ikke at det har nået midten. Meget irriterende. De to triggerknapper er inkluderet i joystickdataene. Hvis du trykker på en af udløserknapperne, efter at joysticket er vendt tilbage til midten, opdateres joystickpositionen til nul. Rammerne har en indbygget timeout-timer, der automatisk simulerer en joystick-meddelelse kort tid efter, at alle meddelelser om joystick/trigger-knap holder op med at ankomme. Timeren sætter joysticket til nul. Joysticket har en rækkevidde på ca. +/- 25 på hver akse.

Trin 5: Betjening af VR -boks: Trigger -knapper

Triggerknapperne sender en meddelelse en gang, når der trykkes på dem, og igen når de slippes. Meddelelsesmeddelelsen, der trykkes på, angiver den knap, der blev trykket på. Meddelelsen om frigivelse angiver, at begge knapper er frigivet.

Hvis du holder den nedre udløserknap, forhindrer serveren i at opdage, at der er blevet trykket på den øverste triggerknap. Hvis du holder den øverste triggerknap nede og trykker på den nederste triggerknap, resulterer serveren i en meddelelse om, at der trykkes på den nederste triggerknap (den øverste triggerknap er nul!). Hvis du slipper den nederste trigger -knap, får serveren en meddelelse om, at der trykkes på den øverste trigger -knap, og at den nederste trigger frigives.

Med andre ord er den nederste trigger -knap dominerende over den øverste trigger -knap og vil tilsidesætte den, når der trykkes på begge. Du skal bestemme, hvordan du skal håndtere sagen, hvor begge knapper trykkes ned.

Trin 6: Betjening af VR -boks: A/B -knapper

A- og B -knapperne fungerer som joysticket og sender løbende meddelelser, når de holdes nede. Beskederne stopper, når knappen slippes. A- og B -knapperne fungerer på samme måde som udløserknapperne, idet A -knappen dominerer B -knappen ligesom den nederste triggerknap dominerer den øverste triggerknap.

Trin 7: Betjening af VR -boks: C/D -knapper

C- og D -knapperne sender en meddelelse en gang, når der trykkes på dem, og igen når de slippes. Hvis den holdes nede, sendes der ikke flere meddelelser, før de er frigivet. Hvis du holder en af C- eller D -knapperne nede, forhindres serveren i at registrere aktivitet på den anden knap.

Trin 8: Konklusion

Betjeningen af knapperne er efter min mening lidt skæv. Rammerne indeholder steder, hvor du kan sætte din kode til handling, når der trykkes på en knap. Hvis du også skal registrere knapudgivelser, er det tilbage for dig at finde ud af, hvordan du gør.

Det er helt op til dig at bestemme, hvad du vil have hver knap til at gøre, og hvad bevægelse af joysticket skal gøre. Hvordan du håndterer forskellene i udløseren, A & B og C & D -knapperne er op til dig.

Se i koden for; taskJoyStick (), taskButtonAB (), taskButtonCD () funktioner og tilføj din kode efter "// ===== tilføj din kode her =====" kommentar.

Du skal bruge op til fire funktioner til at håndtere joysticket (fremad, bagud, højre og venstre) og op til seks funktioner til at håndtere de forskellige knapper. Gennemfør dem alle eller bare hvad du har brug for. Det er dit valg.

Hvis du bruger denne ramme. Jeg ville elske et råb om, hvad du brugte det til, og hvis du fandt det let at bruge.

Hvis du har spørgsmål om hvordan det fungerer eller har brug for hjælp til at få det til at fungere, så kontakt mig.

Koden er tilgængelig på GitHub her.

God fornøjelse.

Anbefalede: