Laborpraktikum I Legorobotik in JAVA Fakultät für Informatik, Institut

Werbung
Fakultät für Informatik, Institut für Robotik
Laborpraktikum I
Legorobotik in JAVA
Ute Ihme
Hochschule Mannheim | Ute Ihme
DAS LEGO® MINDSTORMS® System
Die Bausysteme
source: Lego via Cnet
1999: RCX
Hochschule Mannheim | Ute Ihme
2007: NXT
2013: EV3
März 2013
2
DAS LEGO® MINDSTORMS® System
Das NXT System
Prinzip von LEGO® MINDSTORMS®
 Roboter wird gebaut mit
 programmierbarem LEGO® Stein
 bis zu 3 Motoren oder Lampen
 bis zu 4 Sensoren
 LEGO® TECHNIC Teile
 Erstellung eines Steuerprogramms
am Computer
 Übertragen des Programms auf den
Roboter
 Testen des Programms
Hochschule Mannheim | Ute Ihme
März 2013
3
DAS LEGO® MINDSTORMS® System
Programmiersprachen für das NXT System
Graphische Programmiersprachen
Text-basierte Programmiersprachen
 NXT-G
 NXC, C (GNU C/C++)
 Java
 LabView
 Robolab 2.9
task main()
{
for (int i = 1; i <= 4; i++)
{
OnFwd(OUT_AC,75);
Wait(2000);
Off(OUT_AC);
OnFwd(OUT_A,75);
Wait(800);
Off(OUT_A);
}
}
‘Quellcodebeispiel: Im Viereck fahren in NXT-G und in NXC
Hochschule Mannheim | Ute Ihme
März 2013
4
DAS LEGO® MINDSTORMS® System
Der NXT Stein
Technische Daten
• 32-bit ARM7 Microcontroller
• 256 kbytes FLASH, 64 Kbytes RAM
• 8-bit AVR Microcontroller
• 4 Kbytes FLASH, 512 Byte RAM
• Bluetooth Kommunikation (drahtlos)
• USB Anschluss (12 Mbit/s)
• 4 Eingänge
• 3 Ausgänge
• Es können bis zu 3 Steine miteinander
verbunden werden (Kommunikation
ist nur mit einem Stein möglich)
• 100 x 64 Pixel LCD Display (graphisch)
• Lautsprecher
Hochschule Mannheim | Ute Ihme
März 2013
5
DAS LEGO® MINDSTORMS® System
Standardsensoren
Ultraschallsensor
Berührungssensor
Tastsenor
Lichtsensor
Mannheim University of Applied Sciences | Ute Ihme
March 4,. 2013
6
DAS SPIELFELD EXPLORE MARS
Allgemeiner Aufbau
Mannheim University of Applied Sciences | Ute Ihme
March 4, 2013
7
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
8
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
9
Start der Entwicklungsumgebung
Starten von Eclipse
3. Programmierung vorbereiten
Datei wählen
Mannheim University of Applied Sciences | Ute Ihme
March 4,. 2013
10
Start der Entwicklungsumgebung
Starten von Eclipse
3. Programmierung vorbereiten
- Neu und
- Projekt…
auswählen
Mannheim University of Applied Sciences | Ute Ihme
- LeJOS NXT Projekt wählen
- auf Weiter> drücken
March 4,. 2013
11
Start der Entwicklungsumgebung
Starten von Eclipse
3. Programmierung vorbereiten
Projektname eingeben
Fertigstellen drücken
Mannheim University of Applied Sciences | Ute Ihme
March 4,. 2013
12
JAVA Code
JAVA Basics I
Jedes JAVA Programm besteht aus Klassen.
public class Berechnung {
// hier wird der Programmcode eingefügt
}
Eine der Klassen muss eine main Methode besitzen.
public class Berechnung {
public static void main(String[] args) {
// hier wird der Programmcode eingefügt
}
}
Mannheim University of Applied Sciences | Ute Ihme
March 4,. 2013
13
Start der Entwicklungsumgebung
Starten von Eclipse
3. Programmierung vorbereiten
- Datei
- neu
- Klasse
wählen
Mannheim University of Applied Sciences | Ute Ihme
March 4,. 2013
14
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
15
Start der Entwicklungsumgebung
Starten von Eclipse
3. Programmierung vorbereiten
Nun kann das
Programmieren beginnen!
Mannheim University of Applied Sciences | Ute Ihme
March 4,. 2013
16
JAVA Code
Realisierung eines Pausenbefehls
1. Warten darauf, dass ein Knopf des NXT Steins gedrückt wird
Button.waitForAnyPress();
2. Nutzung eines leJos Befehls
Delay.msDelay(2000);
Hochschule Mannheim| Ute Ihme
März 2013
17
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("Hello World 1", 0, 2);
b) Für Zahlen
LCD.drawInt(7, 0, 4);
3. Löschen des Displays
LCD.clear();
Hochschule Mannheim| Ute Ihme
März 2013
18
JAVA Code
Das erste Programm: Bildschirmanzeige / Hello World
// Importieren von LejosBibliotheken
import lejos.nxt.*;
import lejos.util.*;
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
19
JAVA Code
Das erste Programm: Bildschirmanzeige / Hello World
// Ausgabe eines Strings mit dem LejosBefehl
LCD.drawString("Hello World 1", 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
20
JAVA Code
Das erste Programm: Bildschirmanzeige / Hello World
Datei speichern bzw. alle Dateien speichern drücken
Hochschule Mannheim| Ute Ihme
März 2013
21
JAVA Code
Das erste Programm: Bildschirmanzeige / Hello World
1.
2.
3.
• Ausführen als LeJOS NXT Programm wählen,
zuvor NXT Stein einschalten (oranger Knopf)
• Programm startet selbstständig, kann aber erneut
über das Menü auf dem NXT erneut gestartet werden.
Hochschule Mannheim| Ute Ihme
März 2013
22
DAS SPIELFELD EXPLORE MARS
Mission 0: Displayanzeige
Erstellen Sie ein erstes Programm, dass Ausgaben auf dem Display
des
NXT realisiert.
• Programmieren Sie dazu zunächst, dass Beispiel der vorherigen Folien
selbstständig nach!
• Realisieren Sie danach eigene Ausgaben!
Hochschule Mannheim| Ute Ihme
März 2013
23
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
 Kombinationen mehrerer Motoren
möglich
 arbeiten ggf. mit gleicher
Geschwindigkeit
Hochschule Mannheim| Ute Ihme
März 2013
24
JAVA Code
Die Klasse Motor
Klasse enthält Objekte eigenen Typs, die direkt mit
Motor.A, Motor.B und Motor.C
referenziert werden können.
Wichtige Methoden
der Klasse Motor
Vorwärtsfahren:
Motor.A.forward();
Rückwärtsfahren:
Motor.A.backward();
Anhalten:
Motor.B.stop();
Hochschule Mannheim| Ute Ihme
Kurve
Motor.B.forward();
Motor.C.backward();
oder
Motor.C.forward();
Motor.B.backward();
März 2013
25
JAVA Code
Motorensteuerung I
- zeitgesteuert Syntax:
Vorwärtsfahren:
Motor.A.forward();
Rückwärtsfahren:
Motor.A.backward();
Anhalten:
Motor.B.stop();
Mannheim University of Applied Sciences | Ute Ihme
Kurve
Motor.B.forward();
Motor.C.backward();
oder
Motor.C.forward();
Motor.B.backward();
March 4,. 2013
26
JAVA Code
Motorensteuerung I import lejos.nxt.*;
import lejos.util.*;
- zeitgesteuert Programmbeispiel:
public class Motoren {
public static void main(String[] args) {
// Vorwärtsfahren
Motor.B.forward();
Motor.C.forward();
Delay.msDelay(2000);
Motor.B.stop();
Motor.C.stop();
Mannheim University of Applied Sciences | Ute Ihme
March 4,. 2013
27
// Rückwärtsfahren
Motor.B.backward();
Motor.C.backward();
Delay.msDelay(2000);
Motor.B.stop();
Motor.C.stop();
JAVA Code
Motorensteuerung I
- zeitgesteuert Programmbeispiel:
// Kurve mit einem Motor
Motor.B.forward();
Delay.msDelay(2000);
Motor.B.stop();
//Kurve mit 2 Motoren
Motor.B.forward();
Motor.C.backward();
Delay.msDelay(2000);
Motor.B.stop();
Motor.C.stop();
}
}
Hochschule Mannheim| Ute Ihme
Mannheim University of Applied Sciences | Ute Ihme
March
März
4,. 2013
28
JAVA Code
Die Klasse Motor
Weitere Funktionen der Klasse Motor
• void setSpeed(int speed)
setzt die Motorgeschwindigkeit
Parameter speed wird in Grad pro Sekunde angegeben (max. 900)
• void reverseDirection()
dreht die aktuelle Drehrichtung um
• void flt()
stopt die Motordrehung, lässt die Motoren dabei aber auslaufen
Mannheim University of Applied Sciences | Ute Ihme
March 4,. 2013
29
JAVA Code
Die Klasse Motor
Weitere Funktionen der Klasse Motor
• void rotate(int angle)
lässt Motor um den angebenen Winkel drehen
• void rotateTo(int limitAngle)
lässt den Motor zu dem angebenden Winkel drehen
• int getTachoCount()
gibt den Drehwinkel seit dem letzten Aufruf von resetTachoCount()
• void resetTachoCount()
setzt den Drehwinkel auf 0
• void lock(int power)
falls das Anhalten eines Motors mit stop nicht reicht, z.B. Roboterarm
Verstärkung der Haltekraft zwischen 1 und 100
Mannheim University of Applied Sciences | Ute Ihme
March 4,. 2013
30
Motorensteuerung II /- rotationsgesteuert import lejos.nxt.*;
import lejos.util.*;
public class MotorKlasse {
// Motorenkann man auch als Variablen deklarien
// Instanziierung zweier Motoren
static NXTRegulatedMotor leftMotor = Motor.B;
static NXTRegulatedMotor rightMotor = Motor.C;
public static void main(String[] args) {
//Setzen der Geschwindigkeit
leftMotor.setSpeed(500);
rightMotor.setSpeed(500);
//Vorwärtsfahren bis Drehwinkel von 300 erreicht ist
leftMotor.rotate(300,true);
rightMotor.rotate(300);
}
}
Mannheim University of Applied Sciences | Ute Ihme
Hochschule Mannheim| Ute Ihme
March
März
4,. 2013
31
DAS SPIELFELD EXPLORE MARS
Mission 1
Schieben der Trägerrakete in Startposition
Start und Ende: Base 1
Die Langstreckenrakete soll von
der Ausgangsstellung zur
Startrampe geschoben werden.
Video:
https://services.informatik.hsmannheim.de/~ihme/Version01/Deutsch/Mission1.html
Mannheim University of Applied Sciences | Ute Ihme
March 4,. 2013
32
DAS SPIELFELD EXPLORE MARS
Mission 2:
Starten der Langstreckenrakete mit dem Satelliten
Start: Base 1
Ende: Base 2
Der Roboter soll der Straße folgen
und die Langstreckenrakete
aufrichten
Video:
https://services.informatik.hsmannheim.de/~ihme/Version01/Deutsch/Mission2.html
Mannheim University of Applied Sciences | Ute Ihme
March 4,. 2013
33
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
34
JAVA Code
Berührungssensor / Tastsensor
Initialisierung:
public static TouchSensor touchSensor = new TouchSensor(SensorPort.S1);
Hinweis:
S1 wird verwendet, wenn der Tastsensor am Port S1 angeschlosssen ist .
Wird der Sensor an einem anderen Port angeschlossen, so ist entsprechend
S2, S3 oder S4 zu verwenden.
Abfrage:
boolean sensorPressed = false;
sensorPressed = touchSensor.isPressed();
Mannheim University of Applied Sciences | Ute Ihme
March 4,. 2013
35
JAVA Code
Berührungssensor / Tastsensor
Programmbeispiel:
import lejos.nxt.*;
public class Tastsensor {
//Initialisierung des Tastsenors am Port 1
public static TouchSensor touchSensor = new
TouchSensor(SensorPort.S1);
public static void main(String[] args) {
//Festlegung einer booleschen Variablen für den Tastsensor
boolean sensorPressed = false;
Mannheim University of Applied Sciences | Ute Ihme
March
März
4,. 2013
36
JAVA Code
Berührungssensor / Tastsensor
Programmbeispiel:
//Geradausfahren bis Tastsensor gedrückt wird
Motor.B.backward();
Motor.C.backward();
while(sensorPressed==false){
//Auslesen des Zustandes des Tastsensor
sensorPressed = touchSensor.isPressed();
}
Motor.B.stop();
Motor.C.stop();
}
}
Mannheim University of Applied Sciences | Ute Ihme
March 4,. 2013
37
DAS SPIELFELD EXPLORE MARS
Mission 3:
Einschalten des Kontrollzentrums
Start und Ende: Base 2
Der blaue Knopf am Kontrollzentrum
soll betätigt werden. Der Roboter soll
mit Hilfe eines Berührungssensors
feststellen, wenn der blaue Knopf
gedrückt ist. Wird der
Berührungssensor ausgelöst, so soll
Hinweis:
der Roboter anhalten und eine Lampe
Lampen werden an die Ausgänge A, B oder C für 30 s einschalten.
angeschlossen und wie Motoren behandelt.
Video:
https://services.informatik.hsmannheim.de/~ihme/Version01/Deutsch/Mission3.html
Mannheim University of Applied Sciences | Ute Ihme
March 4,. 2013
38
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
Hochschule Mannheim| Ute Ihme
März 2013
39
JAVA Code
Ultraschallsensor
Initialisierung für Port 2:
public static UltrasonicSensor sonicSensor = new UltrasonicSensor(SensorPort.S2);
Wichtig Methode:
• int getDistance()
Gibt die Entfernung zwischen Sensor und Hindernis in cm an.
Maximalwert 255
Hochschule Mannheim| Ute Ihme
März 2013
40
JAVA Code
Ultraschallsensor
Programmbeispiel:
import lejos.nxt.*;
public class Ultraschall {
//Initialsierung Ultraschallsensor an Port 2
public static UltrasonicSensor sonicSensor = new
UltrasonicSensor(SensorPort.S2);
public static void main(String[] args) {
int distance=255;
Motor.B.forward();
Motor.C.forward();
Hochschule Mannheim| Ute Ihme
März 2013
41
JAVA Code
Ultraschallsensor
Programmbeispiel:
while(distance>=10){
//Auslesen des Zustandes des Ultraschallsensor
distance = sonicSensor.getDistance();
}
Motor.B.stop();
Motor.C.stop();
}
}
Hochschule Mannheim| Ute Ihme
März 2013
42
DAS SPIELFELD EXPLORE MARS
Mission 4:
Abholen der Astronauten
Start: Base 2
Ende: an Shuttle
Sensor: Ultraschallsensor
Der Roboter soll die Astronauten
abholen. Dazu soll er zur
Raumfähre fahren und ca. 5 cm vor
der Wand stehen bleiben die
Astronauten können dann per Hand
in den Roboter gesetzt werden.
Video:
https://services.informatik.hs-mannheim.de/
~ihme/Version01/Deutsch/Mission4.html
Mannheim University of Applied Sciences | Ute Ihme
March 4,.
4, 2013
2013
March
4343
DAS LEGO® MINDSTORMS® System
Lichtsensor
• Messung der Helligkeit mittels Fotodiode
• Helle Fläche reflektiert mehr Licht als dunkle
• Messbereich:
• 0: dunkel
• 100: hell
• Zur Ausleuchtung kann eine LED eingeschaltet
werden
Hochschule Mannheim| Ute Ihme
März 2013
44
JAVA Code
Lichtsensor
Initialisierung:
public static LightSensor lightSensor = new LightSensor(SensorPort.S3);
Wichtige Methoden:
• int getLightValue()
gibt den aktuellen Sensorwert zurück in % (0-100%)
• void setFloodlight(boolean floodlight)
Ein- und Ausschalten der aktiven Beleuchtung
Hochschule Mannheim| Ute Ihme
März 2013
45
JAVA Code
Lichtsensor
import lejos.nxt.*;
public class Lichtsensor {
public static LightSensor lightSensor = new LightSensor(SensorPort.S3);
public static void main(String[] args) {
int licht = 100;
Motor.B.forward();
Motor.C.forward();
while(licht>=40){
//Auslesen des Zustandes des //Lichtsensor
licht = lightSensor.getLightValue();
}
Motor.B.stop();
Motor.C.stop();
}
}
Hochschule Mannheim| Ute Ihme
März 2013
46
DAS SPIELFELD EXPLORE MARS
Mission 5:
Start: Shuttle
Astronauten zurückbringen
Ende: Base 2
Sensor: Lichtsensor
Führen Sie das Programm von
Mission 4 fort!
Der Roboter soll langsam mit den
Astronauten zur Base zurückfahren.
Video:
https://services.informatik.hs-mannheim.de/
~ihme/Version01/Deutsch/Mission5.html
Mannheim University of Applied Sciences | Ute Ihme
Gestartet wird der Roboter mittels
Tastsensor oder einer NXT Taste.
Mittels Lichtsensor, soll er
automatisch erkennen, wenn er sich
in der Base befindet. Dazu soll die
schwarze Line in Norden der Base
erkannt werden.
March 4,. 2013
47
DAS SPIELFELD EXPLORE MARS
Mission 6: Zusatzaufgabe
Zum Mars fliegen
Start: Base2
Ende: Mars Landeplattform
Mittels zweier Lichtsensoren soll
der Roboter auf der Flugbahn
(Line) zum Marsfliegen.
Benutze einen zusätzlichen
Sensor, um den Linienfolger
abzubrechen.
Video:
https://services.informatik.hs-mannheim.de/
~ihme/Version01/Deutsch/Mission6.html
Mannheim University of Applied Sciences | Ute Ihme
March 4,. 2013
48
Herunterladen