Upload
ngodien
View
218
Download
0
Embed Size (px)
Universität Karlsruhe (TH), Institut für Prozeßrechentechnik, Automation und Robotik
Programmierung derProgrammierung derLego MindstormsLego MindstormsRoboterRoboterDipl.-Inform. O. Taminé
Universität Karlsruhe (TH), Institut für Prozeßrechentechnik, Automation und Robotik
Gliederung
❑ Infrastruktur Aufbau, Vorbereitungen, WWW-Links
❑ NQC-ProgrammierungVorbereitungen, Kommandozeilen-Programmierung,IDE-Oberflächen
❑ NQC-SprachreferenzBeschreibung der NQC-Sprache
Universität Karlsruhe (TH), Institut für Prozeßrechentechnik, Automation und Robotik
Teil I: Infrastruktur
Universität Karlsruhe (TH), Institut für Prozeßrechentechnik, Automation und Robotik
RCX-BausteinRCX-Baustein
❑ Hitachi H8-Prozessor8 Bit, 16 Mhz
❑ 32 Kbyte RAM
❑ 16 Kbyte ROM
❑ je drei Ein-/Ausgänge
❑ Infrarot-Schnittstelle
❑ 5 Programmspeicher
Universität Karlsruhe (TH), Institut für Prozeßrechentechnik, Automation und Robotik
SpeicheraufbauSpeicheraufbau
BIOS
Firmware
1 2 3 4 532 Kbytestatisches RAM
16 Kbyte ROM
5x1,2 KByte RAMProgrammspeicherplätze
Universität Karlsruhe (TH), Institut für Prozeßrechentechnik, Automation und Robotik
RCX-DisplayRCX-Display
Boot-Modus
View
On/Off
Prgm
Run
1 2 3
A B C
100.00
Zeitanzeige
^^^
SensoranzeigeBatterieanzeigeKommunikationAktiver Ausgang
Universität Karlsruhe (TH), Institut für Prozeßrechentechnik, Automation und Robotik
InfrarotsenderInfrarotsender
Kommunikation PC -> Lego Mindstorms
Anschluß an COM-Port
(1) Übertragung derFirmware
(2) Übertragung eigenerProgramme
Universität Karlsruhe (TH), Institut für Prozeßrechentechnik, Automation und Robotik
StromversorgungStromversorgung
9 Volt (6x1,5 V Mignon Batterien)
1,5 V
Entladung
Alkaline
NiCd
Universität Karlsruhe (TH), Institut für Prozeßrechentechnik, Automation und Robotik
RCX-CodeRCX-Code
Lego-Programmiersprache
Universität Karlsruhe (TH), Institut für Prozeßrechentechnik, Automation und Robotik
WWW-LinksWWW-Links
Software, Dokumentationen, Büchertipps, WWW-Seiten, Teilnehmerlisten, ...
auf der Praktikumshomepage:
http://i61www.ira.uka.de/users/tamine/lego/
Universität Karlsruhe (TH), Institut für Prozeßrechentechnik, Automation und Robotik
Teil II: NQC-Programmierung
Universität Karlsruhe (TH), Institut für Prozeßrechentechnik, Automation und Robotik
Vorbereitung (Teil 1)Vorbereitung (Teil 1)
Auf Lego-CD:System\spirit.ocxFirm\firm0309.lgo
Download der RCX 2.0 Firmware:firm0328.lgo (Praktikumshomepage)
Universität Karlsruhe (TH), Institut für Prozeßrechentechnik, Automation und Robotik
Software installieren (Teil 2)Software installieren (Teil 2)
Installieren von Bricx Command Center:bricxcc.exe, Aktuelle Version: 3.3
Win 95/98/ME/2000/XPDownload von Homepage
Alternativ:Installieren von NQC:
nqc-win-2-3-r1.zip, Aktuelle Version: 2.3Download von Homepage
Version 2.4 im Beta-Stadium
Universität Karlsruhe (TH), Institut für Prozeßrechentechnik, Automation und Robotik
Firmware übertragen (Teil 3)Firmware übertragen (Teil 3)
1. Möglichkeit Bricx Command Center:Menü Tools/Download FirmwareDatei firm0328.lgo auswählen
2. Möglichkeit:nqc -firmware pfad\firm0328.lgo
oder: nqc -firmfast pfad\firm0328.lgo
Universität Karlsruhe (TH), Institut für Prozeßrechentechnik, Automation und Robotik
Programmierumgebung IProgrammierumgebung I
(1) NQC-Programmin Editor schreiben
(2) DOS-Shell:Kompilieren +Übertragen an RCX
Universität Karlsruhe (TH), Institut für Prozeßrechentechnik, Automation und Robotik
Programmierumgebung IIProgrammierumgebung II
Universität Karlsruhe (TH), Institut für Prozeßrechentechnik, Automation und Robotik
Starten vom Starten vom Bricx Command Bricx Command CenterCenter
Suche nacheingeschaltetem LegoMindstorms Roboter
Falls Roboter nicht gefunden wird,sind nicht alle Funktionen verfügbar.
Universität Karlsruhe (TH), Institut für Prozeßrechentechnik, Automation und Robotik
Tool: Tool: Direct ControlDirect Control
Direkte Steuerung derRCX-Komponenten:
❑ Sensoren:Typ + Modus der 3 Sensoren
❑ Motoren:Vorwärts, Rückwärts, Bremsen, Leerlauf
❑ Variablen:Wertzuweisung
❑ Tasks:Starten + Anhalten der10 Tasks
Universität Karlsruhe (TH), Institut für Prozeßrechentechnik, Automation und Robotik
Tool: Tool: DiagnosticsDiagnostics
Anzeige von:
❑ Status❑ Firmware-Version❑ Batteriestatus❑ Anschlußport❑ Aktueller Programmnr.❑ Auschaltzeit❑ Infrarotstärke❑ Einschaltzeit❑ Display-Anzeige
Universität Karlsruhe (TH), Institut für Prozeßrechentechnik, Automation und Robotik
Tool: Tool: Watching the Watching the RCXRCX
Beobachten folgender RCX-Werte:❑ Variablen❑ Sensoren
❑ Motoren❑ Timer
❑ Infrarot❑ Zähler
Universität Karlsruhe (TH), Institut für Prozeßrechentechnik, Automation und Robotik
Weitere ToolsWeitere Tools
Joystick
RCX-PianoSendMessage
Universität Karlsruhe (TH), Institut für Prozeßrechentechnik, Automation und Robotik
Teil III: NQC-Sprachreferenz
Universität Karlsruhe (TH), Institut für Prozeßrechentechnik, Automation und Robotik
NQC SprachkonstrukteNQC Sprachkonstrukte
❑ Lexikalische Strukturen
❑ Programmstrukturen
❑ Kontrollstrukturen
❑ RCX API
❑ Beispiele
NQC = Not quite C
Universität Karlsruhe (TH), Institut für Prozeßrechentechnik, Automation und Robotik
Lexikalische StrukturenLexikalische Strukturen
❑ Kommentare // Einzeiliger Kommentar/* Dieser Kommentar belegt mehrere Zeilen */
❑ Leerzeichen nicht notwendig, aber hilfreichx=2;x = 2;
❑ Numerische Konstantenx = 10; // setzt x auf den Dezimalwert 10x = 0x10; // setzt x auf den Dezimalwert 16
❑ Präprozessorbefehle wie in C
Universität Karlsruhe (TH), Institut für Prozeßrechentechnik, Automation und Robotik
Der Der PräprozessorPräprozessor
❑ Einbinden von Programmteilen #include “part2.nqc“
❑ Substitution von Werten#define SCHWARZ 800
❑ Speicherreservierung#pragma reserve 0 1 2notwendig bei Timern und Zählern
Universität Karlsruhe (TH), Institut für Prozeßrechentechnik, Automation und Robotik
Programmstrukturen IProgrammstrukturen I
Tasks❑ RCX ist multitaskingfähig❑ unterstützt max. 10 Tasks❑ Tasks werden durch start task_name gestartet
und durch stop task_name beendet❑ StopAllTasks(); beendet alle Tasks
Beispiel:
task main(){ // Ein leerer Task}
Universität Karlsruhe (TH), Institut für Prozeßrechentechnik, Automation und Robotik
Programmstrukturen IIProgrammstrukturen II
Unterprogramme❑ max. 8 Stück❑ keine Parameter❑ keine Rückgabewerte ❑ keine Rekursion erlaubt❑ keine anderen Unterprogrammaufrufe erlaubt❑ nur 1 kompiliert (Speicherplatz sparend!)
Beispiel:sub dummy(){ // Ein leeres Unterprogramm}
Universität Karlsruhe (TH), Institut für Prozeßrechentechnik, Automation und Robotik
Programmstrukturen IIIProgrammstrukturen III
Inline-Funktionen❑ kein Rückgabewert❑ Parameterübergabe per Wert und per Referenz❑ Funktionen werden beim Kompilieren an die
Aufrufstelle kopiert (Makro)
Beispiel:void fkt(int x, int& y) { x = 3; y = 2;} task main() { int y = 1; int x = 2; fkt(x, y);}
Universität Karlsruhe (TH), Institut für Prozeßrechentechnik, Automation und Robotik
VariablenVariablen
❑ nur 16-Bit Integer Variablen❑ Arrays erlaubt❑ Deklarationen wie in C❑ Ausdrücke wie in C erlaubt (++, *=, |, &&, >>, usw.)
Beispiele:
int a=1, x;x += a;a = 5 % 2; // modulox = 31 | 1; // Or
Universität Karlsruhe (TH), Institut für Prozeßrechentechnik, Automation und Robotik
Globale und lokale VariablenGlobale und lokale Variablen
❑ unterstützt max. 32 globale Variablen
❑ max. 16 lokale Variablen
Beispiel:
int x = 0; // bin globaltask main() {
int y; // bin lokaly = x; // ok
}
task move() {x = 5; // oky = x; // nicht ok, y hier unbekannt
}
Universität Karlsruhe (TH), Institut für Prozeßrechentechnik, Automation und Robotik
KontrollstrukturenKontrollstrukturen
❑ if (Bedingung) Block1 else Block2❑ while (Bedingung) Block❑ do Block while (Bedingung)❑ repeat (Ausdruck) Block❑ switch (Ausdruck) case❑ until (Bedingung);❑ Befehle break, continue, default usw. wie in C
Beispiele:if (x==1) y = 3; else y = 4;while (x<10) {
y *= 5; x++; }until (SENSOR_1 == 1);
Universität Karlsruhe (TH), Institut für Prozeßrechentechnik, Automation und Robotik
MotorsteuerungMotorsteuerung
Konstanten: OUT_A, OUT_B, OUT_C
Befehl BeschreibungOn (const) schaltet Motor einOff(const) schaltet Motor ausFloat(const) schaltet auf LeerlaufFwd(const) vorwärtsRev(const) rückwärtsToggle(const) wechselt RichtungOnFwd(const) ein + vorwärtsOnRev(const) ein + rückwärtsOnFor(const, time) vorwärts für time/100 secSetPower(const, x) Geschwindigkeit (0-7)
Universität Karlsruhe (TH), Institut für Prozeßrechentechnik, Automation und Robotik
SensorikSensorik
Berührungssensor Lichtsensor
Ausgänge: SENSOR_1, SENSOR_2, SENSOR_3Sensoren: SENSOR_TOUCH, SENSOR_LIGHTSetSensor(Ausgang, Sensor) setzt einen Ausgangauf einen bestimmten SensortypDer Sensor wird dabei in seinem Standardmodusbetrieben
Universität Karlsruhe (TH), Institut für Prozeßrechentechnik, Automation und Robotik
BerührungssensorBerührungssensor
Was macht dieses Programm ?
task main(){
SetSensor(SENSOR_1, SENSOR_TOUCH);OnFwd(OUT_A+OUT_C);until (SENSOR_1 == 1);Off(OUT_A+OUT_C);
}
Universität Karlsruhe (TH), Institut für Prozeßrechentechnik, Automation und Robotik
Sensor-ModiSensor-Modi
Const: SENSOR_TYPE_TOUCH, SENSOR_TYPE_LIGHT
Befehl BeschreibungSetSensorType(Ausgang, const) legt Sensortyp festSetSensorMode(Ausgang, mod) legt Sensormodus fest
Modus BeschreibungSENSOR_MODE_RAW 0 bis 1023SENSOR_MODE_BOOL 0 bis 1SENSOR_MODE_EDGE zählt ZustandswechselSENSOR_MODE_PULSE zählt ZustandsperiodenSENSOR_MODE_PERCENT 0 bis 100 Prozent
Universität Karlsruhe (TH), Institut für Prozeßrechentechnik, Automation und Robotik
Funktionsweise eines SensorsFunktionsweise eines Sensors
SENSOR_MODE_RAW
1023
0
SENSOR_MODE_PERCENT: Transformation desRaw-Wertes in den Wertebereich 0-100
t
Universität Karlsruhe (TH), Institut für Prozeßrechentechnik, Automation und Robotik
Boolescher ModusBoolescher Modus
SENSOR_MODE_BOOL
False
1023
0
True
t
Universität Karlsruhe (TH), Institut für Prozeßrechentechnik, Automation und Robotik
ZustandswechselZustandswechsel
SENSOR_MODE_EDGE
1023
0
1
2
3
4
t
Universität Karlsruhe (TH), Institut für Prozeßrechentechnik, Automation und Robotik
PeriodenwechselPeriodenwechsel
SENSOR_MODE_PULSE
1023
01
2
t
Universität Karlsruhe (TH), Institut für Prozeßrechentechnik, Automation und Robotik
RCX RCX EventsEvents
Befehl BeschreibungSetEvent(Nr, source, type) legt Sensorfest festmonitor(EVENT_MASK(Nr)) überwacht Event
Typ BeschreibungEVENT_TYPE_PRESSED GedrücktEVENT_TYPE_RELEASED Nicht gedrücktEVENT_TYPE_PULSE PeriodenwechselEVENT_TYPE_EDGE ZustandswechselEVENT_TYPE_LOW Wechsel in NiedrigbereichEVENT_TYPE_NORMAL Wechsel in NormalbereichEVENT_TYPE_HIGH Wechsel in HochbereichEVENT_TYPE_MESSAGE IR-Nachricht empfangenEVENT_TYPE_FASTCHANGE Schneller Wertwechsel
Universität Karlsruhe (TH), Institut für Prozeßrechentechnik, Automation und Robotik
Niedrig
Normal
Event Event ModusModus
Hoch1023
0
Universität Karlsruhe (TH), Institut für Prozeßrechentechnik, Automation und Robotik
Beispiel: LichtsensorBeispiel: Lichtsensor
task main() {
SetSensorType(SENSOR_2, SENSOR_LIGHT);
SetEvent(1, SENSOR_2, EVENT_TYPE_HIGH);
SetEvent(2, SENSOR_2, EVENT_TYPE_LOW);
SetLowerLimit(2, 550); SetUpperLimit(1, 790);
monitor(EVENT_MASK(1) | EVENT_MASK(2)) {
// tue was immer du willst...
} catch (EVENT_MASK(1)) {
// Schwarz gefunden
} catch (EVENT_MASK(2)) {
// Weiss gefunden
} }
Universität Karlsruhe (TH), Institut für Prozeßrechentechnik, Automation und Robotik
KommunikationKommunikation
❑ id = Message();id = 0: keinen Wert empfangen
❑ SendMessage(id);versendet id (0-255)
❑ ClearMessage();löschst den Empfangspuffer
❑ SetTXPower(TX_POWER_LO)legt Sendestärke fest
Befehle:
Universität Karlsruhe (TH), Institut für Prozeßrechentechnik, Automation und Robotik
Beispiel KommunikationBeispiel Kommunikation
#define __NOTETIME 10#define __WAITTIME 12
task communication() { ClearMessage(); SendMessage(5); // Warte auf Antwort until (Message() != 0); // ID empfangen if (Message() == 5) { // ID korrekt SendMessage(10); PlayTone(330,4*__NOTETIME); Wait(4*__WAITTIME); } else { // Falscher Partner OnRev(OUT_A+OUT_C); } } ClearMessage(); }task main() { start communication;}
Universität Karlsruhe (TH), Institut für Prozeßrechentechnik, Automation und Robotik
ProgrammumschaltungProgrammumschaltung
5 Programmspeicher
Befehl BeschreibungSelectProgram(Nr) wechselt Programm und
startet es (Nr: 0-4)x = Program(); liest aktuelle Programmnr.
aus
Universität Karlsruhe (TH), Institut für Prozeßrechentechnik, Automation und Robotik
Weitere BefehleWeitere Befehle
❑ Musik
❑ Zähler
❑ Timer
❑ Display
❑ Datalog
❑ Random
❑ usw, usw., usw.
Universität Karlsruhe (TH), Institut für Prozeßrechentechnik, Automation und Robotik
Letztes Beispiel: SemaphorenLetztes Beispiel: Semaphoren
int sem;task main() {
sem = 0; start move;SetSensor(SENSOR_1, SENSOR_TOUCH);while (true) {
if (SENSOR_1 == 1) {until (sem == 0); sem = 1;OnRev(OUT_A); Wait(85);sem = 0; } }
}task move() {
while (true) {until (sem == 0); sem = 1;OnFwd(OUT_A);sem = 0; Wait(200);
}}
Universität Karlsruhe (TH), Institut für Prozeßrechentechnik, Automation und Robotik
Viel Erfolg !!!!!!!