Inhoudsopgave:

ESP32 Bluetooth BLE-afstandsbediening - Ajarnpa
ESP32 Bluetooth BLE-afstandsbediening - Ajarnpa

Video: ESP32 Bluetooth BLE-afstandsbediening - Ajarnpa

Video: ESP32 Bluetooth BLE-afstandsbediening - Ajarnpa
Video: BLE/WiFi Remote using ESP32C3 ⚡️ | ESP32 Projects | IOT Projects 2024, November
Anonim
ESP32 Bluetooth BLE-afstandsbediening
ESP32 Bluetooth BLE-afstandsbediening
ESP32 Bluetooth BLE-afstandsbediening
ESP32 Bluetooth BLE-afstandsbediening
ESP32 Bluetooth BLE-afstandsbediening
ESP32 Bluetooth BLE-afstandsbediening
ESP32 Bluetooth BLE-afstandsbediening
ESP32 Bluetooth BLE-afstandsbediening

Dit project is een voorbeeld van het aansluiten van een goedkope Bluetooth BLE-joystick op een ESP32. De code is geschreven met behulp van de Arduino IDE Ver 1.8.5 met de ESP32-add-on. De gebruikte BLE-joystick is een commercieel apparaat dat u op internet kunt kopen voor minder dan $ 20,00 of bij uw lokale fiveBELoW-winkel voor $ 5,00.

De joystick die ik voor dit project heb gebruikt, is een Spektrum VR Control Bluetooth-afstandsbediening. Het wordt op de markt gebracht als werkend met Android- en IOS-tablets als joystick/muis voor gebruik met VR-headsets.

De VR Control Bluetooth-afstandsbediening heeft een enkele joystick met X- en Y-as, twee triggerknoppen aan de voorkant en zes knoppen op het handvat. Twee van de knoppen zijn voor aan/uit en moduscontrole. De andere vier knoppen kunnen worden gebruikt voor wat je maar wilt. Dit project is een skelet of raamwerk dat alle Bluetooth-interfaces en decodering van de knoppen en joystick afhandelt. Het enige dat u hoeft te doen, is functieaanroepen toevoegen om te doen wat u wilt dat de knoppen en joystick doen. U hoeft niets van Bluetooth te weten om dit framework te gebruiken.

Er zijn talloze websites met gedetailleerde instructies voor het installeren van de Arduino IDE en de ESP32-add-on. Ik ga die informatie hier niet herhalen. Google erop en volg de aanwijzingen.

Het framework is een aanpassing van een BLE-clientvoorbeeld gepubliceerd door IoT Sharing. Je kunt het hier vinden. U kunt deze code bestuderen om een idee te krijgen van hoe BLE werkt. Expressif heeft een compleet voorbeeld voor een GATT BLE-client en legt de werking in detail uit (niet geschreven voor Arduino IDE). Je kunt het hier krijgen.

Dit is geen BLE-tutorial. Ik zal niet in detail uitleggen hoe de code werkt. Ik zal BLE-terminologie gebruiken om enkele functies van de joystick te beschrijven. Het deel van de code dat u voor uw project moet wijzigen, wordt in detail uitgelegd om u te helpen het te wijzigen. De reikwijdte is beperkt om deze Instructable kort en gericht te houden op het gebruik van de joystick.

Stap 1: Een beetje over Bluetooth Low Energy (BLE)

Dit is niet bedoeld als een tutorial over BLE. Toen ik aan dit project begon, kende ik het verschil niet tussen BLE en Classic Bluetooth. Ik wilde gewoon kijken of ik de joystick die ik kocht kon gebruiken om met de ESP32 te werken. In de volgende tekst gebruik ik BLE-terminologie om een vereenvoudigd overzicht te geven van hoe BLE werkt.

BLE gebruikt een client/server-architectuur. Eén apparaat is een server die services levert. Het andere apparaat is een client die services verbruikt. Om de stroomvereisten laag te houden, verzendt BLE alleen kleine pakketjes informatie wanneer zich een wijziging voordoet. In het geval van de joystick is het joystickapparaat een server. Als server maakt hij reclame voor zichzelf en stuurt hij op verzoek een lijst met de diensten die hij levert. De joystick maakt reclame voor vijf diensten. De enige service waarin we geïnteresseerd zijn, is de BLE HID-service (Human Interface Device). Aan een BLE-service zijn zogenaamde kenmerken verbonden. Een kenmerk is doorgaans een gegevensbron. De HID-service van de joystick heeft tien kenmerken. Sommige kenmerken zijn duplicaten en worden genegeerd. We zijn alleen geïnteresseerd in de BLE-rapportkenmerken met lees- en meldingsfuncties. Drie van de kenmerken voldoen aan deze eisen en geven gegevens over de positie van de joystick en de stand van de knoppen. Wanneer notificatie is ingeschakeld, zal de server datapakketten verzenden wanneer een wijziging wordt gedetecteerd op het bijbehorende kenmerk.

Het framework verifieert dat de gevonden server de BLE HID-service heeft en schakelt vervolgens meldingen over de drie rapportkenmerken in die informatie over de joystick- en knopstatus bieden. Wanneer vervolgens een knop wordt ingedrukt of losgelaten of de joystick wordt bewogen, ontvangt de ESP32 een gegevenspakket dat vertelt wat de nieuwe joystickpositie is en/of de status van sommige knoppen.

Stap 2: Scan- en verbindingsindicatoren

Het raamwerk definieert twee LEDS, GREENLED en BLUELED en wijst deze toe aan twee van de GPIO-pinnen van de ESP32. De GROENE LED licht op wanneer de ESP32 naar de BLE-joystick zoekt. Wanneer de joystick wordt gevonden, gaat de GROENE LED uit en gaat de BLAUWELED branden om aan te geven dat de verbinding tot stand is gebracht en dat u klaar bent om te gaan. Als de verbinding wordt verbroken, wordt de BLUELED uitgeschakeld, wordt de ESP32 gereset, gaat de GROENELED branden en begint het scannen opnieuw. Als de joystick niet binnen dertig seconden wordt gevonden, stopt het scannen en gaat de GROENE LED uit. Na vijf seconden begint het scannen opnieuw en gaat de GROENE LED aan.

Het eindresultaat is dat de ESP32 blijft zoeken naar de joystick totdat hij deze vindt. Zodra de verbinding tot stand is gebracht en deze vervolgens wordt verbroken, zal de ESP32 zichzelf resetten en opnieuw beginnen met scannen. De ESP32 is gereset omdat er geen ESP32 SDK-functies zijn om de Bluetooth-stack te resetten om het scannen opnieuw te starten.

Stap 3: Joystick- en knopgebeurtenissen ontcijferen

Eén callback-gebeurtenis op de ESP32 ontvangt drie verschillende datapakketten van de server voor de drie kenmerken die zijn ingesteld om meldingen te leveren. Een pakket is vier bytes lang. Drie van de bytes bevatten de positie van de X-as, de positie van de Y-as en de triggerknoppen, die bit-map in de byte zijn. De andere twee pakketten zijn elk twee bytes en hebben een enkele byte met de bitmapstatus. De ontvangen pakketten worden gedecodeerd en gekopieerd naar een bytearray in het geheugen. De joystick-asgegevens gaan naar de X- en Y-gegevensbytes en elk van de drie bitmap-knopbytes wordt naar de juiste byte voor die knoppen geleid.

Er wordt een FreeRTOS-taak gemaakt om de gegevens te verwerken die door de meldingen worden ontvangen. Eén taak voor de joystick en triggerknoppen, één taak voor de A & B-knoppen en één taak voor de C & D-knoppen. Elk van deze taken heeft duidelijk gemarkeerde gebieden waar u uw code moet toevoegen om te doen wat u wilt met het evenement. Zoek naar de "//===== voeg hier uw code toe =====" commentaar in de hoofdtekst van de taak en voeg uw code erna toe. Elke taak heeft een opmerking die aangeeft waarvoor deze wordt gebruikt en gebruikt een Serial.println() om een bericht af te drukken over de gebeurtenis die zich heeft voorgedaan.

Hier is een voorbeeld van de A/B-knoptaak;

void taskButtonAB(void *parameter){ uint8_t buttons;

//===== als de taak een eenmalige initialisatie vereist, plaats het hier =====

while (true) { // geef de CPU op, wacht op nieuwe gegevens vTaskSuspend (NULL); // we zijn net wakker, nieuwe gegevens zijn beschikbaar knoppen = VrBoxData [VB_BTNAB]; Serial.printf("A/B-knoppen: %02X\n", knoppen); if (knoppen & VB_BUTTON_A) { // knop A ingedrukt of ingedrukt gehouden Serial.println ("Knop A"); //===== voeg hier uw code toe ===== }

if (knoppen & VB_BUTTON_B)

{ // knop B ingedrukt of wordt ingedrukt gehouden Serial.println ("Knop B");

//===== voeg hier uw code toe =====

} } // voor } // taskButtonAB

Stap 4: VR Box-bediening: de joystick

Als de joystick in de middenpositie wordt gelaten, worden er geen joystickmeldingen verzonden. Zodra de joystick uit het midden wordt verplaatst, wordt ongeveer elke 15 mS een meldingsbericht met joystickgegevens en triggerknopgegevens verzonden. Wanneer de joystick terug naar het midden wordt bewogen, wordt er geen melding verzonden dat deze naar het midden is verplaatst. Met andere woorden, het vertelt u dat de joystick uit het midden is verplaatst, maar niet dat deze naar het midden is verplaatst. Het eindresultaat is dat u berichten ontvangt die aangeven dat de joystick naar het midden beweegt, maar niet dat deze het midden heeft bereikt. Heel irritant. De twee triggerknoppen worden meegeleverd met de joystickgegevens. Door op een van de triggerknoppen te drukken nadat de joystick naar het midden is teruggekeerd, wordt de joystickpositie op nul gezet. Het Framework heeft een ingebouwde time-outtimer die automatisch een joystick-notificatiebericht simuleert kort nadat alle joystick-/triggerknop-notificatieberichten niet meer binnenkomen. De timer zet de joystick op nul. De joystick heeft een bereik van ongeveer +/- 25 op elke as.

Stap 5: VR-boxbediening: triggerknoppen

De triggerknoppen sturen één keer een melding wanneer ze worden ingedrukt en nogmaals wanneer ze worden losgelaten. Het ingedrukte meldingsbericht geeft de knop aan die is ingedrukt. Het bericht met de vrijgavemelding geeft aan dat beide knoppen zijn losgelaten.

Door de onderste triggerknop ingedrukt te houden, kan de server niet detecteren dat de bovenste triggerknop is ingedrukt. Door de bovenste triggerknop ingedrukt te houden en op de onderste triggerknop te drukken, stuurt de server een melding dat de onderste triggerknop is ingedrukt (de bovenste triggerknop is nul!). Als u de onderste triggerknop loslaat, stuurt de server een melding dat de bovenste triggerknop wordt ingedrukt en de onderste trigger wordt losgelaten.

Met andere woorden, de onderste triggerknop is dominant over de bovenste triggerknop en zal deze negeren wanneer beide worden ingedrukt. U moet bepalen hoe u omgaat met het geval dat beide knoppen worden ingedrukt.

Stap 6: VR Box-bediening: A / B-knoppen

De A- en B-knoppen werken als de joystick en sturen continu meldingsberichten wanneer ze ingedrukt worden gehouden. De berichten stoppen wanneer de knop wordt losgelaten. De A- en B-knoppen werken op dezelfde manier als de triggerknoppen, omdat de A-knop de B-knop domineert, net zoals de onderste triggerknop de bovenste triggerknop domineert.

Stap 7: VR-boxbediening: C / D-knoppen

De C- en D-knoppen sturen één keer een melding wanneer ze worden ingedrukt en nogmaals wanneer ze worden losgelaten. Als u deze ingedrukt houdt, worden er geen berichten meer verzonden totdat ze worden vrijgegeven. Als u een van de C- of D-knoppen ingedrukt houdt, voorkomt u dat de server activiteit op de andere knop detecteert.

Stap 8: Conclusie

De bediening van de knoppen is naar mijn mening een beetje wankel. Het Framework biedt plaatsen om uw code te laten werken wanneer er op een knop wordt gedrukt. Als u ook het loslaten van knoppen moet detecteren, moet u zelf uitzoeken hoe u dat moet doen.

Het is geheel aan jou om te bepalen wat je wilt dat elke knop doet en wat het bewegen van de joystick moet doen. Hoe je omgaat met de verschillen in de trigger, A & B en de C & D-knoppen is aan jou.

Kijk in de code voor de; taskJoyStick(), taskButtonAB(), taskButtonCD() functies en voeg uw code toe na de "//===== voeg hier uw code toe =====" commentaar.

U hebt maximaal vier functies nodig om de joystick te bedienen (vooruit, achteruit, rechts en links) en maximaal zes functies om de verschillende knoppen te bedienen. Implementeer ze allemaal of alleen wat je nodig hebt. De keuze is aan jou.

Als u dit kader gebruikt. Ik zou graag willen weten waarvoor je het hebt gebruikt en of je het gemakkelijk te gebruiken vond.

Als je vragen hebt over hoe het werkt of hulp nodig hebt om het werkend te krijgen, neem dan contact met me op.

De code is hier beschikbaar op GitHub.

Genieten van.

Aanbevolen: