Wegen des benötigten Einsatzes eines L293D Motor Shields waren nur noch Pins A0-A5 frei.
Da aber der Ultraschallsensor neben 5V und GND 2 Anschlüsse und die LED-Matrix sogar 3 Anschlüsse
benötigt,
war nur noch ein Pin für Buttons frei.
Ursprünglich waren drei Buttons geplant: Spieler gewonnen, Bot gewonnen und unentschieden.
Diese bräuchten aber JEWEILS einen Pin bei INSGESAMT nur einem freien Pin.
Lösung: Ein einziger Button mit sensibler Erkennung und Unterscheidung zwischen
einfachem, zweifachem, dreifachem und langem Klicken für Spieler gewonnen,
Bot gewonnen, unentschieden und zurücksetzen.
Probleme & Lösungen
Im Laufe des Projekts sind wir auf zahlreiche Problematiken und Herausforderungen gestoßen.
Welche diese sind und wie wir sie gelöst haben, haben wir hier notiert:
Für ein besonderes Spielerlebnis waren Reaktionen des Bots in Form von Gesichtern auf einer LED-Matrix
geplant.
Der Spielstand sollte auf einem zusätzlichen LCD-Bildschirm angezeigt werden. Diese hätten zusammen aber
deutlich zu viele Pins
(bei sowieso schon zu wenigen Steckplätzen) belegt.
Lösung: Darstellung von Gesichtern UND Punktestand auf LED-Matrix mithilfe von selbst
angelegten Datenlisten.
Für ein schönes Aussehen, herrausragendes Spielerlebnis und eine geordnete Struktur wollten wir ein
Gehäuse
bauen.
Da der benötigte Durchmesser für eine passende Drehtrommel aber mindestens 32 cm betragen müsste, gab es
ein
Problem:
Die Druckplatten unserer drei eigenen 3D-Drucker sind alle kleiner als 25 cm x 25 cm.
Lösung: Modulare Gestaltung des Gehäuses.
Der neue Motor hat immer problemlos funktioniert. Doch nach dem Einsetzen in die Konstruktion im
Gehäuse, schaffte der Motor es nicht mehr, zu starten,
drehte sich nicht mehr und brummte immer laut.
Lösung: Externe Stromversorgung über zusätzlichen Akkumulator und Stufenweise
Beschleunigung der Hände
mit dynamischer Geschwindigkeits-Funktion.
Beim erstmaligen Einsetzen der Technik in die Gehäuseteile fiel auf, dass der Arduino zu nah unter den
3D-gedruckten Händen sitzt,
sodass sie sich nicht drehen können.
Lösung: Montage einer neuen Arduino-Halterung in großes Loch,
das als Fenster für erleichtertes Arbeiten im zusammengebauten Gehäuse gedacht war.
Als wir die Gehäuseteile das erste Mal zusammensetzten, fiel auf, dass die Teile verbogen waren. Dies
entstand vermutlich durch ein Zusammenspiel
aus Hochgeschwindigkeit beim 3D-Druck und Spannungen des Materials bei noch hoher Temperatur.
Lösung: Erhitzen durch Föhnen, Befestigen in der richtigen Position mittels
Schraubzwingen.
Nachdem die Maschine soweit fertig und die Zusatzartikel (T-Shirts, Flyer, Einkaufswagenchips, ...)
hergestellt waren, starteten wir die Maschine,
um per Video aufzunehmen, wie der HandSpin 360 funktioniert. Doch nach dem Drücken des Buttons startete
der Motor direkt - er wartete nicht auf eine Hand
vor dem Sensor. Nach dem Anschließen des Seriellen Monitors via Laptop wurde klar, dass der
Ultraschallsensor permanent ein Hindernis in ca. 8 cm Entfernung
erkennt, obwohl alles vor ihm frei ist. Unsere Theorie: Der große Resonanzkörper des Gehäuses verstärkt
minimalste Störsignale und versetzt durch die
enge Passgenauigkeit des Sensors im Gehäuse den Sensor in Schwinungen und erzeugt so falsche Werte.
Lösung: Vergrößern der Löcher für mehr Toleranz.
Der Ursprüngliche 28BYJ48 Schrittmotor hatte zu wenig Leistung. Er war zu schwach für die Hände und zu langsam für ein spannendes Spiel. Daher tauschten wir ihn gegen einen 17Hs08-1004S Nema17-Motor aus. Solche Motoren werden auch in der Industrie für zum Beispiel 3D-Drucker verwendet.
Die Erkennung, ob der Taster einfach, zweifach, dreifach oder lang gedrückt wurde, ist essenziell für die Funktion der Maschine. Die Programmierung einer präzisen Erkennung und Unterscheidung zwischen einfachem, doppeltem, dreifachem und langem Klick war nicht einfach und verlangte mehr als drei Stunden Arbeit.
Der komplexe Code-Riese belegt mit 1921 Bytes ganze 93% des dynamischen Speichers, der für
Laufzeitdaten beziehungsweise Variabeln zuständig ist.
Das bedeutet, dass nur noch etwa ein Array wie 'int myArray[60]' oder ein paar kurze Strings möglich
wären.
Da der Code aber alle Funktionen erfüllt, sind die übrigen 7% nicht notwendig.
Wie unter 'Taktik' nachzulesen ist, besitzt der HandSpin 360 ein kluges Taktik-System mit zwei Primär-Taktiken sowie einer Sekundär-Taktik: Die Erkennung eines Verhaltensmusters. Dafür ist jedoch eine dynamische Züge-Liste nötig. Diese zu führen und korrekt auswerten zu lassen, war nicht einfach und hat etwa 4 Stunden gebraucht.
Die Anzeige zweier voneinander unabhängiger Zahlen auf einer 8x8-Matrix ist mit der geplanten
Vorgehensweise von festen Listen für Anzeigedaten nicht möglich.
Lösung: Datenlisten mit einzelnen Ziffern, die als zwei Hälften mit Bit-Shift in eine
Anzeigeliste kombiniert werden.
Nach mehreren Stunden Tests fing die selbst programmierte Klickerkennung des Tasters an, ungültige
Werte auszugeben.
Das Austauschen des Buttons zeigte: Es lag am Button. Der Taster scheint also nach einigen hundert
Klicks seine Funktionsfähigkeit zu verlieren.
Zum Glück hatten wir aber bereits aus früheren Projekten gelernt, dass Redudundanz wichtig ist.
Daher haben wir zwei Ersatzmotoren, eine Ersatz-LED-Matrix, einen Ersatz-Ultraschallsensor und
5 Ersatz-Taster/Buttons sowie zahlreiche Ersatz-Kabel organisiert beziehungsweise besorgt.