Mit einer 16x16 NeoPixel-Matrix, einem Arduino UNO R4 und ein paar Holzresten kannst du dir einen eigene Mini-Arcade-Box bauen. Ob für eine schnelle Runde zwischendurch oder um in Erinnerungen an die goldene Ära der 8-Bit-Spiele zu schwelgen: Das Projekt bringt das echte Retro-Gaming-Feeling im handlichen Format direkt zu dir nach Hause.
Hinweis zu den Bildern, leider kann meine Kamera auf die Pixel nicht Scharf stellen, deshalb sieht das alles so "überbelichtet" bei den Pixeln aus.
Das Gehäuse: Zusammenbau & Hardware
Das Gehäuse muss nicht kompliziert sein, um edel auszusehen. Für den Korpus kannst du einfach Pressspanholz verwendet und es sauber mit einer hochwertigen Holzfolie beklebt. Das gibt dem Ganzen einen coolen, rustikalen Look, der stark an die alten Arcade-Gehäuse der 80er-Jahre erinnert.
Für die Front kommt eine 2 mm Milchglas-Plexiglasscheibe zum Einsatz. Das ist das eigentliche Geheimnis der Optik: Das Milchglas bricht das harte Licht der einzelnen RGB-LEDs und verwandelt sie in weiche, fette Quadrate (Pixel). Erst dadurch entsteht der echte, authentische Retro-Pixel-Look!
Die Pin-Zuordnung am Arduino
Damit alles reibungslos läuft, verbindest du die Komponenten wie folgt mit deinem Arduino UNO R4:
-
Die Pin-Zuordnung am Arduino
Im neuen Setup ist die Verkabelung deutlich schlanker geworden. Du verbindest die Komponenten wie folgt mit deinem Arduino:
Joystick & Buttons
- Joystick X-Achse: Pin A0
- Joystick X-Achse: Pin A0
- Action-Taste (Fire/Jump): Pin 2
- Action-Taste (Start/Reset): Pin 3
- NeoPixel DATA-Pin: Pin 7
- Joystick X-Achse: Pin A0
⚠️ Wichtige Hardware-Hinweise:
- Gutes Netzteil nutzen: Eine 16x16 Matrix besitzt 256 RGB-LEDs. Wenn alle weiß und auf voller Helligkeit leuchten, ziehen sie ordentlich Strom! Versorge die Matrix niemals nur über den 5V-Pin des Arduinos, sondern nutze ein stabiles, externes 5V-Netzteil (mindestens 2 bis 3 Ampere). Verbinde die Masse (GND) des Netzteils unbedingt mit dem GND des Arduinos.
- Saubere Verdrahtung am Data-Pin: Der DATA-Pin (Pin 9) reagiert empfindlich auf Störungen. Achte auf kurze, saubere Signalwege. Ein 330-Ohm-Widerstand (wenn nicht schon verbaut) in der Datenleitung direkt vor der Matrix schützt das Signal und verhindert ungewolltes Flackern.
Die 3 wichtigsten Stellen im Hauptcode (pixel.ino)
Wie im Dateibaum zu sehen ist, teilt sich das Projekt in verschiedene Dateien auf (z. B. config.h, highscore.h und Header-Dateien für jedes einzelne Spiel). Das Herzstück bildet nun die Datei game.ino. Hier sind die drei zentralen Stellen, die du verstehen solltest:
1. Matrix-Indexierung & 180°-Drehung (getIndex)
Da das LED-Panel je nach Einbau gedreht sein kann, rechnet die Funktion getIndex(x, y) die Koordinaten um. Hier wird die 180-Grad-Spiegelung für die X- und Y-Achse mathematisch gelöst:
int getIndex(int x, int y) {
// 180-Grad-Drehung: X und Y spiegeln
x = (WIDTH - 1) - x;
y = (HEIGHT - 1) - y;
if (x < 0 || x >= WIDTH || y < 0 || y >= HEIGHT) return -1;
if (x % 2 == 0) return (x * HEIGHT) + y;
else return (x * HEIGHT) + (HEIGHT - 1 - y);
}
2. Die zentrale State Machine in loop()
Um sauber zwischen dem Boot-Vorgang, dem Hauptmenü und den einzelnen Spielen zu wechseln, nutzt die loop()-Funktion eine switch-Struktur, die auf der Variablen sysMode basiert:
// --- SYSTEM STATE MACHINE ---
switch (sysMode) {
case SYS_BOOT:
sysMode = SYS_MENU;
break;
case SYS_MENU: {
FastLED.clear();
FastLED.setBrightness(globalBrightness);
// ... (Joystick-Auswertung und Menü-Logik) ...
break;
}
case SYS_PLAY_JUMP:
FastLED.clear(); FastLED.setBrightness(globalBrightness);
pj_updateGame();
break;
// ... (Weitere Spiele und GameOver-Screen) ...
}
3. Feste Framerate per Timer (FRAME_MS)
Damit die Spiele flüssig und nicht unkontrolliert schnell ablaufen, wird am Anfang der loop() die Bildwiederholrate hart begrenzt. Die Konstante FRAME_MS sorgt dafür, dass das System nur alle 20 Millisekunden ein neues Bild berechnet:
void loop() {
static unsigned long lastFrame = 0;
const unsigned long FRAME_MS = 20;
unsigned long now = millis();
if (now - lastFrame < FRAME_MS) return;
lastFrame = now;
// Hier folgt die restliche Tasten- und Spiellogik...
}
Welche Spiele sind enthalten?
Das System ist modular aufgebaut. Folgende Klassiker haben wir direkt für das 16x16-Pixel-Raster umgesetzt:
- 🟢 Pixel Jump - Der klassische Plattformer-Test für schnelle Reflexe.
- 👾 Space Invaders - Hol die Aliens vom Himmel, bevor sie den Boden erreichen!
- 🧱 Tetris - Der ewige Klassiker: Blöcke drehen, Reihen auflösen und Punkte sammeln.
- 🐍 Snake - Futter fressen, wachsen und bloß nicht in den eigenen Schwanz beißen.
- 🐥 Flappi - Steuere den kleinen Vogel sicher durch die Hindernisse.
- 🦖 Dino-Spiel - Weiche den Kakteen aus und renne um den Highscore.
Download & Code
ℹ️ Hinweis zum Code: Hier auf der Seite siehst du nur den Code der pixel.ino (der Hauptdatei). Um das gesamte Projekt zu kompilieren, benötigst du auch die Header- und Spiel-Dateien. Das komplette Projekt inklusive aller Spiele und Bibliotheken findest hier als download: Arduino-Retro-16-16-game.zip
Der Arduino pixel.ino Code für das Spiel
Der kleine Bruder des Pixelmonsters: Bewusst minimalistisch
Vielleicht kennst du schon das große „Pixelmonster“ mit seiner gewaltigen 32x32 Matrix. Diese 16x16 Arcade-Box ist quasi der kleine, kompakte Bruder dazu! Bei diesem Projekt stand ganz bewusst der Minimalismus im Vordergrund.
![]()
Statt einer ausladenden Konsole mit zig Schaltern und riesigem Display beschränkt sich dieses Design auf das absolut Wesentliche: Ein analoger Joystick und genau zwei Tasten (Action/Jump und Start). Das reicht völlig aus, um all die integrierten Retro-Klassiker perfekt zu steuern. Durch diese Reduzierung ist der Zusammenbau nicht nur deutlich einfacher und günstiger, die kompakte Box passt auch auf jeden noch so vollen Schreibtisch. Der nostalgische 8-Bit-Charme kommt durch das grobere 16x16-Raster und die dicken Milchglas-Pixel dabei sogar noch viel besser zur Geltung!


