Arduino-gesteuerte Flipper-Maschine selbst bauen: Komplett-Anleitung
Komponenten und Zubehör
| Bauteil | Menge | Hinweise |
|---|---|---|
| Arduino Mega 2560 | 1 | Zentrale Steuerung |
| Adafruit 2-Pin LCD Display | 1 | Für Score/Anzeige (seriell) |
| 24 V Netzteil | 1 | Für Spulen (Flipper, Slingshots, Pop-Bumper) |
| Adafruit Kraftsensor (Force Sensor) | 1 | Ball-Verlust-Erkennung |
| Pop-Bumper Assembly | 1 | Mit Spule & Schalter |
| Pop-Bumper Switch | 1 | |
| Target Switch (Zielschalter) | 1 | |
| Rollover Switch (Durchroll-Schalter) | 1 | |
| Flipper Assembly (links & rechts) | 2 | Mit Spule, Bat, Schalter, Button |
| LED-Lampen (Pinball-LEDs) | 1 Set | Für Spielanzeige |
Projektbeschreibung
Der Bau einer Arduino-gesteuerten Flipper-Maschine vereint Holzbau, Mechanik, Elektronik und Programmierung. Es dauerte ca. 6 Monate (nebenher) und war das komplexeste Projekt, das ich je gebaut habe – auch weil es wenig Dokumentation dazu gab. Diese Anleitung soll anderen den Einstieg erleichtern. Alles prototypen und testen! Ich nutzte Rest-Sperrholz für jeden Mechanismus, bevor er in die finale Maschine kam.
Gehäuse (Cabinet)
- Material: Eichen-furniertes Sperrholz (Baumarkt).
- Front/Rückwand: 20″ H × 23″ B. Seiten: 20″ H × 47″ L.
- Gehrungsschnitte, Verbinden mit Lamello (Flachdübel) & Leim. Taschenschrauben + Leim geht auch.
- Stabilität: ¾″ Nut 1″ über Boden für Einlegeboden (nicht verleimen – Schwindung!). Boden trägt Netzteile.
- Spielfeld: 22″ B × 42″ L (kürzer als Cabinet → 3″ Platz vorne für Plunger, Kabel, Buttons).
- Spielfeld ruht auf Holzklötzen an Seitenwänden (~4″ unter Oberkante). Zum Wartung: Deckel auf, Spielfeld raus, umklappen.
- Beine: Verstellbar über Gewindestangen (3/8″, 12″ lang) in Holzbeinen mit T-Nuten & Nivellierfüßen. Neigung 1–7° einstellbar (höher = schneller).
- Netzleiste an Rückwand → ein Schalter für alles. USB-Kabel nach außen für Arduino-Neuprogrammierung ohne Spielfeld-Entnahme.
Deckel (Backglass)
- Eichenholzrahmen, Außenmaße wie Cabinet. Oben/Seiten 1,5″ breit, unten 5″ (verdeckt Spalt).
- Nut für Plexiglas (leichter, bruchsicherer als Glas). Taschenschrauben für Demontierbarkeit.
- LED-Streifen unter Deckel für Deko. Piano-Scharnier eingelassen.
Arduino-Steuerung
Der Mega 2560 übernimmt vier Aufgaben:
- Schalter abfragen (Targets, Rollovers, Pop-Bumper, Flipper-Buttons, Ball-Shooter, Verlust-Sensor).
- Lampen/LEDs ansteuern.
- Scoring & Ball-Zählung verwalten.
- Score & Ball-Nr. auf LCD anzeigen (serielles 2-Pin-Display).
Verdrahtung: Meiste Schalter: Digitaler Eingang + GND, Pin als INPUT_PULLUP. Low = aktiv.
Pop-Bumper Sonderfall: Arbeiten mit 24 V (Spulen). Deren Schalter liefert 24 V → Spannungsteiler auf 5 V für Arduino. Analog-Eingänge nutzen (Schwellwert > 500), um Störungen durch Leckströme zu filtern.
Scoring-Logik: Alle Targets/Pops/Rollovers getroffen → alle Lichter dieser Gruppe blinken 3×, dann Wert vervielfachen (Targets ×5, Rollovers ×2 + Score×2, Pops ×2).
Ball-Verlust: Kraftsensor unter Auswurf → erkennt Ball. 5 Bälle pro Spiel. Game Over: Alle Lichter blinken nacheinander, LCD zeigt „Game Over!!!“.
Stromversorgung
24 V Netzteil für alle Spulen. Verteilung über Sammelschienen (Busbars) unter Spielfeld (Elektrofachmarkt). 16 AWG für 24 V, 22 AWG für Arduino-Signale.
Ball-Shooter (Plunger)
Kaufteil (z. B. Marcospecialties B-12445). Loch in Frontwand, präzise ausrichten: Mitte Plunger = halbe Ballhöhe (Pinballs: 1 1/16″).
Spielfeld-Oberfläche
6 mm Birken-Sperrholz. NASA-Poster (Hubble-Bild) mit Sprühkleber aufbringen, zuschneiden.
Flipper
Kaufteile (z. B. Pinballlife #172). Verdrahtung: EOS-Schalter (End-of-Stroke) schaltet Spule im Hold-Modus. Flipper-Button → Spule → EOS → Hold-Spule. Details im Originalbild.
Slingshots
Komplett-Sets (Action Pinball). Gummiringe, Stifte. Metall-Schienen neben Flippern selbst gemacht (Verzinkter Draht, gebohrt & epoxiert).
Pop-Bumper
3 Löcher bohren (2 Stützstangen, 1 Schalterwelle). Ball drückt Scheibe → Blattkontakt → Spule zieht Ring runter → Ball wird weggeschleudert.
Targets, Rollover, Lampen
- Targets: Marcospecialties A-14691-5
- Rollover: Action Pinball A-12687
- LED-Lampen: LED4555 + Fassung 077-5030-00
Alle gleich verdrahtet: Schalter → Arduino Input (Pullup), Lampe → Arduino Output (via Transistor/MOSFET an 24 V).
Code (Arduino)
const int TxPin = 17; // LCD seriell
long Score = 0, OldScore = 0;
long TargetVal = 1, PopVal = 1, RollVal = 10;
int Targets[8] = {}, Rolls[3] = {}, Pops[4] = {};
int Milli = 10, Flash = 100;
int Ball = 0, Shot = 0, Lost = 0, Pressure = 1024;
#include <SoftwareSerial.h>
SoftwareSerial mySerial(255, TxPin); // Nur TX
void setup() {
pinMode(TxPin, OUTPUT); digitalWrite(TxPin, HIGH);
mySerial.begin(9600); mySerial.write(12); mySerial.write(17); // Clear, Backlight on
// Target Inputs 2-9
for (int i = 2; i <= 9; i++) pinMode(i, INPUT_PULLUP);
// Rollover Inputs 10-12
for (int i = 10; i <= 12; i++) pinMode(i, INPUT_PULLUP);
// Ball-Shooter Switches 15, 16
pinMode(15, INPUT_PULLUP); pinMode(16, INPUT_PULLUP);
// LCD TX Pin 17 schon gesetzt
// Target Lights 32-39
for (int i = 32; i <= 39; i++) pinMode(i, OUTPUT);
// Rollover Lights 40-42
for (int i = 40; i <= 42; i++) pinMode(i, OUTPUT);
// Pop Lights 50-53
for (int i = 50; i <= 53; i++) pinMode(i, OUTPUT);
}
void loop() {
// Targets prüfen
for (int i = 0; i < 8; i++) {
if (digitalRead(i + 2) == LOW) {
Targets[i] = 1; Score += TargetVal;
digitalWrite(i + 32, HIGH); delay(Milli); break;
}
}
int sum = 0; for (int i = 0; i < 8; i++) sum += Targets[i];
if (sum == 8) { // Alle getroffen
for (int j = 0; j < 3; j++) {
for (int i = 0; i < 8; i++) digitalWrite(i + 32, LOW);
delay(Flash);
for (int i = 0; i < 8; i++) digitalWrite(i + 32, HIGH);
delay(Flash);
}
for (int i = 0; i < 8; i++) { digitalWrite(i + 32, LOW); Targets[i] = 0; }
delay(Flash); TargetVal *= 5;
}
// Rollovers prüfen
for (int i = 0; i < 3; i++) {
if (digitalRead(i + 10) == LOW) {
Rolls[i] = 1; Score += RollVal;
digitalWrite(i + 40, HIGH); delay(Milli); break;
}
}
sum = 0; for (int i = 0; i < 3; i++) sum += Rolls[i];
if (sum == 3) {
for (int j = 0; j < 3; j++) {
for (int i = 0; i < 3; i++) digitalWrite(i + 40, LOW);
delay(Flash);
for (int i = 0; i < 3; i++) digitalWrite(i + 40, HIGH);
delay(Flash);
}
for (int i = 0; i < 3; i++) { digitalWrite(i + 40, LOW); Rolls[i] = 0; }
delay(Flash); Score *= 2; RollVal *= 10;
}
// Pop Bumper (Analog Pins 0-3, Schwelle 500)
for (int i = 0; i < 4; i++) {
if (analogRead(i) > 500) {
Pops[i] = 1; Score += PopVal;
digitalWrite(i + 50, HIGH); delay(Milli); break;
}
}
sum = 0; for (int i = 0; i < 4; i++) sum += Pops[i];
if (sum == 4) {
for (int j = 0; j < 3; j++) {
for (int i = 0; i < 4; i++) digitalWrite(i + 50, LOW);
delay(Flash);
for (int i = 0; i < 4; i++) digitalWrite(i + 50, HIGH);
delay(Flash);
}
for (int i = 0; i < 4; i++) { digitalWrite(i + 50, LOW); Pops[i] = 0; }
delay(Flash); PopVal *= 2;
}
// Ball Shooter / Ball Zählung
if (digitalRead(15) == LOW && Shot == 0) { // Unterer Schalter
Lost = 0; Pressure = analogRead(A7) + 20; OldScore = -1;
Ball++; if (Ball == 6) { Ball = 1; Score = 0; TargetVal = PopVal = RollVal = 1; }
Shot = 1;
}
if (digitalRead(16) == LOW && Shot == 0) { // Oberer Schalter
Lost = 0; Pressure = analogRead(A7) + 15; OldScore = -1;
Ball++; if (Ball == 6) { Ball = 1; Score = 0; TargetVal = PopVal = RollVal = 1; }
Shot = 1;
}
// Ball auf Drucksensor (A7) → Ball verloren
if (analogRead(A7) > Pressure) {
Shot = 0;
if (Lost == 0) {
Lost = 1;
if (Ball == 5) { // Game Over (5. Ball verloren)
// Alle Lichter blinken Sequenz
for (int j = 0; j < 3; j++) {
for (int i = 0; i < 3; i++) digitalWrite(i + 40, LOW); delay(Flash);
for (int i = 0; i < 3; i++) digitalWrite(i + 40, HIGH); delay(Flash);
} for (int i = 0; i < 3; i++) digitalWrite(i + 40, LOW);
for (int j = 0; j < 3; j++) {
for (int i = 0; i < 4; i++) digitalWrite(i + 50, LOW); delay(Flash);
for (int i = 0; i < 4; i++) digitalWrite(i + 50, HIGH); delay(Flash);
} for (int i = 0; i < 4; i++) digitalWrite(i + 50, LOW);
for (int j = 0; j < 3; j++) {
for (int i = 0; i < 8; i++) digitalWrite(i + 32, LOW); delay(Flash);
for (int i = 0; i < 8; i++) digitalWrite(i + 32, HIGH); delay(Flash);
} for (int i = 0; i < 8; i++) digitalWrite(i + 32, LOW);
mySerial.write(12); delay(5);
mySerial.print(Score); mySerial.write(13);
mySerial.print("Game Over!!!");
}
}
}
// LCD Update
if (Score != OldScore) {
mySerial.write(12); delay(5);
mySerial.print(Score); mySerial.write(13);
mySerial.print("Ball = "); mySerial.print(Ball);
OldScore = Score;
}
}
Schaltplan
Siehe Fritzing-Bild im Original: Ein exemplarischer Ausschnitt (ein Target, ein Rollover, ein Pop, Flipper, Shooter, LCD, Kraftsensor). Vollständiger Plan wäre zu unübersichtlich.
Herstellungsprozess
- SMS-gesteuerter Smart AC Power Switch mit Raspberry Pi & Hologram
- Bluetooth-gesteuerter Raspberry Pi Roboter mit Audio-Feedback bauen
- Gesteuerter RGB-Tischlampe – Interaktive, berührungslose Beleuchtung
- Ultraschall-Schwebegerät mit Arduino bauen – Akustische Levitation Schritt für Schritt
- LEDs mit Alexa über Raspberry Pi steuern – Einfache Schritt-für-Schritt-Anleitung
- Altes RC-Auto per Xbox-Controller & Arduino zum Joystick-Fahrzeug umbauen
- Arduino-basierter 6-DoF Roboterarm mit Nunchuk-Steuerung
- Intelligenter kabelloser Lichtschalter-Controller: Arduino-basierter Fernschalter-Manipulator
- Sprachgesteuerter Roboter mit Arduino Nano bauen
- DIY Arduino Smartwatch: Eigene Apple-Watch-Alternative bauen