leJOS Beispiele

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.

ev3classes

leJOS – Beispiel

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.