20.11.2014 Aufrufe

Programmierung der Lego Mindstorms Roboter

Programmierung der Lego Mindstorms Roboter

Programmierung der Lego Mindstorms Roboter

MEHR ANZEIGEN
WENIGER ANZEIGEN

Erfolgreiche ePaper selbst erstellen

Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.

<strong>Programmierung</strong> <strong>der</strong><br />

<strong>Lego</strong> <strong>Mindstorms</strong><br />

<strong>Roboter</strong><br />

Dipl.-Inform. O. Taminé<br />

Universität Karlsruhe (TH), Institut für Prozeßrechentechnik, Automation und Robotik<br />

Glie<strong>der</strong>ung<br />

❑ Infrastruktur<br />

Aufbau, Vorbereitungen, WWW-Links<br />

❑ NQC-<strong>Programmierung</strong><br />

Vorbereitungen, Kommandozeilen-<strong>Programmierung</strong>,<br />

IDE-Oberflächen<br />

❑ NQC-Sprachreferenz<br />

Beschreibung <strong>der</strong> NQC-Sprache<br />

Universität Karlsruhe (TH), Institut für Prozeßrechentechnik, Automation und Robotik


Teil I: Infrastruktur<br />

Universität Karlsruhe (TH), Institut für Prozeßrechentechnik, Automation und Robotik<br />

RCX-Baustein<br />

❑ Hitachi H8-Prozessor<br />

8 Bit, 16 Mhz<br />

❑ 32 Kbyte RAM<br />

❑ 16 Kbyte ROM<br />

❑ je drei Ein-/Ausgänge<br />

❑ Infrarot-Schnittstelle<br />

❑ 5 Programmspeicher<br />

Universität Karlsruhe (TH), Institut für Prozeßrechentechnik, Automation und Robotik


Speicheraufbau<br />

5x1,2 KByte RAM<br />

Programmspeicherplätze<br />

32 Kbyte<br />

statisches RAM<br />

16 Kbyte ROM<br />

1 2 3 4 5<br />

Firmware<br />

BIOS<br />

Universität Karlsruhe (TH), Institut für Prozeßrechentechnik, Automation und Robotik<br />

RCX-Display<br />

Batterieanzeige<br />

Kommunikation<br />

Aktiver Sensoranzeige<br />

Zeitanzeige<br />

Boot-Modus Ausgang<br />

View<br />

On/Off<br />

1 2 3<br />

^<br />

00.00<br />

^ ^<br />

1<br />

A B C<br />

Prgm<br />

Run<br />

Universität Karlsruhe (TH), Institut für Prozeßrechentechnik, Automation und Robotik


Infrarotsen<strong>der</strong><br />

Kommunikation PC -> <strong>Lego</strong> <strong>Mindstorms</strong><br />

Anschluß an COM-Port<br />

(1) Übertragung <strong>der</strong><br />

Firmware<br />

(2) Übertragung eigener<br />

Programme<br />

Universität Karlsruhe (TH), Institut für Prozeßrechentechnik, Automation und Robotik<br />

Stromversorgung<br />

9 Volt (6x1,5 V Mignon Batterien)<br />

1,5 V<br />

Alkaline<br />

NiCd<br />

Entladung<br />

Universität Karlsruhe (TH), Institut für Prozeßrechentechnik, Automation und Robotik


RCX-Code<br />

<strong>Lego</strong>-Programmiersprache<br />

Universität Karlsruhe (TH), Institut für Prozeßrechentechnik, Automation und Robotik<br />

WWW-Links<br />

Software, Dokumentationen,<br />

Büchertipps, WWW-Seiten, Teilnehmerlisten, ...<br />

auf <strong>der</strong> Praktikumshomepage:<br />

http://i61www.ira.uka.de/users/tamine/lego/<br />

Universität Karlsruhe (TH), Institut für Prozeßrechentechnik, Automation und Robotik


Teil II: NQC-<strong>Programmierung</strong><br />

Universität Karlsruhe (TH), Institut für Prozeßrechentechnik, Automation und Robotik<br />

Vorbereitung (Teil 1)<br />

Auf <strong>Lego</strong>-CD:<br />

System\spirit.ocx<br />

Firm\firm0309.lgo<br />

Download <strong>der</strong> RCX 2.0 Firmware:<br />

firm0328.lgo (Praktikumshomepage)<br />

Universität Karlsruhe (TH), Institut für Prozeßrechentechnik, Automation und Robotik


Software installieren (Teil 2)<br />

Installieren von Bricx Command Center:<br />

bricxcc.exe, Aktuelle Version: 3.3<br />

Win 95/98/ME/2000/XP<br />

Download von Homepage<br />

Alternativ:<br />

Installieren von NQC:<br />

nqc-win-2-3-r1.zip, Aktuelle Version: 2.3<br />

Download von Homepage<br />

Version 2.4 im Beta-Stadium<br />

Universität Karlsruhe (TH), Institut für Prozeßrechentechnik, Automation und Robotik<br />

Firmware übertragen (Teil 3)<br />

1. Möglichkeit Bricx Command Center:<br />

Menü Tools/Download Firmware<br />

Datei firm0328.lgo auswählen<br />

2. Möglichkeit:<br />

nqc -firmware pfad\firm0328.lgo<br />

o<strong>der</strong>: nqc -firmfast pfad\firm0328.lgo<br />

Universität Karlsruhe (TH), Institut für Prozeßrechentechnik, Automation und Robotik


Programmierumgebung I<br />

(1) NQC-Programm<br />

in Editor schreiben<br />

(2) DOS-Shell:<br />

Kompilieren +<br />

Übertragen an RCX<br />

Universität Karlsruhe (TH), Institut für Prozeßrechentechnik, Automation und Robotik<br />

Programmierumgebung II<br />

Universität Karlsruhe (TH), Institut für Prozeßrechentechnik, Automation und Robotik


Starten vom Bricx Command Center<br />

Suche nach<br />

eingeschaltetem <strong>Lego</strong><br />

<strong>Mindstorms</strong> <strong>Roboter</strong><br />

Falls <strong>Roboter</strong> nicht gefunden wird,<br />

sind nicht alle Funktionen verfügbar.<br />

Universität Karlsruhe (TH), Institut für Prozeßrechentechnik, Automation und Robotik<br />

Tool: Direct Control<br />

Direkte Steuerung <strong>der</strong><br />

RCX-Komponenten:<br />

❑ Sensoren:<br />

Typ + Modus <strong>der</strong> 3 Sensoren<br />

❑ Motoren:<br />

Vorwärts, Rückwärts,<br />

Bremsen, Leerlauf<br />

❑ Variablen:<br />

Wertzuweisung<br />

❑ Tasks:<br />

Starten + Anhalten <strong>der</strong><br />

10 Tasks<br />

Universität Karlsruhe (TH), Institut für Prozeßrechentechnik, Automation und Robotik


Tool: Diagnostics<br />

Anzeige von:<br />

❑ Status<br />

❑ Firmware-Version<br />

❑ Batteriestatus<br />

❑ Anschlußport<br />

❑ Aktueller Programmnr.<br />

❑ Auschaltzeit<br />

❑ Infrarotstärke<br />

❑ Einschaltzeit<br />

❑ Display-Anzeige<br />

Universität Karlsruhe (TH), Institut für Prozeßrechentechnik, Automation und Robotik<br />

Tool: Watching the RCX<br />

Beobachten folgen<strong>der</strong> RCX-Werte:<br />

❑ Variablen<br />

❑ Sensoren<br />

❑ Motoren<br />

❑ Timer<br />

❑ Infrarot<br />

❑ Zähler<br />

Universität Karlsruhe (TH), Institut für Prozeßrechentechnik, Automation und Robotik


Weitere Tools<br />

Send<br />

Message<br />

RCX-Piano<br />

Joystick<br />

Universität Karlsruhe (TH), Institut für Prozeßrechentechnik, Automation und Robotik<br />

Teil III: NQC-Sprachreferenz<br />

Universität Karlsruhe (TH), Institut für Prozeßrechentechnik, Automation und Robotik


NQC Sprachkonstrukte<br />

NQC = Not quite C<br />

❑ Lexikalische Strukturen<br />

❑ Programmstrukturen<br />

❑ Kontrollstrukturen<br />

❑ RCX API<br />

❑ Beispiele<br />

Universität Karlsruhe (TH), Institut für Prozeßrechentechnik, Automation und Robotik<br />

Lexikalische Strukturen<br />

❑ Kommentare<br />

// Einzeiliger Kommentar<br />

/* Dieser Kommentar belegt<br />

mehrere Zeilen */<br />

❑ Leerzeichen nicht notwendig, aber hilfreich<br />

x=2;<br />

x = 2;<br />

❑ Numerische Konstanten<br />

x = 10; // setzt x auf den Dezimalwert 10<br />

x = 0x10; // setzt x auf den Dezimalwert 16<br />

❑ Präprozessorbefehle wie in C<br />

Universität Karlsruhe (TH), Institut für Prozeßrechentechnik, Automation und Robotik


Der Präprozessor<br />

❑ Einbinden von Programmteilen<br />

#include “part2.nqc“<br />

❑ Substitution von Werten<br />

#define SCHWARZ 800<br />

❑ Speicherreservierung<br />

#pragma reserve 0 1 2<br />

notwendig bei Timern und Zählern<br />

Universität Karlsruhe (TH), Institut für Prozeßrechentechnik, Automation und Robotik<br />

Programmstrukturen I<br />

Tasks<br />

❑ RCX ist multitaskingfähig<br />

❑ unterstützt max. 10 Tasks<br />

❑ Tasks werden durch start task_name gestartet<br />

und durch stop task_name beendet<br />

❑ StopAllTasks(); beendet alle Tasks<br />

Beispiel:<br />

task main()<br />

{<br />

// Ein leerer Task<br />

}<br />

Universität Karlsruhe (TH), Institut für Prozeßrechentechnik, Automation und Robotik


Programmstrukturen II<br />

Unterprogramme<br />

❑ max. 8 Stück<br />

❑ keine Parameter<br />

❑ keine Rückgabewerte<br />

❑ keine Rekursion erlaubt<br />

❑ keine an<strong>der</strong>en Unterprogrammaufrufe erlaubt<br />

❑ nur 1 kompiliert (Speicherplatz sparend!)<br />

Beispiel:<br />

sub dummy()<br />

{<br />

// Ein leeres Unterprogramm<br />

}<br />

Universität Karlsruhe (TH), Institut für Prozeßrechentechnik, Automation und Robotik<br />

Programmstrukturen III<br />

Inline-Funktionen<br />

❑ kein Rückgabewert<br />

❑ Parameterübergabe per Wert und per Referenz<br />

❑ Funktionen werden beim Kompilieren an die<br />

Aufrufstelle kopiert (Makro)<br />

Beispiel:<br />

void fkt(int x, int& y) {<br />

x = 3; y = 2;<br />

}<br />

task main() {<br />

int y = 1; int x = 2; fkt(x, y);<br />

}<br />

Universität Karlsruhe (TH), Institut für Prozeßrechentechnik, Automation und Robotik


Variablen<br />

❑ nur 16-Bit Integer Variablen<br />

❑ Arrays erlaubt<br />

❑ Deklarationen wie in C<br />

❑ Ausdrücke wie in C erlaubt (++, *=, |, &&, >>, usw.)<br />

Beispiele:<br />

int a=1, x;<br />

x += a;<br />

a = 5 % 2; // modulo<br />

x = 31 | 1; // Or<br />

Universität Karlsruhe (TH), Institut für Prozeßrechentechnik, Automation und Robotik<br />

Globale und lokale Variablen<br />

❑ unterstützt max. 32 globale Variablen<br />

❑ max. 16 lokale Variablen<br />

Beispiel:<br />

int x = 0; // bin global<br />

task main() {<br />

int y; // bin lokal<br />

y = x; // ok<br />

}<br />

task move() {<br />

x = 5; // ok<br />

y = x; // nicht ok, y hier unbekannt<br />

}<br />

Universität Karlsruhe (TH), Institut für Prozeßrechentechnik, Automation und Robotik


Kontrollstrukturen<br />

❑ if (Bedingung) Block1 else Block2<br />

❑ while (Bedingung) Block<br />

❑ do Block while (Bedingung)<br />

❑ repeat (Ausdruck) Block<br />

❑ switch (Ausdruck) case<br />

❑ until (Bedingung);<br />

❑ Befehle break, continue, default usw. wie in C<br />

Beispiele:<br />

if (x==1) y = 3; else y = 4;<br />

while (x


Sensorik<br />

Berührungssensor<br />

Lichtsensor<br />

Ausgänge: SENSOR_1, SENSOR_2, SENSOR_3<br />

Sensoren: SENSOR_TOUCH, SENSOR_LIGHT<br />

SetSensor(Ausgang, Sensor) setzt einen Ausgang<br />

auf einen bestimmten Sensortyp<br />

Der Sensor wird dabei in seinem Standardmodus<br />

betrieben<br />

Universität Karlsruhe (TH), Institut für Prozeßrechentechnik, Automation und Robotik<br />

Berührungssensor<br />

Was macht dieses Programm ?<br />

task main()<br />

{<br />

SetSensor(SENSOR_1, SENSOR_TOUCH);<br />

OnFwd(OUT_A+OUT_C);<br />

until (SENSOR_1 == 1);<br />

Off(OUT_A+OUT_C);<br />

}<br />

Universität Karlsruhe (TH), Institut für Prozeßrechentechnik, Automation und Robotik


Sensor-Modi<br />

Const: SENSOR_TYPE_TOUCH, SENSOR_TYPE_LIGHT<br />

Befehl<br />

SetSensorType(Ausgang, const)<br />

SetSensorMode(Ausgang, mod)<br />

Beschreibung<br />

legt Sensortyp fest<br />

legt Sensormodus fest<br />

Modus<br />

Beschreibung<br />

SENSOR_MODE_RAW 0 bis 1023<br />

SENSOR_MODE_BOOL 0 bis 1<br />

SENSOR_MODE_EDGE zählt Zustandswechsel<br />

SENSOR_MODE_PULSE zählt Zustandsperioden<br />

SENSOR_MODE_PERCENT 0 bis 100 Prozent<br />

Universität Karlsruhe (TH), Institut für Prozeßrechentechnik, Automation und Robotik<br />

Funktionsweise eines Sensors<br />

SENSOR_MODE_RAW<br />

1023<br />

0<br />

SENSOR_MODE_PERCENT: Transformation des<br />

Raw-Wertes in den Wertebereich 0-100<br />

t<br />

Universität Karlsruhe (TH), Institut für Prozeßrechentechnik, Automation und Robotik


Boolescher Modus<br />

SENSOR_MODE_BOOL<br />

1023<br />

True<br />

False<br />

0<br />

t<br />

Universität Karlsruhe (TH), Institut für Prozeßrechentechnik, Automation und Robotik<br />

Zustandswechsel<br />

SENSOR_MODE_EDGE<br />

1023<br />

1<br />

3<br />

2<br />

4<br />

0<br />

t<br />

Universität Karlsruhe (TH), Institut für Prozeßrechentechnik, Automation und Robotik


Periodenwechsel<br />

SENSOR_MODE_PULSE<br />

1023<br />

1<br />

2<br />

0<br />

t<br />

Universität Karlsruhe (TH), Institut für Prozeßrechentechnik, Automation und Robotik<br />

RCX Events<br />

Befehl<br />

Beschreibung<br />

SetEvent(Nr, source, type) legt Sensorfest fest<br />

monitor(EVENT_MASK(Nr)) überwacht Event<br />

Typ<br />

EVENT_TYPE_PRESSED<br />

EVENT_TYPE_RELEASED<br />

EVENT_TYPE_PULSE<br />

EVENT_TYPE_EDGE<br />

EVENT_TYPE_LOW<br />

EVENT_TYPE_NORMAL<br />

EVENT_TYPE_HIGH<br />

EVENT_TYPE_MESSAGE<br />

EVENT_TYPE_FASTCHANGE<br />

Beschreibung<br />

Gedrückt<br />

Nicht gedrückt<br />

Periodenwechsel<br />

Zustandswechsel<br />

Wechsel in Niedrigbereich<br />

Wechsel in Normalbereich<br />

Wechsel in Hochbereich<br />

IR-Nachricht empfangen<br />

Schneller Wertwechsel<br />

Universität Karlsruhe (TH), Institut für Prozeßrechentechnik, Automation und Robotik


Event Modus<br />

1023<br />

Hoch<br />

Normal<br />

0<br />

Niedrig<br />

Universität Karlsruhe (TH), Institut für Prozeßrechentechnik, Automation und Robotik<br />

Beispiel: Lichtsensor<br />

task main() {<br />

SetSensorType(SENSOR_2, SENSOR_LIGHT);<br />

SetEvent(1, SENSOR_2, EVENT_TYPE_HIGH);<br />

SetEvent(2, SENSOR_2, EVENT_TYPE_LOW);<br />

SetLowerLimit(2, 550); SetUpperLimit(1, 790);<br />

monitor(EVENT_MASK(1) | EVENT_MASK(2)) {<br />

// tue was immer du willst...<br />

} catch (EVENT_MASK(1)) {<br />

// Schwarz gefunden<br />

} catch (EVENT_MASK(2)) {<br />

// Weiss gefunden<br />

} }<br />

Universität Karlsruhe (TH), Institut für Prozeßrechentechnik, Automation und Robotik


Kommunikation<br />

Befehle:<br />

❑ id = Message();<br />

id = 0: keinen Wert empfangen<br />

❑ SendMessage(id);<br />

versendet id (0-255)<br />

❑ ClearMessage();<br />

löschst den Empfangspuffer<br />

❑ SetTXPower(TX_POWER_LO)<br />

legt Sendestärke fest<br />

Universität Karlsruhe (TH), Institut für Prozeßrechentechnik, Automation und Robotik<br />

Beispiel Kommunikation<br />

#define __NOTETIME 10<br />

#define __WAITTIME 12<br />

task communication() {<br />

ClearMessage();<br />

SendMessage(5);<br />

// Warte auf Antwort<br />

until (Message() != 0);<br />

// ID empfangen<br />

if (Message() == 5) {<br />

// ID korrekt<br />

SendMessage(10);<br />

PlayTone(330,4*__NOTETIME); Wait(4*__WAITTIME);<br />

} else {<br />

// Falscher Partner<br />

OnRev(OUT_A+OUT_C);<br />

}<br />

}<br />

ClearMessage();<br />

}<br />

task main() { start communication;}<br />

Universität Karlsruhe (TH), Institut für Prozeßrechentechnik, Automation und Robotik


Programmumschaltung<br />

5 Programmspeicher<br />

Befehl<br />

SelectProgram(Nr)<br />

x = Program();<br />

Beschreibung<br />

wechselt Programm und<br />

startet es (Nr: 0-4)<br />

liest aktuelle Programmnr.<br />

aus<br />

Universität Karlsruhe (TH), Institut für Prozeßrechentechnik, Automation und Robotik<br />

Weitere Befehle<br />

❑ Musik<br />

❑ Zähler<br />

❑ Timer<br />

❑ Display<br />

❑ Datalog<br />

❑ Random<br />

❑ usw, usw., usw.<br />

Universität Karlsruhe (TH), Institut für Prozeßrechentechnik, Automation und Robotik


Letztes Beispiel: Semaphoren<br />

int sem;<br />

task main() {<br />

sem = 0; start move;<br />

SetSensor(SENSOR_1, SENSOR_TOUCH);<br />

while (true) {<br />

if (SENSOR_1 == 1) {<br />

until (sem == 0); sem = 1;<br />

OnRev(OUT_A); Wait(85);<br />

sem = 0; } }<br />

}<br />

task move() {<br />

while (true) {<br />

until (sem == 0); sem = 1;<br />

OnFwd(OUT_A);<br />

sem = 0; Wait(200);<br />

}}<br />

Universität Karlsruhe (TH), Institut für Prozeßrechentechnik, Automation und Robotik<br />

Viel Erfolg !!!!!!!<br />

Universität Karlsruhe (TH), Institut für Prozeßrechentechnik, Automation und Robotik

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!