5 Warten, wiederholen, Eigene Blöcke und Multitasking

Im letzten Kapitel hast du gelernt, wie du deinen Roboter verschiedene Aktionen ausführen lässt, z.B. Bewegungen. In diesem Kapitel lernst du verschiedene Programmiertechniken, mit denen du größeren Einfluss auf die Reihenfolge der Blöcke in deinen EV3-Programmen hast. Du lernst Programme mit Wartenblöcken anzuhalten, eine Reihe von Aktionen mit Schleifenblöcken zu wiederholen, wie über den Schleifen-Interrupt mehrere Blöcke parallel ablaufen können und sogar, wie du Eigene Blöcke erstellst.

Der Warteblock

Bisher hast du Programmierblöcke verwendet, durch die sich der Roboter bewegt, Klänge abspielt oder etwas mit dem Display macht. Jetzt lernst du einen Block kennen, der nichts anderes macht, als das Programm für eine bestimmte Dauer anzuhalten. Dieser Block, der Warteblock, wird in Abbildung 5-1 gezeigt.

Die Einstellungen des Warteblocks

Du verwendest den Warteblock wie die anderen Programmierblöcke auch: Platziere ihn im Programmierbereich und konfiguriere Modus und Einstellungen. In diesem Kapitel verwendest du nur den Zeit-Modus.

Im Zeit-Modus hält der Block das Programm einfach für eine bestimmte Dauer an, z.B. fünf Sekunden. Wenn die Zeit verstrichen ist, fährt das Programm mit dem nächsten Block fort. Die in das Feld Sekunden eingetragene Anzahl kann eine ganze Zahl sein, wie 4, oder eine Zahl mit Dezimalstelle, wie 1,5. Um das Programm z.B. für 50 Millisekunden anzuhalten (0,05 Sekunden), gibst du 0,05 ein.

Der Warteblock in Aktion

Warum sollte man einen Block einsetzen, der das Programm einfach nur anhält? Hier folgt ein Beispiel für den Einsatz des Warteblocks. Erstell ein neues Projekt, speichere es als EXPLOR3R-5 und erstelle ein Programm namens WaitDisplay, wie in Abbildung 5-1 gezeigt.

Image

Abbildung 5-1: Das Programm WaitDisplay enthält zwei Warteblöcke im Zeit-Modus, um das Programm nach Anzeige einer Nachricht auf dem EV3-Display anzuhalten.

Das Programm WaitDisplay

Wenn du das Programm ausführst, sollte der Text »Hallo!« auf dem EV3-Display erscheinen und eine Sekunde später »Was gibt’s?«. Der zweite Warteblock gibt dir Zeit, zu lesen, was auf dem EV3-Display steht. Ohne die Verzögerung würde das Programm sofort nach dem zweiten Anzeigeblock beendet sein, sodass die Meldung nicht mehr gelesen werden könnte. Warteblöcke sind auch nützlich für einen Roboter mit Sensoren, wie du im nächsten Kapitel sehen wirst.

Der Schleifenblock

Stelle dir vor, du gehst entlang eines Quadrats wie in Abbildung 5-3. Beim Gehen folgst du immer wieder einem bestimmten Muster: geradeaus gehen, nach rechts drehen, geradeaus gehen, nach rechts drehen usw.

Image

Abbildung 5-3: Der EXPOLR3R bewegt sich in einem Quadrat.

Um für deinen Roboter diese Art von Verhalten zu erreichen, könntest du einen Bewegungslenkungsblock für die gerade Bewegung verwenden und einen weiteren für die Drehung nach rechts. Damit der Roboter ein vollständiges Quadrat zurücklegt, bräuchtest du diese zwei Blöcke vier Mal hintereinander, insgesamt also acht Blöcke.

Statt dieses Programm mit acht Blöcken zu schreiben, kannst du auch einen Schleifenblock verwenden, der eine Reihe von Blöcken nacheinander wiederholt. Schleifenblöcke sind sehr nützlich, wenn du bestimmte Aktionen mehrfach wiederholen möchtest.

Den Schleifenblock einsetzen

Der Schleifenblock (siehe Abbildung 5-4) führt darin platzierte Blöcke mehrfach aus. Abhängig vom gewählten Modus führt er die Blöcke eine bestimmte Anzahl von Durchläufen (Zählen) oder eine bestimmte Anzahl von Sekunden (Zeit) aus, oder er wiederholt die Blöcke unbegrenzt, bis du das Programm auf dem EV3-Stein unterbrichst. (Die weiteren Modi lernst du in den folgenden Kapiteln kennen.)

Oben in jeder Schleife kannst du einen Namen eingeben, der die Funktion der darin platzierten Blöcke beschreibt. Du kannst den Block manuell in der Größe anpassen, wenn nötig, wie in Abbildung 5-4. (Es gibt außerdem die Funktion eines Zählers, die du in Kapitel 14 kennenlernen wirst, die wir momentan jedoch ignorieren.)

Du stellst Blöcke in die Schleife, indem du einfach einen oder mehrere hineinziehst, wie in Abbildung 5-5 gezeigt.

Der Schleifenblock in Aktion

Um den Schleifenblock in Aktion zu sehen, vervollständigst du das Programm OneSquare aus Abbildung 5-6. Wenn du es ausführst, sollte der Roboter einen Klang abspielen, das Quadrat fahren, einen weiteren Klang abspielen und anhalten. Wenn der Roboter keine 90-Grad-Drehungen ausführt, versuche die Anzahl Grad im zweiten Bewegungslenkungsblock anzupassen, wie du es auch in Selbst entdecken 2 auf Seite 39 getan hast.

Image

Abbildung 5-4: Der Schleifenblock im Modus Zählen. In dieser Konfiguration führt das Programm alle in der Schleife platzierten Blöcke vier Mal aus. In den anderen Modi kannst du die Blöcke in der Schleife eine bestimmte Anzahl Sekunden oder auch unbegrenzt oft ausführen.

Schleifenblöcke innerhalb von Schleifenblöcken

Das Programm OneSquare (siehe Abbildung 5-6) lässt den EXPLOR3R einmal im Quadrat fahren. Du kannst einen weiteren Schleifenblock verwenden, um die Fahrstrecke zu wiederholen, sodass der Roboter mehrmals ein Quadrat fährt. Im Modus Unbegrenzt fährt der Roboter dann endlos lange Quadrate ab.

Image

Abbildung 5-5: Um Blöcke in einen Schleifenblock einzufügen, platzierst du zuerst alle benötigten Blöcke im Programmierbereich (1). Dann wählst du die zu verschiebenden Blöcke aus und ziehst sie in die Schleife (2). Der Schleifenblock sollte seine Größe automatisch anpassen, um Platz für die eingefügten Blöcke zu bieten. Wenn du einen Schleifenblock verschiebst, verschiebt sich sein Inhalt mit.

Versuche dies mit dem Programm InfiniteSquare aus Abbildung 5-7. Um es zu erstellen, erweiterst du das gerade geschriebene Programm, indem du einen zweiten Schleifenblock aus der Palette nimmst und seinen Modus auf Unbegrenzt einstellst. Zieh dann den Block, der das Quadrat fährt, und den zweiten Klangblock in den neuen Schleifenblock hinein. Jetzt fährt der Roboter ständig das Quadrat ab und sagt nach jeder Runde »Goodbye«, bis du das Programm mit der Zurück-Taste auf dem EV3-Stein abbrichst.

Image

Abbildung 5-6: Das Programm OneSquare enthält eine Schleife, die vier Mal ausgeführt wird. Wenn die beiden Blöcke innerhalb der Schleife vier Mal ausgeführt wurden (was ein Quadrat ergibt), macht das Programm mit dem nächsten Block weiter, in diesem Fall einem Klangblock. Du kannst als Name für die Schleife Quadrat eingeben, um ihre Funktion zu beschreiben.

Image

Abbildung 5-7: Das Programm InfiniteSquare zeigt, wie du einen Schleifenblock in einen anderen einfügst. Der innere Schleifenblock lässt den EXPLOR3R ein Quadrat abfahren und »Goodbye« sagen und der äußere Block wiederholt diesen Vorgang unbegrenzt.

Blöcke selbst machen: Eigene Blöcke

Zusätzlich zu den vorgefertigten Blöcken kannst du auch Eigene Blöcke erstellen. In Eigenen Blöcken kombinierst du mehrere Programmierblöcke in einem. Eigene Blöcke sind besonders nützlich, wenn du eine bestimmte Kombination Blöcke häufig in deinen Programmen einsetzt. Du kannst z.B. einen Eigenen Block erstellen, durch den der Roboter »Hello! Good morning!« sagt und der die Statusleuchte auf Rot setzt.

Normalerweise benötigst du fünf Programmierblöcke für diese Aufgabe. Wenn die Aktion häufiger ausgeführt werden soll, wäre es viel einfacher, einen Eigenen Block zu erstellen, als jedes Mal die fünf Blöcke zu kopieren und einzufügen. Durch Eigene Blöcke sehen deine Programme auch ordentlicher aus, denn es befinden sich weniger Blöcke auf dem Bildschirm.

Eigene Blöcke erstellen

Um die Funktion Eigener Blöcke zu zeigen, schreiben wir ein Programm, das den EXPLOR3R »Hello! Good morning!« sagen lässt, vorwärts fährt und dann dasselbe noch einmal sagt. Da der Roboter dich zwei Mal grüßen soll, ist es einfacher, einen Eigenen Block namens Talk zu erstellen und diesen zu wiederholen, wie in den Abbildungen 5-9 bis 5-11 gezeigt. Wenn du diesen Eigenen Block erstellt hast, kannst du ihn zukünftig in jedem Programm verwenden, in dem der EXPLOR3R dir »Good morning!« wünschen soll.

1. Erstelle ein neues Programm namens MyBlockDemo und platziere und konfiguriere die fünf Blöcke des Robotergrußes im Programmierbereich wie in Abbildung 5-9. Dann wählst du diese fünf Blöcke aus (ausgewählte Blöcke werden blau umrandet) und klickst auf Werkzeuge Image Eigene Blöcke erstellen.

2. Jetzt erscheint Eigene Blöcke erstellen wie in Abbildung 5-10. Gib dem Block einen Namen, z.B. Talk. Nutze den Bereich Beschreibung, um den Block zu erklären, damit du seine Funktion später noch verstehst, wenn du ihn wiederverwenden möchtest. Dann suchst du ein Symbol für ihn aus, z.B. den Lautsprecher, der anzeigt, dass dieser Block mit Klang zu tun hat. Klicke dann auf Fertig stellen.

3. Wenn du deinen Eigenen Block fertig hast, erscheint er im Programmierbereich und ersetzt die fort vorher ausgewählten Blöcke, wie in Abbildung 5-11 gezeigt. Ordner die Blöcke neu an, wenn das notwendig ist.

Eigene Blöcke in Programmen verwenden

Wenn der Eigene Block fertig ist, findest du ihn im hellblauen Register in der Programmierpalette wie in Abbildung 5-12. Füge einen Bewegungslenkungsblock hinzu und eine weitere Kopie des Eigenen Blocks und schließe das Programm MyBlockDemo ab. Wenn du das Programm ausführst, sollte der Roboter »Hello! Good morning!« sagen, vorwärts fahren und erneut grüßen. Die Statusleuchte sollte rot sein, während der Klang abgespielt wird, und grün, wenn der Roboter fährt.

Diese Eigenen Blöcke machen das Programm viel verständlicher, wenn du es z.B. einem Freund erklären willst. Daher ist es manchmal sinnvoll, dein Programm in mehrere Eigene Blöcke aufzuteilen, auch wenn du sie nur einmal verwendest.

Eigene Blöcke bearbeiten

Du kannst die Programmierblöcke innerhalb Eigener Blöcke bearbeiten. Um das zu tun, doppelklickst du im Programmierbereich auf den Eigenen Block, um seinen Inhalt anzuzeigen, und bearbeitest ihn wie ein ganz normales Programm. Wenn du fertig bist, klickst du auf Speichern und kehrst zum Programm zurück, das den Eigenen Block verwendet.

Um einen Eigenen Block umzubenennen, doppelklickst du auf seine Beschriftung und gibst einen neuen Namen ein (wie du es bei normalen Programmen auch tun würdest und wie in Abbildung 3-11 auf Seite 29 gezeigt).

Eigene Blöcke in Projekten verwalten

Du kannst Eigene Blöcke in jedem Programm innerhalb desselben Projekts verwenden. Zum Beispiel kannst du den Eigenen Block Talk in jedem Programm im Projekt EXPLOR3R-5 verwenden. Manchmal möchtest du den Eigenen Block jedoch auch in anderen Projekten nutzen.

Image

Abbildung 5-9: Platziere und konfiguriere die Blöcke wie gezeigt. Wähle dann alle bis auf den orangefarbenen Startblock aus und klicke im Menü auf Eigene Blöcke erstellen.

Image

Abbildung 5-10: Eigenen Block erstellen: Wähle einen Namen, eine Beschreibung und ein Symbol für deinen Eigenen Block. Klicke auf Fertig stellen, um zurückzukehren.

Image

Abbildung 5-11: Der fertige Eigene Block im Programmierbereich. Wenn dein Eigener Block nach seiner Erstellung nicht richtig mit dem Startblock ausgerichtet ist, klicke auf das linke Ende der Weiterleitung, um die Blöcke zu verbinden.

Image

Abbildung 5-12: Das fertige Programm MyBlockDemo

Um den gerade erstellten Eigenen Block in ein anderes Projekt zu kopieren (wie in Abbildung 5-13 gezeigt), gehst du zur Eigenschaftsseite des Projekts (1), wählst Talk.ev3 aus dem Register Eigene Blöcke aus und klickst auf Kopieren (3). Ohne das Projekt zu schließen, öffnest du das vorherige Projekt: EXPLOR3R-4 (4). Gehe zu seinen Eigenen Blöcken auf der Eigenschaftsseite (5) und klicke auf Einfügen (6). Jetzt solltest du den Eigenen Block auch im Projekt EXPLOR3R-4 verwenden können.

Statt den Befehl Kopieren zu verwenden, kannst du auch auf Exportieren klicken, womit du einen Eigenen Block als Datei speichern kannst. Diese Datei kannst du einem Freund mailen, der sie dann seinem Projekt über die Schaltfläche Importieren hinzufügen kann. Um einen Eigenen Block aus einem Projekt zu entfernen, klickst du auf die Schaltfläche Löschen.

HINWEIS Mit dieser Methode kannst du auch andere Dateien zwischen Projekten übertragen, z.B. einzelne Programme, eigene Klänge und Bilder.

Image

Abbildung 5-13: Den Eigenen Block aus dem EXPLOR3R-5-Projekt ins EXPLOR3R-4-Projekt kopieren

Multitasking

Alle Blöcke, die du bisher verwendet hast, wurden nacheinander ausgeführt, so wie sie im Programmierbereich angeordnet waren. Der EV3 kann Blöcke jedoch auch parallel ausführen, entweder mittels mehrerer Startblöcke oder einer verzweigten Weiterleitung. Die Methoden sind sich sehr ähnlich, wie du sehen wirst.

Mehrere Startblöcke

Ein einfacher Weg, zwei Sequenzen von Blöcken parallel auszuführen (also gleichzeitig), ist, einen zweiten Startblock hinzuzufügen wie in Abbildung 5-14. Wenn du Herunterladen und ausführen anwählst, werden beide Sequenzen gleichzeitig gestartet. Das Programm ist beendet, wenn beide Sequenzen abgeschlossen sind. Wenn du eine einzelne Sequenz testen willst, kannst du sie per Klick auf den grünen Pfeil auf dem jeweiligen Startblock aktivieren.

Wenn du dieses Programm ausführst, bewegt sich der Roboter und spielt gleichzeitig einen Klang.

Eine Weiterleitung verzweigen

Ein anderer Weg zum Multitasking-Roboter besteht in einer verzweigten Weiterleitung wie in Abbildung 5-15. Das ist nützlich, wenn du zwei parallele Sequenzen haben möchtest, sie aber nicht von Anfang an benötigst. Im Programm MultiSequence spielt der Roboter einen Klang ab und dann laufen zwei Aktionen parallel: Der Roboter fährt vorwärts und sagt gleichzeitig »Hello! Good morning!«, indem er den vorhin erstellten Talk-Block benutzt.

Image

Abbildung 5-14: Multitasking mit zwei Startblöcken im Programm MultiStart. Den Startblock findest du bei den Ablaufblöcken (im orangenen Register).

Image

Abbildung 5-15: Multitasking mit einer verzweigten Sequenzleitung im Programm MultiSequence. Um es zu erstellen, platzierst du zuerst alle benötigten Blöcke im Programmierbereich, schließt dann eine Weiterleitung an jede Blockserie an. (Das funktioniert, obwohl der Klangblock und der Bewegungsblock miteinander verbunden sind. Die Blöcke werden automatisch getrennt, wenn du versuchst, sie mit dem eigenen Talk-Block zu verbinden.)

Ressourcenkonflikte vermeiden

Genauso wie du nicht gleichzeitig vorwärts und rückwärts gehen kannst, so kannst du deinen Roboter auch nicht in einer Sequenz programmieren, vorwärts zu fahren, und in der anderen rückwärts. Es gibt einen Ressourcenkonflikt, wenn zwei Blocksequenzen gleichzeitig versuchen, einen einzelnen Motor anzusteuern.

Leider teilt dir die EV3-Software nicht mit, wenn es in deinem Programm einen solchen Konflikt gibt. Das Programm wird trotzdem ausgeführt, aber das Ergebnis ist nicht vorhersehbar. Zum Beispiel könnte der Roboter in eine völlig andere Richtung fahren. Um dieses potenzielle Problem zu vermeiden, verwende immer nur einen Motor oder einen Sensor in einer Sequenz.

Wenn möglich solltest du Multitasking vermeiden, denn Ressourcenkonflikte können auch unerwartet auftreten. Manchmal erreichst du dieselbe Funktion auch durch eine Reihe von Blöcken, die nacheinander ausgeführt werden. Statt beispielsweise eine Bewegung und einen Klang in parallelen Sequenzen zu steuern, ist das auch in einer einzelnen möglich, wie in Selbst entdecken 21.

Weitere Experimente

Nachdem du den ersten Teil dieses Buchs abgeschlossen hast, verfügst du über eine solide Grundlage wichtiger Programmiertechniken. In diesem Kapitel hast du Warte- und Schleifenblöcke kennengelernt, erfahren, wie Eigene Blöcke erstellt und bearbeitet werden und wie deine Roboter Multitasking praktizieren.

Im nächsten Teil dieses Buchs erstellst du Roboter, die über Sensoren mit ihrer Umgebung interagieren. Bevor du damit jedoch beginnst, solltest du dein Wissen mit den folgenden Selbst entdecken vertiefen.

SELBST KONSTRUIEREN 3:
MR. EXPLOR3R

Bau: Image Programmierung: Image

Baue einen mittleren Motor ein, der den EXPLOR3R mit einer winkenden Hand ausschaltet. Nutze weitere Lego-Teile, um den Roboter mehr aufzuschmücken und ihn in Mr. EXPLOR3R zu verwandeln. Lasse ihn ständig winken und gleichzeitig eine Begrüßung wie »Good morning!« sagen.