Innehållsförteckning:

ESP32 Bluetooth BLE fjärrkontroll: 8 steg
ESP32 Bluetooth BLE fjärrkontroll: 8 steg

Video: ESP32 Bluetooth BLE fjärrkontroll: 8 steg

Video: ESP32 Bluetooth BLE fjärrkontroll: 8 steg
Video: Как использовать RemoteXY с модулем ESP32 по Bluetooth в FLProg 2024, November
Anonim
ESP32 Bluetooth BLE fjärrkontroll
ESP32 Bluetooth BLE fjärrkontroll
ESP32 Bluetooth BLE fjärrkontroll
ESP32 Bluetooth BLE fjärrkontroll
ESP32 Bluetooth BLE fjärrkontroll
ESP32 Bluetooth BLE fjärrkontroll
ESP32 Bluetooth BLE fjärrkontroll
ESP32 Bluetooth BLE fjärrkontroll

Detta projekt är ett exempel på hur du ansluter en billig Bluetooth BLE -joystick till en ESP32. Koden skrevs med Arduino IDE Ver 1.8.5 med tillägget ESP32. BLE -joysticken som används är en kommersiell enhet som du kan köpa på Internet för mindre än $ 20,00 eller från din lokala fiveBELoW -butik för $ 5,00.

Joysticken som jag använde för detta projekt är en Spektrum VR -kontroll Bluetooth -fjärrkontroll. Det marknadsförs som att arbeta med Android- och IOS -surfplattor som en joystick/mus för användning med VR -headset.

VR -kontrollens Bluetooth -fjärrkontroll har en enda joystick med X- och Y -axel, två avtryckarknappar fram och sex knappar på handtaget. Två av knapparna är för ström på/av och lägesstyrning. De andra fyra knapparna kan användas för vad du vill. Detta projekt är ett skelett eller ramverk som hanterar allt Bluetooth -gränssnitt och avkodning av knapparna och joysticken. Allt du behöver göra är att lägga till funktionssamtal för att hantera vad du vill att knapparna och joysticken ska göra. Du behöver inte veta något om Bluetooth för att använda detta ramverk.

Det finns många webbplatser med detaljerade instruktioner för installation av Arduino IDE och ESP32 -tillägget. Jag kommer inte att försöka upprepa den informationen här. Googla det och följ anvisningarna.

Ramverket är en anpassning av ett BLE -klientexempel publicerat av IoT Sharing. Du hittar den här. Du kan studera den här koden för att få en uppfattning om hur BLE fungerar. Expressif har ett komplett exempel för en GATT BLE -klient och förklarar operationen i detalj (inte skrivet för Arduino IDE). Du kan få det här.

Detta är inte en BLE -handledning. Jag kommer inte att förklara hur koden fungerar i detalj. Jag kommer att använda BLE -terminologi för att beskriva några av funktionerna i joysticken. Den del av koden som du behöver ändra för ditt projekt kommer att förklaras i detalj för att hjälpa dig att ändra den. Omfattningen är begränsad för att hålla denna instruerbara kort och fokuserad på att använda joysticken.

Steg 1: Lite om Bluetooth Low Energy (BLE)

Detta är inte avsett att vara en handledning om BLE. När jag startade det här projektet visste jag inte skillnaden mellan BLE och Classic Bluetooth. Jag ville bara se om jag kunde få joysticken som jag köpte att fungera med ESP32. I följande text använder jag BLE -terminologi för att ge en förenklad översikt över hur BLE fungerar.

BLE använder en klient/server -arkitektur. En enhet är en server som tillhandahåller tjänster. Den andra enheten är en klient som förbrukar tjänster. För att hålla strömkraven nere sänder BLE endast små paket med information när en förändring inträffar. När det gäller joysticken är joystick -enheten en server. Som server annonserar den sig själv och skickar en lista över de tjänster som den tillhandahåller när den blir tillfrågad. Joystick -enheten annonserar fem tjänster. Den enda tjänsten som vi är intresserade av är tjänsten BLE HID (Human Interface Device). En BLE -tjänst har det som kallas egenskaper. En egenskap är vanligtvis en datakälla. HID -tjänsten för joysticken har tio egenskaper. Några av egenskaperna är dubbletter och ignoreras. Vi är bara intresserade av BLE -rapportens egenskaper som har läs- och meddelandefunktioner. Tre av egenskaperna uppfyller dessa krav och tillhandahåller data om joystickens position och knapparnas tillstånd. När avisering är aktiverad kommer servern att skicka datapaket när en ändring detekteras på den associerade egenskapen.

Ramverket verifierar att servern som den hittar har BLE HID -tjänsten och aktiverar sedan aviseringar om de tre rapportegenskaperna som tillhandahåller joystick- och knapptillståndsinformation. När en knapp trycks ned eller släpps eller joysticken flyttas, tar ESP32 emot ett datapaket som berättar vad den nya joystickpositionen är och/eller vissa knappars tillstånd.

Steg 2: Skannings- och anslutningsindikatorer

Ramverket definierar två lysdioder, GREENLED och BLUELED och tilldelar dem till två av ESP32: s GPIO -stift. GREENLED lyser när ESP32 söker efter BLE -joysticken. När joysticken hittas stängs den GRÖNLÖDA av och BLUELED lyser för att indikera att anslutningen har upprättats och du är redo att gå. Om anslutningen avbryts, stängs BLUELED av, ESP32 återställs, den GRÖNLÖDA tänds och skanningen startar igen. Om joysticken inte hittas inom trettio sekunder stannar genomsökningen och den GRÖNLEDA stängs av. Efter fem sekunder startar skanningen igen och GRÖNLEDNING slås på.

Slutresultatet är att ESP32 fortsätter att söka efter joysticken tills den hittar den. När anslutningen upprättats, om den sedan förloras, kommer ESP32 att återställa sig själv och börja skanna om igen. ESP32 återställs eftersom det inte finns några ESP32 SDK -funktioner för att återställa Bluetooth -stacken för att starta om skanningen.

Steg 3: Avkodning av joystick- och knapphändelser

En återuppringningshändelse på ESP32 tar emot tre olika datapaket från servern för de tre egenskaper som konfigurerades för att tillhandahålla aviseringar. Ett paket är fyra byte långt. Tre av byten innehåller positionen för X -axeln, Y -axelns position och triggerknapparna, som är bitmappade i byten. De andra två paketen är två byte vardera och har en enda byte som har bitmappad knappläge. De mottagna paketen avkodas och kopieras till en byte -array i minnet. Joystick -axeldata går in i X- och Y -databyte och var och en av de tre bitars mappade knappbytesna riktas in i lämplig byte för dessa knappar.

En FreeRTOS -uppgift skapas för att hantera data som tas emot av aviseringarna. En uppgift för joystick- och triggerknapparna, en uppgift för A & B -knapparna och en uppgift för C & D -knapparna. Var och en av dessa uppgifter har tydligt markerade områden där du ska lägga till kod för att göra vad du vill med händelsen. Leta efter kommentaren "// ===== lägg till din kod här =====" i uppgiftens brödtext och lägg till koden efter den. Varje uppgift har en kommentar som anger vad den används till och använder en Serial.println () för att skriva ut ett meddelande om händelsen som inträffade.

Här är ett exempel från A/B -knappens uppgift;

void taskButtonAB (void *parameter) {uint8_t knappar;

// ===== om uppgiften kräver någon initialisering en gång, lägg den här =====

medan (true) {// ge upp CPU: n, vänta på nya data vTaskSuspend (NULL); // vi vaknade precis, nya data finns tillgängliga knappar = VrBoxData [VB_BTNAB]; Serial.printf ("A/B -knappar: %02X / n", knappar); if (knappar & VB_BUTTON_A) {// knapp A trycks ned eller hålls ned Serial.println ("Knapp A"); // ===== lägg till din kod här =====}

if (knappar & VB_BUTTON_B)

{// knapp B trycks ned eller hålls ned Serial.println ("knapp B");

// ===== lägg till din kod här =====

}} // för} // taskButtonAB

Steg 4: VR -boxdrift: joysticken

Om joysticken lämnas i mittläget skickas inga joystickaviseringar. När joysticken har flyttats från mitten skickas ett meddelande med joystickdata och utlösarknappsdata ungefär var 15 ms. När joysticken flyttas tillbaka till mitten skickas inte ett meddelande om att den har flyttats till mitten. Med andra ord, det berättar att joysticken har flyttat från mitten, men inte att den har flyttat till mitten. Slutresultatet är att du får meddelanden som indikerar att joysticken rör sig mot mitten, men inte att den har nått mitten. Väldigt irriterande. De två utlösningsknapparna ingår i joystickdata. Genom att trycka på en av avtryckarknapparna efter att joysticken återförts till mitten uppdateras joystickens position till noll. Ramverket har en timeout-timer inbyggd i den som automatiskt simulerar ett joystick-meddelande kort efter att alla joystick/trigger-knappaviseringar slutat komma. Timern ställer joysticken på noll. Joysticken har ett område på cirka +/- 25 på varje axel.

Steg 5: VR -boxdrift: Trigger -knappar

Utlösningsknapparna skickar ett aviseringsmeddelande en gång när det trycks in och igen när det släpps. Meddelandet visas genom att trycka på knappen. Meddelandet om release visar att båda knapparna släpps.

Om du håller den nedre utlösningsknappen förhindrar servern att upptäcka att den övre triggknappen har tryckts in. Om du håller den övre utlösningsknappen och trycker på den nedre utlösningsknappen resulterar det i att servern skickar ett meddelande om att den nedre utlösningsknappen trycks in (den övre utlösningsknappen är noll!). Om du släpper den nedre triggknappen kommer servern att skicka ett meddelande om att den övre triggknappen trycks in och den nedre utlösaren släpps.

Med andra ord är den nedre utlösarknappen dominerande över den övre avtryckarknappen och kommer att åsidosätta den när båda trycks ned. Du måste bestämma hur du ska hantera båda knapparna.

Steg 6: VR -boxdrift: A/B -knappar

A- och B -knapparna fungerar som joysticken och skickar kontinuerligt meddelanden när de hålls intryckta. Meddelandena stannar när knappen släpps. A- och B -knapparna fungerar ungefär som Trigger -knapparna genom att A -knappen dominerar B -knappen precis som den nedre triggerknappen dominerar den övre triggerknappen.

Steg 7: VR -boxdrift: C/D -knappar

C- och D -knapparna skickar ett aviseringsmeddelande en gång när de trycks in och igen när de släpps. Om den hålls nere skickas inga ytterligare meddelanden förrän de släpps. Om du håller ned en av C- eller D -knapparna kommer servern att inte upptäcka aktivitet på den andra knappen.

Steg 8: Slutsats

Knapparnas funktion är enligt min mening lite skrämmande. Ramverket innehåller platser för att sätta din kod att agera på när en knapp trycks in. Om du också behöver upptäcka knappsläpp är det kvar för dig att ta reda på hur du gör.

Det är helt upp till dig att bestämma vad du vill att varje knapp ska göra och vad som ska flyttas med joysticken. Hur du hanterar skillnaderna i utlösaren, A & B och C & D -knapparna är upp till dig.

Leta i koden för; taskJoyStick (), taskButtonAB (), taskButtonCD () funktioner och lägg till din kod efter kommentaren "// ===== lägg till din kod här =====".

Du behöver upp till fyra funktioner för att hantera joysticken (framåt, bakåt, höger och vänster) och upp till sex funktioner för att hantera de olika knapparna. Implementera dem alla eller precis vad du behöver. Valet är ditt.

Om du använder detta ramverk. Jag skulle gärna skrika om vad du använde det till och om du tyckte det var lätt att använda.

Om du har frågor om hur det fungerar eller behöver hjälp att få det att fungera, kontakta mig.

Koden är tillgänglig på GitHub här.

Njut av.

Rekommenderad: