Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Manufacturing Technology >> Herstellungsprozess

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)

Deckel (Backglass)

Arduino-Steuerung

Der Mega 2560 übernimmt vier Aufgaben:

  1. Schalter abfragen (Targets, Rollovers, Pop-Bumper, Flipper-Buttons, Ball-Shooter, Verlust-Sensor).
  2. Lampen/LEDs ansteuern.
  3. Scoring & Ball-Zählung verwalten.
  4. 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

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

  1. SMS-gesteuerter Smart AC Power Switch mit Raspberry Pi & Hologram
  2. Bluetooth-gesteuerter Raspberry Pi Roboter mit Audio-Feedback bauen
  3. Gesteuerter RGB-Tischlampe – Interaktive, berührungslose Beleuchtung
  4. Ultraschall-Schwebegerät mit Arduino bauen – Akustische Levitation Schritt für Schritt
  5. LEDs mit Alexa über Raspberry Pi steuern – Einfache Schritt-für-Schritt-Anleitung
  6. Altes RC-Auto per Xbox-Controller & Arduino zum Joystick-Fahrzeug umbauen
  7. Arduino-basierter 6-DoF Roboterarm mit Nunchuk-Steuerung
  8. Intelligenter kabelloser Lichtschalter-Controller: Arduino-basierter Fernschalter-Manipulator
  9. Sprachgesteuerter Roboter mit Arduino Nano bauen
  10. DIY Arduino Smartwatch: Eigene Apple-Watch-Alternative bauen