ESP32 Bluetooth Gamepad

Last Updated on 9 February 2024 by Suffocation

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

Facts

Benötigte Hardware

  • ESP32 BLE Board (ESP32, ESP32C3, ESP32S3)
  • Sensors, Joysticks, Potentiometers …
  • Cable for wiring
  • (Optional) Breadboard
  • (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 Library
  • (Optional für Linux) bluez

Areas of application

  • Remote control
  • RC control
  • Joystick für Spiele

Views

Joystick Versuchsaufbau – Verdrahtung wird unten noch näher beschrieben

Programming

Libraries

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

Connection test

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 or in Linux eingebunden wird, kann in den gelinkten Beiträgen nachgesehen werden.

This is how the simulator should look in the respective operating system.

Periphery test

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 Library. My experimental setup is as follows.

Experimental setup

Connection diagram

Pin assignment

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.

PeripheryESP GPIO
Pot 1 Middle pin25
Pot 2 Middle Pin26
Joystick X-axis14
Joystick Y-axis27
Joystick button12
Pin configuration on the ESP32 Wroom

ATTENTION 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.

Source code

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

The output should look like this:

Peripheral test output

All together

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

The example code can be found here:

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.

The whole thing can be tested again in Windows in the „Game Controller Setup“ and under Linux with the jstest.gtk tool (see chapter Connection test).

Problems

Not yet

Miscellaneous

Connect controllers on Windows

Integrating controllers under Linux

Conclusion

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

Sources

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

DateChangeAuthor
04.01.2024Post createdSuffocation

2 thoughts on “ESP32 BlueTooth Gamepad

  1. Hello Karl-Heinz
    In the current case, I haven't set anything specific. I'm using Ubuntu, but I've also had problems with Bluetooth and other Linux distributions like Proxmox. Unfortunately, I haven't found a solution.

    LG Stefan

  2. Good day, ,
    I have a question. On Windows and Android I can easily pair and connect. On Linux /Bacotera/Recalbox/Retropie I can't connect. Or rather, it's constantly disconnected. So, it's not usable. Is there a trick for Linux? Could you help me with that?

Leave a Reply

Your email address will not be published. Required fields are marked *