Hier möchte ich euch zwei einfache Beispiele vorstellen, wie die Motoren des EV3 angesteuert werden können. Das erste Beispiel verwendet die Klasse RegulatedMotor der leJOS-Java-Bibliothek, was das fahren eines Rechtecks etwas komplizierter gestaltet. Das zweite Beispiel verwendet die komplexere Klasse MovePilot der leJOS-Bibliothek.
SquareNative
Das Programm lässt einen einfachen Roboter mit zwei Motoren ein Rechteck fahren. Dazu benötigt ihr ein Modell mit zwei Motoren an Port B und C. Ich hab dazu den Riley-Rover nachgebaut. Einen Bauplan für den Riley-Rover findet ihr z.B. hier: Bauplan für den Riley-Rover
Zunächst legen wir eine weitere Java-Klasse an. Das geht wieder über File -> New -> Class. Als Package-Namen hab ich wieder com.lego.ev3.lejos vergeben. Als Namen für das Programm hab ich den Namen SquareNative verwendet.
Hier ist der Quellcode für das erste Beispiel:
package com.lego.ev3.lejos; import lejos.hardware.Button; import lejos.hardware.ev3.LocalEV3; import lejos.hardware.lcd.Font; import lejos.hardware.lcd.GraphicsLCD; import lejos.hardware.motor.EV3LargeRegulatedMotor; import lejos.hardware.port.MotorPort; import lejos.robotics.RegulatedMotor; import lejos.utility.Delay; /** * Benötigt ein Fahrzeug mit zwei unabhängigen Motoren * Die Motoren müssen an Port B und C angeschlossen sein * */ public class SquareNative { public static void introMessage() { GraphicsLCD g = LocalEV3.get().getGraphicsLCD(); g.drawString("Motor-Demo", 5, 0, 0); g.setFont(Font.getSmallFont()); g.drawString("Fährt ein Rechteck", 2, 20, 0); g.drawString("Zwei unabhängige Motoren", 2, 30, 0); g.drawString("an Port B und Port C", 2, 40, 0); } public static void main(String[] args) { // Ausgabe der Intro-Message auf dem LCD-Display des Bricks introMessage(); // Linker Motor an Port B RegulatedMotor left = new EV3LargeRegulatedMotor(MotorPort.B); // Rechter Motor an Port C RegulatedMotor right = new EV3LargeRegulatedMotor(MotorPort.C); // Und im Rechteck fahren while(Button.ESCAPE.isUp()) { // Geschwindgkeit (Grad pro Sekunde) left.setSpeed(720); right.setSpeed(720); // Beide Motoren vorwärts left.forward(); right.forward(); // Eine Sekunde fahren lassen Delay.msDelay(1000); // Beide Motoren stop left.stop(); right.stop(); // Um 90 Grad rotieren left.rotate(-180, true); right.rotate(-360, true); while(right.isMoving()) { Thread.yield(); } } left.close(); right.close(); } }
Die verwendeten Klassen von jeJOS findet im im Eclipse Package Explorer unter leJOS EV3 EV3 Runtime. Eine Dokumentation der Klassen-Bibliothek findet ihr in dem heruntergeladenen leJOS-Paket unter docs. Weiterführende Beispiele findet ihr unter Samples.
Wenn der Quellcode ohne Fehler kompiliert wird, könnt ihr das Programm wieder mit Run -> Run As oder Debug -> Debug As starten. Der Roboter sollte dann ein Rechteck fahren.
Square
Hier nun das Beispiel mit der Klasse MovePilot. Die Instanz der Klasse muss etwas aufwändiger initialisiert werden, bietet dann aber komfortable Möglichkeiten um den Roboter zu bewegen. Auch dazu benötigt ihr wieder ein Modell mit zwei Motoren an Port B und C. Ich hab dazu wieder den Riley-Rover verwendet.
Dafür legt ihr eine weitere Klasse in Eclipse an (File -> New -> Class). Als Package-Namen hab ich wieder com.lego.ev3.lejos vergeben. Als Namen für das Programm hab ich den Namen Square verwendet.
Hier ist der Quellcode für das zweite Beispiel:
package com.lego.ev3.lejos; import lejos.hardware.Button; import lejos.hardware.ev3.LocalEV3; import lejos.hardware.lcd.Font; import lejos.hardware.lcd.GraphicsLCD; import lejos.hardware.motor.EV3LargeRegulatedMotor; import lejos.hardware.port.MotorPort; import lejos.robotics.RegulatedMotor; import lejos.robotics.navigation.MovePilot; import lejos.robotics.chassis.Wheel; import lejos.robotics.chassis.WheeledChassis; /** * Benötigt ein Fahrzeug mit zwei unabhängigen Motoren * Die Motoren müssen an Port B und C angeschlossen sein * */ public class Square { public static void introMessage() { GraphicsLCD g = LocalEV3.get().getGraphicsLCD(); g.drawString("Motor-Demo", 5, 0, 0); g.setFont(Font.getSmallFont()); g.drawString("Fährt ein Rechteck", 2, 20, 0); g.drawString("Zwei unabhängige Motoren", 2, 30, 0); g.drawString("an Port B und Port C", 2, 40, 0); } public static void main(String[] args) { // Linker Motor an Port B RegulatedMotor left = new EV3LargeRegulatedMotor(MotorPort.B); // Rechter Motor an Port C RegulatedMotor right = new EV3LargeRegulatedMotor(MotorPort.C); // Definition der Räder: Motor, Durchmesser in mm, Abstand zwischen Rad und Motor Wheel wheel1 = WheeledChassis.modelWheel(left, 30).offset(-10); Wheel wheel2 = WheeledChassis.modelWheel(right, 30).offset(10); WheeledChassis chassis = new WheeledChassis(new Wheel[] { wheel1, wheel2 }, WheeledChassis.TYPE_DIFFERENTIAL); MovePilot pilot = new MovePilot(chassis); while(Button.ESCAPE.isUp()) { // Fahre 50 cm pilot.travel(50); // 90 Grad Drehung pilot.rotate(90); } pilot.stop(); } }
Wenn der Quellcode ohne Fehler kompiliert, wird könnt ihr das Programm wieder mit Run -> Run As oder Debug -> Debug As starten. Der Roboter sollte wieder ein Rechteck fahren.
Weiter geht’s mit der Erweiterungs-Bibliothek EV3JLIB, die das Programmieren des EV3 schon einfacher macht.