Calliope mini - Spaß durch Programmieren

Entwicklungsumgebungen

Pong

Ziel: Das bekannte Computerspiel Pong wird auf einem 8x16-Display gespielt. Die beiden Schläger werden über Funk von zwei Drehreglern gesteuert.
Ziel: Auf einem 8x16-Neopixel-Display bewegt sich ein leuchtender Punkt schräg über das Feld und wird an den Rändern reflektiert. Damit bewegt sich der Punkt unendlich lange über das Feld. Nach dem Start bewegt er sich noch langsam und wird dann immer schneller.

Hardware

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.

Calliope mini-LED-Modul

Der Punkt fällt nach unten

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.

fallender Punkt

Der Punkt wandert hoch und runter

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.

fallender Punkt

Unendliche Reflexion

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.

fallender Punkt

Er wird schneller

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.

fallender Punkt

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.

fallender Punkt

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.

fallender Punkt

Im Video sieht man den fertigen Programmteil. Der Punkt wandert mit der größten Geschwindigkeit.

Ziel: An den beiden Rändern befinden sich Schläger, die aus jeweils drei leuchtenden Punkten bestehen. Die Schläger lassen sich über zwei weitere Calliope mini jeweils per Drehreglern steuern.

Richtung des Drehreglers übertragen

Die Hardware

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.

Drehregler

Der Sender

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.

Drehregler

Der Empfänger

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.

Drehregler

Schläger bewegen

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.

Drehregler

Grenzen setzen

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.

Drehregler

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!

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.

Drehregler

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".

Drehregler

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.

treffer_test

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.

zurück