Programmierung des Lego Mindstorms EV3 mit Java (Lejos) Version 0.5 27.1.2015

Die Seite wird erstellt Finja Martin
 
WEITER LESEN
Programmierung des Lego Mindstorms EV3 mit Java (Lejos) Version 0.5 27.1.2015
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
           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)   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
            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-
Programmierung des Lego Mindstorms EV3 mit Java (Lejos) Version 0.5 27.1.2015
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-
Programmierung des Lego Mindstorms EV3 mit Java (Lejos) Version 0.5 27.1.2015
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);          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-
Programmierung des Lego Mindstorms EV3 mit Java (Lejos) Version 0.5 27.1.2015
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