bewegen

2. ROBOTER STEUERN

 

 

DU LERNST HIER...

 

wie du die Motoren und LEDs deines Roboters programmieren kannst.

 

 

MUSTERBEISPIELE

 

Beispiel 1: Fahren und abbiegen
Der Roboter soll zuerst vorwärts fahren, dann links abbiegen und danach wieder ein kurzes Stück vorwärts fahren. Mit dem Befehl forward() wird der Roboter in den Zustand "forward" versetzt. delay(2000) gibt die Zeit im Millisekunden an, bis der Mikroprozessor den nächsten Befehl left() erteilt. Dieser versetzt den Roboter in den Zustand "linksdrehen". Während der 550 Millisekunden dreht sich der Roboter ca. um 90° links. Danach fährt er wieder 2000 Millisekunden vorwärts, eher er den Befehl stop() erhält.

 

from grobot import *

forward()
delay(2000)
left()
delay(550)
forward()
delay(2000)
stop()
► In Zwischenablage kopieren

Für die Steuerung des Roboters kannst du auch sogenannte blockierende Befehle verwenden. Mit forward(2000) fährt der Roboter während 2000 Millisekunden vorwärts, mit left(550) dreht er während 550 Millisekunden nach links.

from grobot import *

forward(2000)
left(550)
forward(2000)
► In Zwischenablage kopieren

Ein Nachteil der blockierenden Befehle, wie z.B. forward(2000) ist, dass der Roboter während 2000 ms keine weitere Befehle entgegen nehmen kann. Mit forward() (ohne Zeitangabe) wird der Roboter in die Vorwärtsbewegung versetzt und bleibt in diesem Zustand so lange bis er einen Befehl erhält, den Zustand der Motoren zu ändern. Während dieser Zeit kann er andere Befehle entgegen nehmen, z. B. Sensorwerte zurückmelden.


 

Beispiel 2: Mehreres gleichzeitig tun
Obwohl das nachfolgende Programm aus einer Sequenz von Anweisungen besteht, die der Reihe nach ausgeführt werden, kann der Roboter mehreres gleichzeitig tun. Der Roboter fährt während 4 s vorwärts und anschliessend 4 s rückwärts. während des Rückwärtsfahrens schaltet er die LEDs ein und aus.

Die Motoren und die LEDs werden durch den Mikroprozessor gesteuert, wobei der Mikroprozessor auch mehrere Aktoren gleichzeitig bedienen kann. Während sich die Motoren nach dem Erhalt des Befehls backward() im Zustand backward befinden, werden mit dem Befehl

setLED(1) die LEDs eingeschaltet und nach 3500 ms mit setLED(0) ausgechaltet. Danach erhalten nach weiteren 500 ms die Motoren den Befehl stop() und der Roboter hält an.  

from grobot import *

forward()
delay(4000)
backward()
setLED(1)
delay(3500)
setLED(0)
delay(500)
stop()
► In Zwischenablage kopieren  

 

Beispiel 3: Auf Kreisbogen fahren
Der Roboter soll zuerst 5 s auf einem Linksbogen, dann 5 s auf einem Rechtsbogen und anhalten. Für das Bogenfahren verwendest du die Befehle leftArc(r) bzw. rightArc(r), wobei der Radius r in Meter ist.

Mit setSpeed(speed) kannst du die Geschwindigkeit ändern (0 bis 100, default speed ist 30).

 




from grobot import *

setSpeed(40)

leftArc(0.2)
delay(5000)
rightArc(0.2)
delay(5000)
stop()
► In Zwischenablage kopieren  

 

 

MERKE DIR...

 

Für die Steuerung des Roboters stehen die folgende Befehle zur Verfügung:

 forward()  fährt vorwärts
 backward()  fährt rückwärts
 left()  dreht links
 right()  dreht rechts
 leftArc(r)  fährt auf Linksbogen mit Radius r
 rightArc(r)  fährt auf Rechtsbogen mit Radius r
 stop()  hält an
 setSpeed(speed)  setzt die Geschwindigkeit
 delay(ms)  bleibt ms Millisekunden im gleichen Zustand
 setLED(n)  LEDs einschalten (1 rot, 2 grün, 3 orange)
 setLED(0)  LEDs ausschalten
 setAlarm(1)  Schaltet einen Pipton ein
 setAlarm(0)  Schaltet den Pipton aus

Programmausführung abbrechen:
Am einfachsten geht es mit Schliessen des Terminalfensters. Du kannst auch die Buttons ENTER und DOWN gleichzeitig drücken, nur wird dabei auch das Brickgate-Programm abgebrochen und musst ihn danach mit ENTER-Buttons neu starten.

Du kannst alle Beispiele auch im Simulationsmodus ausführen. Um ein Programm zu starten, klickst du anstelle des Robotik-Buttons auf den grünen Run-Pfeil. Willst du im Grafikfenster die Roboterspuren anzeigen lassen, fügst du nach der Importzeile folgende Zeile ein:
RobotContext.enableTrace(True)

 

 

ZUM SELBST LÖSEN

 

 

1.
Erstelle mit einigen Gegenständen einen Parcours und schreibe ein Programm so, dass der Roboter vom Start zum Ziel fährt.

 

2.
Der Roboter soll sich so lange auf einen Linksbogen bewegen, bis er einen ganzen Kreis zurückgelegt hat. Danach soll er sich gleich lange auf einem rechtsbogen bewegen.  

3.

Mit setAlarm(1) wird ein Alarm eingeschaltet (ein Pipton). setAlarm(0) schaltet den Alarm aus. Der Roboter fährt zuerst 5000 ms vorwärts und danach 5000 ms rückwärts. Während des Rückwärtsfahrens soll er Alarm einschalten.

 

 

ZUSATZSTOFF: MOTOREN EINZELN STEUERN

 

Die Befehle forward(), left() usw. steuern das ganze Fahrwerk, das aus zwei Motoren besteht. Man kann aber auch die einzelnen Motoren einschalten und ihre Geschwindigkeit regeln. Mit motL.rotate(speed) wird der linke Motor in die Vorwärtsbewegung versetzt und rotiert mit der Geschwindigkeit speed. Für die positiven speed-Werte rotiert der Motor vorwärts, bei negativer Werten rückwärts und für speed = 0 hält der Motor an. Entsprechend funktioniert der Befehl motR.rotate(speed) für den rechten Motor.

 

Beispiel 4: Der linke Motor läuft zuerst 3 Sekunden mit der Geschwindigkeit 50 vorwärts, dann 3 Sekunden mit der Geschwindigkeit 30 rückwärts. Anschliessend hält er an. Führe das Programm zuerst im Simulationsmodus aus und beobachte die Rotationen im Grafikfenster.

 


from grobot import *

motL.rotate(50)
delay(3000)
motL.rotate(-30)
delay(3000)
motL.rotate(0)
► In Zwischenablage kopieren  

 

 

ZUM SELBST LÖSEN

 

 

4.
Lasse die beiden Motoren mit der gleichen Geschwindigkeit 4000 Millisekunden vorwärts rotieren.

5.
Lasse während 4 Sekunden den linke Motor vorwärts und den rechten Motor rückwärts laufen.

6.

Wie musst du den linken und den rechten Motor steuern, damit sich der Roboter 4 Sekunden auf einem Linksbogen bewegt?

 

 

   

 

2-1
Didaktische Hinweise:

Die Unterscheidung zwischen blockierenden und nicht-blockierenden Funktionen ist von grosser Wichtigkeit weit über die Robotik hinaus. Sie ist aber für Programmieranfänger keineswegs evident und führt sogar für Fortgeschrittene immer wieder zu Schwierigkeiten.

Die Robotik ist ein hervorragend geeignetes Betätigungsfeld für "das Denken in Zuständen". Da wir auf die Zustansprogrammierung einen grossen Wert legen, verwenden wir in diesem Lernprogramm fast aussliesslich die nichtblockierenden Befehle, obwohl die Programme dadurch etwas länger werden. Für die Schülerinnen und Schüler ist es aber einfacher, als zwischen blockierenden und nichtblockierenden Befehlen zu welchseln.