Inhaltsverzeichnis:

ESP32 Bluetooth BLE-Fernbedienung - Gunook
ESP32 Bluetooth BLE-Fernbedienung - Gunook

Video: ESP32 Bluetooth BLE-Fernbedienung - Gunook

Video: ESP32 Bluetooth BLE-Fernbedienung - Gunook
Video: Control your Arduino and ESP32 remote car using the Bluetooth Joystick app 2024, November
Anonim
ESP32 Bluetooth BLE-Fernbedienung
ESP32 Bluetooth BLE-Fernbedienung
ESP32 Bluetooth BLE-Fernbedienung
ESP32 Bluetooth BLE-Fernbedienung
ESP32 Bluetooth BLE-Fernbedienung
ESP32 Bluetooth BLE-Fernbedienung
ESP32 Bluetooth BLE-Fernbedienung
ESP32 Bluetooth BLE-Fernbedienung

Dieses Projekt ist ein Beispiel dafür, wie Sie einen kostengünstigen Bluetooth BLE-Joystick mit einem ESP32 verbinden. Der Code wurde mit der Arduino IDE Ver 1.8.5 mit dem ESP32-Addon geschrieben. Der verwendete BLE-Joystick ist ein kommerzielles Gerät, das Sie im Internet für weniger als 20,00 USD oder in Ihrem örtlichen fiveBELOW-Geschäft für 5,00 USD erwerben können.

Der Joystick, den ich für dieses Projekt verwendet habe, ist eine Spektrum VR Control Bluetooth-Fernbedienung. Es wird so vermarktet, dass es mit Android- und IOS-Tablets als Joystick/Maus zur Verwendung mit VR-Headsets funktioniert.

Die VR Control Bluetooth-Fernbedienung verfügt über einen einzigen Joystick mit X- und Y-Achse, zwei Auslöseknöpfe vorne und sechs Knöpfe am Griff. Zwei der Tasten dienen zum Ein-/Ausschalten und zur Modussteuerung. Die anderen vier Tasten können für alles verwendet werden, was Sie wollen. Dieses Projekt ist ein Skelett oder Framework, das die gesamte Bluetooth-Schnittstelle und die Dekodierung der Tasten und des Joysticks übernimmt. Sie müssen lediglich Funktionsaufrufe hinzufügen, um die gewünschten Funktionen der Tasten und des Joysticks auszuführen. Sie müssen nichts über Bluetooth wissen, um dieses Framework zu verwenden.

Es gibt zahlreiche Websites mit detaillierten Anweisungen zur Installation der Arduino-IDE und des ESP32-Addons. Ich werde nicht versuchen, diese Informationen hier zu wiederholen. Google es und folge den Anweisungen.

Das Framework ist eine Adaption eines von IoT Sharing veröffentlichten BLE-Client-Beispiels. Sie finden es hier. Sie können diesen Code studieren, um eine Vorstellung davon zu bekommen, wie BLE funktioniert. Expressif hat ein vollständiges Beispiel für einen GATT BLE-Client und erklärt die Bedienung im Detail (nicht für Arduino IDE geschrieben). Sie können es hier bekommen.

Dies ist kein BLE-Tutorial. Ich werde nicht erklären, wie der Code im Detail funktioniert. Ich werde die BLE-Terminologie verwenden, um einige der Funktionen des Joysticks zu beschreiben. Der Teil des Codes, den Sie für Ihr Projekt ändern müssen, wird im Detail erklärt, um Ihnen bei der Änderung zu helfen. Der Umfang ist begrenzt, um dieses Instructable kurz zu halten und sich auf die Verwendung des Joysticks zu konzentrieren.

Schritt 1: Ein wenig über Bluetooth Low Energy (BLE)

Dies ist kein Tutorial zu BLE. Als ich dieses Projekt startete, kannte ich den Unterschied zwischen BLE und Classic Bluetooth nicht. Ich wollte nur sehen, ob ich den Joystick, den ich gekauft habe, für den ESP32 bekommen kann. Im folgenden Text verwende ich die BLE-Terminologie, um einen vereinfachten Überblick über die Funktionsweise von BLE zu geben.

BLE verwendet eine Client/Server-Architektur. Ein Gerät ist ein Server, der Dienste bereitstellt. Das andere Gerät ist ein Client, der Dienste konsumiert. Um den Energiebedarf gering zu halten, überträgt BLE nur kleine Informationspakete, wenn eine Änderung auftritt. Im Falle des Joysticks ist das Joystick-Gerät ein Server. Als Server bewirbt er sich selbst und übermittelt auf Anfrage eine Liste der angebotenen Dienste. Das Joystick-Gerät wirbt für fünf Dienste. Der einzige Service, an dem wir interessiert sind, ist der BLE HID (Human Interface Device) Service. Mit einem BLE-Dienst sind sogenannte Merkmale verbunden. Ein Merkmal ist normalerweise eine Datenquelle. Der HID-Dienst des Joysticks hat zehn Eigenschaften. Einige der Merkmale sind Duplikate und werden ignoriert. Wir sind nur an den BLE-Berichtsmerkmalen interessiert, die über Lese- und Benachrichtigungsfunktionen verfügen. Drei der Merkmale erfüllen diese Anforderungen und liefern Daten über die Position des Joysticks und den Zustand der Tasten. Wenn die Benachrichtigung aktiviert ist, sendet der Server Datenpakete, wenn eine Änderung des zugehörigen Merkmals erkannt wird.

Das Framework überprüft, ob der gefundene Server über den BLE-HID-Dienst verfügt und aktiviert dann Benachrichtigungen zu den drei Berichtsmerkmalen, die Joystick- und Schaltflächenstatusinformationen bereitstellen. Wenn dann eine Taste gedrückt oder losgelassen oder der Joystick bewegt wird, empfängt der ESP32 ein Datenpaket, das ihm die neue Joystick-Position und/oder den Zustand einiger Tasten mitteilt.

Schritt 2: Scan- und Verbindungsanzeigen

Das Framework definiert zwei LEDs, GREENLED und BLUELED und weist sie zwei der GPIO-Pins des ESP32 zu. Die GRÜNE LED leuchtet, wenn der ESP32 nach dem BLE-Joystick sucht. Wenn der Joystick gefunden wird, erlischt die GRÜNE LED und die BLAUE LED leuchtet, um anzuzeigen, dass die Verbindung hergestellt wurde und Sie bereit sind. Wenn die Verbindung verloren geht, wird die BLUELED ausgeschaltet, der ESP32 zurückgesetzt, die GREENLED leuchtet und der Scanvorgang beginnt erneut. Wenn der Joystick nicht innerhalb von dreißig Sekunden gefunden wird, wird der Scanvorgang beendet und die GRÜNE LED erlischt. Nach fünf Sekunden beginnt der Scanvorgang erneut und die GRÜNE LED leuchtet.

Das Endergebnis ist, dass der ESP32 weiterhin nach dem Joystick sucht, bis er ihn findet. Sobald die Verbindung hergestellt ist, setzt sich der ESP32 selbst zurück und beginnt erneut mit dem Scannen. Der ESP32 wird zurückgesetzt, da es keine ESP32 SDK-Funktionen gibt, um den Bluetooth-Stack zurückzusetzen, um das Scannen neu zu starten.

Schritt 3: Entschlüsseln von Joystick- und Schaltflächenereignissen

Ein Callback-Ereignis auf dem ESP32 empfängt drei verschiedene Datenpakete vom Server für die drei Merkmale, die eingerichtet wurden, um Benachrichtigungen bereitzustellen. Ein Paket ist vier Byte lang. Drei der Bytes enthalten die X-Achsen-Position, die Y-Achsen-Position und die Trigger-Buttons, die im Byte Bitmap sind. Die anderen beiden Pakete sind jeweils zwei Bytes und haben ein einzelnes Byte, das den Bitmap-Schaltflächenzustand hat. Die empfangenen Pakete werden decodiert und in ein Byte-Array im Speicher kopiert. Die Joystick-Achsendaten gehen in die X- und Y-Datenbytes und jedes der drei Bitmap-Schaltflächenbytes wird in das entsprechende Byte für diese Schaltflächen geleitet.

Eine FreeRTOS-Aufgabe wird erstellt, um die von den Benachrichtigungen empfangenen Daten zu verarbeiten. Eine Aufgabe für die Joystick- und Trigger-Tasten, eine Aufgabe für die A- und B-Tasten und eine Aufgabe für die C- und D-Tasten. Jede dieser Aufgaben hat klar gekennzeichnete Bereiche, in denen Sie Ihren Code hinzufügen sollten, um mit dem Ereignis das zu tun, was Sie möchten. Suchen Sie im Hauptteil der Aufgabe nach dem Kommentar "//===== fügen Sie Ihren Code hier hinzu =====" und fügen Sie Ihren Code danach hinzu. Jede Aufgabe hat einen Kommentar, der angibt, wofür sie verwendet wird, und verwendet Serial.println(), um eine Nachricht über das aufgetretene Ereignis zu drucken.

Hier ist ein Beispiel aus der A/B-Tastenaufgabe;

Void taskButtonAB (void *Parameter) { uint8_t Schaltflächen;

//===== Wenn die Aufgabe eine einmalige Initialisierung erfordert, füge sie hier ein =====

while(true) { // CPU aufgeben, auf neue Daten warten vTaskSuspend(NULL); // wir sind gerade aufgewacht, neue Daten sind verfügbar buttons = VrBoxData[VB_BTNAB]; Serial.printf("A/B-Tasten: %02X\n", Tasten); if (buttons & VB_BUTTON_A) {// Taste A gedrückt oder wird gedrückt Serial.println ("Button A"); //===== fügen Sie Ihren Code hier ein ===== }

if (Schaltflächen & VB_BUTTON_B)

{// Taste B gedrückt oder wird gedrückt Serial.println ("Taste B");

//===== fügen Sie Ihren Code hier ein =====

} } // für } // taskButtonAB

Schritt 4: Bedienung der VR-Box: der Joystick

Wenn der Joystick in der Mittelposition bleibt, werden keine Joystick-Benachrichtigungen gesendet. Sobald der Joystick aus der Mitte bewegt wird, wird etwa alle 15 ms eine Benachrichtigung mit Joystick-Daten und Trigger-Tastendaten gesendet. Wenn der Joystick wieder in die Mitte bewegt wird, wird keine Benachrichtigung gesendet, dass er sich in die Mitte bewegt hat. Mit anderen Worten, es sagt Ihnen, dass sich der Joystick aus der Mitte bewegt hat, aber nicht, dass er sich in die Mitte bewegt hat. Das Endergebnis ist, dass Sie Meldungen erhalten, die darauf hinweisen, dass sich der Joystick in Richtung Mitte bewegt, aber nicht, dass er die Mitte erreicht hat. Sehr nervig. Die beiden Trigger-Buttons sind in den Joystick-Daten enthalten. Durch Drücken einer der Auslösertasten nach dem Zurückbringen des Joysticks in die Mitte wird die Joystickposition auf Null aktualisiert. Das Framework verfügt über einen integrierten Timeout-Timer, der automatisch eine Joystick-Benachrichtigung simuliert, kurz nachdem alle Joystick-/Triggertasten-Benachrichtigungsnachrichten nicht mehr ankommen. Der Timer setzt den Joystick auf Null. Der Joystick hat einen Bereich von ca. +/- 25 auf jeder Achse.

Schritt 5: VR-Box-Betrieb: Trigger-Tasten

Die Trigger-Tasten senden einmal beim Drücken und beim Loslassen eine Benachrichtigung. Die gedrückte Benachrichtigung zeigt die gedrückte Taste an. Die Freigabebenachrichtigung zeigt an, dass beide Tasten freigegeben sind.

Das Halten der unteren Triggertaste verhindert, dass der Server erkennt, dass die obere Triggertaste gedrückt wurde. Das Halten der oberen Triggertaste und das Drücken der unteren Triggertaste führt dazu, dass der Server eine Benachrichtigung sendet, dass die untere Triggertaste gedrückt wurde (die obere Triggertaste ist Null!). Das Loslassen der unteren Trigger-Taste veranlasst den Server, eine Benachrichtigung zu senden, dass die obere Trigger-Taste gedrückt und die untere Trigger-Taste losgelassen wird.

Mit anderen Worten, der untere Triggerknopf dominiert den oberen Triggerknopf und überschreibt ihn, wenn beide gedrückt werden. Sie müssen festlegen, wie Sie mit dem Fall umgehen, dass beide Tasten gedrückt werden.

Schritt 6: VR-Box-Betrieb: A / B-Tasten

Die Tasten A und B verhalten sich wie der Joystick und senden beim Drücken und Halten kontinuierlich Benachrichtigungen. Die Meldungen stoppen, wenn die Taste losgelassen wird. Die A- und B-Tasten funktionieren ähnlich wie die Trigger-Tasten, da die A-Taste die B-Taste dominiert, genauso wie die untere Trigger-Taste die obere Trigger-Taste dominiert.

Schritt 7: VR-Box-Betrieb: C / D-Tasten

Die Tasten C und D senden beim Drücken einmal eine Benachrichtigung und beim Loslassen erneut. Wird sie gedrückt gehalten, werden keine weiteren Nachrichten gesendet, bis sie freigegeben werden. Wenn Sie eine der Tasten C oder D gedrückt halten, wird verhindert, dass der Server Aktivitäten auf der anderen Taste erkennt.

Schritt 8: Fazit

Die Bedienung der Tasten ist meiner Meinung nach etwas wackelig. Das Framework bietet Stellen, an denen Ihr Code beim Drücken einer Schaltfläche aktiv werden kann. Wenn Sie auch Tastenfreigaben erkennen müssen, müssen Sie herausfinden, wie Sie vorgehen.

Es liegt ganz bei Ihnen, zu bestimmen, was jede Taste tun soll und was das Bewegen des Joysticks bewirken soll. Wie Sie mit den Unterschieden beim Trigger, A & B und den C & D-Tasten umgehen, bleibt Ihnen überlassen.

Suchen Sie im Code nach dem; taskJoyStick(), taskButtonAB(), taskButtonCD() und fügen Sie Ihren Code nach dem "//===== fügen Sie Ihren Code hier hinzu =====" Kommentar.

Sie benötigen bis zu vier Funktionen, um den Joystick zu bedienen (vorwärts, rückwärts, rechts und links) und bis zu sechs Funktionen, um die verschiedenen Tasten zu bedienen. Implementieren Sie sie alle oder nur das, was Sie brauchen. Es ist deine Entscheidung.

Wenn Sie dieses Framework verwenden. Ich würde mich freuen, wenn Sie sagen würden, wofür Sie es verwendet haben und ob Sie es einfach zu bedienen finden.

Wenn Sie Fragen zur Funktionsweise haben oder Hilfe bei der Inbetriebnahme benötigen, kontaktieren Sie mich.

Der Code ist hier auf GitHub verfügbar.

Genießen.

Empfohlen: