DU LERNST HIER... |
wie ein Roboter bestimmte Befehlssequenzen wiederholen kann und wie du mit benannten Programmblöcken (Funktionen) deine Programme besser strukturieren kannst. |
MUSTERBEISPIELE |
from grobot import * repeat 4: forward() delay(2000) left() delay(550) stop() Führe das Programm zuerst im Simulationsmodus aus. Im Realmodus musst du eventuell die Zeit beim Linksdrehen anpassen. Im Unterschied zur Simulation, bei der der Roboter ein Quadrat ganz exakt abfahren kann, ist es beim realen Roboter schwierig, exakt geradeaus zu fahren und exakt in einem rechten Winkel abzubiegen. Dies entspricht der Wirklichkeit, denn kein Auto wird bei starrer Radstellung, d.h. blockierter Steuerung, je exakt geradeaus fahren, man muss immer wieder regulierend eingreifen. Deswegen sind Roboter mit Sensoren ausgerüstet, die ihnen helfen, diese Ungenauigkeiten zu korrigieren. Verwende also nicht zu viel Zeit, um dem Roboter ein exaktes Quadrat fahren beizubringen. |
from grobot import * repeat: forward() delay(2000) backward() delay(2000) left() delay(550) Hier ist es nützlich zu wissen, wie man ein laufendes Programm abbrechen kann: Am einfachsten geht es mit Schliessen des Terminalfensters. Du kannst ein Programm auch durch gleichzeitiges Drücken von ENTER und DOWN auf dem EV3-Brick abbrechen. Dabei wird aber auch das Brickgate-Programm beendet und muss erneut mit dem ENTER-Button gestartet werden. |
Beispiel 3: Programme mit eigenen Funktionen strukturieren Eine Funktionsdefinition beginnt immer mit dem Schlüsselwort def. Darauf folgen ein Funktionsname, eine Parameterklammer und ein Doppelpunkt. Die Anweisungen im Funktionskörper sind eingerückt. Im Hauptprogramm wird die Funktion aufgerufen. In deinem Beispiel definierst du eine Funktion blink(), die das einmalige aufleuchten der roten LED bewirkt. Im Hauptprogramm macht der Roboter eine ähnlich Bewegung wie im vorhergehenden Beispiel. Bevor er rückwärtsfährt hält er an, Blinkt zweimal und fährt rückwärts zum Ausgangspunkt.
|
MERKE DIR... |
Um ein Programmblock n mal zu wiederholen, verwendest du eine repeat-Schleife: Um ein Programmblock endlos zu wiederholen, verwendest du eine Endlos-Schleife: |
ZUM SELBST LÖSEN |
|
Der autonome Modus entspricht eher der üblichen Vorstellung eines Roboters, der nach seiner Programmierung keine Verbindung zu einem externen Computer mehr benötigt. Er ist auch der der bevorzugte Modus für Roboter-Wettbewerbe.
Für die Programmentwicklung und Demonstrationen ist der Remote Modus hingegen sehr praktisch, da die Programme nicht heruntergeladen werden und deswegen schneller starten. Zudem muss am Roboter selbst weniger manipuliert werden.
Der Brickgate-Server ist ein TCP-Socket-Server, der auf IP Port 1299 die vom PC gesendeten Befehle empfängt und die entsprechenden autonomen Funktionen aufruft. Falls diese einen Rückgabewert haben, wird dieser an den PC zurück gesendet.
Man nennt eine solche Schleife auch Event-Loop, da getestet wird, welcher der Tastenevents seit dem letzten Durchlauf aufgetreten ist. Die Funktion isNNHit() prüft nämlich nicht, ob die Taste gerade im Augenblick des Aufrufs gedrückt ist, sondern ob seit dem letzten Aufruf der Funktion die Taste irgend einmal gedrückt wurde. Dieses Verfahren hat grosse Vorteile, denn es gehen kein Tastenevents "verloren", weil das Programm das Drücken der Taste verpasst.
Wenn ein Roboter bestimmte Befehle mehrmals wiederholen muss, kannst du die betreffenden Programmzeilen zu einem Programmblock zusammenfassen und diesen mit einer for-Schleife mehrmals durchlaufen. Die Zeilen im Programmblock müssen eingerückt sein und am Ende der for-Anweisung muss ein Doppelpunkt sein.
for i in range(n): Befehl 1 Befehl 2 ......
Hier werden die eingerückten Zeilen n mal wiederholt, wobei n eine beliebige positive ganze Zahl ist. Mehr dazu findest du im Kapitel while&for im Teil Turtlegrafik.
Beachte, dass du bei der Robotik für die Wiederholung repeat nicht verwenden darfst.