Programmieren von Lego Robotern mit NQC

Gymnasium im Schloss Informatik 07 IT Programmieren von Lego – Robotern mit NQC Seite – 5.1 – 1. Die Entwicklungsumgebung Die Lego-Mindstorms Robot...
5 downloads 4 Views 219KB Size
Gymnasium im Schloss Informatik 07 IT

Programmieren von Lego – Robotern mit NQC

Seite – 5.1 –

1. Die Entwicklungsumgebung Die Lego-Mindstorms Roboter werden so wie Karol über ein Programm gesteuert. Ein solches Programm wird in einer Entwicklungsumgebung geschrieben, die einen Texteditor enthält. Beim Schreiben der Texte müssen wie bei Karol Regeln genau beachtet werden. Die Programmiersprache, die Ihr kennen lernt, ist NQC („Not Quite C“). Die Regeln orientieren sich an der Programmiersprache C. Übertragen des Programms Compilieren

(Download program)

Aufgaben: 1. Starte das Bricx Command Center. Vergleiche mit der Abbildung oben. Gib das angegebene Programm ein und speichere es in einem neuen Ordner Lego im Ordner Informatik. 2. Der Text wird im Editor durch verschiedene Farben dargestellt. Nach den Erfahrungen mit Karol kannst Du schon Vermutungen über die Bedeutung der Farben anstellen. 3. Lass das Programm compilieren. An diesem Beispiel lassen sich einige Grundstrukturen ableiten. Jedes Programm muss ein Hauptprogramm enthalten, das hier als task main ( ) bezeichnet wird. Dazu können noch weitere tasks (Aufgaben) kommen. Der Beginn einer task wird durch die geschweifte Klammer ( ) verdeutlicht, am Ende schließt eine geschweifte Klammer ( ) die Anweisungsfolge. Eine task besteht aus einer Folge von Anweisungen, die jeweils mit einem Semikolon beendet werden. Wichtig ist, dass die Groß- und Kleinschreibung beachtet werden muss. Die beiden Befehle haben folgende Funktionen: PlayTone(262,40); erzeugt einen Ton mit der angegebenen Frequenz für 40/100 sek Wait(50); stoppt den weiteren Programmlauf, so dass die Töne besser zu hören sind

Gymnasium im Schloss Informatik 07 IT

Programmieren von Lego – Robotern mit NQC

Seite – 5.2 –

2. Übertragung auf den RCX Das Programm muss auf den RCX (Robotics-Command-System), einen programmierbaren Microcomputer, übertragen werden. Dazu muss ein Infrarot-Sender mit der USB Schnittstelle des Notebooks verbunden sein. Beim Anschließen und Übertragen leuchtet eine grüne Leuchtdiode im Sendeteil kurz auf. Der Brick muss sich mit seinem Empfänger/Sender in der Nähe befinden. Ist der Brick angeschaltet und betriebsbereit, so zeigt das Display die Systemuhr an. Ist das nicht der Fall, so muss evtl. die Lego-Software geladen werden. Die Betriebsbereitschaft kann unter Tools – Find Brick getestet werden. Aufgaben: 1. Verbinde den Sender mit dem Notebook und schalte den Brick ein. Lasse den Brick von der Entwicklungsumgebung aus suchen. Übertrage Dein Programm mit dem Symbol Download auf den Brick. Ein Signal ertönt. Betätige die Taste Run auf dem Brick. 2. Ergänze den Programmtext, so dass die Tonfolge wieder nach unten verläuft. 3. Im Brick sind verschiedene Sounds vorprogrammiert, die nun getestet werden sollen. Die Sounds werden durch PlaySound(0); Wait(100); abgerufen. Die Nummern der Sounds laufen von 0 bis 5. 4. Beschreibe, was im Display passiert, wenn ein Programm übertragen und gestartet wird. Der Brick enthält neben dem Tongeber noch einen internen Zeitgeber. Die Motoren oder Lampen werden an die drei Ausgänge angeschlossen, die mit A, B, C bezeichnet sind. An die Eingänge werden Sensoren angeschlossen.

Gymnasium im Schloss Informatik 07 IT

Programmieren von Lego – Robotern mit NQC

Seite – 5.3 –

3. Regeln und Tipps für die Arbeit im Labor Für die Arbeit im Roboter-Labor sind einige Regeln zu beachten: -

-

-

-

-

Jedes Team besteht aus zwei Personen. Für jedes Team steht ein „Lego Mindstorms for Schools“ Labor zur Verfügung, für das das Team verantwortlich ist. Die Einsortierung erfolgt nach Lageplan und muss beibehalten werden. So kann man bei den Bauanleitungen Teile schnell finden. Am Ende der Unterrichtseinheit müssen alle Teile wieder nach Plan verteilt werden. Die beiden Namen der Teammitglieder werden an den Stirnseiten der grünen Materialkiste und des Aufbewahrungskartons angebracht. Beides wird am Ende der Stunde im Regal im Roboterlabor II abgelegt. Im Karton befindet sich auch der Roboter. Bitte die Plastikkisten so packen, dass der Deckel locker aufliegt. Nicht mit Gewalt arbeiten! Für die Arbeit mit den Brick werden Akkus benötigt, die in den gekennzeichneten Kisten zu finden sind. Wenn die Leistung nachlässt, leuchtet in der Anzeige des RCX ein entsprechendes Signal auf. Die schwachen Akkus werden in die entsprechende Kiste gelegt, so dass sie rechtzeitig wieder aufgeladen werden können. Die Sendestation muss immer am gleichen USB-Port des Notebooks angeschlossen werden, sonst gibt es Probleme. Bevor Programme übertragen werden, muss die Lego-Software auf den Brick überspielt werden. Diese befindet sich auf den Notebooks. Da sich die Infrarot - Übertragungen stören können, sollte ein Sicherheitsabstand zum nächsten Notebook eingehalten werden. Das gleiche gilt bei der Übertragung von Programmen auf den Brick. Zeigt der Brick an, dass die Akkus leer sind, müssen diese möglichst schnell gewechselt werden. Dann muss die Lego-Software nicht wieder überspielt werden. Die Roboter fahren immer auf dem Fußboden! Nach dem Test werden sie wieder auf dem Tisch gestellt, damit keiner darauf tritt. Vorsicht beim Zusammen- und Auseinanderbauen! Nicht mit Gewalt arbeiten. Stehen Teile unter Spannung, bewegt sich der Roboter nicht richtig. Überprüfe nach jedem Abschnitt, ob die Teile richtig zusammengesetzt sind. Passen Baugruppen nicht zusammen, liegt es nicht an der Anleitung. Der Zusammenbau erfolgt nicht unter Zeitdruck. Jedes Team hat genügend Zeit und Raum, um die Aufgaben zu lösen.

4. Erste Fahrversuche Bevor ein Programm einen Roboter steuert, sind einige Vorarbeiten erforderlich. Aufgaben: 1. Baue nach der Bauanleitung den Roverbot–Antriebsblock in den Schritten 1 bis 5 zusammen. 2. Setze die Akkus ein, schalte den RCX an und übertrage die Lego-Software. Teste eines der Programme von Seite 5.2. Damit kann man kontrollieren, ob die Übertragung klappt. 3. Teste folgende Programmschritte OnFwd (OUT_A+OUT_C); Wait(500); Off (OUT_A+OUT_C); 4. Der Befehl zum Rückwärtsfahren lautet OnRev(OUT_A+OUT_C); Lasse damit den Roboter (auf dem Fußboden!) 5 Sek. geradeaus fahren und 3 Sekunden zurückfahren.

Gymnasium im Schloss Informatik 07 IT

Programmieren von Lego – Robotern mit NQC

Seite – 5.4 –

Tipps: -

Prüfe, ob die Motoren richtig angeschlossen sind. Bevor der Roboter auf dem Boden fährt, kann man die Laufrichtung der Räder ausprobieren, indem man den Roboter zunächst in der Luft hält.

Die Namen OUT_A, OUT_B und OUT_C bezeichnen die drei Ausgänge, an die Motoren angeschlossen werden können. Sollen mehrere Ausgänge in einem Befehl angesprochen werden, so werden die Namen mit einem Pluszeichen verbunden. Um einen Motor zu benutzen, stellt NQC verschiedene Befehle zur Verfügung: − − −

− −

− −



OnFwd(Motoren), Schaltet die angegebenen Motoren vorwärts ein Bsp.: OnFwd(OUT_A + OUT_C); OnRev(Motoren), Schaltet die angegebenen Motoren rückwärts ein Bsp.: OnRev(OUT_A + OUT_C); Wait(Zeit), der Robot bleibt für die angegebene Zeit (Angabe in Millisekunden) in dem vorherigen Zustand Bsp.: Wait(200); Off(Motoren), die angegebenen die Motoren werden ausgeschaltet.. Bsp.: Off(OUT_C); SetPower(Motoren, Leistung), setzt die Leistung auf eine der Stufen von 0 bis 7, dabei können die Konstanten OUT_LOW, OUT_HALF und OUT_FULL verwendet werden Bsp.: Set Power(OUT_A, OUT_FULL); Fwd(Motoren), Setzt die Drehrichtung auf "vorwärts" Bsp: Fwd(OUT_A + OUT_C); On(Motoren), Motor wird in die durch Fwd(Motoren) eingestellte Richtung eingeschaltet. Bsp.: On(OUT_A); OnFor(Motoren, Zeit), eine Kombination von On() und Wait und Off /On. Bsp.; OnFor(OUT_A, 200);

Aufgaben: 1. Der Roboter soll 2 Sekunden geradeaus fahren, nach links fahren (ca. 90°) und wieder vorwärts fahren. Lasse ihn anschließend auch nach rechts fahren. 2. Der Roboter soll ein Quadrat fahren. Anschließend soll er einen Ton als Erfolgsmeldung spielen. 3. Das Quadrat soll so ausgedehnt werden, dass die vorgegebenen Markierungen umfahren werden. 4. Der Roboter soll sich im „Zickzack“ vorwärts bewegen. Dabei soll er möglichst eine Linie einhalten, wenn man Anfangs- und Endpunkt verbindet. 5. Genauso wie bei Karol (Seite 3.3) gibt es in NQC die Möglichkeit, eine Folge von gleichen Anweisungen zu wiederholen. Die Wiederholungsanweisung lautet hier repeat (10) {

// wiederhole 10-mal // Beginn der Folge

Anweisungen }

// Ende der Folge

Lasse den Roboter 10-mal im „Zickzack“ laufen.

Gymnasium im Schloss Informatik 07 IT

Programmieren von Lego – Robotern mit NQC

Seite – 5.5 –

Bei den Fahraufgaben hast Du festgestellt, dass das Ergebnis nicht immer so ist, wie man sich das bei der Programmentwicklung vorgestellt hat. Das ist der Unterschied zu Karol. Diese Abweichungen wollen wir untersuchen. Führe dazu die Forschungsaufgaben durch und protokolliere die Ergebnisse.

Forschungsaufgaben F1: Lasse den Roboter auf der 2m langen Teststrecke fahren. - Miss die Zeit bei voller Geschwindigkeit von der Start- bis zur Ziellinie - Schreibe auch die Abweichung von der Bezugslinie auf F2: Versuche, eine ungefähre Zuordnung zwischen der programmierten Drehung und dem tatsächlichen Drehwinkel herauszufinden.

5. Sensoren Sensoren sind Fühler, mit denen Informationen von außen an den Roboter weiter gegeben werden können. Diese Informationen müssen im Programm abgefragt werden. Der Berührungssensor besteht aus einer kleinen Taste auf einer Seite eines LEGOSteins. Über die elektrischen Kontakte wird der Drucksensor (Berührungssensor) über ein Verbindungskabel mit einem der drei Eingänge des RCX-Bausteins verbunden. Diese sind mit den Zahlen 1 bis 3 bezeichnet. Den Berührungssensor kann man sich auch als Schalter vorstellen. Vor der Verwendung des Sensors muss dieser initialisiert werden, d. h. der Eingang und die Art des Sensors werden im Programm notiert. Durch das Programm muss gewährleistet sein, dass der Sensor ständig abgefragt wird. Beispiel: task main() { SetSensor(SENSOR_1,SENSOR_TOUCH); while (true) { if (SENSOR_1 == 1) { PlaySound(2); Wait (50); } }

}

//definiert Sensor an Eingang 1 //Endlosschleife, die den Sensor abfragt //wenn Sensor gedrückt //dann Start der Anweisungen //dann ertönt die Melodie 2 // Ende von if // Ende von while

// Ende Task

Aufgaben: 1. 2. 3. 4. 5.

Schließe den Tastsensor an den richtigen Eingang an. Teste das Programm. Der Roboter soll fahren. Er stoppt, wenn der Taster betätigt wird. (evtl. mit repeat) Baue den Stoßfänger gemäß Bauanleitung zusammen. Der Roboter soll geradeaus fahren. Wenn er auf ein Hindernis stößt, hält er an. Der Roboter soll, wenn er auf ein Hindernis stößt, rückwärts fahren und drehen.

Die Abfrage des Sensors erfolgt in einer Schleife, die in ähnlicher Form auch schon bei Karol

Programmieren von Lego – Robotern mit NQC

Gymnasium im Schloss Informatik 07 IT

Seite – 5.6 –

verwendet wurde. Dort wurde sie mit solange tue eingeleitet und die Folge der Anweisungen mit *solange beendet. In NQC ist diese Schleife so aufgebaut: while (Bedingung erfüllt) { //Beginn der Anweisungen }

// Ende der Schleife

Aufgabe: 1. Teste das Beispiel und beschreibe die Wirkung des Programms. 0 task main () 1 { 2 SetSensor(SENSOR_1, SENSOR_TOUCH); //definiert Sensor 3 while (SENSOR_1 != 1) //Schleifenbedingung 4 { 5 OnFwd(OUT_A+OUT_C); 6 Wait(10); 7 } //Ende der Schleife 8 9

Off (OUT_A+OUT_C); }

Die Bedingungen, die bei einer Schleife oder bei einer Verzweigung geprüft werden, bestehen meistens aus einem Vergleich. Hier wird der Wert abgefragt, den der Sensor hat. Es kommen nur die Werte 0 und 1 in Frage, da er gedrückt ist (1) oder nicht (0). Folgende Vergleichsmöglichkeiten gibt es: == < >= !=

ist genau gleich (siehe Seite 5.5) kleiner als kleiner oder gleich größer größer oder gleich ungleich (siehe oben)

Die Bedingung wird geprüft und ist erfüllt (true) oder nicht erfüllt (false). Je nach Ergebnis reagiert dann das Programm, indem die Schleife ausgeführt wird oder nicht. Aufgabe: 2. Teste das Beispiel und beschreibe die Wirkung und die Schwächen des Programms. 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 }

task main () { SetSensor(SENSOR_1, SENSOR_TOUCH); OnFwd(OUT_A+OUT_C); while (true) { if (SENSOR_1 = = 1) { OnRev(OUT_A+OUT_C); Wait(50); OnFwd(OUT_A); Wait(100); OnFwd(OUT_A+OUT_C); } }

// // // // // //