In dem Artikel Arduino Gamepads von bitluni wird ein NES- bzw. SNES-Game-Controller an einen ESP32 angeschlossen. Da ich in der Vergangenheit schon einige Spiel mit dem Arduino ungesetzt habe, bietet sie hier die Möglichkeit an, solche einen (nachgebauten) Game-Controller als Eingabe- und Steuergerät zu verwenden.
Die originalen und nachgebauten SNES-Controller haben einen Stecker mit 7 Anschlüssen, wobei hier nur 5 davon benötigt werden. In meinen Game-Controllern, die ein Noname-China-Nachbau sind, waren zwei (im Bild grauen) Anschlüsse gar nicht belegt.
Nun können die so vorbereiteten Anschlüsse des SNES-Controllers mit dem Arduino verbunden werden:
SNES-Controller | Arduino Uno |
---|---|
VCC | 5V (3,3V sind auch möglich) |
GND | GND |
Clock | beliebiger digitaler Pin (hier: #9) |
Latch | beliebiger digitaler Pin (hier: #8) |
Data |
beliebiger digitaler Pin (hier: #10) Bei mehreren gleichzeitig betriebenen Controllern kann zwar Clock und Latch gemeinsam verwendet werden, jedoch muss pro Controller immer ein unterschiedlicher Data-Pin benutzt werden. |
Auf github hat bitluni schon die wunderbar funktionierende Library ArduinoGameController zur Verfügung gestellt, die es sehr einfach macht, den SNES-Controller in jedes beliebige Projekt einzubinden. Der folgende Sketch stellt nur einen kleinen Test dar, damit man die Funktionsfähigkeit ausprobieren kann.
#include "GameControllers.h"
// shared pins between all used controllers
const int LATCH_PIN = 8;
const int CLOCK_PIN = 9;
// individual data pin for each controller
const int DATA_PIN_0 = 10;
GameControllers controllers;
void setup()
{
Serial.begin(9600);
// initialize shared pins
controllers.init(LATCH_PIN, CLOCK_PIN);
// activate first controller ans set the type to SNES
controllers.setController(0, GameControllers::SNES, DATA_PIN_0);
}
void loop()
{
// read all controllers
controllers.poll();
// check if Start was pressed since last loop
if (controllers.pressed(0, GameControllers::START)) {
Serial.println("Start");
}
// if button "A" is hold down repeat after 20 loops
if (controllers.pressed(0, GameControllers::A, 20)) {
Serial.println("A");
}
// check if button "B" button is currently pressed down
if (controllers.down(0, GameControllers::B)) {
Serial.println("B");
}
// read controller just ~20times a second
delay(50);
}
Für die folgenden Spiele und Projekte könnte man einen oder zwei dieser SNES-Game-Controller verwenden:
zurück