Fakultät für Informatik, Institut für Robotik Laborpraktikum II Legorobotik in JAVA – EV3 Ute Ihme Hochschule Mannheim | Ute Ihme DAS LEGO® MINDSTORMS® System Standardsensoren Ultraschallsensor Berührungssensor Tastsenor Gyrosensor Farbsensor Mannheim University of Applied Sciences | Ute Ihme March 4,. 2013 2 Zur Wiederholung Das erste Labor liegt schon etwas zurück, daher eine kurze Wiederholung der wichtigsten Inhalte aus dem Labor I, die für das folgende Labor benötigt werden. Für das Labor II wird benötigt - Benutzung Eclipse für Lego - Displayanzeige - Motorensteuerung - Ultraschallsensor Hochschule Mannheim| Ute Ihme März 2013 3 1. Start der Entwicklungsumgebung Starten von Eclipse 1. Starten der 32-bit Version von Eclipse (Eclipse Luna) 2. Auswahl des Arbeitsbereiches Standardeinstellungen übernehmen auf OK-Button drücken Hochschule Mannheim| Ute Ihme März 2013 4 Start der Entwicklungsumgebung Starten von Eclipse 3. Programmierumgebung Eclipse wird gestartet Navigationsleiste Dateinavigator Feld für Programmentwicklung Informationsfeld Mannheim University of Applied Sciences | Ute Ihme March 4,. 2013 5 Start der Entwicklungsumgebung Starten von Eclipse 3. Programmierung vorbereiten Datei wählen Mannheim University of Applied Sciences | Ute Ihme March 4,. 2013 6 Start der Entwicklungsumgebung Starten von Eclipse 3. Programmierung vorbereiten - Neu und - Projekt… auswählen Mannheim University of Applied Sciences | Ute Ihme - LeJOS EV3 Projekt wählen - auf Weiter> drücken March 4,. 2013 7 Start der Entwicklungsumgebung Starten von Eclipse 3. Programmierung vorbereiten Projektname eingeben Fertigstellen drücken Mannheim University of Applied Sciences | Ute Ihme March 4,. 2013 8 Start der Entwicklungsumgebung Starten von Eclipse 3. Programmierung vorbereiten - Datei - neu - Klasse wählen Mannheim University of Applied Sciences | Ute Ihme March 4,. 2013 9 Start der Entwicklungsumgebung Starten von Eclipse 3. Programmierung vorbereiten 1. Klassennamen eingeben 2. Hier zusätzlich public static void main ankreuzen, wenn Klasse main Methode enthalten soll. 3. Fertigstellen drücken Mannheim University of Applied Sciences | Ute Ihme March 4,. 2013 10 Start der Entwicklungsumgebung Starten von Eclipse 3. Programmierung vorbereiten Nun kann das Programmieren beginnen! Mannheim University of Applied Sciences | Ute Ihme March 4,. 2013 11 JAVA Code Realisierung eines Pausenbefehls 1. Warten darauf, dass ein Knopf des NXT Steins gedrückt wird Button.waitForAnyPress(); 2. Nutzung eines leJos Pausen - Befehls Delay.msDelay(2000); Hochschule Mannheim| Ute Ihme März 2013 12 JAVA Code Displayanzeige Syntax: 1. Nutzung des Standard JAVA Befehls System.out.println("Hello World!") 2. Nutzung des lejos Befehls a) für Strings LCD.drawString(“string", Spalte, Zeile)) LCD.drawString("Hello World 1", 0, 2); b) Für Zahlen LCD.drawInt(Zahl, Spalte, Zeile); LCD.drawInt(7, 0, 4); 3. Löschen des Displays LCD.clearDisplay(); Hochschule Mannheim| Ute Ihme März 2013 13 JAVA Code Programmbeispiel: Bildschirmanzeige / Hello World // Importieren von LejosBibliotheken import lejos.hardware.Button; import lejos.hardware.lcd.LCD; import lejos.utility.Delay; public class HelloWorld { public static void main(String[] args) { // TODO Automatisch generierter Methodenstub // Nutzung der JAVA Syntax für die Ausgabe eines Strings System.out.println("Hello World!"); Button.waitForAnyPress(); // Bildschirmlöschen LCD.clear(); Hochschule Mannheim| Ute Ihme März 2013 14 JAVA Code Programmbeispiel: Bildschirmanzeige / Hello World // Ausgabe eines Strings mit dem LejosBefehl LCD.drawString("Hello", 0, 2); // Warten für 2000ms Delay.msDelay(2000); // Ausgabe einer Zahl mit dem LejosBefehl LCD.drawInt(7, 0, 4); Delay.msDelay(2000); } } Hochschule Mannheim| Ute Ihme März 2013 15 JAVA Code Übertragen von Programmen vom Rechner auf den EV3 Datei speichern bzw. alle Dateien speichern drücken Hochschule Mannheim| Ute Ihme März 2013 16 JAVA Code Übertragen von Programmen vom Rechner auf den EV3 1. 2. 3. • Ausführen als LeJOS EV3 Programm wählen, zuvor NXT Stein einschalten Hochschule Mannheim| Ute Ihme März 2013 17 DAS LEGO® MINDSTORMS® System Motoren Servomotor Verfügt über integrierten Rotationssensor misst Geschwindigkeit und Abstand Leitet Ergebnisse an NXT Stein weiter Motor kann auf einen Grad genau gesteuert werden Quelle: Lego Kombinationen mehrerer Motoren möglich arbeiten ggf. mit gleicher Geschwindigkeit Hochschule Mannheim| Ute Ihme März 2013 18 JAVA Code Die Klasse Motor – Allgemeine Befehle Verwendung folgender import - Funktionen import lejos.hardware.motor.Motor; Wichtige Methoden der Klasse Motor Vorwärtsfahren: Motor.A.forward(); Rückwärtsfahren: Motor.A.backward(); Verwendung der Portbezeichnung (A, B, C oder D), An den der Sensor angeschlossen Ist bzw. wird. Anhalten: Motor.A.stop(); oder Motor.A.flt(); Hochschule Mannheim| Ute Ihme März 2013 19 JAVA Code Motorensteuerung für 2 Motoren - zeitgesteuert Syntax: Vorwärtsfahren: Motor.A.forward(); Motor.B.forward(); Kurve Motor.A.forward(); Motor.B.backward(); Rückwärtsfahren: Motor.A.backward(); Motor.B.backward(); oder Motor.A.backward(); Motor.B.forward(); Anhalten mit Bremsen: Motor.A.stop(); Motor.B.stop(); Mannheim University of Applied Sciences | Ute Ihme Anhalten mit Auslaufen: Motor.A.flt(); Motor.B.flt(); March 4,. 2013 20 JAVA Code Motorensteuerung import lejos.hardware.motor.Motor; import lejos.utility.Delay; - zeitgesteuert Programmbeispiel: public class Motoren { public static void main(String[] args) { // Vorwärtsfahren Motor.A.forward(); Motor.B.forward(); // Zeit in ms Delay.msDelay(2000); Motor.A.stop(); Motor.B.stop(); } } Mannheim University of Applied Sciences | Ute Ihme March 4,. 2013 21 JAVA Code Motorensteuerung - zeitgesteuert Programmelemente: // Rückwärtsfahren Motor.A.backward(); Motor.B.backward(); // Zeit in ms Delay.msDelay(2000); Motor.A.stop(); Motor.B.stop(); Mannheim University of Applied Sciences | Ute Ihme // Kurve mit einem Motor Motor.A.forward(); // Zeit in ms Delay.msDelay(2000); Motor.A.stop(); //Kurve mit 2 Motoren Motor.A.forward(); Motor.B.backward(); // Zeit in ms Delay.msDelay(2000); Motor.A.stop(); Motor.B.stop(); March März 4,. 2013 22 JAVA Code Arbeiten mit Sensoren Verwendung folgender import - Funktionen import lejos.hardware.port.SensorPort; import lejos.hardware.sensor.*; import lejos.robotics.*; Hinweis: Die Initialisierung der Sensoren und die Abfrage der Messwerte erfolgt bei allen Sensoren nach dem gleichen Prinzip. Wichtig ist, dass stets der Port (S1, S2, S3 bzw. S4) in der Initialisierung verwendet wird, an dem der Sensor tatsächlich angeschlossen ist. Mannheim University of Applied Sciences | Ute Ihme March 4,. 2013 23 DAS LEGO® MINDSTORMS® System Berührungssensor / Tastsensor • Abfrage, ob Sensor gedrückt • Werte des Sensors • 0: Sensor nicht gedrückt • 1: Sensor gedrückt Hochschule Mannheim| Ute Ihme März 2013 24 JAVA Code Berührungssensor / Tastsensor Initialisierung: SensorModes sensor1 = new EV3TouchSensor(SensorPort.S1); SampleProvider touch = sensor1.getMode("Touch"); Abfrage der Messwerte: Jeweiligen Anschlußport angeben (S1, S2, S3 oder S4) // Initialisierung der Messwerte float pressed =0; float sample[] = new float[touch.sampleSize()]; // Abfrage der Sensorwerte touch.fetchSample(sample, 0); pressed = sample[0]; Mannheim University of Applied Sciences | Ute Ihme March 4,. 2013 25 JAVA Code Berührungssensor / Tastsensor Programmbeispiel: import import import import lejos.hardware.motor.Motor; lejos.hardware.port.SensorPort; lejos.hardware.sensor.*; lejos.robotics.*; public class Tastsensor { public static void main(String[] args) { // TODO Automatisch generierter Methodenstub - Programmcode nächste Folien } } Mannheim University of Applied Sciences | Ute Ihme March März 4,. 2013 26 JAVA Code Berührungssensor / Tastsensor Programmcode für public static void main: // Initialisierung des Sensors SensorModes sensor1 = new EV3TouchSensor(SensorPort.S1); SampleProvider touch = sensor1.getMode("Touch"); // Initialisierung der Messwerte float pressed =0; float sample[] = new float[touch.sampleSize()]; Mannheim University of Applied Sciences | Ute Ihme March 4,. 2013 27 JAVA Code Berührungssensor / Tastsensor Programmcode für public static void main: // Einschalten der Motoren Motor.A.forward(); Motor.B.forward(); // Abfrage der Sensorwerte bis Sensor gedrückt wird while(pressed ==0){ touch.fetchSample(sample, 0); pressed = sample[0]; } // Ausschalten der Motoren Motor.A.stop(); Motor.B.stop(); Mannheim University of Applied Sciences | Ute Ihme March 4,. 2013 28 DAS LEGO® MINDSTORMS® System Ultraschallsensor • Sensor sendet Ultraschall aus • Schall wird von Hindernis reflektiert • Reflektierter Schall wird vom Empfänger registriert • Aus Laufzeit des Schalls kann auf die Entfernung geschlussfolgert werden • Messwerte werden in Meter ausgegeben Hochschule Mannheim| Ute Ihme März 2013 29 JAVA Code Ultraschallsensor Initialisierung: SensorModes sensor4 = new EV3UltrasonicSensor(SensorPort.S4); SampleProvider us = sensor4.getMode("Distance"); Jeweiligen Anschlußport angeben (S1, S2, S3 oder S4) Abfrage der Messwerte: // Initialisierung der Messwerte float distanz=10; float sample[] = new float[us.sampleSize()]; // Abfrage der Messwerte us.fetchSample(sample, 0); distanz = sample[0]; Mannheim University of Applied Sciences | Ute Ihme March 4,. 2013 30 JAVA Code Ultraschallsensor Programmbeispiel: import import import import lejos.hardware.motor.Motor; lejos.hardware.port.SensorPort; lejos.hardware.sensor.*; lejos.robotics.*; public class Ultraschall { public static void main(String[] args) { // TODO Automatisch generierter Methodenstub - Programmcode nächste Folien } } Hochschule Mannheim| Ute Ihme März 2013 31 JAVA Code Ultraschallsensor Programmcode für public static void main: // Initialisierung Ultraschallsensor SensorModes sensor4 = new EV3UltrasonicSensor(SensorPort.S4); SampleProvider us = sensor4.getMode("Distance"); // Initialisierung der Messwerte float distanz=10; float sample[] = new float[us.sampleSize()]; // Einschalten der Motoren Motor.A.forward(); Motor.B.forward(); Hochschule Mannheim| Ute Ihme März 2013 32 JAVA Code Ultraschallsensor Programmcode für public static void main: // Abfrage der Messwerte, // bis eine Entfernung unterschritten ist while(distanz >=0.05){ us.fetchSample(sample, 0); distanz = sample[0]; } // Ausschalten der Motoren Motor.A.stop(); Motor.B.stop(); Hochschule Mannheim| Ute Ihme März 2013 33 DAS LEGO® MINDSTORMS® System Colorsensor • Verfügt über mehrere Moden, z. B. Bestimmung des Farbwertes (ColorID) Bestimmung der reflektierten Helligkeit • Zur Ausleuchtung kann eine LED eingeschaltet werden Hochschule Mannheim| Ute Ihme März 2013 34 Wert Farbe DAS LEGO® MINDSTORMS® System Colorsensor – ColorID Mode • Bestimmung der Farbe • Jede Farbe hat einen Wert • Werte für EV3 Colorsensor Hochschule Mannheim| Ute Ihme -1 keine 0 Rot 1 Grün 2 Blau 3 Gelb 4 Magenta 5 Orange 6 Weiß 7 Schwarz 8 Pink 9 Grau 10 Hellgrau 11 Dunkelgrau 12 Zyan 13 Braun März 2013 35 JAVA Code Colorsensor – ColorID Mode Initialisierung: SensorModes colorSensor = new EV3ColorSensor(SensorPort.S1); SampleProvider col = colorSensor.getMode("ColorID"); Jeweiligen Anschlußport angeben (S1, S2, S3 oder S4) Abfrage der Messwerte: // Intialisierung der Messwerte int sampleSize = colorSensor.sampleSize(); float[] sample = new float[sampleSize]; int farbe; // Abfrage der Messwerte col.fetchSample(sample, 0); // Umrechung float in integer farbe = (int)sample[0]; Hochschule Mannheim| Ute Ihme März 2013 37 JAVA Code Colorsensor – ColorID Mode Programmbeispiel: import import import import import import import lejos.hardware.Button; lejos.hardware.lcd.LCD; lejos.hardware.motor.*; lejos.hardware.port.SensorPort; lejos.hardware.sensor.*; lejos.robotics.*; lejos.utility.Delay; public class EVColorFarbe { public static void main(String[] args) { // TODO Automatisch generierter Methodenstub - Programmcode nächste Folien } }Hochschule Mannheim| Ute Ihme März 2013 38 JAVA Code Colorsensor – ColorID Mode Programmcode für public static void main: //Initialisierung SensorModes colorSensor = new EV3ColorSensor(SensorPort.S1); SampleProvider col = colorSensor.getMode("ColorID"); // Intialisierung der Messwerte int sampleSize = colorSensor.sampleSize(); float[] sample = new float[sampleSize]; int farbe; Hochschule Mannheim| Ute Ihme März 2013 39 JAVA Code Colorsensor – ColorID Mode Programmcode für public static void main: while(true) { // Abfrage der Messwerte col.fetchSample(sample, 0); // Umrechung float in integer farbe = (int)sample[0]; LCD.drawInt(farbe, 3, 3); Button.waitForAnyPress(); LCD.clearDisplay(); } Hochschule Mannheim| Ute Ihme März 2013 40 Neue Inhalte Für das Labor II werden folgende neue Inhalte benötigt - Geschwindigkeitsfestlegung für Motoren - Nutzung des NXT - Lichtsensors Hochschule Mannheim| Ute Ihme März 2013 41 Aufgabe Der Roboter soll einer Linie mit Hilfe von zwei NXT Lichtsensoren folgen. Einem auf der Linie stehenden Hindernis soll der Roboter ausweichen. Dieses ist mit einem Ultraschallsensor zu detektieren. Der Roboter soll selbstständig auf der schwarzen Kachel am Ende der Linie anhalten. Hochschule Mannheim| Ute Ihme März 2013 42 DAS LEGO® MINDSTORMS® System NXT Lichtsensor • Messung der Helligkeit mittels Fotodiode • Helle Fläche reflektiert mehr Licht als dunkle • Messbereich: • 0: dunkel • 100: hell • Zur Ausleuchtung kann eine rote LED eingeschaltet werden Hochschule Mannheim| Ute Ihme März 2013 43 JAVA Code NXT Lichtsensor Initialisierung für Nutzung der LED: SensorModes sensor1 = new NXTLightSensor(SensorPort.S1); SampleProvider licht1 = sensor1.getMode("Red"); Abfrage der Messwerte: Jeweiligen Anschlußport angeben (S1, S2, S3 oder S4) //Intialisierung der Messwerte float wert_licht1; float sample[] = new float[licht1.sampleSize()]; //Abfrage der Messwerte licht1.fetchSample(sample, 0); wert_licht1=sample[0]*100; Hochschule Mannheim| Ute Ihme März 2013 44 JAVA Code NXT Lichtsensor Programmbeispiel: import import import import import import lejos.hardware.lcd.LCD; lejos.hardware.motor.Motor; lejos.hardware.port.*; lejos.hardware.sensor.*; lejos.robotics.*; lejos.utility.Delay; public class Anzeige { public static void main(String[] args) { // TODO Automatisch generierter Methodenstub - Programmcode nächste Folien } } Hochschule Mannheim| Ute Ihme März 2013 45 JAVA Code NXT Lichtsensor Programmcode für public static void main: //Initialisierung SensorModes sensor2 = new NXTLightSensor(SensorPort.S2); SampleProvider licht1 = sensor2.getMode("Red"); float sample[] = new float[licht1.sampleSize()]; float wert_licht1; while(true){ //Abfrage des Messwertes licht1.fetchSample(sample, 0); //Umrechnung des Messwertes wert_licht1=sample[0]*100; //Anzeige des umgerechneten Wertes LCD.drawInt((int)wert_licht1, 0, 1); Hochschule Mannheim| Ute Ihme März 2013 46 JAVA Code NXT Lichtsensor Programmcode für public static void main: //Abfrage ob Hell oder Dunkel if(wert_licht1<50){ LCD.drawString("schwarz", 1, 3); } else{ LCD.drawString("weiß", 1, 3); } Delay.msDelay(1000); } Hochschule Mannheim| Ute Ihme März 2013 47 JAVA Code Setzen eines Geschwindigkeitswertes für die Motoren Motor.A.setSpeed(Geschwindigkeit); Geschwindigkeit - Angabe in Grad/sec - Maximaler Wert ca. Batteriespannung*100 - Daher Maximum bei ca. 720 Beispiel: Motor.A.setSpeed(400); Hochschule Mannheim| Ute Ihme März 2013 48 JAVA Code Abfrage mehrerer Sensoren // Initialisierung von Variablen float wert_licht1; float wert_licht2; // Initialisierung der Sensoren SensorModes sensor1 = new NXTLightSensor(SensorPort.S1); SensorModes sensor2 = new NXTLightSensor(SensorPort.S2); SampleProvider licht1 = sensor1.getMode("Red"); float sample[] = new float[licht1.sampleSize()]; SampleProvider licht2 = sensor2.getMode("Red"); float sample1[] = new float[licht2.sampleSize()]; Hochschule Mannheim| Ute Ihme März 2013 49 JAVA Code Abfrage mehrerer Sensoren // Abfrage der Sensoren licht1.fetchSample(sample, 0); licht2.fetchSample(sample1, 0); // Anzeige der Werte und Casten der Werte auf integer LCD.drawInt((int) wert_licht1, 0, 1); LCD.drawInt((int) wert_licht2, 0, 2); Hochschule Mannheim| Ute Ihme März 2013 50