Programmierung des Lego Mindstorms EV3 mit Java (Lejos)

Transcription

Programmierung des Lego Mindstorms EV3 mit Java (Lejos)
Mag. Helmut Mieß
Robotik
Altes Gymnasium Leoben
Tutorial
Programmierung des Lego Mindstorms EV3 mit Java (Lejos)
Version 0.5 – 27.1.2015
Siehe auch Lejos-Wiki: (http://sourceforge.net/p/lejos/wiki/Home )
1 Installation der Software (Windows)
a) Installation des Java Development Kit 7
(Download: http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads1880260.html)
b) Installation von Lejos
(Download: https://sourceforge.net/projects/lejos/files/lejos-EV3/)
c) Erstellen einer SD Karte mit der Lejos-Firmware für den EV3
  Lejos EV3 SD-Card Creator
 Micro-SD-Card mit Adapter
 Mindestgröße 2GB / Maximalgröße 32GB
d) Installation der Eclipse-IDE
(Download: http://www.eclipse.org/downloads/)
e) Installation des Lejos-Plugins in Eclipse
 EclipseHelpInstall new SoftwareAdd
 Position: http://lejos.sourceforge.net/tools/eclipse/plugin/ev3
 Lejos-Home-Ordner einstellen (c:\Programme\Lejos EV3)
EclipseWindowsPreferencesLejosEV3 Home
b) Installation des deutschen Sprachpakets in Eclipse
 EclipseHelpInstall new SoftwareAdd
 Position: http://download.eclipse.org/technology/babel/update-site/R0.12.1/luna
 „Babel Language Packs in German“ auswählen
 Eclipse neu starten
2 Verbindung mit EV3 herstellen
2.1 WIFI
a)
b)
c)
d)
e)
f)
SD-Card einsetzen
„NETGEAR WMA1100 WIFI Dongle“ in den USB-Port
WIFI-Netz aktivieren
EV3 einschalten
Menü-WIFI: WIFI-Netz auswählen und Passwort eingeben
 Zweite IP-Adresse wird auf der Startseite angezeigt
Windows-PC mit EV3 verbinden
 EclipseMenü Lejos EV3Start EV3 ControlSearchConnect
2.2 Bluetooth
a) Bluetooth am EV3 einschalten und als sichtbar einstellen (Standardeinstellung)
b) EV3 am Windows-PC als Bluetoothgerät hinzufügen
Seite -1-
Mag. Helmut Mieß
Robotik
Altes Gymnasium Leoben
c) WindowsNetzwerk- und FreigabecenterAdaptereinstellungen ändernKontextmenü
Bluetooth-NetzwerkverbindungBluetooth Netzwerkgeräte anzeigen  Kontextmenü
EV3Verbindung herstellen über Zugriffspunkt
d) Eclipse mit EV3 verbinden
 Möglichkeit 1: FensterBenutzervorgabenLejosConnect to named
brick”10.0.1.1” eintragen
Wenn später wieder die WIFI-Verbindung verwendet werden soll, muss dieser
Eintrag wieder entfernt werden
 Möglichkeit 2: EclipseMenü Lejos EV3Start EV3 ControlName:”10.0.1.1”
eintragenConnect
3 Projekt und Main-Klasse erstellen
a) Eclipse Projekt erstellen
 Datei´NeuProjektLejos EV3 Project
 Projektname eingebenFertigstellen
b) Java Paket einfügen
 Im Projektexplorer das neue Projekt expandierensrcrechte
MaustasteNeuPaketFertigstellen
 Paketrechte MaustasteNeuKlasse
c) Name eingeben
d) Methoden-Stub „public static class main“ auswählen
e) Fertigstellen
f) Programmbefehle in der Klasse Main einfügen
g) Import der benötigten Klassen aus der Lejos-Bibliothek erfolgt automatisch, sobald eine
Klasse verwendet wird!
Falls die Import-Anweisung nicht automatisch eingefügt wird:
Cursor über den Klassennamen führenKontextmenü erscheintimport-Anweisung
einfügen
package motoren;
import lejos.hardware.lcd.LCD;
import lejos.hardware.motor.Motor;
import lejos.utility.Delay;
public class motor {
public static void main(String[] args)
{
LCD.drawString("Hallo Welt", 1, 1);
Delay.msDelay(5000);
LCD.clear();
while(true)
{
Motor.A.setSpeed(100);
Motor.D.setSpeed(100);
Motor.A.forward();
Motor.D.forward();
Delay.msDelay(1000);
Motor.A.backward();
Motor.D.backward();
Delay.msDelay(1000);
}
}
}
Seite -2-
Mag. Helmut Mieß
Robotik
Altes Gymnasium Leoben
4 Programm hochladen, starten und beenden
a) Hochladen
 Main Klasse in Eclipse öffnen
 EclipseAusführenAusführen alsLejos EV3 Program
 Wurde das Programm schon einmal gestartet reicht der Klick auf das Symbol „>“
(Ausführen)!
b) Beenden
 EV3 ControlStop Program
c) Bereits hochgeladenes Programm starten
 EV3 Control*.jar Datei auswählenProgramm starten
oder
 EV3 MenüPrograms*.jar Datei auswählenExecute Program
5 Lejos EV3 – Befehle
5.1 Motoren
Vorbemerkung: Sowohl die EV3- als auch die NXT-Motoren können problemlos ohne zusätzliche
Adapter bzw. Motorsteuerungen mit Lejos-EV3 angesteuert werden!
5.1.1 Methode 1 - Klasse „Motor“ mit statischen Feldern A,B,C und D
Folgende Befehle sind über die „Motor“-Klasse verwendbar (Auswahl):
Motor.A.setSpeed(int Speed);
Motor.A.forward();
Motor.A.backward();
Motor.A.rotate(int Grad);
Motor.A.rotate(int Grad, true);
Motor.A.stop();
Geschwindigkeit einstellen mit „Speed“ in Grad/Sekunde
360 = eine Umdrehung/Sekunde
Motor vorwärts drehen (mit eingestellter Geschwindigkeit)
Motor rückwärts drehen (mit eingestellter Geschwindigkeit)
Motor um eine bestimmte Gradanzahl „Grad“ drehen
wie oben ohne warten auf Fertigstellung
Motor stoppt
5.1.2 Methode 2 – Motoren als Objekte
Am Beginn der Main-Klasse wird ein Motor als Objekt erzeugt (Konstruktor). Der Name des Motors
ist frei wählbar! Die Basisklasse des Motors sollte richtig angegeben werden:
EV3LargeRegulatedMotor, EV3MediumRegulatedMotor oder NXTRegulatedMotor
RegulatedMotor motor_links = new EV3LargeRegulatedMotor(MotorPort.A);
Die oben genannten Befehle können dann dem Motorobjekt direkt zugewiesen werden:
motor_links.setSpeed(int Speed);
motor_links.forward();
motor_links.stop();
Die Methode 2 stellt insgesamt mehr Funktionalitäten zur Verfügung und erlaubt ein sauberes
objektorientiertes Programmieren. Sie sollte deshalb die erste Wahl für größere und/oder
ambitioniertere Projekte sein.
Achtung: Methode 1 und Methode 2 können nicht gleichzeitig in einem Programm verwendet
werden, wenn sie auf dieselben Ports zugreifen!
Seite -3-
Mag. Helmut Mieß
Robotik
Altes Gymnasium Leoben
5.2 Pause/Delay
Eine einfache Pause kann mit der Klasse „Delay“ eingefügt werden:
Delay.msDelay(int Millisekunden)
1000ms = 1 Sekunde
Zeitmesser mit erweiterten Funktionen können in Form von Instanzen der Standard-Java-Klasse
„Timer“ realisiert werden!
5.3 Display, Buttons, Sound und Light
5.3.1 Display
Es können Texte(String) oder Ganze Zahlen(Integer) am Bildschirm ausgegeben werden. Es stehen 18
Spalten(0-17) und 8 Zeilen(0-7) zur Verfügung.
LCD.drawString(string Text, int x, int y);
LCD.drawInt(int Integer x, y);
LCD.clear();
LCD.clear(y)
x=Spalte, y=Zeile, Text(z.B. “Hallo Welt”)
Integer Zahl ausgeben
Gesamten Bildschirm löschen
Zeile y löschen
Dezimalzahlen (Single, Double) müssen zuerst in einen String konvertiert werden, um ausgegeben zu
werden!
Double zahl = 3.56;
String zahl_string = zahl.toString();
Variable mit dem Datentyp “Double”!
Konvertierung in einen String!
5.3.2 Buttons
Die Buttons des EV3 können über die Klasse Button angesprochen werden.
Folgende Buttons stehen zur Verfügung:
1.
2.
3.
4.
5.
6.
ENTER
LEFT
RIGHT
UP
DOWN
ESCAPE
Um zu überprüfen, ob ein Button gedrückt ist, steht die Methode „isDown()“ zur Verfügung. Die
Methode gibt einen boolschen Wert (true oder false) zurück. Analog dazu steht auch die Methode
„isUp()“ zu Verfügung.
If (Button.ENTER.ispressed()
{
Anweisungen…
}
Zusätzlich können folgende Methoden eingesetzt werden. Sie bewirken eine Pause, bis der
entsprechende Event eintritt:
Button.ENTER.waitForPress();
Pause bis zum Drücken von „Enter“
Button.UP.waitForPressAndRelease() Pause bis zum Drücken und wieder loslassen von „UP“
Eine Pause bis zum Drücken einer beliebigen Taste kann mit folgender Methode eingefügt werden:
Button.waitForAnyPress();
Seite -4-
Mag. Helmut Mieß
Robotik
Altes Gymnasium Leoben
5.3.3 Sound
In der Klasse „Sound“ stehen folgende Methoden zur Verfügung:
Sound.beep()
Sound.twoBeeps()
Sound.beepSequence()
Sound.beep.SequenceUp()
Sound.buzz()
ein Beep
zwei Beeps
absteigende Tonfolge
ansteigende Tonfolge
Buzzer-Sound
Sound.setVolume(int Lautstärke)
Einstellen der Lautstärke von 0-100%
Für erweiterte Soundausgabe stehen die Methoden „playTone(…)“, „playNote(…)“ und
„playSample(…)“ zur Verfügung.
Siehe dazu die Lejos EV3 API (http://www.lejos.org/ev3/docs/)
5.3.4 Light
Die Methode „LEDPattern(int Pattern)“ der Klasse „Button“ erlaubt es die LEDs des EV3 (grün, rot,
gelb) anzusteuern. Folgende Patterns sind möglich:
0
1/2/3
4/5/6
7/8/9
alle aus
statisches Licht grün/rot/orange
normal blinkendes Licht grün/rot/orange
schnell blinkendes Licht grün/rot/orange
Button.LEDPattern(5);
Delay.msDelay(3000);
Button.LEDPattern(0);
5.4 Sensoren
Die Verwendung von Sensoren in Lejos EV3 ist nicht direkt möglich, sondern nur über den Umweg
sogenannter Sensormodes. Diese scheinbar komplizierte Herangehensweise hat den Vorteil, dass
auch völlig unterschiedliche Sensoren mit identischen Methoden Sensordaten liefern.
(vgl. http://sourceforge.net/p/lejos/wiki/Sensor%20Framework/)
Die Vorgehensweise sei hier protopypisch am Beispiel des EV3-Touichsensors gezeigt.
5.4.1 EV3 Touch-Sensor
a) Der Sensor wird als Sensormode-Objekt erzeugt, der Port, an den der
Sensor angeschlossen ist, wird angegeben. Der Name des
SensorMode-Objekts kann frei gewählt werden.
SensorModes sensor1 = new EV3TouchSensor(SensorPort.S1);
b) Dem Sensormode-Objekt wird nun mit der Methode „getMode()”ein bestimmter
Sensormode(„Touch“) zugewiesen. Unterschiedliche Sensortypen können unter einem oder
mehreren unterschiedlichen Modes betrieben werden.
Gleichzeitig wird ein sogenanntes “SampleProvider-Objekt“ erzeugt, also ein Sensor in einem
bestimmten Mode der Messergebnisse (Samples) liefert. Die Art der Messergebnisse (ein
Wert, mehrere Werte …) kann je nach Sensorart und Mode unterschiedlich sein.
SampleProvider touch = sensor1.getMode("Touch");
c) Nun wird ein Array vom Datentyp „float“ erzeugt, in dem später die Messergebnisse
abgelegt werden. Ein Array ist notwendig, da ein Sensor eine unterschiedliche Anzahl von
Seite -5-
Mag. Helmut Mieß
Robotik
Altes Gymnasium Leoben
Werten bei einer Messung liefern kann. Die Anzahl der Werte wird mit „sampleSize()“ in
Erfahrung gebracht. Das Array wird dementsprechend groß angelegt.
float sample[] = new float[touch.sampleSize()];
d) Nun können Sensorwerte abgefragt werden, und zwar immer mit der Methode
“fetchSensor()”. Unabhängig von der Art der Messung und der Art und Anzahl der Ergebnisse
werden diese in dem Array „sample“ abgelegt.
touch.fetchSample(sample, 0);
e) Über den Index 0 kann das Messergebnis aus dem Array ausgelesen werden. Ist mehr als ein
Ergebnis vorhanden, besitze die weiteren Messergebnisse die fortlaufenden Indizes 1,2,3…
Bei einer neuen Messung, werden die alten Ergebnisse überschrieben.
if (sample[0] == 1) LCD.drawString("Touched!!!", 0, 0);
else LCD.drawString("Released!!!", 0, 0);
f)
Der Touchsensor liefert im einzig möglichen Mode „Touch“ die Werte 1, wenn er gedrückt
ist, sonst den Wert 0!
5.4.2 EV3 Ultraschallsensor
Der US-Sensor besitzt mehrere Sensormodes. Der wichtigste ist der Mode zur
Distanzmessung. Der Sensor liefert im Mode „Distance“ Dezimalwerte, und
zwar in der Einheit Meter.
SensorModes sensor2 = new EV3UltrasonicSensor(SensorPort.S1);
SampleProvider us = sensor2.getMode("Distance");
us.fetchSample(sample, 0);
if (sample[0] < 1) LCD.drawString("kleiner 1 Meter", 0, 0);
else LCD.drawString("groesser 1 Meter", 0, 0);
5.4.3 EV3 Farbsensor/Lichtsensor
Der Farbsensor verfügt über 4 verschieden Modes. Im Mode „Ambient“ liefert
der Sensor die Gesamtlichtstärke. Die Messwerte liegen zwischen 0 (0%) und
1 (100%).
Im Mode „Red“ liefert der Sensor die Lichtstärke des reflektierten Lichts der
eingeschalteten roten LED! (Funktion wie ein NXT-Lichtsensor)
SensorModes sensor3 = new EV3ColorSensor(SensorPort.S1);
SampleProvider light= sensor3.getMode("Ambient");
light.fetchSample(sample, 0);
if (sample[0] < 0,2) LCD.drawString("Schwarz", 0, 0);
else if (sample[0] < 0,8) LCD.drawString("Grau", 0, 0);
else LCD.drawString("Weiss", 0, 0);
oder
SensorModes sensor3 = new EV3ColorSensor(SensorPort.S1);
SampleProvider light = sensor3.getMode("Red");
float sample[] = new float[light.sampleSize()];
while(true)
{
Seite -6-
Mag. Helmut Mieß
Robotik
light.fetchSample(sample, 0);
System.out.println(sample[0]);
Delay.msDelay(1000);
}
5.4.4 NXT Lichtsensor
Mode „Red“: siehe EV3 Farbsensor!
SensorModes sensor3 = new NXTLightSensor(SensorPort.S1);
SampleProvider light = sensor3.getMode("Red");
float sample[] = new float[light.sampleSize()];
while(true)
{
light.fetchSample(sample, 0);
System.out.println(sample[0]);
Delay.msDelay(1000);
}
5.4.5 EV3 Gyrosensor
Im Mode “Angle” liefert der Sensor den Drehwinkel in Grad, ausgehend vom
Winkel beim Starten des Programms. Ein neuer Startwinkel kann mit der
Methode „reset()“ hergestellt werden
SensorModes sensor4= new EV3Gyroensor(SensorPort.S1);
SampleProvider gyro= sensor4.getMode("Angle");
gyro.fetchSample(sample, 0);
gyro.reset();
gyro.fetchSample(sample, 0);
Seite -7-
Altes Gymnasium Leoben