Programmierung des Lego Mindstorms EV3 mit Java (Lejos) Version 0.5 27.1.2015
←
→
Transkription von Seiteninhalten
Wenn Ihr Browser die Seite nicht korrekt rendert, bitte, lesen Sie den Inhalt der Seite unten
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-downloads-
1880260.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
EclipseHelpInstall new SoftwareAdd
Position: http://lejos.sourceforge.net/tools/eclipse/plugin/ev3
Lejos-Home-Ordner einstellen (c:\Programme\Lejos EV3)
EclipseWindowsPreferencesLejosEV3 Home
b) Installation des deutschen Sprachpakets in Eclipse
EclipseHelpInstall new SoftwareAdd
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) SD-Card einsetzen
b) „NETGEAR WMA1100 WIFI Dongle“ in den USB-Port
c) WIFI-Netz aktivieren
d) EV3 einschalten
e) Menü-WIFI: WIFI-Netz auswählen und Passwort eingeben
Zweite IP-Adresse wird auf der Startseite angezeigt
f) Windows-PC mit EV3 verbinden
EclipseMenü Lejos EV3Start EV3 ControlSearchConnect
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) WindowsNetzwerk- und FreigabecenterAdaptereinstellungen ändernKontextmenü
Bluetooth-NetzwerkverbindungBluetooth Netzwerkgeräte anzeigen Kontextmenü
EV3Verbindung herstellen über Zugriffspunkt
d) Eclipse mit EV3 verbinden
Möglichkeit 1: FensterBenutzervorgabenLejosConnect 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: EclipseMenü Lejos EV3Start EV3 ControlName:”10.0.1.1”
eintragenConnect
3 Projekt und Main-Klasse erstellen
a) Eclipse Projekt erstellen
Datei´NeuProjektLejos EV3 Project
Projektname eingebenFertigstellen
b) Java Paket einfügen
Im Projektexplorer das neue Projekt expandierensrcrechte
MaustasteNeuPaketFertigstellen
Paketrechte MaustasteNeuKlasse
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ührenKontextmenü erscheintimport-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
EclipseAusführenAusführen alsLejos EV3 Program
Wurde das Programm schon einmal gestartet reicht der Klick auf das Symbol „>“
(Ausführen)!
b) Beenden
EV3 ControlStop Program
c) Bereits hochgeladenes Programm starten
EV3 Control*.jar Datei auswählenProgramm starten
oder
EV3 MenüPrograms*.jar Datei auswählenExecute 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); Geschwindigkeit einstellen mit „Speed“ in Grad/Sekunde
360 = eine Umdrehung/Sekunde
Motor.A.forward(); Motor vorwärts drehen (mit eingestellter Geschwindigkeit)
Motor.A.backward(); Motor rückwärts drehen (mit eingestellter Geschwindigkeit)
Motor.A.rotate(int Grad); Motor um eine bestimmte Gradanzahl „Grad“ drehen
Motor.A.rotate(int Grad, true); wie oben ohne warten auf Fertigstellung
Motor.A.stop(); 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); x=Spalte, y=Zeile, Text(z.B. “Hallo Welt”)
LCD.drawInt(int Integer x, y); Integer Zahl ausgeben
LCD.clear(); Gesamten Bildschirm löschen
LCD.clear(y) Zeile y löschen
Dezimalzahlen (Single, Double) müssen zuerst in einen String konvertiert werden, um ausgegeben zu
werden!
Double zahl = 3.56; Variable mit dem Datentyp “Double”!
String zahl_string = zahl.toString(); 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. ENTER
2. LEFT
3. RIGHT
4. UP
5. DOWN
6. 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() ein Beep
Sound.twoBeeps() zwei Beeps
Sound.beepSequence() absteigende Tonfolge
Sound.beep.SequenceUp() ansteigende Tonfolge
Sound.buzz() 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 alle aus
1/2/3 statisches Licht grün/rot/orange
4/5/6 normal blinkendes Licht grün/rot/orange
7/8/9 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 Altes Gymnasium Leoben
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-Sie können auch lesen