Game-Controller (SNES) mit Arduino

Game-Controller (SNES) mit Arduino

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.

Verwendete Bauteile

Anschlüsse

Anschlüsse des SNES-Game-Controllers

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.

Arduino-Verbindung

Stecker und Anschlüsse des SNES-Controllers
Abb.: Stecker des SNES-Controllers mit den 7 Anschlüssen.
Stecker und Anschlüsse des SNES-Controllers
Abb.: Anschlusskabel des SNES-Controllers nach (gewaltsamen) Entfernen der Steckerhülle. Man erkennt, dass zwei Anschlüsse überhaupt nicht verwendet werden.
Hinweis: spätestens hier sollte man sich die Farben der Kabel zusammen mit der Anschlussbelegung merken/aufschreiben!
Stecker und Anschlüsse des SNES-Controllers
Abb.: Nach dem vorsichtigen Herausziehen der "Kabelschuhe" aus dem Kunststoffstecker müssen diese nun für den Einsatz auf einem Breadboard vorbereitet werden.
Stecker und Anschlüsse des SNES-Controllers
Abb.: Die Kabel sind mit Jumperkabeln für ein Breadboard-Einsatz zusammengelötet worden und mit Schrumpfschlauch isoliert.
Stecker und Anschlüsse des SNES-Controllers
Abb.: Da ich nicht fünf verschiedene Jumperkabel durchschneiden und opfern wollte, musste ich die Kabel beschriften, da die originale Farbe nicht mehr zu sehen ist.

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.

Programmierung & Sketch

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);
}

Ergebnis

Ausgabe auf der seriellen Konsole
Abb.: Das Ergebnis des Sketches ist je nach Knopfdruck eine Ausgabe auf der seriellen Konsole des Arduino.

Einsatzmöglichkeiten

Für die folgenden Spiele und Projekte könnte man einen oder zwei dieser SNES-Game-Controller verwenden:

zurück