AMIGA-Magazin · Ausgabe 11/03 · Lego Mindstorms: »NQC für Amiga«

Aktuelles Heft 11/03

Baustein-Roboter

Die »Lego Mindstorms« sind eine Produktreihe von Lego, die es ermöglicht Roboter aus Lego-Steinen zu bauen und zu programmieren. Mit Hilfe des NQC-Ports kann man diese Programme auch auf dem Amiga entwickeln.

von Uwe Ryssel

Das Herz:
Über dem RCX_Block werden die Lego-Mindstorms-Kreationen gesteuert.

Die Mindstorms-Serie ist im Prinzip eine Erweiterung der Lego-Technic-Reihe. Aus den Technic-Teilen werden Mechaniken aufgebaut, die dann durch einen beiliegenden Mikrocomputer über Sensoren und Motoren bewegt und gesteuert werden können. Das bekannteste Lego-Mindstorms-Produkt ist das Basissystem »Robotics Invention System« ­ kurz RIS genannt. Es enthält den Mikrocomputer RCX, der über je drei Ein- und Ausgänge für Sensoren und Aktoren verfügt. Weiterhin enthalten ist ein IR-Transmitter für die Übertragung von Daten zwischen Computer unddem RCX-Block.

Das RIS gibt es in verschiedenen Versionen. Aktuell ist die 2.0. Bei dieser Version ist ein USB-IR-Transmitter und der RCX 2.0 enthalten. Im Gegensatz dazu enthalten die älteren Versionen 1.0 und 1.5 einen seriellen IR-Transmitter und den RCX 1.0. Die Besonderheit des RCX ist, dass man die Firmware austauschen kann. In Deutschland nicht erhältlich ist das »Robotics Discovery Set«, das den einfacheren Scout enthält. Dieser verfügt nur über je zwei Ein- und Ausgänge. Weitere Mindstorms-Produkte sind, neben ein paar Erweiterungssets zum »Robotics Invention System«, das »Dark Side Developer Kit« und das »Droid Developer Kit«. Beide enthalten den sehr einfachen Micro-Scout. Dieser ist nur in Verbindung mit dem RCX oder Scout sinnvoll.

Neben der Mindstorms-Reihe bietet Lego noch weitere programmierbare Roboter-Sets an: Den »Lego Technic Cybermaster« und die »Spybotics«-Reihe. Eigentlich wurde Lego Mindstorms für Kinder entwickelt. Doch vor allem der RCX erfreut sich auch bei Erwachsenen großer Beliebtheit. An einigen Universitäten wird Lego Mindstorms, vor allem der RCX, sogar in der Lehre von Informatik- und Robotikkonzepten verwendet.

Die Programmierung
Da der RCX der vielseitigste und am meisten verwendetste Mikrocomputer von Mindstorms ist, soll er an dieser Stelle Thema sein. Die Bedienung der anderen Controller ist ähnlich. Normalerweise wird der RCX über die beiliegende Software grafisch programmiert. Dabei werden die einzelnen Blöcke, die Aktionen, Bedingungen oder Schleifen repräsentieren, per Drag&Drop zusammengestellt.

Das damit erzeugte Programm wird in einen Bytecode übersetzt und zum RCX gesendet. Die Firmware des RCX interpretiert den erzeugten Bytecode und führt die Aktionen aus. Es können bis zu fünf dieser Programme auf den RCX geladen werden, aber nur ein Programm wird zur gleichen Zeit ausgeführt.

Die grafische Programmierung ist zwar für Anfänger sehr gut geeignet, aber für Fortgeschrittene nicht mächtig genug. Auch bevorzugen Programmierer eher eine textbasierte Programmiersprache. Ein weiteres Manko ist, dass die beiliegende Software nur für Windows geschrieben ist. Ein paar gute Gründe für Dave Baum die Programmiersprache NQC ­ Not quite C oder in Deutsch »Nicht ganz C« ­ zu entwickeln. NQC ist eine C-ähnliche Programiersprache für die Programmierung der schon genannten Mikrocomputer RCX, Scout, Cybermaster und Spybotics.

Das Programm NQC übernimmt dabei die Compilierung der NQC-Sourcen und erzeugt den selben Bytecode wie der grafische RCX-Code. Für die Übertragung wird der serielle und der USB-Transmitter unterstützt. Die aktuelle Version von NQC ist 2.5r1 und wurde im April diesen Jahres veröffentlicht.

NQC wurde ursprünglich für den Apple Macintosh und Windows geschrieben, aber wegen der portablen Programmierweise gibt es auch Versionen für Linux, Solaris, BeOS und jetzt auch für AmigaOS. NQC ist kommandozeilenorientiert, wird also aus einer Shell bedient. Für Mac und Windows existieren Entwicklungsumgebungen, die auf NQC aufbauen.

Der Amiga-Port
Wie das original NQC ist auch die Amiga-Version kommandozeilenorientiert, d.h. NQC wird aus der Shell gestartet. Es werden beide Transmitter-Arten unterstützt. Für den USB-Transmitter wird natürlich eine USB-Karte und der USB-Stack Poseidon von Chris Hodges benötigt. Bevor Sie anfangen, sollte der RCX mit den entsprechenden Batterien versorgt und der IR-Transmitter an den Computer angeschlossen werden.
Zuerst sollte man das NQC-Archiv irgendwo auf der Festplatte im System mit

lha x nqc.lha

entpacken. Enthalten ist das Hauptprogramm NQC und eine englische Anleitung, die alle Optionen und Kommandos von NQC beschreibt, und ein Beispielprogramm zum Testen.

Als erstes muss angegeben werden, an welchem Anschluss sich der IR-Transmitter befindet. Voreinstellung ist die serielle Schnittstelle (serial.device Unit 0). Mit der Option -S kann man auf eine andere Schnittstelle oder auf USB umschalten ­ die Option

-Susb

steht für die Kommunikation über USB und

-Sioblixser.device:3

für die Kommunikation über ioblixser.device Unit 3.

Zum Testen geben Sie folgende Kommandozeile ein:

nqc -S<device> -near

Wobei für <device> die zu verwendende Schnittstelle einzusetzen ist.
Damit wird der RCX in den Nah-Modus geschaltet. Wenn keine Fehlermeldungen erscheinen, die mit der seriellen Schnittstelle, dem USB-Port oder dem IR-Transmitter zu tun haben, funktioniert die Kommunikation zum IR-Transmitter. Wenn bei dem Testkommando die Fehlermeldung »No firmware installed on RCX« erscheint, muss die Firmware noch heruntergeladen werden. Bei »No reply from RCX« ist die Verbindung zwischen IR-Transmitter und RCX gestört oder der RCX ist noch nicht angeschaltet. Damit man nicht bei jedem Kommando die Schnittstelle neu angeben muss, kann man auch die Umgebungsvariable RCX_PORT setzen:

setenv RCX_PORT "usb"

oder

setenv RCX_PORT "ioblixser.device:3"

Natürlich sollte Sie nicht vergessen die Umgebungsvariable auf die Festplatte zu sichern:

copy ENV:RCX_PORT ENVARC:

Da NQC für verschiedene Systeme geeignet ist, kann man die Ziel-Hardware mit der Option -T<target> angeben. Die Option <target> kann dabei RCX, RCX2, CM, Scout oder Spy sein, wobei RCX voreingestellt ist.

Diese und gegebenenfalls weitere Optionen, die bei jedem Aufruf verwendet werden sollen, können auch in der Umgebungsvariablen NQC_OPTIONS gesetzt werden. Ein Beispiel zu den Optionen wäre:

>setenv NQC_OPTIONS "-TRCX2"

Danach nicht vergessen die Variable dauerhaftzu sichern:

copy ENV:NQC_OPTIONS ENVARC:


Die Firmware

Listing 1: Ein erstes einfaches Beispiel zu NQC.

#define BUTTON SENSOR_1
#define MOTOR OUT_A

task main()
{
#ifdef __RCX
// RCX needs to be told what kind of
// sensor is used
SetSensor(BUTTON, SENSOR_TOUCH);
#endif

On(MOTOR);
until(BUTTON == 1);

PlaySound(SOUND_CLICK);
Off(MOTOR);
}

Der RCX benötigt zum Abarbeiten der Programme eine Firmware. Diese muss vor dem ersten Benutzen, oder nachdem die Batterien mehr als eine Minute aus den RCX entfernt wurden, auf den RCX heruntergeladen werden. Die Firmware ist zwar auf der mitgelieferten CD-ROM enthalten, aber man kommt nur an die Datei heran, wenn man die Software auf einen Windows-Rechner installiert.

Wenn Sie die Möglichkeit haben, finden Sie die Firmware unter dem Dateinamen »firm0328.lgo«. Wenn kein Windows-PC vorhanden ist, kann man sich folgendermaßen behelfen: Auf der Homepage von Lego Mindstorms wird die Firmware in der Version 2.0 zum Herunterladen angeboten. Sie ist mit der Version auf der RIS 2.0-CD-ROM identisch und ist als Update für Besitzer der älteren RIS 1.0 und 1.5-Sets gedacht. Unter http://mindstorms.lego.com/sdk2/default.asp finden Sie die Firmware. Leider ist auch hier eine Windows- Installation nötig.

Glücklicherweise gibt es unter http://mindstorms.lego.com/sdk2beta/default.asp eine ältere Beta-Version, die nur mit ZIP gepackt wurde. Auch hier ist der Name der Firmware »firm0328.lgo«. Wenn Sie die Firmware haben, müssen Sie sie nur noch auf den RCX laden. Das kann mit normaler und mit doppelter Geschwindigkeit geschehen. Die zweite Methode verkürzt die Übertragungszeit von vier auf zwei Minuten. Die Befehle lauten:

nqc -firmware firm0328.lgo

und

nqc -firmfast firm0328.lgo

Beim Herunterladen der Firmware, insbesondere im schnellem Modus, sollte der RCX nicht zu weit vom IR-Transmitter entfernt sein. Etwa 10 Zentimeter Abstand zwischen Transmitter und RCX sind zu empfehlen.

Das erste Programm
Zum Verstehen und Programmieren in NQC sind grundlegende Kenntnisse der Programmiersprache C nötig. Es ist empfehlenswert eines der vielen C-Tutorials im Internet zu lesen. Das NQC-Archiv enthält einen Beispiel-Code mit der Bezeichnung »test.nqc« (s. Listing 1) zum Testen des Compilers und der Übertragung zum RCX. Schließen Sie zuvor einen Drucksensor an den Eingang 1 und einen Motor an Ausgang A des RCX an. Mit

nqc -d test.nqc

wird der Quellcode kompiliert und zum RCX übertragen. Die Option -d gibt dabei an, dass der kompilierte Code direkt zum RCX gesendet wird. Das Programm wird dabei auf die aktuelle Programmnummer des RCX geladen. In RCX_PORT sollte natürlich die richtige Schnittstelle stehen. Wenn die Übertragung erfolgreich verlaufen ist, können Sie mit der RUN-Taste des RCX das Programm starten. Jetzt sollte sich der Motor bewegen und sobald der Drucksensor betätigt wird wieder anhalten. Dabei wird ein kurzer Ton erzeugt. Eine Vorauswahl der Programmnummer und das Starten des Programmes kann auch über NQC erledigt werden. Mit

nqc -d -pgm 3 test.nqc -run

wird zuerst die Programmnummer mit der Option ­pgm 3 auf 3 gestellt, dann die Datei test.nqc kompiliert und der Bytecode an den Kontrollblock übertragen und am Ende das Programm auf dem RCX gestartet (-run).

Informationen im Internet
Lego http://www.lego.de
Lego Mindstorms http://www.mindstorms.de
NQC-Homepage http://www.baumfamily.org/nqc/
Programmer´s Guide http://lug.mfh-iserlohn.de/lego/
NQC-API (HTML-Format) http://www.cybercomm.net/~rajcok/ nqc/

Nun, was macht test.nqc genau? Die Sensoren werden über die Symbole SENSOR_1, SENSOR_2 und SENSOR_3 angesprochen. Die Ausgänge mit OUT_A, OUT_B und OUT_C. Man sollte immer neue Symbole für die Ein- und Ausgänge mit Hilfe von #define definieren.
Wenn sich die Belegung der Ein- oder Ausgänge ändern sollte, braucht man nicht das ganze Programm abzuändern, sondern man muss nur die #define-Zeilen anpassen. Auch wird das Programm dadurch lesbarer, weil man sofort weiß, was an welchem Ein- oder Ausgang hängt.

Mit task main() wird der Start-Task definiert. Der RCX ist multitaskingfähig und unterstützt bis zehn Tasks pro Programm. In NQC werden die Tasks mit

task <name>()
{ ... }

definiert, wobei der Task main immer existieren muss. Weitere Tasks werden mit start <name> gestartet. In diesem Beispiel wird aber nur ein Task verwendet.

Da es mehrere Typen von Sensoren für den RCX gibt, muss am Anfang des Programmes mit SetSensor die Art des verwendeten Sensors angegeben werden. Der Wert SENSOR_TOUCH entspricht einem Drucksensor mit booleschem Wertebereich. Das bedeutet, dass als Werte nur 0 und 1 in Frage kommen. Im Gegensatz dazu wird bei SENSOR_LIGHT ein Lichtsensor mit prozentualem Wertebereich festgelegt.

Mit On(MOTOR) wird der Motor angeschaltet. Mehrere Ausgänge können mit + verknüpft werden, d.h. On(OUT_A + OUT_B) würde die Ausgänge A und B anschalten.

until(BUTTON == 1);

ist eine leere Schleife und wird solange ausgeführt bis BUTTON gleich 1 ist. Wie man sieht, werden die Werte der Sensoren direkt wie Variablen gelesen. Übrigens ist until(<bedingung>) nur ein Makro und entspricht while(!<bedingung>).

Mit PlaySound(SOUND_ CLICK) wird der kurze Ton abgespielt und danach mit Off(MOTOR) der Motor wieder abgeschaltet. Die Abarbeitung des Programms endet mit dem Programmende und der RCX wechselt in den STOP-Modus.

Etwas komplexer

Frontend
Ein Mindstorms-Roboter mit dem RCX-Block als Kernstück kann über NQC programmiert werden.

Das nächste Programm (s. Listing 2) wurde für den in der »Constructopedia« (der Bauanleitung des RIS) beschriebenen Roverbot mit Kettenantrieb und Doppelsensor-Stoßfänger geschrieben. Es lässt den Roverbot vorwärts fahren bis er auf ein Hindernis trifft. Beim Auftreffen setzt er kurz zurück, dreht sich um eine viertel Drehung und fährt dann weiter. Gleich am Anfang von Task main wird eine Variable x deklariert. Der RCX kennt nur einen Datentyp: Integer (int). Das ist eine vorzeichenbehaftete 16-Bit-Zahl.

Variablen können global und lokal deklariert werden. Es ist aber zu beachten, dass die Anzahl der Variablen beschränkt ist. »RCX 1.0« hat insgesamt nur 32 globale Variablen zur Verfügung. Der Nachfolger »RCX 2.0« besitzt noch zusätzlich 16 lokale Register. Da NQC für Zwischenergebnisse auch Variablen benötigt, können nicht alle vorhandenen Register im Quellcode benutzt werden.

Nach der Initialisierung der Sensoren werden die Ausgänge eingestellt. Mit SetDirection() kann man die Drehrichtung der Motoren verändern. OUT_FWD steht für vorwärts und OUT_REV für rückwärts. Die Geschwindigkeit der Motoren, genauer die Spannung, die an den Ausgängen ausgegeben wird, kann mit SetPower() beeinflusst werden. Möglich sind Werte zwischen 0 (langsam bzw. niedrig) und 7 (schnell bzw. hoch).

Danach wird mit Wait() eine Sekunde gewartet. Wait() verlangt dabei eine Zeitangabe in hundertstel Sekunden. Bevor das Programm in eine Endlosschleife geht, werden beide Motoren angeschaltet und der Roverbot fährt los. Mit

until((LEFT == 1) ||(RIGHT == 1));

wird solange »gewartet« bis einer der Sensoren auslöst. Da die spätere Drehrichtung abhängig von dem Sensor ist, der betätigt wurde, muss die Richtung gespeichert werden. Je nach dem ausgelösten Sensor wird x auf 1 oder 2 gesetzt.

Jetzt werden beide Motoren angehalten, die Fahrtrichtung verändert und die Motoren für eine Sekunde eingeschaltet. Das Fahrzeug fährt kurz rückwärts. Je nach Drehrichtung werden die Fahrtrichtungen der Motoren gegensätzlich festgelegt und wieder werden die Motoren für eine bestimmte Zeit eingeschaltet. Das bewirkt eine Drehung des Roverbots auf der Stelle. Danach fährt das Fahrzeug wieder vorwärts und die Schleife fängt von vorn an. Durch die Endlosschleife wird das Programm erst beendet, wenn RUN auf dem RCX gedrückt wird.

Weitere Möglichkeiten
NQC bietet noch viele weitere Möglichkeiten der Programmierung, die noch erwähnt werden sollen:

Dies sollte nur eine kleine Einführung in die Welt der Lego-Mindstorms-Roboter und deren Programmierung mit NQC sein. Im Internet gibt es viele Bauanleitungen für solche Roboter. Natürlich auch mit den zugehörigen Programmen in NQC. Als Empfehlung soll die Homepage von NQC-Entwickler Dave Baum, die vollständige Anleitungen für die NQC-Sprache und einige Tutorials anbietet, außerdem der Programmer´s Guide

lb


 Hauptseite © 2003 All Rights Reserved. Alle Rechte vorbehalten Franzis' Verlag GmbH
Veröffentlichung und Vervielfältigung nur mit schriftlicher Genehmigung des Verlags

Kommentare, Fragen, Korrekturen und Kritik bitte an Webmaster AMIGA schicken.
Zuletzt aktualisiert am 5.10. 2003.