a) Jana und Jonas haben jeweils LEDs an den Arduino angeschlossen und steuern diese mit den unten abgebildeten Programmen. Vergleiche die beiden Programme im Hinblick auf ihre Wirkung und die Art der Programmierung. Welches gefällt dir besser?
b) Zusatzüberlegung: Wie viel muss man ändern, wenn man die Leuchtdauer ändern will?
Eine Variable kann man sich als Koffer vorstellen, der einen Namen bekommt und in dem man einen festgelegten Datentyp speichert. Jedes Mal, wenn der Name des Koffers aufgerufen wird, wird der abgespeicherte Wert hervorgeholt und an die Stelle des Namens gesetzt. Intern wird der Variablenname als Verweis auf einen bestimmten Speicherplatz genutzt, in dem der Wert der Variable abgelegt ist.
Für den Namen hat sich der lowerCamelCase etabliert: Der erste Buchstabe ist klein; wenn weitere Wörter folgen, fangen diese mit einem großen Buchstaben an. Leerzeichen sind nicht erlaubt.
Viele Dinge werden interessanter, wenn sie sich nicht immer auf die genau gleiche Art wiederholen. Für diese Fälle kann man im Programm den blauen Block für Zufallszahlen verwenden (Expertenblöcke aktivieren!), der jedes Mal eine neue Zufallszahl erzeugt, wenn er aufgerufen wird.
Ein einfaches Beispiel ist die “Bombe”, die man bei dem Spiel “Tick Tack Bumm” startet und die man so lange herum geben muss, bis sie explodiert. Dabei ist die Dauer des Tickens ein zufälliger Wert zwischen ca. 5s und 20s.
Baue und programmiere eine “Bombe”, die für eine zufällige Dauer zwischen 5s und 20s tickt und dann explodiert. Die Bombe wird über einen Taster aktiviert.
Zusatz: Welchen Unterschied macht es, wenn man die ausgewürfelte Zufallszahl in einer Variable speichert?
Übertrage das unten abgebildete Programm auf den Arduino und betrachte die so erzeugten Zufallszahlen. Drücke dann auf den Reset-Taster am Arduino und betrachte die nun erzeugten Zufallszahlen. Wiederhole den Vorgang einige Male und beschreibe Auffälligkeiten.
Baue und programmiere einen Reaktionszeitmesser.
Der Reaktionszeitmesser soll zunächst warten, bis ein Taster gedrückt wurde, der besagt, dass es losgehen kann. Dann wird eine LED angeschaltet (Vorwiderstand!) und nach einer zufälligen Zeit wieder ausgeschaltet. Nun beginnt die Zeitmessung. Die Stoppuhr läuft solange, bis der Taster gedrückt wurde. Die gemessene Zeit wird dann über den seriellen Monitor ausgegeben und es wird erneut gewartet, bis der Anwender bestätigt, dass es losgehen kann.
Miss mindestens zehn Mal deine Reaktionszeit und bestimme den Mittelwert. Bist du besser als dein Partner?
Idee: Frick, Fritsch und Trick (2015): Einführung in Mikrocontroller - Der Arduino als Steuerzentrale, Bad Saulgau
In vielen Fällen geht es bei Schleifen nicht um eine genau oder zufällig bestimmte Anzahl von Wiederholungen, sondern darum, einen Vorgang zu wiederholen, bis eine Bedingung wahr ergibt, bzw. solange, wie eine Bedingung wahr ergibt. Die Bedingung, die wahr oder falsch ergibt, kann auch Sensorwerte beinhalten.
Baue und programiere eine Alarmanlage, die wie folgt funktioniert: Wenn über einen Bewegungsmelder eine Bewegung registriert wird, dann geht die Alarmanlage los (Blinken und / oder Piepsen). Die Alarmanlage bleibt so lange aktiv, bis ein Taster gedrückt wurde, um sie wieder auszustellen.
Baue und programmiere ein konfigurierbares Reaktionsspiel!
Am Anfang des Spiels soll diese maximale Reaktionszeit konfiguriert werden können. Das heißt, man kann die max. Reaktionszeit mit dem linken Taster verringern und mit dem rechten Taster vergrößern. Erst wenn der mittlere Taster gedrückt wird, startet das Spiel.
Für einen besseren Zugang zu diesem komplexen Spiel kannst du folgende Vorlage öffnen, mittels “Speichern unter” als Reaktionsspiel.xml
auf dem Computer speichern und die Datei im Open Roberta Lab importieren: reaktionsspiel-start.xml.
Mögliche Erweiterungen:
Lauflichter findet man inzwischen überall in unserer Welt: An den Rändern von Landebahnen an Flughäfen, an Spieleautomaten, aufdringlichen Werbeschildern, als Blinker von modernen Autos und vieles mehr. Wenn man diese programmieren will, eignen sich dazu am besten Zählschleifen.
Das oben abgebildete Programm enthält zwei selbst definierte Blöcke, mit denen sich eine LED an einem beliebigen Pin zwischen 2 und 13 anstellen bzw. ausschalten lässt. In der Endlosschleife wird dann eine Zählschleife genutzt.
Stelle eine Vermutung an, was die Zählschleife bewirkt.
Überprüfe deine Vermutung mit Hilfe einer Trace-Tabelle (siehe unten).
Trace-Tabellen stellen den Wert von Variablen beim Durchlaufen des Programms dar. Auf diese Art und Weise kann man sich zum Beispiel genau veranschaulichen, wann Schleifen abgebrochen werden.
Zeile | i |
---|---|
… | … |
5 | 2 |
6 | 2 |
5 | 3 |
6 | 3 |
Programmiere ein Lauflicht so, wie es auch als Blinker in modernen Autos genutzt wird. Nutze zunächst nur 5 LEDs (mit Vorwiderstand!).
Hinweis: Du kannst das folgende Programm als Vorlage nutzen, damit du auch über die selbst definierten Blöcke zum Anstellen bzw. Ausstellen einer LED an einem beliebigen Pin zwischen 2 und 13 verfügst. Speichere das Programm als blinker.xml
und importiere es in Open Roberta Lab: blinker-start.xml.
Programmiere ein Lauflicht, das hin- und zurückläuft.
Unten siehst du zwei Programme, für die jeweils fünf LEDs mit Vorwiderstand an Pin 2 bis 6 angeschlossen wurden. Darunter siehst du die Wirkung der Programme in einem kurzen Video.
Beschreibe die Wirkung von Die Schleife abbrechen
und mit der nächsten Iteration der Schleife fortfahren
.
Programmdownload: schleife-abbrechen.xml
In Nepo wie in anderen Programmiersprachen gibt es verschiedene Arten von Schleifen. Bisher wurde in Nepo die einfache Zählschleife wiederhole x mal
, die bedingungsgesteuerte Wiederholschleife wiederhole bis / solange
und die Zählschleife mit Zählervariable genutzt. Tatsächlich lässt sich das gleiche Verhalten aber mit allen drei Schleifenvarianten erreichen.
Betrachte noch einmal das Programm schleife-abbrechen.xml
(siehe oben). Implementiere das gleiche Verhalten mit …
wiederhole x mal
Schleife,wiederhole bis
Schleife,wiederhole solange
Schleife.Erkläre, welche Schleifenvariante sich als “Grundschleife” eignet, die die anderen Varianten immer ersetzen kann.
Ein Unterschied zwischen den Schleifenimplementierungen bleibt bestehen: Die Zählvariable i
wird bei einer Zählschleife als lokale Variable angelegt, das heißt, man kann die Zählvariable nur innerhalb der Schleife nutzen. Dafür benötigt sie auch nur innerhalb der Schleife Speicherplatz.
Im Gegensatz dazu sind die unter Start
angelegten Variablen überall im Programm bzw. global verfügbar und heißen deshalb globale Variablen. Für diese Variablen muss während der ganzen Zeit Speicherplatz bereitgehalten werden, auch wenn sie vielleicht nur an einer Stelle wirklich benötigt werden.
Bei der Programmierung werden häufig Schleifen genutzt, die die Anweisungen in ihrem Rumpf (oder Körper) solange wiederholen, bis eine gewisse Abbruchbedingung eintritt.
wiederhole x mal
: Einfache Zählschleife, die die Anweisungen im Rumpf für eine festgelegte Anzahl wiederholt.wiederhole, bis
: Bedingungsgesteuerte Schleife, die die Anweisungen im Rumpf wiederholt, bis die Bedingung wahr ergibt.wiederhole, solange
: Bedingungsgesteuerte Schleife, die die Anweisungen im Rumpf wiederholt, solange die Bedingung wahr ergibt.zähle i von … solange Zähler … mit Schrittweite …
: Zählergesteuerte Schleife, die die Anweisungen im Rumpf wiederholt, solange der Zähler kleiner als eine vorgegebene Zahl ist und die Zählervariable nach jedem Durchlauf um eine angegebene Zahl erhöht.Die Überprüfung, ob die Bedingung wahr ist, erfolgt hier vor der Ausführung der Anweisungen im Rumpf. Daher nennt man die Schleifen auch kopfgesteuert.