Farb- und Lichtsensor

Der Sensor misst im Mode "Red" die Helligkeit, die eine rote LED reflektiert. Im Mode "RGB" können die drei Farbanteile (rot, grün und blau) gemessen werden.

Der gemessene Wert im Modus "Red"  liegt zwischen 0 und 100%. Der Wert ist abhängig von Entfernung, Farbe, Oberfläche und Form. Vergleichbar ist der Messwert demnach nur, wenn alle Faktoren übereinstimmen.

Prinzip des Lichtsensors

Der Lichtsensor misst die Lichtintensität mit (Modus "Red") oder ohne (Modus "Ambient") einschaltbarem Hilfslicht. Der Roboter kann die Helligkeit in seiner Umgebung ermitteln oder um bei eingeschaltetem Hilfslicht die Helligkeit einer nahen Oberfläche zu erkennen.

Betriebsarten des Sensors

Farb- und Lichtsensor

Modus int mode

String modeName

Bedeutung

"Farb-ID" 0

Color ID

erkennt 8 Farben:0 bedeutet transparent. 1 bis 7 jeweils „schwarz“, „blau“, „grün“, „gelb“, „rot“, „weiß“ und 

"Rotlicht" 1

Red

Das Licht einer roten LED wird reflektiert und vom Sensor gemessen.
"RGB" 2

RGB

Die LED emitiert einen RGB-Strahl, so können die RGB-Anteile des Untergrundes bestimmt werden.

"Umgebungslicht" 3

Ambient

Die LED wird ausgeschalten, so dass nur die Stärke des Umgebungslichts gemessen wird.

Quelltext (Ausgabe auf dem Display)

Ausgabe auf dem Display

import lejos.hardware.Button;
import lejos.hardware.lcd.LCD;
import lejos.hardware.port.SensorPort;
import lejos.hardware.sensor.EV3ColorSensor;
import lejos.utility.Delay;

public class MeinRoboter {
	EV3ColorSensor lichtSensor;
	float[] farbe;

	MeinRoboter() {
		lichtSensor = new EV3ColorSensor(SensorPort.S1);
		lichtSensor.setCurrentMode("Red");
		farbe = new float[lichtSensor.sampleSize()];
	}

	public static void main(String[] args) {
		MeinRoboter m = new MeinRoboter();
		while (Button.ESCAPE.isUp()) {
			m.lichtSensor.fetchSample(m.farbe, 0);
			LCD.drawString(String.valueOf(m.farbe[0]), 0, 3);
			Delay.msDelay(500);
			LCD.clear();
		}
	}
}

Aufgaben:

  1. Der Roboter soll geradeaus fahren, bis er auf eine schwarze Linie trifft. Hier soll er kurz anhalten und dann weiterfahren, bis er sich wieder auf eine weißen Fläche befindet.
  2. Der Roboter trifft auf mehrere schwarze Linien. Diese soll er überfahren, aber nach der dritten Linie soll er anhalten, sich drehen und zurück fahren.
  3. Schreibe die Programm so um, dass er entsprechende Daten (Anzahl der scharzen Linien, Lichtwerte, ...) auf dem Display ausgibt.
Quelltext (Grundprogramm: Motor und Lichtsensor)

Grundprogramm

import lejos.hardware.Button;
import lejos.hardware.motor.UnregulatedMotor;
import lejos.hardware.port.MotorPort;
import lejos.hardware.port.SensorPort;
import lejos.hardware.sensor.EV3ColorSensor;
import lejos.robotics.EncoderMotor;

public class MeinRoboter2 {

	// Eigenschaften des Roboter
	EV3ColorSensor lichtSensor;
	float[] farbe;

	EncoderMotor MotorL;
	EncoderMotor MotorR;

	// Der Konstruktor
	MeinRoboter2() {
		// Lichtsensor
		lichtSensor = new EV3ColorSensor(SensorPort.S1);
		lichtSensor.setCurrentMode("Red");
		farbe = new float[lichtSensor.sampleSize()];
		// Motoren
		MotorL = new UnregulatedMotor(MotorPort.B);
		MotorR = new UnregulatedMotor(MotorPort.C);
	}
	
	// Hauptprogramm
	public static void main(String[] args) {
		MeinRoboter2 m = new MeinRoboter2();
		m.MotorL.forward();
		m.MotorR.forward();
		int v = 100;
		while (Button.ESCAPE.isUp()) {
			// Messvorgang starten --> Messwert in farbe[0] gespeichert
			m.lichtSensor.fetchSample(m.farbe, 0);
			// abhängig vom Messwert die Geschwindigkeit festlegen
			if (m.farbe[0] > 0.5) {
				v = 100;
			} else {
				v = 0;
			}  // ende if
			m.MotorL.setPower(v);
			m.MotorR.setPower(v);
		}  // ende while
	} // ende main
} // ende class
Quelltext (Linienzähler)
import lejos.hardware.Button;
import lejos.hardware.lcd.LCD;
import lejos.hardware.motor.UnregulatedMotor;
import lejos.hardware.port.MotorPort;
import lejos.hardware.port.SensorPort;
import lejos.hardware.sensor.EV3ColorSensor;
import lejos.robotics.EncoderMotor;
import lejos.utility.Delay;

public class LinienZaehler1 {

	// Eigenschaften des Roboter
	EV3ColorSensor lichtSensor;
	float[] farbe;

	EncoderMotor MotorL;
	EncoderMotor MotorR;

	// Der Konstruktor
	LinienZaehler1() {
		// Lichtsensor
		lichtSensor = new EV3ColorSensor(SensorPort.S1);
		lichtSensor.setCurrentMode("Red");
		farbe = new float[lichtSensor.sampleSize()];
		// Motoren
		MotorL = new UnregulatedMotor(MotorPort.B);
		MotorR = new UnregulatedMotor(MotorPort.C);
	}

	// Hauptprogramm
	public static void main(String[] args) {

		boolean hell = true;
		boolean hell_alt = true;
		int wechsel = 0;
		int v = 100;

		LinienZaehler1 m = new LinienZaehler1();
		m.MotorL.forward();
		m.MotorR.forward();
		m.lichtSensor.fetchSample(m.farbe, 0);
		// wert_alt = m.farbe[0];

		while (Button.ESCAPE.isUp()) {
			// Messvorgang starten --> Messwert in farbe[0] gespeichert
			m.lichtSensor.fetchSample(m.farbe, 0);
			// entscheiden ob hell oder dunkel
			if (m.farbe[0] < 0.2) {
				hell = false;
			}
			if (m.farbe[0] > 0.4) {
				hell = true;
			}
			// jetz nachschauen, ob sich was geändert hat
			if (hell != hell_alt) { 
				wechsel = wechsel + 1;
			}
			// aktuellen Wert merken für den nächsten Vergleich
			hell_alt = hell;

			if (wechsel < 6) {
				v = 100;
			} else {
				v = 0;
			} // ende if
			m.MotorL.setPower(v);
			m.MotorR.setPower(v);
			
		} // ende while
		// zum Schluss nochmal die Variable für 3 Sekunden anschauen
		LCD.drawInt(wechsel, 0, 0);
		Delay.msDelay(3000);
	} // ende main
}// ende class