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 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) 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 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); 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