HandSpin 360

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:

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.

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.