Innehållsförteckning:
- Steg 1: Lite om Bluetooth Low Energy (BLE)
- Steg 2: Skannings- och anslutningsindikatorer
- Steg 3: Avkodning av joystick- och knapphändelser
- Steg 4: VR -boxdrift: joysticken
- Steg 5: VR -boxdrift: Trigger -knappar
- Steg 6: VR -boxdrift: A/B -knappar
- Steg 7: VR -boxdrift: C/D -knappar
- Steg 8: Slutsats
Video: ESP32 Bluetooth BLE fjärrkontroll: 8 steg
2024 Författare: John Day | [email protected]. Senast ändrad: 2024-01-30 12:46
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:
Trä Bluetooth -fjärrkontroll för Lego Duplo -tåg: 3 steg (med bilder)
Trä Bluetooth -fjärrkontroll för Lego Duplo -tåg: Mina barn älskade det här lilla Lego Duplo -tåget, särskilt min yngsta som kämpar för att kommunicera sig själv med ord så jag ville bygga henne något som skulle hjälpa henne att leka med tåget oberoende av vuxna eller telefoner/surfplattor. Något som
Fjärrkontroll Bluetooth -ljusbrytare: 4 steg (med bilder)
Fjärrkontroll Bluetooth -ljusbrytare: Detta kommer att vara det första projektet i en serie med titeln: "Optimerad latskap: över konstruerade lösningar för anmärkningsvärt triviala problem" Har du någonsin legat i sängen sent på kvällen och läst eller tittat på Netflix på din bärbara dator? Det värsta är förstås
Hitta en borttappad TV -fjärrkontroll med Arduino och Bluetooth: 5 steg
Hitta en förlorad TV -fjärrkontroll med Arduino och Bluetooth: Hitta en förlorad fjärrkontroll på en mycket enkel krets och koden är så enkel, bara att använda Arduino Nano med Bluetooth -modul och liten summer med batteriförstärkare från 3,7v till 5v, och jag har skapat en app i MIT App Inventor, * kan du ansluta
Konvertera din IR -fjärrkontroll till RF -fjärrkontroll: 9 steg (med bilder)
Konvertera din IR -fjärrkontroll till RF -fjärrkontroll: I dagens Instructable visar jag dig hur du kan använda en generisk RF -modul utan en mikrokontroller som så småningom kommer att leda oss till att bygga ett projekt där du kan konvertera en IR -fjärrkontroll från vilken enhet som helst till en RF Avlägsen. Den största fördelen med att konvertera en
Styr dina elektriska apparater med din fjärrkontroll för fjärrkontroll (IR -fjärrkontroll) med temperatur- och luftfuktighetsdisplay: 9 steg
Styr dig elektriska apparater med din TV -fjärrkontroll (ir -fjärrkontroll) med temperatur- och luftfuktighetsdisplay: hej jag är Abhay och det är min första blogg om Instructables och idag ska jag visa dig hur du styr dina elektriska apparater med din fjärrkontroll genom att bygga detta enkelt projekt. tack till atl lab för stöd och tillhandahållande av materialet