ESP32 BlueTooth Gamepad

Last Updated on 9. Februar 2024 by sfambach

Manchmal braucht es eine Fernbedienung oder einen Joystick, um ein Projekt zu Testen oder einfach Spaß zu haben. Im Folgenden wird die Anbindung eines ESP32 über BlueTooth beschrieben. Zur Steuerung werden ein kleiner analog Joystick und zwei Potis angeschlossen

Fakten

Benötigte Hardware

  • ESP32 BLE Board (ESP32, ESP32C3, ESP32S3)
  • Taster, Joysticks, Potis …
  • Kabel zum verdrahten
  • (Optional) Bread Board
  • (Optional) I²C Expansion Board
  • (Optional) USB Dongle für den Rechner

Benötigte Software

  • Arduino GUI
  • https://github.com/h2zero/NimBLE-Arduino
  • https://github.com/lemmingDev/ESP32-BLE-Gamepad
  • (Optional) Custom Keyboard Bibliothek
  • (Optional für Linux) bluez

Anwendungsbereiche

  • Fernbedienung
  • RC Steuerung
  • Joystick für Spiele

Ansichten

Joystick Versuchsaufbau – Verdrahtung wird unten noch näher beschrieben

Programmierung

Bibliotheken

Die folgenden beiden Bibliotheken werden benötigt. Dies können über den download des Zips von Git oder direkt in der Arduino GUI geschehen. Die dritte ist nicht nötig für den BlueTooth Betrieb wird aber in meinen Beispielen verwendet.

NimBLE-Arduino

ESP32-BLE-Gamepad

CustomKeyboard

Verbindungstest

Der erste Test soll zeigen ob eine Verbindung mit dem PC möglich ist. Hierfür habe ich einen USB-Dongel an den PC angelschossen umd mir einen ESP32 Wroom geschnappt. Das Testprogramm wird bei der ESP32-BLE-Gamepad Bibliothek mit geliefert und heißt Gamepad. Das Programm simuliert in Abständen von einer halben Sekunde das Drücken und Lösen der Taste 5 (bzw 4) sowie das Setzen der Achsenwerte.

Den Sketch für den Arduino compilieren und aufspielen. Wie der Controller in Windows oder in Linux eingebunden wird, kann in den gelinkten Beiträgen nachgesehen werden.

So sollte der Simulator dann im jeweiligen Betriebssystem aussehen.

Peripherietest

Um vorab zu überprüfen ob die Potis und der Joystick auch funktionieren, habe ich einen Peripheriestest erstellt, der einfach die entsprechenden Ports abfragt und auf der Konsole ausgibt. Er basiert auf meiner CustomKeyboard Bibliothek. Mein Versuchaufbau sieht wie folgt aus.

Versuchsaufbau

Verbindungsplan

Pinbelegung

Hier die verwendeten Pins. Diese sind im Grunde frei wählbar. Für die Potis und die Achsen werden Analoge Input Pins benötigt und da der AD-Wandler 1 nicht funktioniert wenn Wifi oder BLE aktiv ist habe ich Pins des ADC2 Verwendet.

PeripherieESP GPIO
Poti 1 Mittelpin25
Poti 2 Mittelpin26
Joystick X Achse14
Joystick Y Achse27
Joystick Taster12
Pinbelegung am ESP32 Wroom

ACHTUNG nicht vergessen die beiden anderen Pins der Potis mit der Versorgungsspannung und Masse zu verbinden und auch an die Stromversorgung für den Joystick denken.

Quellcode

Der Sourcecode für den Test ist unter folgenden Link zu finden:

https://github.com/sfambach/esp32/tree/6e8ab27afbf1394bf51c2333cddb67b81479e9fd/project/ESP32BLE-Joystick/src/ESP32-BLE-Gamepad_InputTest

Die Ausgabe sollte wie folgt aussehen:

Ausgabe Peripherietest

Alles zusammen

Nun bleibt nicht viel mehr als die beiden Test zusammen zu fügen und die von der Physik gelesenen Werte mit BlueTooth zu übermitteln.

Der Beispielcode ist hier zu finden:

https://github.com/sfambach/esp32/tree/e442fb75d588c93a59c3316685182d3358aa51df/project/ESP32BLE-Joystick/src/ESP32-BLE-Gamepad_FinalTest

Es werden drei Achsen X,Y, RX und RY sowie der Knopf 0 übertragen.

Gesteste werden kann das Ganze wieder in Windows in der „GameController Einrichtung“ und unter Linux mit dem Tool jstest.gtk (siehe Kapitel Verbindungstest).

Probleme

Bis jetzt keine

Sonstiges

Controller unter Windows einbinden

Controller unter Linux einbinden

Fazit

Wie immer Schritt für Schritt zum Ziel. Zuerst die Blutooth Funktionalität herstellen, danach die Peripherie anschliessen und zum Schluß beides kombinieren. So fiel die Implementierung leicht. Die Bluetooth Funktionalität des ESP erscheint ausgereift. Die schlechte Analog-/Digitalwandlung muss durch mittelwertbildung verbessert werden aber zum Spielen sollte es ausreichen.

Verwandte Beiträge

Quellen

NimBLE-Arduino

NimBLE-Arduino New User Guide

NimBLE-Arduino API

https://github.com/lemmingDev/ESP32-BLE-Gamepad

https://en.wikipedia.org/wiki/List_of_Bluetooth_profiles

https://en.wikipedia.org/wiki/USB_human_interface_device_class

https://www.usb.org/sites/default/files/documents/hid1_11.pdf

https://github.com/nilutpolkashyap/esp32_microros_joystick/blob/main/cmd_vel_publisher_udp/cmd_vel_publisher_udp.ino

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert