Lego-Robotik mit Java

English
Virtueller Campus Projekt, PHBern
HomeoopNXToopNXJlejosNXTlejosNXJLegoRCXDruckenJava-Online
Online-Editor starten

Lightsensor


Benötigter Roboter:

NXTRobot mit Gear und Lichtsensor


Der verwendete Roboter hat ein Fahrwerk (Gear) und einen Lichtsensor. Ein Lichtsensor ist mit einer roten Leuchtdiode (LED) zur Beleuchtung einer reflektierenden Fläche und einer Fotodiode ausgestattet, welche die Lichtintensität messen kann. Der Lichtsensor kann in zwei Modi betrieben werden:

  • Aktivmode - die LED leuchtet. Dieses Modus wird verwendet für die Messung des  reflektierendes Lichts
  • Passivmode - die LED ist ausgeschaltet. Dieses Modus wird verwendet für die Helligkeitsmessung  einer externen Lichtquelle.

Die Methode getValue() gibt den Wert des Lichtsensors zurück. Die Werte liegen zwischen 0 und 1023 (je grösser der Wert, um so heller).

 

Es gibt grundsätzlich zwei Möglichkeiten, Sensorwerte zu erfassen:
1) mit Java-Event-Modell: Ein Sensor löst einen Event aus und dabei wird eine Callbackmethode aufgerufen, in welcher deklariert wir, was geschehen soll.
2) mit Pollen: Die Sensorwerte werden in einer endlosen while-Schleife ständig registriert. Der Roboter bleibt in einem vorgegebnen Zustand, bis die Sensorwerte eine bestimmte Grenze erreicht haben.

Beispiel 1: Verwendung vom Java-Event-Model. Der Roboter soll sich innerhalb der dunklen Fläche bewegen. Der Lichtsensor wird durch einen LightListener mit einem wählbaren Schwellenwert (Triggerlevel) überwacht. Der LightListener hat zwei Callbackmathoden bright() und dark(), die beide implementiert werden müssen. Wird der Schwellenwert überschritten, so wird die Callbackmethode bright() aufgerufen, der Roboter fährt eine kurze Strecke zurück, dreht um 90° nach links und fährt anschliessen wieder vorwärts..

Beispiel mit Online Editor testen

Programmcode:

// LightsensorEx1.java

import ch.aplu.nxt.*;
import ch.aplu.util.*;

public class LightsensorEx1 implements LightListener
{
  private final int triggerLevel = 525;
  private Gear gear;
  
  public LightsensorEx1()
  {
    NxtRobot robot = new NxtRobot();
   
    LightSensor ls = new LightSensor(SensorPort.S1);
    robot.addPart(ls);
    ls.addLightListener(this, triggerLevel);
    ls.activate(true);

    gear = new Gear();
    gear.setSpeed(30);
    robot.addPart(gear);
    gear.forward();
  
    while (!QuitPane.quit())
    {}
    robot.exit();
  }
   
  public void bright(SensorPort port, int level)
  {
    gear.backward(500);
    gear.left(500);
    gear.forward();
  }  
  
  public void dark(SensorPort port, int level)
  { 
  } 
    
  public static void main(String[] args)
  {
    new LightsensorEx1();
  }
}

Erklärungen zum Programmcode:
implements LightListener
LightListener ist ein Interface.
Interfaces in Java enthalten Methodendeklarationen ohne Programmcode. Während in Java nur eine einfache Vererbung erlaubt ist, ist es möglich, dass eine Klasse mehrere Interfaces implementiert. Sie muss alle Methoden des Interfaces deklarieren. Da das Interface LightListener zwei Callbackmethoden (bright() und dark()) hat, muss auch eine leere Methode dark() deklariert werden
private final int triggerLevel = 525
Triggerlevel wird als final deklariert, d.h. ihr Wert kann im Verlauf des Programms nicht veändert werden
ls.addLightListener(this, triggerLevel) LightListener wird mit der aktuellen Instanz und dem Triggerlevel registriert. Wird der Triggerlevel überschritten, so wird die Callbackmethode bright() aufrufen

 

Beispiel 2: Das gleiche Beispiel mit Pollen.

Beispiel mit Online Editor testen

Programmcode:

// LightsensorEx1a.java

import ch.aplu.nxt.*;
import ch.aplu.util.*;

public class LightsensorEx1a 
{
  public LightsensorEx1a()
  {
    NxtRobot robot = new NxtRobot();
    LightSensor ls = new LightSensor(SensorPort.S1);
    robot.addPart(ls);
    ls.activate(true);
    Gear gear = new Gear();
    gear.setSpeed(30);
    robot.addPart(gear);
    gear.forward();
  
    while (!QuitPane.quit())
    {
      while (ls.getValue() < 500) {} 
      gear.backward(500);
      gear.left(500);
      gear.forward();
    }
    robot.exit();
  }
     
  public static void main(String[] args)
  {
    new LightsensorEx1a();
  }
}

Erklärungen zum Programmcode:
getValue()
Gibt den Sensorwert zurück (pollt den Sensor)
while (ls.getValue() < 500) {} So lange der Sensorwert kleiner als 500 ist pasiert nichts, d.h. der Roboter bleibt im Vorwärtszustand. Wenn es nicht mehr der Fall ist, werden nachfolgende Programmschritte ausgeführt