Espressif ESP32-Wrover DevKit - Buttonbox mit BluTooth HID

U

User 20791

Ich starte hier nochmal das Thema, damit der Simagic Mini Thread nicht hijacked wird.

RAYKREBS schrieb
ich experimentiere gerade mit einem Espressif ESP32-Wrover DevKit. Das ist etwas größer als ein Arduino nano 33 IoT, hat aber dafür nativen Bluetooth HID Support, d.h. es gibt eine Library die einfach eingebunden werden kann und von Windows Plug&Play als BLE Gamepad erkannt wird.

Ich denke das ist im Prinzip die Lösung die auch Cube Control bei seinem neuen Rim gegangen ist.

Zählt man die Komponenten zusammen braucht man ca.80€ für ein nacktes RIM, 20€ für das ESP32 Board. 20€ für Kleinkram und Taster. Wer die Möglichkeit eines 3D-Druckers hat, kann es noch weiter vereinfachen. Ansonsten ist ein Button Dash im Eigenbau, wer keine zwei linken Hände hat, auch möglich. Magnet-Shifter kosten ca. 100€. Wer Spaß an der Sache hat kommt etwa auf 1/3 vom Preis. Zeit darf man nicht mit einbeziehen.
 
U

User 20791

ich habe mal bei Amazon ein kleines Dev-Kit bestellt.
Damit kann ich auch andere Funktionen testen und etwas programmieren/basteln.
Hoffe das ist das richtige ;)

als passende library wurde folgende vorgeschlagen.


so.
Und jetzt ist die Community offen für Vorschläge, Erfahrungen und Erfolgsmeldungen von Leuten, die sich schon damit herumgeschlagen haben
:-)
 
U

User 16061

Ich habe ein Wheel mit einem ESP32 ebenfalls schon gebaut. Der Code ist für 12 Buttons und zwei Encoder, kann aber über die Variablen ROWS, COLS, rowPins, colPins, uppPin, dwnPing, encoderUpp, encoderDwn für den eigenen Use Case angepasst werden. Vielleicht hilft es ja jemandem.

Ich habe den ESP32 D1 Mini genutzt.
1645877440255.jpeg

#include <ESP32Encoder.h> // https://github.com/madhephaestus/ESP32Encoder/ #include <Keypad.h> // https://github.com/Chris--A/Keypad #include <BleGamepad.h> // https://github.com/MagnusThome/ESP32-BLE-Gamepad BleGamepad bleGamepad("Buttonplate", "Manufacturer", 100); #define ROWS 4 #define COLS 3 uint8_t rowPins[ROWS] = {4, 16, 17, 18}; uint8_t colPins[COLS] = {19, 21, 22}; uint8_t keymap[ROWS][COLS] = { {0, 1, 2}, {3, 4, 5}, {6, 7, 8}, {9, 10, 11}, }; Keypad customKeypad = Keypad( makeKeymap(keymap), rowPins, colPins, ROWS, COLS); #define MAXENC 2 uint8_t uppPin[MAXENC] = {23, 27}; uint8_t dwnPin[MAXENC] = {25, 33}; uint8_t encoderUpp[MAXENC] = {12, 14}; uint8_t encoderDwn[MAXENC] = {13, 15}; ESP32Encoder encoder[MAXENC]; unsigned long holdoff[MAXENC] = {0, 0}; int32_t prevenccntr[MAXENC] = {0, 0}; bool prevprs[MAXENC] = {0, 0}; #define HOLDOFFTIME 150 // TO PREVENT MULTIPLE ROTATE "CLICKS" WITH CHEAP ENCODERS WHEN ONLY ONE CLICK IS INTENDED void KeypadUpdate() { customKeypad.getKeys(); for (int i = 0; i < LIST_MAX; i++) // Scan the whole key list. { if ( customKeypad.key[i].stateChanged ) // Only find keys that have changed state. { uint8_t keystate = customKeypad.key[i].kstate; if (keystate == PRESSED) { pressKey(int(customKeypad.key[i].kchar)); } if (keystate == RELEASED) { releaseKey(int(customKeypad.key[i].kchar)); } } } } void sendKey(uint8_t key) { uint32_t gamepadbutton = pow(2, key); // CONVERT TO THE BINARY MAPPING GAMEPAD KEYS USE Serial.print("pulse\t"); Serial.println(key); if (bleGamepad.isConnected()) { bleGamepad.press(gamepadbutton); delay(150); bleGamepad.release(gamepadbutton); } } void pressKey(uint8_t key) { uint32_t gamepadbutton = pow(2, key); // CONVERT TO THE BINARY MAPPING GAMEPAD KEYS USE Serial.print("hold\t"); Serial.println(key); if (bleGamepad.isConnected()) { bleGamepad.press(gamepadbutton); } } void releaseKey(uint8_t key) { uint32_t gamepadbutton = pow(2, key); // CONVERT TO THE BINARY MAPPING GAMEPAD KEYS USE Serial.print("release\t"); Serial.println(key); if (bleGamepad.isConnected()) { bleGamepad.release(gamepadbutton); } } void setup() { Serial.begin(115200); for (uint8_t i = 0; i < MAXENC; i++) { encoder[i].clearCount(); encoder[i].attachFullQuad(dwnPin[i], uppPin[i]); } //customKeypad.setHoldTime(1); bleGamepad.begin(); Serial.println("Booted!"); } void loop() { unsigned long now = millis(); // -- ROTARY ENCODERS : ROTATION -- // for (uint8_t i = 0; i < MAXENC; i++) { int32_t cntr = encoder[i].getCount(); if (cntr != prevenccntr[i]) { if (!holdoff[i]) { if (cntr > prevenccntr[i]) { sendKey(encoderUpp[i]); } if (cntr < prevenccntr[i]) { sendKey(encoderDwn[i]); } holdoff[i] = now; if (holdoff[i] == 0) holdoff[i] = 1; // SAFEGUARD WRAP AROUND OF millis() (WHICH IS TO 0) SINCE holdoff[i]==0 HAS A SPECIAL MEANING ABOVE } else if (now - holdoff[i] > HOLDOFFTIME) { prevenccntr[i] = encoder[i].getCount(); holdoff[i] = 0; } } } KeypadUpdate(); delay(10); }
Quelle: https://github.com/lemmingDev/ESP32-BLE-Gamepad/issues/34#issuecomment-753246360
 
U

User 22349

Was ein USB-Adapter angeht, muss man sich glaube ich keine großen Sorgen machen. Ich habe hier einen von inLine. Frag mich bitte nicht, wie/wo und für wie viel ich den erstanden habe. Tut aber seinen Dienst.

Wer vor hat, den ESP mit Akku/Batterie zu betreiben, sollte im Setup noch "setCpuFrequencyMhz(80);" nutzen. Das limitiert die Taktfrequenz und schon so die Stromquelle.
 
U

User

Für mich hat sich nach einigen Fehlkäufen der Trust 18187 als äußerst zuverlässig erwiesen.
 
U

User 16760

Find ich cool dass das Thema etwas Fahrt aufgenommen hat. Mein Devkit kam gestern an. Bin noch am testen. Die BleGamepad Library von Lemmings habe ich gestern geflast. Die schien mir als sehr gut, zumal die Library auch schon in anderen DIY Projekten verwendet wurde.

Das DevKit habe ich eben auf einer Lochrasterplatine steckbar befestigt. Ich muss das Programm noch anpassen, so dass die I/O auf die Buttons gelegt sind. Dann kann ich es am Wheel montieren und erste Testfahrten machen.

Ich habe im PC ein Intel Wireless Modul, das AC 9462. Damit klappt es bisher einwandfrei.
 
U

User 19590

USB-Adapter/Dongle sollte wie geschrieben schon min. BT4.2 unterstützen,, aber 5 ist ja eigentlich schon Standard
und da drunter würde ich nicht gehen.
Ich hab mit den Teilen von CSL ganz gute Erfahrung gemacht und auch TP-Link was ich momentan nutze ist ganz gut
bezüglich Preis/Leistung.
 
U

User 16760

@User 16061Klöckner
Das von Dir sieht echt super aus. Richtig professionell mit eigenem PCB, top.

Meine Sorge ist, dass das bisher zwar auf Anhieb so auf dem Schreibtisch lief, aber am Ende im Rig nicht zuverlässig die Buttons im Spiel erkannt werden.

Mein erster Versuch mit dem Arduino nano 33 IoT ist bisschen ein Flop. Das lief auch erst super am Schreibtisch, aber im Rig in real Life, werden manchmal bestenfalls die Buttons ewtas verzögert im Spiel erkannt, manchmal komplett ignoriert.

Das nano 33 IoT hat zwar die Arduino BLE Library aber keinen direkten Support für HID OVER GATT PROFILE, also HID over BLE. Ich habe dann ein kleines C# Programm geschrieben das die BLE Datenpakete empfängt und dann ein ein virtuelles Joystick Device einwirft.

Woran es jetzt liegt, dass es nicht zuverlässig die Buttons überträgt, habe ich noch nicht herausgefunden. C# Programme sind natürlich nicht gut echtzeitfähig.

Deshalb hoffe ich, das es mit dem ESP32 als echtes HID Device, welches von Windows direkt eingebunden wird, stabiler und ohne große Latenz funktioniert.
 
U

User 22349

Deshalb hoffe ich, das es mit dem ESP32 als echtes HID Device, welches von Windows direkt eingebunden wird, stabiler und ohne große Latenz funktioniert.
Wenn man so liest, sind Latenzen bzw. Delays und Input lag ja auch immer so eine Gefühlssache. Daher kann ich nur sagen, dass ich bei meinem Setup keine Verzögerungen bemerke. Allerdings ist das bei mir auch recht "minimalistisch". VR, DD, Pedale, Shifter und halt je nach Laune ein RIM mit ESP oder Arduino pro micro. Den BT USB, habe ich direkt am Rechner und nicht mit am Aktiven HUB, der am Wheelstand hängt. Luftlinie ist das unter einem Meter.

Hat hier jemand schon was gefunden, um den Akku/Batteriestatus im Windows sauber zu aktualisieren? Bei mir ist es so, dass dieser nur beim Koppeln oder wenn man BT im Windows deaktiviert und wieder aktiviert aktualisiert wird. On-the-Fly scheint das dank des Windows Treibers nicht sauber zu funktionieren(ein Problem, was nicht nur den esp32 betrifft).
 
U

User 16760

Mein erster Prototyp mit dem ESP32 und Eigenbau Dash mit Magnetschalter.
Leider ist eben wieder etwas der Mut gesunken.
In Windows in der Spielesteuerung werden die Buttons eigentlich unverzögert angezeigt.
In ACC mit großem Delay welches noch zufällig länger oder kürzer ausfällt. Gefahren bin ich noch nicht.

PXL_20220227_074825498.jpg
 
U

User 22349

Hast du den Delay beim Zuweisen der Tasten, oder auch wenn die schon zugewiesen sind? Welches Board verwendest du?

Und aus reiner Neugierde: ziehst du den Strom direkt aus der Base? Die haben ja so ein nettes Wireless-System da drinnen.
 
U

User 16760

Also, ja, die 5V kommen von der Base, die ja auch für die Simagic Wheels verwendet werden.

Das Board ist ein Wrover - stepping E, also dss neuste. Das komplette Board ist ein original Espressif DevKit.

Ich habe den Code von LemmingDev genommen und dort auch geschaut wie er es in verschiedenen Beispielen gemacht hat.

Die Routine ist in etwa so, aus dem Gedächtnis:

Inputs lesen also die Digitalen I/O
Bei Änderungen die press oder Release Funktion auf gerufen.

Am Ende der Loop()
Send.Report()
Delay(10)

Klar habe ich in ACC die Buttons zugewiesen, schon da in den Controller Settting reagieren die Buttons extrem langsam.

Im Gegensatz dazu, reagieren die Buttons von der Selbstbau USB ButtonBox in Echtzeit.
 
Zuletzt bearbeitet:
U

User 16760

Leute, ich kann Entwarnung geben. Ich traue mich kaum zu sagen was die Ursache war.

Also, ich wollte das neuste Stepping, das gab es nur als IE, sprich mit externem Antennenanschluss.

In ruhiger, vermutlich ungestörter Umgebung, konnte ich ohne Antenne damit bis zu 3m vom PC eine stable Echtzeit-Verbindung sehen. Also dachte ich, bevor ich noch Umbauten anstelle, müsste das auf die kurze Distanz eigentlich funktionieren.

Jetzt, am Rig, DD aktiv, ACC am laufen, kamen die Buttons verzögert bis gar nicht. Dieses Verhalten sah ich dann auch in dem Windows Gamepad Controller Panel

Je nach Stellung des Lenkrads, war es besser oder schlechter. Das Modul ist keinen Meter von den Antennen vom PC entfernt.

Ich hatte noch vom Routerumbau IPX Adapterkabel übrig. Also nicht lange überlegt und das Antennenkabel samt externer Antenne aufgesteckt und die Antenne provisorisch mit Tesafilm angeklebt.

Die Testfahrten in ACC waren sagenhaft. Kein spürbares Delay, saubere Schaltvorgänge, ich bin entzückt.

Ich kann jedem nur Mut machen es zu probieren und das leidige Kabel am Wheel ist Vergangenheit.

Ich werde das auf jeden Fall im Auge behalten, aber so war heute das Hotlapping ne reine Freude.

Jetzt kann ich mich endlich auch mal intensiver um die Alpha mini kümmern, denn das Ding habe ich auch erst seit etwas mehr als einer Woche. Ich war ständig nur mit dem Bluetooth Kram beschäftigt.
 
Zuletzt bearbeitet:
U

User 11852

Mal so am Rande, ich fahre SC 2 Sport.....nur mit Wireless Wheels.
Habe mal ein M4 GT4 Budget-Wheel mit Pro Micro und Kabel gebaut, das Kabel stört mich kein Stück, merke es nicht mal.
 
U

User 20791

ja. Ist richtig. Ich habe selbst 2 wheels mit USB Kabel.
Aber wenns wireless geht, warum nicht.
Außerdem gehts hier in erster Linie ums Basteln und Lösungen finden.
Da ist das selbe wie mit meiner Ferrari 488 Buttonbox.
Technisch bringt sie gegenüber meiner 08/15 BB nix. Eher Nachteile, weil ich die Tastenbelegung seit 5 Jahren blind intus habe.
Aber tüfteln und ein schönes Ergebnis daraus is einfach geil :ROFLMAO:
 
Zurück
Oben