Basketball Arcade mit ESP32

Auf Kleinanzeigen Portalen werden allerlei Dinge angeboten, so auch dieser Basketball Automat. Beim Test vor Ort war noch die Diagnose: funktioniert nicht. Vermutlich waren nur zwei, drei Kabel nicht angeschlossen, denn an sich sollte es laufen. Zusätzliche Schwierigkeit: US-Fabrikat mit 110V.

Einige Schlösser waren schon aufgebohrt, die Schrift halb abgeblättert, das Metall, vorher rot lackiert, orange übergestrichen. Schrauben (zöllig versteht sich) fehlten vielerorts.

Einmal richtig verkabelt blinkte jedoch das Display auf, die Lautsprecher ertönten und irgendwas ruckelte. Also kein direktes Geldgrab, der Automat könnte laufen. Die Handbücher von 1994 sind angenehm ausführlich, zeigen den Verkabelungsplan, darin leider nicht überall welche Signale anliegen, sodass eine Wartung ebenso leicht fallen sollte, wie die initiale Inbetriebnahme.

Das Backboard, welches den Korb hält und hin und her fährt hat noch eine zusätzliche Funktion: an der Rückseite sind Gummifüße, die in der hintersten Position gegen ein gefedertes Gestänge drücken, welches wiederum eine beweglich gelagerte Bodenplatte auf dem Feld hochdrückt. Diese verhindert bei beendetem Spiel die Rückgabe der Bälle, damit nicht ohne zu Bezahlen weiter gespielt werden kann. Bestimmt hätte auch ein nahegelegener Spielplatz Basketballkörbe, die kostenlos nutzbar wären, aber das wäre ja nicht der gleiche Ansporn.

Die Taster und das Brett mit der abpellenden Schrift wurden ersetzt, am Ende sind vier unterschiedliche Modi zu viel für das Vorhaben, sodass zwei Taster reichen mussten. Das Gitter hätte eigentlich mit 1/4″ UNC Schrauben befestigt werden sollen. Die Reservierung jener Schrauben im nahegelegenen Baumarkt wurde jedoch storniert (Bestand 1, wahrscheinlich eher mal wieder 0). Also kurzerhand an den nicht tragenden Elementen auf M6 geschnitten und wo nötig mit metrischen Gewindenieten ersetzt. An sich wäre der Automat soweit einsatzbereit. Abgesehen von den farblichen Anpassungen und die Grundreinigung, weil die Rückseite gefühlt direkt hinter der Fritteuse stand und sich dort ein Fett-Staub-Film über die 25 Jahre gebildet hat. Eine Schmierung hatten die Führungen und Gewindestange jedoch mal wieder nötig.

Einziger größerer Kritikpunkt: der damalige US-Distributor hat seine Telefonnummer mit in die Anzeige einprogrammiert. Einerseits wird dieser nach der ganzen Zeit eventuell gar nicht mehr existieren, anderseits bringt es in Deutschland keinem etwas und führt am Aufstellungsort auch eher zu Verwirrung.

Das Display bietet 120x17px Platz, was genau angezeigt wird, ist auf einem EPROM gespeichert. Falls es klappen sollte, den Speicher sinnvoll zu dekodieren, habe ich schon einmal EEPROMs bestellt, um neue Nachrichten auszuprobieren. Mittels ein paar Zeilen Python kurzerhand ein Programm geschrieben, welches die Binärdaten eventuell in Grafiken/Sprites umwandelt. Gefunden wurde je ein kleines und ein großes Alphabet, bezogen auf die Schriftgröße, ebenso ein paar Bilder des Basketballs, welcher sich zwischen auf dem monochromen Display dreht.

NM27C256 EPROM mit den Displaydaten

Wie die Buchstaben und Zahlen jedoch zusammengesetzt werden, dafür hätte man den kryptischen restlichen Teil des EPROMs sinnvoll dekodieren müssen. Den Aufwand war es mir dann doch nicht wert. Aber da die Schaltung recht trivial ist und auch ein Schaltplan mitgeliefert war, konnte ich dort noch nicht aufgeben.

Grundsätzlich hätte es wohl gereicht den Korb in einer Position zu belassen und einfach nur die zwei Lichtschranken am Korb auszulesen, Punkte hochzählen und nach 60 Sekunden Stopp einzublenden. Für die Ansteuerung des Motors sind neben 12V und Masse nur vier weitere Leitungen verzeichnet, so komplex kann das also nicht sein.

Busanalyse am Motor-Stecker mit dem Logic Analyzers des Oszilloskops

Also kurzerhand das Oszilloskop eingepackt, für das ich irgendwann einmal glücklicherweise die überteuerte Schutzabdeckung für Transportzwecke gekauft hatte. Eine Leitung war dabei immer aktiv, während das Backboard sich bewegte, folglich wohl das Aktivierungssignal für den Motor. Ein anderes war nur richtungsgebunden an, also vermutlich die Steuerung, ob das Bord nach hinten oder vorne fahren soll. An der Motorkupplung hinten sind abwechselnd helle und dunkle Streifen, welche mit einem Reflexionssensor als Encoder genutzt werden. Auch dieses Signal wurde an das Mainboard durchgereicht. Das schnell wechselnde Signal konnte recht eindeutig dem Encoder zugewiesen werden. Wie viele Schritte es im Mittel sind, die die Reflexlichtschranke bei einer vollständigen Bewegung nach vorne oder hinten macht, lässt sich dank der Zählfunktion einfach direkt im Oszilloskop ablesen. Im regulären Betrieb konnte ich auf dem Oszilloskop auch das vierte und letzte Signal, die Endstopps sehen, im manuellen Betrieb bereiteten mir die Taster jedoch Kopfzerbrechen.

Motor Signal (ein zusätzlicher Puls ist sichtbar, wenn das Backboard zu weit nach hinten fährt und dann wieder etwas abgerückt werden muss, damit die Bälle freigegeben bleiben), Richtung, Endstopp und Encoderausgang.

Die Technik für die Endstopps ist jedoch so trivial, wie auch gleichzeitig gut. Das Motorboard gibt je nach Verfahrrichtung nur den Schaltzustand des korrespondierenden Endstopps aus. Bedeutet wenn das Board nach vorne fährt, wird auch nur das Signal vom vorderen Taster auf den Bus gelegt. Somit ist das Signal immer eindeutig: wenn das Board nach hinten anfährt und noch am ersten Endstopp steht, wird dennoch „aus“ signalisiert und erst bei Betätigung des hinteren Tasters wieder „an“.

Die Lichtschranken für den Korb sind auf den vorderen Teil des Rings gerichtet, an dem wiederum ein kleiner reflektierender Streifen klebt. Eine Lichtschranke oben, eine unten, sodass man mit einer Statemachine herausfinden kann, ob der Ball gerade durchfällt oder irgendetwas die Optik stört:

  • Beide Lichtschranken sind offen: kein Ball, Status = 0
  • Nur obere Lichtschranke unterbrochen und Status ist 0 (oder 2): Ball am Ring, Status = 1
  • Beide Lichtschranken unterbrochen und Status ist 1 (oder 3): Ball im Ring, Status = 2
  • Nur noch untere Lichtschranke unterbrochen und Status ist 2: Ball fällt durch, Status = 3
  • Wieder beide Lichtschranken freigegeben und Status = 3: Ball ist durch, Punkte vergeben und Status = 0 (s.o.)

Die Statemachine funktioniert vorwärts und bedingt rückwärts, falls der Ball zurückprallt. Alle undefinierten Übergänge führen zu einem Status = 0.

Das Motorboard anzusprechen war auch nicht die Problematik, sofern man die Optokoppler richtigherum anschließt (Endstopp auf positiver Seite/Anode, Encoder hingegen auf negativer/Kathode). Aber eigentliches Ziel war es ja eigentlich, das Display zu ersetzen.

Durch meine Erfahrungen aus den Videowand-Projekten und Spielereien mit Arduino und ESP lag es nahe, LED Matrizen zu nutzen. Das alte Display weist eine Breite von 70cm und eine Höhe von 11,5cm auf. Das bisherige Plexiglas soll grundsätzlich mit dem Display weichen, sodass die alten Maße aber nicht die Eckpunkte darstellen müssen. Knapp unter der Breite des Automaten sind entweder 4 P3 Panels oder 3 P4 Panels einsetzbar, jeweils als 64×32 Matrix resultierend in einer Breite von 76,8cm. Der Automat selbst ist an der Stelle 84cm breit, der Kasten, in dem bisher das Display haust jedoch nur 74cm. Die Matrizen werden daher in eine etwas dickere Holzplatte eingesetzt, in die zuvor der passende Ausschnitt mit der Stichsäge geschnitten wurde. Rückseitig mit gelasertem MDF (Löcher für die M3 Schrauben an den Matrizen) am Holz selbst festgeschraubt und davor gesetzt.

Da die Zuleitung zum Display durch den halben Rahmen läuft und gut 2 Meter überbrücken muss, ist es vorteilhaft, die vergleichsweise schwachen Signale des ESP32 mit 3.3V Pegel auf die eigentlich geforderten 5V zu bringen. Durch die Videowand hatte ich mal einen Schwung 74HC245 besorgt, die sich ideal für diesen Zweck eignen. Zur Sicherheit habe ich alle Signale einmal durch die Buffer geschickt.

Die bisherige Stromversorgung lief mit 110V und dann auf 12V/5V/-5V. Die -5V wurden nur für das Soundmodul benötigt, da das noch durch einen DFplayer ersetzt wird, ist das Potential nicht notwendig. Der verwendete Stecker findet in meinen Bauteilen kein Gegenstück, für ein anderes Projekt lagern hier hingegen die Verbinder für ATX Netzteile, von denen man irgendwo immer eins auftreiben kann. Über den ESP lässt sich dieses sogar aus-/anschalten, während der ESP selbst über die Standby-Leitung versorgt werden kann.

Zunächst auf einer Lochrasterplatine aufgebaut und mit verdrehtem/gespiegeltem ATX Verbinder – wenn man auf die Belegung des Steckers und nicht der Buchse achtet…

Die Software bindet sich per MQTT mit in Home Assistant ein, sodass man eine grobe Übersicht über die Prozesse bekommt und auch manuell eingreifen kann (Motorsteuerung, ATX an/aus). Damit realisiert werden auch Push-Benachrichtigungen bei neuen Highscores versandt. Ebenso ist OTA aktiviert, sodass ein Update ohne USB-Kabel erfolgen kann.

Die Lochrasterplatine hatte jedoch noch nicht den DFPlayer an Board, damit auch nicht die Funktion, MP3s abzuspielen. Theoretisch hätte man den ESP selbst dafür nehmen können, aber die Prozessorzeit reserviere ich dann doch lieber für das Display. Für die Installation beim Kunden ist es – auch wenn das alles in dem Kasten verschwindet – hübscher und zuverlässiger, eine vernünftige Platine zu haben.

Die Platine hatte dank Würth Elektronik Mustern dann auch die richtigen Stiftleisten für die nun auch einrastenden Stecker (WR-WTB 2.54). Da die LEDs in den Tastern noch leuchten sollten, reichten die Pins nicht mehr und ein MCP23017 musste als Erweiterung her. Im rechten Teil sieht man noch die alte Sound-Platine mit EPROMs.

Die Display-Ansteuerung ist mit ESP32-HUB75-MatrixPanel-DMA realisiert. Anstatt den doppelten Buffer zu nutzen habe ich mich entschieden, wo notwendig es auf eine partielle Aktualisierung zu reduzieren. Damit der Watchdog des ESP nicht den Prozessor zwischendurch zurücksetzt, sind keine delay() verwendet, stattdessen werden in Frames eingeteilte Sequenzen mit millis() getimed abgespielt. Da die Motorsteuerung mit der neuen Platine auf den Portexpander ausgelagert wurde, musste ich allerdings doch wieder eine Lektion (erneut) lernen. I2C Kommandos und besonders Software-Serial (für die MP3s) im Interrupt (Endstopps, Encoder, Korb-Lichtschranken) sind nicht die beste Idee und führen schnell zum Absturz.

Ansonsten ist das Programm vergleichsweise einfach:

So lange noch kein Taster gedrückt wurde, spielen diverse Banner durch – bestehend aus dem animierten Kundenlogo, einer kurzen Anleitung und der Highscore. Zur Auswahl stehen ein roter Taster, der die Continuous-Funktion des Originals repliziert, und ein blauer Taster für die Regular-Funktion.

Zunächst wird das Backboard etwas nach vorne gefahren, um die Bälle freizugeben, und angezeigt welches Team beginnt (gegeneinander in je einem Spiel nacheinander). Während des Countdowns fährt das Backboard nach ganz vorne, in diesem Bereich zählen die Körbe zwei Punkte. Nach Anpfiff werden auch die Lichtschranken scharf geschaltet, wer also schon vorher zu Werfen beginnt und zum Start direkt einen Korb wirft ist hier im Vorteil.

Für die einfache Version fährt der Korb nach 30 Sekunden nach hinten, aber nur so weit, dass die Ballausgabe nicht wieder gesperrt wird. Im hinteren Drittel sind Körbe drei Punkte wert, was auch durch eine separate Anzeige neben dem Korb signalisiert wird. Im Continuous-Modus fährt das Backboard hingegen ständig nach hinten und wieder nach vorne und erschwert somit das Treffen. Darüber hinaus bietet das Original noch die Modi Random und Pushback. Ersterer fährt in regelmäßigen Zeitabständen an unterschiedliche Positionen, während Pushback bei jedem Treffer die Position nach hinten (bzw. ganz hinten angekommen auch wieder nach vorne) verändert. Aufgrund der nur noch zwei vorhandenen Taster stehen diese aber nicht zur Verfügung.

Nach Ablauf von 60 Sekunden fährt das Backboard wieder nach ganz hinten und das andere Team ist dran. Das ganze Prozedere läuft also ein weiteres Mal ab, nur dass nun die Punkte auf der anderen Displayseite hochzählen (sofern getroffen wird). Sind beide Teams durch, wird angezeigt, wer gewonnen hat.

Da ich neben den Rätseln für die Escaperäume vor Ort auch diverse Quiz-Spiele mit in die Hausauomatisierung Home-Assistant eingebunden habe, durfte der Automat natürlich nicht fehlen. So werden diverse Daten live übertragen, wie Position, Punkte der Teams und die Highscore. Auch die Steuerung des Motors und ATX-Netzteils ist möglich. Zudem auch eine Reset-Funktion, die die Teams auffordert den Raum zu wechseln, da der Basketballautomat nur eines von 15 Minispielen ist.

Statt der Leuchtstoffröhre wurde in das Backboard ein 12V LED Streifen geklebt. Das Licht speist sich aus dem ATX Netzteil und kann entsprechend mit vom ESP ausgeschaltet werden. Der Metallrahmen bietet genügend passive Kühlung und die durchleuchteten Gitter geben beim Bewegen des Backboards einen netten Effekt an den Wänden.

Wer also den Automaten mal ausprobieren möchte, kann sich das ganze bei Schlag dein Team angucken.

*Info: In diesem Beitrag verweisen orangefarbende Links auf Affiliates.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

I accept that my given data and my IP address is sent to a server in the USA only for the purpose of spam prevention through the Akismet program.More information on Akismet and GDPR.

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.