Gedankenstürme der dritten Art

LEGO Mindstorms EV3 Roboter mit Java programmieren – das Tutorial

Bernhard Löwenstein

© S&S Media

Mit der Mindstorms-Reihe bietet LEGO seit mittlerweile fast drei Jahrzehnten Roboterbaukästen für Technikinteressierte an. Das im September 2013 veröffentliche EV3-Set ist die aktuelle Version. Der Artikel gibt eine technologische Einführung und zeigt, wie man die EV3-Roboter mit Java programmiert.

Was 1932 mit der Herstellung von Holzspielzeug durch einen dänischen Tischlermeister begann, setzte in den darauffolgenden Jahrzehnten zu einem nicht enden wollenden Siegeszug an, der bis heute anhält. Statt Holz wird zwar seit 1949 Kunststoff verwendet, der Name des Unternehmens besteht aber seit 82 Jahren: LEGO. Seit vielen Generationen bauen Kinder und Erwachsene damit rund um den Globus mehr oder weniger phantasievolle Gebilde zusammen.

Das LEGO-Imperium umfasst aber nicht mehr nur einfache Plastiksteine. Mit der Mindstorms-Baukastenserie bietet der dänische Konzern seinen kleinen und großen Fans auch programmierbare Elemente. Das Besondere dabei ist, dass diese speziellen Komponenten nahtlos mit den restlichen LEGO-Steinen kombiniert werden können und sich so unterschiedliche Roboter konstruieren lassen. Wie man diese mit der Java-Schnittstelle leJOS EV3 programmiert, erfahren Sie nach einer kurzen technologischen Einführung.

EV3-Hardware im Überblick

LEGO Mindstorms EV3 ist in zwei verschiedenen Editionen verfügbar: der Home Edition und der Education Edition (Abb. 1). Die beiden Pakete unterscheiden sich durch die im Lieferumfang enthaltenen Teile. Jedes Set enthält neben einer großen Zahl an LEGO-Technikelementen einen programmierbaren Mikrocontroller, an den sich verschiedene Aktoren und Sensoren anschließen lassen. Ganz der LEGO-Philosophie folgend, können mit einem solchen Baukasten unterschiedliche Roboter konstruiert werden. Die große Zahl an Variationsmöglichkeiten trägt maßgeblich zur Faszination bei.

Abb. 1: Der EV3RSTORM ist ein Standardmodell der EV3-Generation

Abb. 1: Der EV3RSTORM ist ein Standardmodell der EV3-Generation

 

Das Herzstück des Systems ist der programmierbare EV3-Stein. In ihm steckt ein ARM9-Prozessor, der mit 300 MHz läuft und auf 64 MB Arbeitsspeicher und 16 MB Flash-Speicher zurückgreifen kann. Als Betriebssystem kommt Linux zum Einsatz. Sechs AA-Batterien versorgen den Mikrocontroller mit Energie. Als Alternative lässt sich ein Akkumodul verwenden, das allerdings nur Bestandteil der Education Edition ist. Auf dem EV3-Stein finden sich weiterhin ein monochromes LCD mit einer Auflösung von 178 x 128 Pixel sowie mehrere Navigationsknöpfe, die sich bei Bedarf genauso wie das Display programmieren lassen. Ein Lautsprecher komplementiert den Baustein. Für den Anschluss von Aktoren stehen vier Ausgangsports (A bis D) zur Verfügung, für Sensoren bietet er vier Eingänge (1 bis 4). Wer damit nicht auskommt, kann per USB-Kabel zwei oder mehr EV3-Steine miteinander verketten und aus seinem Programm heraus auf die Aktoren und Sensoren der mit dem Hauptstein verketteten EV3-Steine zugreifen. LEGO spricht in diesem Zusammenhang vom Reihenschaltungsmodus. Zum Transfer des Programms vom Computer auf den Baustein stehen USB und Bluetooth bereit. Weiterhin lässt sich an den USB-2.0-Anschluss ein WiFi-Dongle zur WLAN-Kommunikation anschließen, der aber gesondert erworben werden muss. Ergänzt wurde außerdem ein Micro-SD-Kartenleser, dank dem der Speicherplatz auf bis zu 32 GB erweitert werden kann (Abb. 2).

Abb. 2: Die Motoren und Sensoren lassen sich über Kabel mit dem EV3-Stein verbinden

Abb. 2: Die Motoren und Sensoren lassen sich über Kabel mit dem EV3-Stein verbinden

Als Aktoren sind dem Baukasten zwei große und ein mittlerer Servomotor mit integriertem Rotationssensor beigepackt. Hinsichtlich der Sensoren kann der Nutzer bei der Home Edition auf einen Infrarotsensor inklusive Fernsteuerung, einen Farbsensor und einen Berührungssensor zurückgreifen. Bei der Education Edition gibt es einen Ultraschallsensor, einen Farbsensor, einen Gyrosensor und zwei Berührungssensoren. Der Infrarotsensor lässt sich genauso wie der Ultraschallsensor für Abstandsmessungen nutzen. In Kombination mit der Fernsteuerung bietet erstgenannter aber noch zwei weitere Modi: Einerseits kann man die Lage des Sensormoduls in Bezug auf die Fernsteuerung abfragen und andererseits über die Fernsteuerung verschiedene Steuerbefehle an den Roboter senden. Der Farbsensor identifiziert Farben, der Gyrosensor registriert Drehbewegungen und der Berührungssensor reagiert auf Druckkontakte. Wer mit diesen Bauteilen nicht auskommt, kann das Erweiterungsset erwerben. Reicht das immer noch nicht aus, kann man bei Fremdanbietern weitere Hardware dazukaufen. Auch verschiedene Aktoren und Sensoren, die eigentlich für NXT 2.0 entwickelt wurden, sind mit der EV3-Version weiterhin nutzbar.

Java-Programmierung mit leJOS EV3

Es stehen unterschiedliche Umgebungen und Sprachen zur Programmierung der zusammengebauten Roboter bereit. Die auf LabVIEW basierende EV3-Software stellt die standardmäßige Programmierumgebung dar. Es handelt sich dabei um eine ikonische Programmierumgebung, die auf Kinder und Erwachsene ohne jegliche Programmiererfahrung abzielt. Die Programmierung der EV3-Roboter ist außerdem mit Java möglich. Dazu muss man sich das kostenlose und Open Source bereitgestellte Softwarepaket leJOS EV3 von der zugehörigen Website herunterladen und installieren. Es ist für Windows, Linux und Mac OS X verfügbar.

Musste der Java-Entwickler in der Vorgängerversion noch die Firmware des NXT-Steins ersetzen, erzeugt er sich nun einfach mithilfe des EV3 SD Card Creators eine zu bootende SD-Karte mit Linux, inklusive einer Java-SE-Embedded-7-Laufzeitumgebung. Nach nur wenigen Sekunden steht die SD-Karte bereit, die man anschließend nur noch in den Micro-SD-Kartenleser einlegen muss. Der erste Start dauert aufgrund verschiedener Initialisierungsarbeiten zwar etwas länger, bei den folgenden Starts bootet der EV3-Stein aber innerhalb einer Minute. Will jemand seinen Roboter wieder mit der EV3-Software programmieren, muss er lediglich die SD-Karte herausnehmen.

Als JDK sollte auf dem Entwicklungsrechner die 7er-Version eingesetzt werden, als Programmierumgebung empfiehlt sich die aktuellste Version der Eclipse IDE for Java Developers, denn dafür gibt es ein passendes leJOS-EV3-Plug-in. Wichtig ist, dass beide Softwarepakete in der 32-Bit-Variante verwendet werden, denn sonst gibt es Probleme beim Zusammenspiel mit leJOS EV3. Wer Windows verwendet und seinen EV3-Stein über USB ansprechen möchte, muss zusätzlich noch den RNDIS/Ethernet-Gadget-Treiber installieren. Danach kann es mit der Java-Programmierung auch schon losgehen.

Zu Beginn ein paar Grundlagen

Am Beginn steht das Anlegen eines passenden Projekts. Durch Auswahl des Projekttyps LeJOS EV3 Project fügt Eclipse automatisch dem neu angelegten Projekt die erforderliche Klassenbibliothek hinzu. Alle Klassen mit main-Methode können außerdem als LeJOS EV3 Program ausgeführt werden, wodurch sie in kompilierter Form auf den EV3-Stein hochgeladen und dort gestartet werden. Das nachträgliche Umwandeln eines Standardprojekts in ein EV3-Projekt ist ebenfalls möglich. Das Ansprechen der Hardware ist denkbar einfach. Für jeden Bauteil gibt es eine zugehörige Java-Klasse, über die sich der jeweilige Aktor oder Sensor steuern und abfragen lässt.

Um einen großen Motor anzusprechen, ist im ersten Schritt ein entsprechendes Objekt zu instanziieren. Dem Konstruktor ist dabei der Port zu übergeben, an dem der Motor angeschlossen ist. Über das erzeugte Objekt erfolgen anschließend die gewünschten Methodenaufrufe:

RegulatedMotor motor = new EV3LargeRegulatedMotor(MotorPort.A);

motor.forward();

// ...

motor.stop();

motor.close();

forward() und backward() stellen wohl die wichtigsten der unzähligen verfügbaren Methoden dar. Sie werden nicht-blockierend ausgeführt, der Motor wird also in die gewählte Richtung losgedreht. Unmittelbar danach folgt die Ausführung der darauffolgenden Programmzeilen. Erst ein Aufruf von stop() hält den Motor wieder an. Mit rotate() steht zur Motorsteuerung auch eine blockierende Variante zur Verfügung. Hier ist als Aufrufargument der Drehwinkel zu übergeben.

Bei einem mittleren Motor muss lediglich ein Objekt der Klasse EV3MediumRegulatedMotor erstellt werden, der Rest bleibt gleich. Weiterhin können die Motoren auch direkt über die bereitgestellten statischen Objekte angesprochen werden:

Motor.A.forward();

// ...

Motor.A.stop();

Zur Abfrage der Sensoren wurde in leJOS EV3 ein Sensorframework integriert, mit dem sich alle Sensoren einheitlich ansprechen lassen. Nachdem ein Sensor mehrere Abfragemodi bieten kann, muss der Programmierer nach der Instanziierung der entsprechenden Sensorklasse – dem Konstruktor ist hier wieder der Port zu übergeben, an dem der Sensor hängt – den gewünschten Modus wählen. Zurückgeliefert bekommt er einen so genannten Sample-Provider, über den er ab sofort den oder die Messwerte in Gestalt eines float-Arrays abfragen kann. Für den Ultraschallsensor sieht das beispielsweise wie folgt aus:

SensorModes sensor = new EV3UltrasonicSensor(SensorPort.S1);

SampleProvider distance = sensor.getMode("Distance");

float[] sample = new float[distance.sampleSize()];

distance.fetchSample(sample, 0);

// sample[0] contains distance ...

sensor.close();

Wem dieser Ansatz zu generisch ist, der kann auch die Sensorklasse selbst als Referenztyp verwenden. Das vereinfacht zumindest die Modusauswahl:

EV3UltrasonicSensor sensor = new EV3UltrasonicSensor(SensorPort.S1);

SampleProvider distance = sensor.getDistanceMode();

// ...

Als weitere wichtige Sensorklassen lassen sich EV3ColorSensor, EV3GyroSensor, EV3IRSensor und EV3TouchSensor nennen. Zur Wiedergabe von Sounds und Tönen stellt leJOS EV3 die Klasse Sound bereit. Das Display kann über LCD angesprochen werden. Zur Programmierung der Tasten am EV3-Stein dient Button, und mithilfe von Delay lassen sich Pausen während der Programmausführung erzwingen. Diese Klassen enthalten allesamt fast ausschließlich statische Methoden:

Sound.beep();

LCD.drawString("Hello World!", 0, 0);

Button.ENTER.waitForPressAndRelease();

Delay.msDelay(1000);

Der Entwickler kann auch Threads erzeugen und so nebenläufige Aktionen implementieren.

Die verschiedenen Steuerungsmodelle

Nachdem bei der Steuerung von Fahrzeugen mit mehreren angetriebenen Rädern die Synchronisation der Motoren eine bedeutende Rolle spielt und es mühsam wäre, das stets manuell machen zu müssen, stellt das API für diese Zwecke ebenfalls eine Lösung bereit. Dank der Klasse MovePilot kann der Roboter einfach dazu gebracht werden, sich zu drehen, sich mit einer bestimmten Geschwindigkeit zu bewegen oder sogar einen Bogen in einem bestimmten Radius zu fahren. MovePilot ist der Nachfolger von DifferentialPilot und im Gegensatz zu jenem für eine beliebige Anzahl an Rädern konzipiert. Um damit arbeiten zu können, muss ein Objekt der zugehörigen Klasse instanziiert werden. Als Parameter ist dem Konstruktor die radmäßige Konfiguration des Fahrgestells per Chassis-Objekt zu übergeben. Unterschieden wird zwischen differenzialem und omnidirektionalem Antrieb. Für den Bau eines Fahrzeugs mit zweitgenanntem Antrieb muss man sich allerdings spezielle Räder organisieren (Abb. 3).

Abb. 3: Ein omnidirektionales Rad kann ohne große Reibung auch entgegen seiner Drehachse bewegt werden

Abb. 3: Ein omnidirektionales Rad kann ohne große Reibung auch entgegen seiner Drehachse bewegt werden

Weist das Robotermodell einen Differenzialantrieb auf, muss der Entwickler für jedes Rad angeben, an welchem Port der zugehörige Motor angeschlossen ist, welchen Durchmesser es hat und wie weit es auf der y-Achse vom Mittelpunkt des lokalen Koordinatensystems entfernt ist (Abb. 4). Letztendlich resultiert das in folgendem Code:

Wheel wheel1 = WheeledChassis.modelWheel(Motor.A, 10)

.offset(-15);

Wheel wheel2 = WheeledChassis.modelWheel(Motor.D, 10)

.offset(15);

Chassis chassis = new WheeledChassis(

new Wheel[] {wheel1, wheel2}, WheeledChassis.TYPE_DIFFERENTIAL

);

MovePilot pilot = new MovePilot(chassis);

// ...

Abb. 4: Bei einem Differentialantrieb ist die y-Position jedes Rads im lokalen Koordinatensystem anzugeben

Abb. 4: Bei einem Differentialantrieb ist die y-Position jedes Rads im lokalen Koordinatensystem anzugeben

 

Bei der Verwendung eines omnidirektionalen Antriebs sieht der Quellcode etwas anders aus. Der Programmierer muss hier mindestens drei Räder definieren. Für jedes Rad sind der Motoranschluss, der Raddurchmesser, die Polarposition im lokalen Koordinatensystem und die Getriebeübersetzung anzugeben (Abb. 5). Für ein Modell mit drei Allseitenrädern sieht dies dann codemäßig wie folgt aus:

Wheel wheel1 = WheeledChassis.modelHolonomicWheel(Motor.A, 10)

.polarPosition(0, 15)

.gearRatio(2);

Wheel wheel2 = WheeledChassis.modelHolonomicWheel(Motor.B, 10)

.polarPosition(120, 15)

.gearRatio(2);

Wheel wheel3 = WheeledChassis.modelHolonomicWheel(Motor.C, 10)

.polarPosition(240, 15)

.gearRatio(2);

Chassis chassis = new WheeledChassis(

new Wheel[] {wheel1, wheel2, wheel3}, WheeledChassis.TYPE_HOLONOMIC

);

MovePilot pilot = new MovePilot(chassis);

// ...

Abb. 5: Bei einem omnidirektionalen Antrieb ist die Polarposition jedes Rads im lokalen Koordinatensystem anzugeben

Abb. 5: Bei einem omnidirektionalen Antrieb ist die Polarposition jedes Rads im lokalen Koordinatensystem anzugeben

Nach dem Erzeugen des MovePilot-Objekts kann man die zur Verfügung stehenden Funktionen verwenden. Stellvertretend für die rund dreißig Methoden werden folgend die wichtigsten vorgestellt. forward() lässt den Roboter vorwärts fahren, backward() rückwärts. Diese Methoden werden wiederum nicht-blockierend ausgeführt. Der Roboter stoppt erst, wenn die Methode stop() aufgerufen wird. Im Gegensatz dazu wird beim Aufruf von travel(distance) nur eine bestimmte Distanz zurückgelegt. Die Methode wirkt blockierend. Die Maßeinheit korrespondiert hier – genauso wie an allen anderen Stellen – mit der für den Raddurchmesser verwendeten Einheit. Ist die übergebene Distanz positiv, so fährt der Roboter vorwärts, ansonsten rückwärts. Um das Roboterfahrzeug nach links oder rechts drehen zu lassen, kann die Methode rotate(angle) genutzt werden. Bei positiver Gradangabe dreht es sich gegen den Uhrzeigersinn, sonst im Uhrzeigersinn. Auch das Fahren von Kreisbögen ist einfach möglich. Mit arc(radius, angle) wird der Bogen bis zu einem bestimmten Winkel gefahren, mit travelArc(radius, distance) bis die übergebene Distanz erreicht wurde. Außerdem gibt es noch arcForward(radius) und arcBackward(radius), die das Vorwärts- oder Rückwärtsfahren entlang eines Kreisbogens ohne definiertes Ende ermöglichen. Das Einstellen der Fahrgeschwindigkeit ermöglicht setLinearSpeed(speed). Die Geschwindigkeit wird in Einheiten pro Sekunde angegeben.

Filter auswählen und integrieren

leJOS EV3 stellt verschiedene Filter für die Abfrage von Sensoren bereit. So kann es beispielsweise erforderlich sein, dass nicht nur der letzte Messwert berücksichtigt wird, sondern stets der Mittelwert über die letzten n Messungen berechnet und an den Aufrufer zurückgeliefert wird. Die Integration eines solchen Filters ist denkbar einfach. Bei dessen Instanziierung ist lediglich der Sample-Provider zur Abfrage eines einzelnen Samples zu übergeben. Dem Konstruktor der MeanFilter-Klasse ist weiterhin die Anzahl der zu berücksichtigenden Messungen zu übergeben. Der Filter selbst tritt nach außen wiederum als Sample-Provider auf.

EV3UltrasonicSensor sensor = new EV3UltrasonicSensor(SensorPort.S1);

SampleProvider average = new MeanFilter(sensor.getDistanceMode(), 5);

float[] sample = new float[average.sampleSize()];

average.fetchSample(sample, 0);

// sample[0] contains average of last 5 distances ...

Eine weitere recht nützliche Filterklasse ist MedianFilter. Sie liefert beim Aufrufen der Methode fetchSample() den mittleren der nach Größe sortierten Werte zurück. Diese beiden Filter werden meist zum Optimieren von ungenauen oder fehlerhaften Messungen verwendet und sind auch die gängigsten, wenn es darum geht, stabile Messwerte des Ultraschall- oder Infrarotsensors zu erhalten. Selbstverständlich sind in dem Package lejos.robotics.filter noch mehr Filterklassen für weitere Anwendungsbereiche vorhanden.

Aus der Ferne: Remote-Zugriff

Zum Vernetzen der EV3-Steine untereinander oder mit einem gewöhnlichen Rechner, beispielsweise um Sensordaten auszutauschen, gibt es verschiedene Möglichkeiten. Allerdings gelangt man nach längerer Recherche und noch längerem Herumprobieren leider zu der Erkenntnis, dass die drahtlose Kommunikation über Bluetooth keine sinnvolle Option ist. Anders sieht es mit der Klasse RMIRemoteEV3 aus, die auf die Remote Method Invocation setzt, die den Aufruf von Methoden in einer anderen JVM ermöglicht. Sie erlaubt so den entfernten Zugriff auf die Hard- und Softwarefunktionen des anderen EV3-Steins. Damit ist es nun unter anderem möglich, die Soundausgabe, LCD-Anzeige oder Motoren eines entfernten EV3-Steins anzusteuern oder darüber Sensorenmessungen durchzuführen. Das Tolle dabei ist, dass das Java-Programm ohne Änderungen nicht nur auf einem EV3-Stein verwendet werden, sondern auch auf einem gewöhnlichen Rechner laufen kann.

Sobald ein leJOS-Programm merkt, dass es auf einem Gerät ohne lokaler EV3-Hardware läuft, sucht es im verbundenen Netzwerk nach EV3-Steinen und benutzt den ersten gefundenen, um die im Programm enthaltenen hardwaretechnischen Aktionen auszuführen. Es muss dazu nicht einmal ein spezielles Programm auf dem gefundenen EV3-Stein gestartet werden. Wichtig ist nur, dass der jeweilige Computer und der EV3-Stein im selben Netzwerk oder per USB-Kabel miteinander verbunden sind und im Programm kein EV3-Button angesprochen wird. Letztgenannte Bedingung scheint auf einen Bug zurückzuführen zu sein.

Zur Anbindung des EV3-Roboters an das Netzwerk benötigt man einen von leJOS EV3 unterstützten WLAN-USB-Adapter, z. B. Edimax EW-7811UN. Er wird an den seitlichen USB-Eingang am EV3-Stein angeschlossen. Während des Boot-Vorgangs sollte der WiFi-Dongle automatisch erkannt werden. Über den Menüpunkt Wifi kann man sich dann mit dem Netzwerk verbinden. Die IP-Adresse wird üblicherweise automatisch zugewiesen.

Wer nur einen EV3 besitzt, kann den oben erwähnten Suchmodus verwenden. Wenn mehrere EV3-Steine im gleichen Netz agieren, empfiehlt es sich, ein RemoteEV3-Objekt zu erstellen und über den Konstruktur die IP-Adresse des entfernt laufenden EV3-Steins zu übergeben. Danach kann der Entwickler diesen Baustein als Standard definieren, wodurch die klassischen Methodenaufrufe (z. B. Sound.beep()) einfach an diesen delegiert werden.

Brick brick = new RemoteEV3("192.168.0.5");

brick.setDefault();

Sound.beep();

// ...

Alternativ dazu lässt sich das Ganze auch wie folgt lösen:

Brick brick = new RemoteEV3("192.168.0.5");

Audio audio = brick.getAudio();

audio.systemSound(0);

// ...

Diese Vorgehensweise wird empfohlen. Die bisherigen statischen Methoden sind eher nur noch aus Gründen der Abwärtskompatibilität vorhanden. Den neuen Interfaces, z. B. Audio, gehört definitiv die Zukunft, da sie leistungsfähiger sind. Die Klasse BrickFinder ermöglicht das Auffinden von EV3-Steinen im Netzwerk. Angestoßen wird die Suche mit der Methode discover(). Sie liefert ein Array mit allen momentan sichtbaren Bausteinen zurück. Der jeweilige EV3-Stein muss dazu hochgefahren und mit dem Netzwerk verbunden sein. Weiterhin muss das Menüprogramm laufen. So kann man beispielsweise alle im Netzwerk gefundenen Bausteine piepen lassen:

BrickInfo[] brickInfos = BrickFinder.discover();

for (BrickInfo brickInfo: brickInfos) {

Brick brick = new RemoteEV3(brickInfo.getIPAddress());

Audio audio = brick.getAudio();

audio.systemSound(0);

}

// ...

Zur Abfrage der Sensoren über eine Remoteverbindung bietet leJOS zwei Möglichkeiten. Bei der ersten Variante wird die verwendete Sensorklasse, z. B. EV3IRSensor, am fernsteuernden EV3-Stein lokal erzeugt und ausgeführt. Jede Sensorabfrage wird hier per I2C-, UART- oder Analogbefehl an den Remote Port geschickt. Da das relativ aufwendig ist, kann es bei manchen Sensoren zu Verzögerungen und Wartezeit kommen.

Brick brick = new RemoteEV3("192.168.0.5");

Port port = brick.getPort("S1");

EV3IRSensor sensor = new EV3IRSensor(port);

SampleProvider distance = sensor.getDistanceMode();

// ...

Effizienter ist die zweite Variante, bei der die Instanz der Sensorklasse direkt auf dem ferngesteuerten EV3-Stein läuft und über ein RMISampleProvider-Objekt aus dem fernsteuernden Java-Prozess heraus kontrolliert wird.

RemoteEV3 brick = new RemoteEV3("192.168.0.5");

RMISampleProvider distance = brick.createSampleProvider("S1", "lejos.hardware.sensor.EV3IRSensor", "distance");

// ...

Zur Ansteuerung von Motoren gibt es analog zur entfernten Sensorabfrage ebenfalls zwei Ansätze. Hier empfiehlt sich die folgende Vorgehensweise:

RemoteEV3 brick = new RemoteEV3("192.168.0.5");

RMIRegulatedMotor motor = brick.createRegulatedMotor("A", 'M');

// ...

Der auf diese Art erzeugte Motor kann auf herkömmliche Art verwendet werden. Bei der Methode createRegulatedMotor(portName, motorType) wird als zweiter Parameter der Motortyp erwartet. ‚L‘ repräsentiert hier einen großen Motor, ‚M‘ einen mittleren. Greift man bei einer Remoteverbindung auf entfernte Sensoren oder Motoren zu, müssen diese mittels close() geschlossen werden, sobald das Programm beendet wird. Sonst bleibt der Port als besetzt markiert, was beim erneuten Ansteuern in der Fehlermeldung unable to open port resultiert. Vergisst der Entwickler, einen Port zu schließen, kann er über den Menüpunkt System | Reset alle Ports zurücksetzen.

Fazit

Der Artikel gibt eine Einführung in LEGO Mindstorms EV3 und zeigt, wie sich die LEGO-Roboter mittels der zugehörigen Java-Schnittstelle leJOS EV3 programmieren lassen. Wie wir gesehen haben, stellt das API zum Steuern und Abfragen der Aktoren und Sensoren passende Klassen bereit, dank derer das Ansprechen der Hardwareteile simpel möglich ist. Selbst remote geht das recht einfach.

Lassen Sie uns zum Abschluss noch eine Warnung aussprechen: Die Beschäftigung mit LEGO Mindstorms EV3 kann süchtig machen. Da wird hier noch etwas am Modell umgebaut, dort noch etwas dazuprogrammiert, und ehe man sich versieht, ist es auch schon weit nach Mitternacht. Sollte demnächst also Ihr Kollege verschlafen ins Büro kommen: Fragen Sie ihn doch einfach, ob er sich vor kurzer Zeit einen LEGO-Mindstorms-EV3-Baukasten zugelegt hat.

In diesem Sinne: Happy building, happy Coding!

Geschrieben von
Bernhard Löwenstein
Bernhard Löwenstein
Bernhard Löwenstein (bernhard.loewenstein@java.at) ist als selbstständiger IT-Trainer und Consultant für javatraining.at tätig. Als Gründer und ehrenamtlicher Obmann des Instituts zur Förderung des IT-Nachwuchses führt er außerdem altersgerechte Roboterworkshops für Kinder und Jugendliche durch, um diese für IT und Technik zu begeistern.
Kommentare

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.