Hallo zusammen,
ich bin neu in diesem Forum und generell auch noch Anfänger in diesem Themenbereich.
Aktuell versuche ich, mit einem ESP32-Board Daten von einem kabellosen PS2-Controller auszulesen. Leider funktioniert das nicht wie erwartet: Jedes Mal, wenn ich die Software auf den ESP32 lade, beginnt die LED am Empfängermodul ununterbrochen zu flackern.
Laut Internetrecherche sollte die LED am PS2-Empfänger blinken, wenn keine Verbindung zum Controller besteht, und durchgehend leuchten, sobald die Verbindung hergestellt ist. Bei mir flackert sie jedoch dauerhaft – als würde das Modul ständig neu starten oder die Stromversorgung verlieren.
Um einen Defekt des PS2-Empfängermoduls auszuschließen (es stammt aus China), habe ich es testweise mit einem ausgeliehenen Arduino Nano ausprobiert. Dort funktioniert alles wie erwartet: Die LED leuchtet konstant bei bestehender Verbindung, und die Tasteneingaben werden korrekt übertragen.
Daher meine Frage: Gibt es etwas Spezielles, das man beim ESP32 beachten muss? Oder funktioniert das PS2-Modul vielleicht generell nicht mit dem ESP32 C3?
Ich freue mich sehr auf eure Hilfe und Rückmeldungen!
Verwendete Komponenten:
ESP32-C3 Super Mini mit C3 Expansion Board (AliExpress)
Wireless PS2 Controller + Empfänger-Modul (AliExpress)
Arduino Nano (Original)
Arduino Nano Code
#include <PS2X_lib.h>
PS2X ps2x;
// Status speichern
uint16_t lastButtonState = 0;
int lastLX = -1;
int lastLY = -1;
int lastRX = -1;
int lastRY = -1;
// Tastenliste für übersichtliches Mapping
const struct {
uint16_t code;
const char* name;
} buttonMap[] = {
{ PSB_SELECT, "SELECT" },
{ PSB_START, "START" },
{ PSB_PAD_UP, "UP" },
{ PSB_PAD_DOWN, "DOWN" },
{ PSB_PAD_LEFT, "LEFT" },
{ PSB_PAD_RIGHT, "RIGHT" },
{ PSB_L1, "L1" },
{ PSB_L2, "L2" },
{ PSB_R1, "R1" },
{ PSB_R2, "R2" },
{ PSB_CROSS, "X" },
{ PSB_CIRCLE, "O" },
{ PSB_SQUARE, "Square" },
{ PSB_TRIANGLE, "Triangle" }
};
void setup() {
Serial.begin(9600);
int error = ps2x.config_gamepad(13, 11, 10, 12);
if (error == 0) {
Serial.println("PS2 Controller erfolgreich verbunden");
} else {
Serial.println("Fehler beim Verbinden mit dem PS2 Controller");
}
}
void loop() {
ps2x.read_gamepad();
// --- TASTENÄNDERUNGEN ---
uint16_t currentButtons = ps2x.ButtonDataByte();
for (int i = 0; i < sizeof(buttonMap) / sizeof(buttonMap[0]); i++) {
bool prev = lastButtonState & buttonMap[i].code;
bool curr = currentButtons & buttonMap[i].code;
if (prev != curr) {
Serial.print(buttonMap[i].name);
Serial.println(curr ? " gedrückt" : " losgelassen");
}
}
lastButtonState = currentButtons;
// --- JOYSTICK-ÄNDERUNGEN ---
int lx = ps2x.Analog(PSS_LX);
int ly = ps2x.Analog(PSS_LY);
int rx = ps2x.Analog(PSS_RX);
int ry = ps2x.Analog(PSS_RY);
if (lx != lastLX) {
Serial.print("LX: ");
Serial.println(lx);
lastLX = lx;
}
if (ly != lastLY) {
Serial.print("LY: ");
Serial.println(ly);
lastLY = ly;
}
if (rx != lastRX) {
Serial.print("RX: ");
Serial.println(rx);
lastRX = rx;
}
if (ry != lastRY) {
Serial.print("RY: ");
Serial.println(ry);
lastRY = ry;
}
delay(20); // Feinfühlig, aber nicht zu schnell
}
ESP32 C3 Super Mini Kontaktübersicht
PS2 Adapter Pin | Beschreibung | ESP32-C3 GPIO | Bemerkung |
---|---|---|---|
CS | Select / ATT | GPIO6 | Chip Select (Controllerwahl) |
CMD | Command | GPIO8 | Daten vom ESP32 zum PS2 |
CLK | Clock | GPIO7 | Taktleitung |
DATA | Daten (DATA) | GPIO9 | Daten vom PS2 zum ESP32 |
VCC | Versorgung | 5V oder 3.3V* | Je nach Modul (meist 5V) |
GND | Masse | GND | Gemeinsame Masse |
ESP32 C3 Super Mini code
#include <PS2X_lib.h>
PS2X ps2x;
// Status speichern
uint16_t lastButtonState = 0;
int lastLX = -1;
int lastLY = -1;
int lastRX = -1;
int lastRY = -1;
const struct {
uint16_t code;
const char* name;
} buttonMap[] = {
{ PSB_SELECT, "SELECT" },
{ PSB_START, "START" },
{ PSB_PAD_UP, "UP" },
{ PSB_PAD_DOWN, "DOWN" },
{ PSB_PAD_LEFT, "LEFT" },
{ PSB_PAD_RIGHT, "RIGHT" },
{ PSB_L1, "L1" },
{ PSB_L2, "L2" },
{ PSB_R1, "R1" },
{ PSB_R2, "R2" },
{ PSB_CROSS, "X" },
{ PSB_CIRCLE, "O" },
{ PSB_SQUARE, "Square" },
{ PSB_TRIANGLE, "Triangle" }
};
void setup() {
Serial.begin(115200); // Höhere Baudrate für ESP32
// Neue GPIO-Zuordnung für ESP32-C3 Mini:
// ATT, CMD, CLK, DAT = GPIO6, GPIO8, GPIO7, GPIO9
int error = ps2x.config_gamepad(6, 8, 7, 9, true, true);
if (error == 0) {
Serial.println("✅ PS2 Controller erfolgreich verbunden");
} else {
Serial.print("❌ Fehler beim Verbinden: ");
Serial.println(error);
}
}
void loop() {
ps2x.read_gamepad();
uint16_t currentButtons = ps2x.ButtonDataByte();
for (int i = 0; i < sizeof(buttonMap) / sizeof(buttonMap[0]); i++) {
bool prev = lastButtonState & buttonMap[i].code;
bool curr = currentButtons & buttonMap[i].code;
if (prev != curr) {
Serial.print(buttonMap[i].name);
Serial.println(curr ? " gedrückt" : " losgelassen");
}
}
lastButtonState = currentButtons;
int lx = ps2x.Analog(PSS_LX);
int ly = ps2x.Analog(PSS_LY);
int rx = ps2x.Analog(PSS_RX);
int ry = ps2x.Analog(PSS_RY);
if (lx != lastLX) {
Serial.print("LX: ");
Serial.println(lx);
lastLX = lx;
}
if (ly != lastLY) {
Serial.print("LY: ");
Serial.println(ly);
lastLY = ly;
}
if (rx != lastRX) {
Serial.print("RX: ");
Serial.println(rx);
lastRX = rx;
}
if (ry != lastRY) {
Serial.print("RY: ");
Serial.println(ry);
lastRY = ry;
}
delay(20); // Feinfühlig, aber nicht zu schnell
}