Einer meiner neusten Ideen war es die general Illumination (GI) eines Pins durch eine RGB-LED-Lichterkette zu ersetzen.
Diese RGB Lichterketten haben typischerweise 50 Stück 7mm LEDs mit integriertem WS2812 Controller und sind für wenig Geld bei Ebay oder beim China-Store Deiner Wahl zu finden.
Die einzelnen LEDs sind über einen 3 Draht Bus verbunden und unten vergossen. Der 3 Draht Bus besteht aus +5V, Masse und Data-In bzw. Out. Die LEDs sind werden einfach aneinander gereiht, wobei immer DataOut der einen LED mit dem DataIn der nächsten verbunden ist.
Von den Abmessungen passen die LEDs mit Gehäuse fast perfekt in der Löcher des Playfields wo bisher die GI-Fassungen angeschraubt oder festgetackert sind.
Bei Lampen die nahe genug beieinander liegen, können die LEDs direkt eingesetzt werden. Lampen, die weiter von einander entfernt sind, brauchen eine „Verlängerung“ des 3 Draht Busses. Hierzu wird die 3 Draht Verbindung aufgetrennt und ein 3 Draht Litzenelement
passender Länge eingesetzt. Dabei muss immer auf die „Richtung“ von DataIn -> DataOut geachtet werden. Was bei der ersten LED als DataOut rauskommt, geht bei der nächsten als DataIn wieder rein.
Von dieser Seite ist der weisse Anschluss DataIn erkennbar am weissen Pfeil. Auf der anderen Seite gehts mit DataOut wieder weiter.
Es empfiehlt sich die LED-Kette in einem Kreis aussen herum anzuordnen beispielsweise beginnend vom linken Slingshot links nach oben, oben herum und dann auf der rechten Seite bis zum rechten Slingshot wieder herunter.
Mit dieser Anordnung sind Farbwechsel, die herumwandern ohne extra Aufwand in der Software zu realisieren. Anmerkung: der aktuelle Software-Stand sieht sowieso noch ein Mapping des Lampen-Index vor, so dass die Anordnung auf dem Playfield völlig unabhängig ist, von den Effekten die man haben möchte. Schlussfolgerung ist also man sollte die Anordnung so wählen, dass es für die Montage unter dem Playfield möglichst problemlos ist, muss dann aber ggf. das Mapping anpassen.
Am besten zeichnet mal einen Plan des Playfields (oder kopiert einen aus dem Manual) und zeichnet durch die nummerierten LEDs ein. (siehe unten)
Für die Stromversorgung empfehle ich ein separates 5V Netzteil mit 4-6A wie es sie für wenig Geld im Handel gibt. Am günstigsten sind Steckernetzteile mit 4A z.B. von Pollin, die bereits für weniger als 10 € zu haben sind. Angeschlossen werden diese Steckernetzteile über einen Mehrfachstecker, der zusammen mit dem Flipper eingeschaltet wird, oder – wenn man es professioneller mag – über eine zusätzliche Netzkupplung oder Netzstecker, der zusammen mit dem Hauptschalter des Flipper ein- und ausgeschaltet wird. Ausserdem haben diese Netzteil auch gleich den richtigen Anschluss für den Arduino.
Eine ersten Eindruck wie die LEDs wirken, sieht man in dem Video.
Hier wird aber zunächst mal nur eine sich wiederholende „Lightshow“ abgespult, die nicht in irgendeiner Form mit dem Spielgeschehen zu tun hat. Hierzu muss zusätzlicher „Input“ vom Pin geholt und die Software entsprechend angepasst werden.
Anschlüsse der Switch-Matrix
Switch Schematics for Data East
Wie man sieht arbeitet der Column Driver with +5V als inactive Potential durch den Pullup von 1K an +5V. Bei Aktivierung der Spalte schaltet der Spalten-Transistor nach Masse durch (active low pulse).
Angesteuert wird der Spalten-Transistor durch den 6821 PIA und den LS244 Treiber.
Ist ein Schalter aktiviert (geschlossen), dann kommt für diesen Schalter der LOW-Impuls auf der entsprechenden Row bei Switch Return wieder an, werden von den 4011er verstärkt, invertiert und über den B-Port des 6821 wieder gelesen.
Timing
Der LOW-Impuls vom Column Strobe ist knapp ms lang dann kommen ca 6ms Pause und dann wiederholt sich das ganze.
Hier ein paar Aufnahmen mit dem Logikanalyser:
Ch1: Column2 Strobe, Ch2: Row1 Return, Ch3: Row2 Return
Ch1: Col1 Strobe, Ch2: Col2 Strobe, Ch3: Col3 Strobe
Die Switch-Matrix wird also mit einer Frequenz von 135Hz abgefragt.
Um das nun mit dem Arduino sauber mit zu bekommen, brauchen wir einen Interrupt, der mit dem ersten Col-Strobe getriggert und damit syncronisiert wird.
Nummern der Switches
Das Testprogramm zählt Spalten ab 0 daher sind die Indices im Programm immer eins weniger.
Auf Grund der Verkabelung sind die Rows ebenfalls vertauscht: (Notation ColRow Manual → ColRow Arduino) am Beispiel von Col2
Name |
ColRow |
ColRow |
Name |
ColRow |
ColRow |
LauchTrigger |
21 |
11 |
Trough#3 |
25 |
15 |
Outhole |
22 |
13 |
ShooterLane |
26 |
12 |
Trough#1 |
23 |
10 |
Left Flipper |
27 |
14 |
Trough#2 |
24 |
17 |
Right Flipper |
28 |
16 |
Ansteuerung des Arduino
Basierend auf dem Timing von oben wurde folgendes Testprogramm entworfen: der Col-Strobe1 triggert den Interrupt 0 auf Pin2, dann wird ein Timer gestartet, der genau die gleiche Frequenz hat wir der Abfrage Takt der Col-Strobes. Bei jedem Timer-Interrupt wird dann das Row-Register PORTA beim Mega gelesen und in eine byte Matrix geschrieben.
Jetzt kann man einfache SwitchHandler auf einen bestimmten Schalter registrieren und daraus Aktionen ableiten. z.B. die Bälle in der Ball Truhe zählen → 3 Bälle länger als 5 Sekunden → Game over / Attract Mode, kein Ball drin → Multiball-Spiel.
Plan der GI-Lampen
Beim Erstellen des Programms muß man natürlich wissen, welche Lampe wo ist. Dafür hab ich ein kleines Testprogramm geschrieben welches die Lampen einzeln auf Tastendruck einschaltet und die Position auf der seriellen Schnittstelle ausgibt. Damit lässt sich folgender Plan erstellen:
Firmware
Die Software für den Controller findet sich auf Github. Der Aufbau der Software sieht ungefähr so aus:
Verwendete Libraries
Zum Ansteuern der LEDs wird FastLED genutzt, eingebettet in die Klasse LEDDriver. Diese Klasse beherbergt die LED Kette und steuert die Farben mit Hilfe von Effekten.
Klassen
Ein Effekt (Klasse) kennt eine Liste von LED Nummern (oder Indices) für die der Effekt gilt, hat eine Prio und einen Callback „updateLEDs()“ der die Farben der LEDs setzt. Hintergrund-Effekte haben die Prio 0, Effekte mit grösserer Prio übersteuern die mit kleineren Prio. Dies kann man nutzen, um bestimmte LEDs aufblitzen zu lassen.
Effekte werde beim LEDDriver registiert, damit der Driver die Callbacks auch aufrufen kann.
Zentrales Element der Steuerung ist der SwitchScanner. Diese Klasse kennt ständig den Zustand alle Switches mit und kann SwitchActions aufrufen. Eine SwitchAction registiert sich beim SwitchScanner unter Angabe des Switches bei dem Action „gezündet“ werden soll. Ausserdem kann man wählen, ob man regelmässig gerufen werden will oder nur wenn der Switch sich ändert.
Mit dem regelmässigen Rufen überwacht man den Ball-Speicher und weiss dann immer, wieviele Bälle im Speicher liegen.
Abhängig davon werden drei Hintergrund-Effekte aktiviert oder deaktiviert: Attract, NormalPlay und MultiBallPlay. Alle drei Effekte blenden unterschiedliche Paleletten hin und her. Attrach ziemlich bunt mit einer Mischung von Paletten, NormalPlay nur in Rot und Blau und MultiBall blinkt in Weiss.
Daneben sind noch weitere Effekte mit Prio 1 integriert: Flash, ein Effekt der ein bestimmte Farbe für die definierten LEDs für ein bestimmte Zeit übersteuert. Damit leuchten jedes Mal wenn der Ball an die Slings geht die passenden LEDs auf.
Von diesen Effekten lassen sich sehr einfach auch noch andere Sachen realisieren.
Und so sieht’s dann aus …
Video Qualität ist noch suboptimal.
Controller einbauen
Die hier vorgeschlagene Lösung kommt völlig ohne zusätzliche Beschaltung allein mit einem Arduino Mega aus, d.h. es ist nur die Arduino in eine Gehäuse zu bauen.
Hierzu verwendet man z.B. ein einfaches ABS Gehäuse und setzt den Arduino auf Platinen-Abstandshalter auf die Grundplatte.
Für die Anschlüsse werden in den weichen Kunststoff ohne viel Mühe die passenden Ausschnitte geschnitten. Power-Anschluss und USB Stecker auf der einen Seite und einen Platinen Stecker für ein Flachbandkabel auf der anderen Seite. Der Platinen-Stecker wird in den Ausschnitt im Gehäuse einfach eingeklebt.
Anschliessend wird der Stecker nach innen verkabelt, um die Verbindung zum Arduino herzustellen. Für die Anschlüsse zur DataEast-CPU wird ein Adapter-Kabel benötigt, um die Signale für Column-Strobe und Row-Return abzugreifen. Ausserdem sind die Signale zum Ansteuern der RGB-LEDs nach aussen geführt.
Das letzte Bild zeigt das bereits komplett verbundene Innere. Dort sind alle Verbindungen des Platinen-Steckers mit dem Arduino verbunden.
Einbau
Die folgenden Bilder zeigen, wie der Anschluss in der Backbox erfolgt. Das Adapterkabel wird einfach per Zwischenstecker an CN10 bzw. CN8 angeschlossen, um so alle Signale für die Switch-Matrix abzugreifen. Zusätzlich wird noch ein Masse-Anschluss gebraucht.
Die Stromversorgung mit einem getrennten 5V – 4A Netzteil und die Zuleitung der RGB LEDs vom Playfield kommen von unten aus dem Cabinet und werden einfach eingesteckt.
Material-Liste
- Arduino-Mega: 18,00€
- Gehäuse von Pollin: 2,30€
- Netzteil von Pollin: 7,95€
- Anschluss fürs Netzteil im Cabinet: „geschlachtete“ Euroverlängerung 2,00€
- RGB-LED String z.B. bei Ebay. ca 20,00€
- Kleinteile: Stecker, Kabel, Stiftleisten ca. 8€
Für ca. 60€ Material-Kosten ist der Umbau also zu haben. Was man wie immer nicht einrechnen darf, ist der Zeitaufwand 🙂
Was ist noch zu tun …
Die Software wird noch etwas optimiert oder ausgebaut:
- Konfiguration per Flipper-Buttons für verschiedene „Light-Modes“
Und wer Lust hat, kann das ja nach bauen. Bei der Software Anpassung auf ein anderes Flippermodell bin ich gerne behilflich.
Ein weiteres Video hier:
Bitte beachten
Bei den Arbeiten an Flippern ist Vorsicht angebracht, bitte bei Arbeiten an den Geräten immer vorher den Stecker ziehen. Unterm Playfield gibt’s im eingeschalteten Zustand hohe Spannungen und ganz schnell hat man einen Kurzschluss fabriziert.
Im Zusammenhang mit dem Arduino muss man beachten, dass die Stromversorgung des Arduinos / der LED-Strips immer eingeschaltet sein muss, bevor man die USB Port zum Programmieren verbindet. Ansonsten ziehen die LED viel Strom über den USB Port und es kann irgendwas kaputt gehen, im schlimmsten Fall womöglich der USB Port des Computers. Alternativ kann man natürlich auf die LEDs zum Programmieren abtrennen.
Referenzen
- Flippermarkt-Thread
- Pinside-Thread
- Aus dem Pinside Thread speziell dieses Dokument
Damit du den Arduino oder den USB Host nicht mit dem LED Strom grillst solltest du die Spanungsversorgungen trennen. Weitere Fallstricke mit Arduinos sind hier beschrieben: http://www.ruggedcircuits.com/10-ways-to-destroy-an-arduino/
Thomas
Hi Thomas,
gut dass Du es erwähnst. Natürlich ist die LED Spannungsversorgung nicht einfach vom 5V Ausgang des Arduino abgezweigt. Die GI-RGB LEDs ziehen unter Vollast knapp 2A, damit wäre der Spannungsregler des Arduino schon geschrottet.
Was ich immer mache, ist den Arduino direkt über die 5V Buchse mit einem 5V Netzteil zu versorgen. Das ist zwar auch von manchen Quellen kontrovers diskutiert und es wird empfohlen es doch über den USB Eingang zu machen. Aber letztendlich habe ich damit noch nie Probleme gehabt. Die simple Methode ist also beim Anschluss eines Netzteils mit 5,5/2,1 Stecker den Spannungsregler des Arduino kurz zu schliessen und die +5V vom Stecker direkt mit der +5V Buchse zu verbinden.
Wem der Strom über die Leiterbahnen selbst dann noch zu gross ist, der kann auch eine Litze direkt am Stecker der Arduino-Platine vorsehen.
Gruß Steve