Handy-Programmierung mit JavaME


PHBern Institut Sekundarstufe I
HomeTurtle GidletsBerechnungenKoordinatengrafikDruckenJava-Online
Online-Editor starten

NXT-Roboter mit Handy steuern

Das Softwarepaket NxtJLib, mit dem sich Lego NXT-Roboter steuern lassen, ist praktisch unverändert auch für Java-fähige Handys verwendbar. Die Klassenbibliothek NxtJLibMP for Mobile Phones ist in der Gidlet-Distribution integriert und kann vor der Website www.aplu.ch heruntergeladen werden.

Beispiel 1: Nach der Eingabe des NXT-Namens (Bluetooth Name) erstellt das Handy eine Verbindung. Der NXT- Roboter kann mit den Tasten UP und DOWN vorwärts und rückwärts gesteuert werden. Zu Beginn ist die Geschwindigkeit 0, bei jedem Klick auf die Taste UP wird die Geschwindigkeit um 5 grösser und der Roboter bewegt sich schneller. Beim Klick auf DOWN wird die Geschwindigkeit um 5 kleiner. Bei negativen Geschwindigkeiten fährt der Roboter rückwärts.

Beispiel im Online-Editor bearbeiten

// NxtGidletEx1.java

import ch.aplu.gidlet.*;
import ch.aplu.nxt.*;
import javax.microedition.lcdui.*;  

public class NxtGidletEx1 extends Gidlet
{
  
  private MPanel p = new MPanel();
  private NxtRobot robot;
  private Gear gear; 
  private int speed = 0;
  
  public void main()
  {
    robot = new NxtRobot();
    gear = new Gear();
    robot.addPart(gear);
    p.show();
    p.title("Press up-, down key");
    p.addKeyListener(this);
  }

  public void keyPressed(int keyCode)
  {
    switch (p.getGameAction(keyCode))
    {
      case Canvas.UP:
        speed += 5;
        gear.setSpeed(speed);
        gear.forward();
        break;

      case Canvas.DOWN:
        speed -= 5;
        gear.setSpeed(speed);
        gear.forward();
        break;
    }
  }
  
  public void doExit()
  {
    robot.disconnect();
    notifyDestroyed();
  }
}

 

 

 

 



Erklärungen zum Programmcode:
Gear gear = new Gear();
Gear ist ein Fahrwerk, das aus zwei synchronisierten Motoren besteht. Weitere Informationen zum Programmieren der NXT-Roboter findet man unter www.legorobotik.ch
robot.diconnect()
notifyDestroyed()
Die Verbindung zum Handy wird abgebrochen
Das Programm wird beendet


Beispiel 2: Der NXT- Roboter wird mit den Tasten UP, DOWN, LEFT und RIGHT gesteuert. Ausser dem ist die Taste Exit aktiviert. Das Programm wird beendet, Roboter hält an und die Verbindung zum Handy wird abgebrochen.

Beispiel im Online-Editor bearbeiten

// NxtGidletEx2.java

import ch.aplu.gidlet.*;
import ch.aplu.nxt.*;
import javax.microedition.lcdui.*;  

public class NxtGidletEx2 extends Gidlet
{
  
  private MPanel p = new MPanel();
  private NxtRobot robot;
  private Gear gear; 
  private int speed = 0;
  
  public void main()
  {
    robot = new NxtRobot();
    gear = new Gear();
    robot.addPart(gear);
    p.show();
    p.title("Press up, down, left or right");
    p.addKeyListener(this);
    
  }

  public void keyPressed(int keyCode)
  {
    switch (p.getGameAction(keyCode))
    {
      case Canvas.UP:
        speed += 5;
        gear.setSpeed(speed);
        gear.forward();
        break;

      case Canvas.DOWN:
        speed -= 5;
        gear.setSpeed(speed);
        gear.forward();
        break;
        
      case Canvas.LEFT:
        gear.setSpeed(30);
        gear.left(485);
        break;

      case Canvas.RIGHT:
        gear.setSpeed(30);
        gear.right(485);
        break;
    }
    
  }
  
  public void doExit()
  {
    robot.disconnect();
    notifyDestroyed();
  }
}

 

 

 

 


Erklärungen zum Programmcode:
gear.left(485)
Der Parameter gibt die Zeit im Millisekunden an. Bei der Geschwindigkeit 30 ergibt 485 etwa den rechten Winkel.


Beispiel 3: Weitere Optimierung: Die Geschwindigkeit und die Drehwinkel können stufenweise geändert werden. Beim Klick auf Fire fährt der Roboter in der vorgegebener Richtung geradeaus. Mit Rev (reverse) wird die Vorwärts- bzw. Rückwärtsbewegung invertiert.

Beispiel im Online-Editor bearbeiten

// NxtGidletEx3.java

import javax.microedition.lcdui.*;
import ch.aplu.gidlet.*;
import ch.aplu.nxt.*;

public class NxtGidletEx3 extends Gidlet
{
  private NxtRobot robot;
  private MPanel p;
  private Gear gear = new Gear();
  private int speed = 0// -100..100
  private int steeringAngle = 0// -10..10

  public void main()
  {
    robot = new NxtRobot(nullfalse);
    if (!robot.connect())
      return;
    robot.addPart(gear);

    p = new MPanel("NXT Control"01000100);
    p.show();
    p.bgColor(BLUE);
    p.color(WHITE);
    p.addKeyListener(this);
    p._label(" Cursor keys to navigate"70);
    p._label(" Fire to go ahead"90);
    p._label(" Rev to reverse"110);
    p.addOkButton("Rev");
  }

  public void keyRepeated(int keyCode)
  {
    keyPressed(keyCode);
  }

  public void keyPressed(int keyCode)
  {
    int sStep = 4;
    int aStep = 1;
    boolean ok = false;
    switch (p.getGameAction(keyCode))
    {
      case Canvas.FIRE:
        steeringAngle = 0;
        ok = true;
        break;

      case Canvas.UP:
        speed += sStep;
        if (speed > 100)
          speed = 100;   // Limit
        ok = true;
        break;

      case Canvas.DOWN:
        speed -= sStep;
        if (speed < -100)
          speed = -100;  // Limit
        ok = true;
        break;

      case Canvas.LEFT:
        steeringAngle += aStep;
        if (steeringAngle > 10)
          steeringAngle = 10;   // Limit
        ok = true;
        break;

      case Canvas.RIGHT:
        steeringAngle -= aStep;
        if (steeringAngle < -10)
          steeringAngle = -10;  // Limit
        ok = true;
        break;
    }
    if (ok)
      setMotion();
  }

  private void setMotion()
  {
    gear.setSpeed(Math.abs(speed));
    if (speed >= 0)  // forward
    {
      if (steeringAngle > 1)
        gear.leftArc(1.0 / Math.abs(steeringAngle));
      else
      {
        if (steeringAngle < -1)
          gear.rightArc(1.0 / Math.abs(steeringAngle));
        else
          gear.forward();
      }
    }
    else  // backward
    {
      if (steeringAngle > 1)
        gear.leftArc(-1.0 / Math.abs(steeringAngle));
      else
      {
        if (steeringAngle < -1)
          gear.rightArc(-1.0 / Math.abs(steeringAngle));
        else
          gear.backward();
      }
    }
  }

  public void doOk()
  {
    speed = -speed;
    setMotion();
  }

  public void doExit()
  {
    robot.disconnect();
    notifyDestroyed();
  }
}
 

Erklärungen zum Programmcode:

keyRepeated(int keyCode)
Wird wiederholt aufgerufen, wenn die Taste gedrückt bleibt. Jedesmal wird der Code von KeyPressed ausgeführt