Es werden zwei 8x8 LED-Module WS2812 hintereinandergeschaltet. Der Eingang des oberen Moduls wird mit dem Pin P0 am Calliope mini verbunden. Die Stromversorgung erfolt über den + und den - Pin am Calliope mini.
Prinzip: Alle 500 ms wird eine Funktion aufgerufen, die die LED an der bisherigen Position ausschaltet und die LED an einer neu berechneten Position wieder einschaltet. Damit erscheint es so, als ob der Punkt wandert.
Die Position des leuchtenden Punktes wird über sein x- und y-Koordinate bestimmt. Da die 128 LEDs von oben links nach unten
rechts durchnummeriert sind, wird aus den beiden Koordinaten die Position berechnet.
Der y-Wert ist die Zeilennummer. Da in einer Zeile 8 LED sind, wird er mit 8 multipliziert und dann der x-Wert addiert.
Für das einfache Herunterfallen muss bei jedem Schritt der y-Wert um 1 erhöt werden. Das ist noch nicht beeindruckend, lässt sich aber sehr leicht ausbauen.
Prinzip: Es wird eine Variable dy verwendet, die die Werte 1 und -1 haben kann.
Die Variable dy wird beim Start auf 1 gesetzt. In dem Programmteil, der für den Schritt verantwortlich ist, wird sie dann auf -1 gesetzt, wenn y den Wert 15 erreicht hat, der Punkt also unten ist. Am oberen Rand wird sie dann wieder auf 1 gesetzt.
Für den x-Wert verfährt man genau so. Es wird eine Variable dx erzeugt, die zu Beginn 1 ist. Im Schritt-Teil wird x um dx geändert. Wenn der Punkt den rechten oder den linken Rand erreicht hat, wird dx von 1 in -1 oder von -1 in 1 geändert.
Bisher erfolgt ein Weiterrücken des leuchtenden Punktes in dem Programmteil, der alle 500 ms aufgerufen wird. Leider lässt sich nach dem Start des Programmes diese Zeit nicht mehr verändern. Schade, denn dann wäre es ganz einfach. So ist es nur einfach.
Prinzip: Die Zeit zwischen dem Weiterrücken des Punktes muss immer dann etwas verkleinert werden, wenn der Punkt den rechten oder linken Rand erreicht. Das ist immer dann der Fall, wenn der y-Wert 0 oder 15 ist.
Als erstes muss der gesamte Programmteil, der bisher aller 500 ms aufgerufen wurde, in eine Funktion gesteckt werden. Die Funktion heißt schritt.
Die Funktion schritt wird aus der Dauerschleife heraus aufgerufen. Dazu werden zwei neue Variablen erzeugt: zeit und wartezeit. Die Variable zeit enthält die aktuelle Laufzeit des Programms plus die Wartezeit, die zu Beginn z.B. 500 beträgt (500 ms). Ist die Laufzeit bei der wenn-Entscheidung dann größer als der Wert in der Variablen zeit, ist die Wartezeit abgelaufen und die Variable zeit wird auf die aktuelle Zeit plus die Wartezeit erhöht.
In der Funktion schritt wird bei jedem Erreichen eines Randes die Variable wartezeit um z.b. 20 erniedrigt. Damit wird in der Dauerschleife die Funktion schritt nach einem kürzeren Zeitraum aufgerufen und der Punkt fliegt schneller.
Im Video sieht man den fertigen Programmteil. Der Punkt wandert mit der größten Geschwindigkeit.
Zur Steuerung der Schläger werden zwei Calliope mini verwendet, die die Steurimpulse jedes Drehreglers per Funk an den Calliope mini übertragen, des den Punkt auf der LED-MAtrix steuert.
Der Anschluss und die Programmierung des Drehreglers ist in einer anderen Übung beschrieben.
Das Programm zum Senden ist sehr einfach gehalten. Bei jedem Drehen des Schalters werden zwei Informationen gesendet: Die Seite, auf der der Schläger bewegt werden soll (rechts oder links) und mit 0 oder 1 die Richtung.
Später kommt noch ein Empfangsteil dazu, um die Punkte anzuzeigen.
Zum Testen der Übertragung erhält der Empfänger-Calliope mini einen kleinen Programmteil, der zusätzlich zum Bewegen des Punktes mit der RBG-LED anzeigt, wie der Drehregler gerade gedreht wurde.
War der Test erfolgreich, kann der Schläger programmiert werden. Dazu wird eine neue Funktion schlaeger_setzen geschrieben, die sich nach jeden Empfang einer Nachricht von den Drehreglern um die Darstellung der beiden Schläger kümmert. Zuerst steuert sie nur für die rechte Seite einen Punkt.
Damit der Schläger genau auf der rechten LED-Leiste bleibt, muss der Wert der Variablen schlaeger_rechts in den Grenzen von 0 bis 7 gehalten werden. Ansonsten würde er verschwinden oder in die nächste Spalte rutschen.
Die Programmerweiterung für den linken Schläger dürfte jetzt kein Problem sein. Das Video zeigt die Ansteuerung der beiden Schläger über die Drehregler.
Treffer auf rechter Seite bedeutet, dass der Ball (Punkt) in der letzten rechten Spalte auf der gleichen Höhe wie der Schläger ist. Dann wurde der Schläger getroffen und der Ball kann zurückfliegen.
Wenn der Ball vom Schläger getroffen wurde, geht das Spiel weiter, ist also aktiv. Falls der Schläger den Ball nicht trifft, wird das Spiel an dieser Stelle abgebrochen, ist also nicht mehr aktiv.
Diese beiden Zustände werden in einer Variablen abgelegt, die aktiv genannt wird. Sie kann nur zwei verschiedene Zustände speichern: wahr oder falsch.Der Informatiker sagt, sie ist vom Typ Boolean.
In der dauerhaft-Schleife wird die Funktion schritt nur noch dann aufgerufen, wenn die Variable aktiv den Wert wahr enthält.
In der Funktion schritt wird die Funktion treffer_test aufgerufen. Damit die Funktion weiß, auf welcher Seite sie testen soll, übergibt man der Funktion als Parameter die Seite in der Form "rechts" oder "links".
Die Funktion überprüft für die rechte Seite, ob der x-Wert des Balls mit dem x-Wert des Schlägern übereinstimmen. Ist das der Fall, wird eine Funktion blitz aufgerufen, die den Punkt des Schlägers kurz aufleuchten lässt.
Stimmen die beiden Werte nicht überein, wird zuerst die Variable aktiv auf falsch gesetzt und wieder die Funktion blitz aufgerufen. Sie lässt den Schläger in Rot aufleuchten.
Wenn das Spiel bis hier hin funktioniert, kann man es optimieren. Noch läuft nicht alles schön glatt (die Schläger werden z.B. nicht durchweg angezeigt...).Bei Spiel im Video wurden schon Verbesserungen eingebaut.