Programmierung der Lego Mindstorms NXT- Roboter mit lejos! INSTITUT FÜR ANTHROPOMATIKLEHRSTUHL PROF. DR.-ING. R. DILLMANN Julian Schill Boris Stach schill@kit.edu boris.stach@student.kit.edu KIT Universität des Landes Baden-Württemberg und nationales Forschungszentrum in der Helmholtz-Gemeinschaft www.kit.edu
Übersicht 1 Infrastruktur NXT-Hardware lejos 2 Entwicklungsumgebung Vorbereitungen und IDE 3 Java an sich Java Kurzeinführung 4 lejos API Ein Java Programm Boris Stach 2/37
Weitere Infos Software, Dokumentationen, Büchertipps, Links,... auf der Praktikumshomepage: http://wwwiaim.ira.uka.de/legowiki Boris Stach 3/37
NXT-Baustein und Peripherie Boris Stach 4/37
Leistung 32-Bit ARM7 Mikroprozessor 256Kb FLASH, 64 Kb RAM 100x64 Pixel Dot Matrix LCD 4 Ein- und 3 Ausgänge (I 2 C) Kommunikation PC mit Lego Mindstorms NXT Anschluß über USB-Schnittstelle oder Bluetooth(BT) (drahtlos): Übertragung der lejos Firmware Übertragung eigener Java-Programme BT: Datenaustausch mit PC oder anderen Robotern Stromversorgung Li-Ion-Akku, mit Ladegerät Alternativ: Standard-Akkus (AAA) Boris Stach 5/37
Menü Programme auswählen, ausführen, löschen Konfigurieren:Töne, Bluetooth Ein/Aus... Boris Stach 6/37
Java und lejos lejos Merkmale seit 2006 für Lego NXT Java Compiler ist standard-konform Normales Java-Tutorial genügt zum Erlernen Enthält Erweiterungen zum Ansteuern des Roboters Gute Dokumentation Boris Stach 7/37
Installation der Entwicklungsumgebung Java Standard Edition JSE von Oracle downloaden & installieren. Lego USB Treiber downloaden & installieren lejos downloaden & installieren libusb downloaden & installieren lejos mit neuer Firmware flashen, wenn Version zu alt! Eclipse IDE downloaden & installieren Weitere Details in Wiki Boris Stach 8/37
Programmierumgebung I Eclipse für Java Boris Stach 9/37
Eclipse: Open Source Entwicklungsumgebung (IDE) für verschiedene Programmiersprachen Programmerstellung, Ablauf: Java Quelltext schreiben (Text!) Compilieren erzeugt Bytecode für Zielhardware (hier: lejos) ggf. Syntaxfehler korrigieren, dann Schritt wiederholen Downloaden auf Zielhardware lejos/nxt Programm starten und testen Boris Stach 10/37
Java an sich Klassen und Objekte Attribute und Methoden Kontrollstrukturen Beispiele Boris Stach 11/37
Aufbau einer Java-Klasse Wichtig! Java-Dateien: <klassenname>.java Dateiname = Klassenname! Grundsätzliches zur Syntax Kommentar: Block: /* */ Zeile: // Anweisungsblock zwischen Hinter jede Anweisung gehört ein Semikolon ; Leerzeichen beliebig erlaubt Boris Stach 12/37
public class Box // Attribute ( Objekte oder Variablen einer Klasse ) private float len ; private float width ; // Methoden ( Funktionen einer Klasse ) public void set_size ( float l, float w ) len = l ; width = w ; public float calculatearea () float A = len * width ; return A ; public class Example public static void main ( String [] args ) Box mybox = new Box (); mxbox. set_size (3,4); System.out. println ( "Area : " + box. calculatearea () ); Boris Stach 13/37
Variablen und Basis-Datentypen Variablen sind Speicherschubladen Berechnen, Auswerten und Manipulieren von Ausdrücken Jeweils verschiedene Operationen möglich: +,-,/,*,... Verschiedene Datentypen Boris Stach 14/37
Methoden Methoden sind Sammlungen von Anweisungen Modularisierung des Programmes Ein oder mehr Übergabe-Parameter public void set_size ( float l, float w ) Genau ein Rückgabe-Wert - Rückgabe mit return-befehl public float calculatearea () float A = len * width ; return A ; Methoden sind immer Teil einer Klasse! Boris Stach 15/37
Objektorientierte Programmierung Java ist eine objektorientierte Programmiersprache. Klassen - Beschreibung von gleichartigen realen oder abstrakten Objekte - Schablone für solche Objekte Objekte - Instanz einer Klasse. - Nur aus einer Klassenbeschreibung erzeugt (instanziiert) Box mybox = new Box (); Box mybox2 = new Box (); Boris Stach 16/37
Verwendung von Klassen Instantiierung von Objekten Objekt der Box-Klasse wird mit new instanziiert. Zugriff auf public-attribute und Methoden durch: <Objektname>.<Member-Name> public class Example public static void main ( String [] args ) Box mybox = new Box (); mxbox. set_size (3,4); System.out. println ( "Area : " + box. calculatearea () ); Boris Stach 17/37
Sichtbarkeit Sichtbarkeits-Spezifizierer für Klassen, Attribute und Methoden: public: für alle sichtbar (aufrufbar, zugreifbar) private: nur innerhalb der gleichen Klasse sichtbar protected: nur innerhalb der gleichen oder in einer Kinder-Klasse sichtbar Vorgabe/Standard: protected Sicheres Programmieren Vermeidung von Spaghetti-Code Boris Stach 18/37
Statische Attribute und Methoden Spezifizierer static vor Attribut oder Methode Alle Instanzen einer Klasse teilen sich das Attribut bzw. die Methode. Statische Methoden können ohne Instantiierung der Klasse aufgerufen werden Ein statisches Attribut wird von allen Instanzen einer Klasse gemeinsam benutzt Besonderheit: Ausführbare Java-Klasse muss statische main-methode besitzen, bsp.: public static void main ( String [] args ) System.out. println ( "I am the main method \n" ); Boris Stach 19/37
Vererbung von Klassen Beschreibung von Klassenhierarchien Modularisierung/ Wiederverwendbarkeit! Bsp.: Die Klasse Quadrat erbt alle Eigenschaften von Box Schlüsselwort: extends Die Methode set_size (... ) wird in quadrat überladen Zugriff auf len und width deshalb protected statt private public class Box // Attribute protected float len ; protected float width ; // Methoden public void set_size ( float l, float w ) len = l ; width = w ;.. public class Quadrat extends Box public void set_size ( float l ) len = l ; width = l ; Boris Stach 20/37
Kontrollstrukturen Verzweigung / Bedingte Ausführung if (condition)... else... Beispiel: public float limiter ( float a, float lower, float upper ) if ( a > upper ) a = upper ; else if ( a < lower ) a = lower ; return a ; Boris Stach 21/37
Kontrollstrukturen Schleifen For-Schleife (zum Zählen mit Variablen) for (startausdruck, Endausdruck, Schrittweite)... Beispiel: public static void main ( String [] args ) for ( int i = 0; i < 10; i ++) System.out. println ( " count \n" + i ); Boris Stach 22/37
Kontrollstrukturen Schleifen While-Schleife (Vergleich) while (Bedingung)... Bedingung wird zuerst geprüft! Do-While-Schleife do... while (Bedingung) Anweisungsblock wird mind. einmal ausgeführt! public static void main ( String [] args ) int i = 0; while ( i < 10) System.out. println ( " count \n" + i ); i = i + 1; public static void main ( String [] args ) int i = 0; do System.out. println ( " count \n" + i ); i = i + 1; while ( i < 10) Boris Stach 23/37
Zusammenfassung Klassen und Objekte Variablen und Attribute Methoden Sichtbarkeit Instanziierung Statische Attribute/Methoden Vererbung Bedingte Ausführung Schleifen Boris Stach 24/37
Weitere Infos zu Java, Auswahl Einfaches Java-Tutorial, englisch: http://www.freejavaguide.com/corejava.htm Java ist auch eine Insel: Umfangreiche Anleitung für Anfänger, deutsch, Online-Version: https://www-rz.uni-hohenheim.de/anw/programme/prg/ java/tutorials/javainsel4/index.htm Links auf unserer Praktikumshomepage: http://wwwiaim.ira.uka.de/legowiki Boris Stach 25/37
lejos API - Was ist eine API? Bisher: Java allgemein. Jetzt: Spezielle lejos Java-Erweiterungen für Lego-Roboter Application Programming Interface (API) Einbinden mit import lejos.nxt.*; Klassenbibliothek Sammlung von Klassen zur Programmierung, u.a.: - Ausgabe von Text auf LCD - Motorsteuerung - Sensordaten lesen - Kommunikation über Bluetooth Boris Stach 26/37
Textausgabe auf LCD Einfache, zeilenweise Textausgabe (Standard-Java): System.out.println(String text); Text positioniert ausgeben LCD.drawString(String text, int x, int y); Zeichenkette (String) zusammensetzen mit + Bsp.: public static void main ( String [] args ) float a = 0.8; for ( int i = 0; i < 10; i ++) System.out. println ( " count \n" + i + ': ' + (a*i) + "done. " ); Boris Stach 27/37
Tastenfeld Implementiert in Klasse Button Zugriff auf alle Tasten: - Button.LEFT - Button.RIGHT - Button.ENTER - Button.ESCAPE Wesentlich Methode boolean ispressed() Beispiel if ( Button. ENTER. ispressed ()) System.out. println ( " enter! " ); Boris Stach 28/37
Motorsteuerung Implementiert in Klasse Motor Drei Motoren an NXT-Ausgängen A,B,C: Motor.A, Motor.B, Motor.C Methoden forward() backward() stop() setspeed(int s) int gettachocount() rotateto(int a) Beschreibung schaltet Motor ein, vorwärts schaltet Motor ein, rückwärts schaltet Motor aus setzt Geschw., Grad/Sekunde Position (Winkel) abfragen auf Winkel rotieren Boris Stach 29/37
Berührungssensor Implementiert in Klasse TouchSensor Instantiierung mit: TouchSensor(sensorport) Wesentlich Methode boolean ispressed() Beispiel TouchSensor touch = new TouchSensor ( SensorPort.S2 ); if ( touch. ispressed ()) System.out. println ( " Sensor pressed! " ); Boris Stach 30/37
Lichtsensor Implementiert in Klasse LightSensor Instanziierung mit: LightSensor(sensorport) Methoden Beschreibung int readnormalizedvalue() lese Helligkeitswert (0..1023) int readvalue() lese Helligkeitswert (0..100) setfloodlight(boolean fl) schalte Licht ein/aus Boris Stach 31/37
Lichtsensor - Werte Boris Stach 32/37
Ultraschall Distanzsensor Implementiert in Klasse UltrasonicSensor Instantiierung mit: UltrasonicSensor(sensorport) Wesentliche Methode int getdistance() lese Entfernung zu Hindernis, 255 für undendlich. Boris Stach 33/37
Checkup Was macht diese Klasse? import lejos. nxt.*; public class Example public static void main ( String [] args ) TouchSensor touch = new TouchSensor ( SensorPort.S1 ); Motor m = Motor. A ; while (! Button. ESCAPE. ispressed ()) m. forward (); while (! touch. ispressed ()) m. backward (); while (! touch. ispressed ()) m. stop (); Boris Stach 34/37
Linienfolger Boris Stach 35/37
Weitere Klassen Kommunikation über Bluetooth Musik Timer und Threads Buttons Random usw, usw., usw. Boris Stach 36/37
Viel Erfolg! Boris Stach 37/37