Real-Time and Embedded Systems

Lichtsensor

Auf den ersten Blick scheint der Lichtsensor einer der einfachsten Sensoren zu sein. Er kann passiv die Helligkeit des einfallenden Liches messen oder selber Licht aussenden und das reflektierte Licht bestimmen. Soweit ist der Sensor auch einfach zu handhaben, aber spätestens wenn es um das Erkennen von Hell und Dunkel geht, fangen die Schwierigkeiten an.

Lsensor 1

Die absolouten Meßwerte des Sensors hängen von mehreren Faktoren ab, zum Beispiel von den Eigenschaften des jeweiligen Sensors, vom Umgebungslicht und dem Ladestand der Batterien. Daher sollte der Lichtsensor möglichst vor jedem Einsatz kalibriert werden.

Kalibrieren

Der Lichtsensor kann theoretisch Meßwerte aus dem Bereich 0..100 liefern. In der Praxis kommen die Werte nur aus einem Teil davon, zum Beispiel aus 16..48 oder 32..75. Damit ein Programm entscheiden kann, ob der Sensor gerade "hell" oder "dunkel" sieht, muß der Sensor darauf geeicht werden. Dies kann so aussehen, daß man den Lichtsensor über schwarzes und weißes Papier hält und beide Male einen Knopf drückt, um den aktuellen Meßwert abzuspeichern.

Das Beispielprogramm lightsensor.c zeigt, wie das Kalibrieren programmiert werden kann. Nach dem Start gibt das Programm "dark" aus und erwartet, daß der Benutzer den Lichtsensor auf eine dunkle Fläche bringt und die PROG-Taste des RCX drückt. Währenddessen werden die aktuellen Meßwerte angezeigt. Danach wiederholt sich mit der Ausgabe "ligh" der Prozess für eine helle Fläche. Die gemessenen Werte werden in den Variablen low und high in der Funktion calibratelight abgespeichert.

Das Programm überprüft, ob low<high ist und die Werte weit genug auseinanderliegen. Außerdem kann es später passieren, daß der Lichtsensor doch einmal Werte liefert, die außerhalb des Bereiches sind. Darauf muß das Programm ebenfalls gefaßt sein.

Mit diesem Wissen kann das Programm den Werten des Lichtsensors eine relative Helligkeit zuordnen, 0% für dunkel und 100% für hell.

Erkennen von Hell-Dunkel-Übergängen

Schwieriger ist das Erkennen eines Hell-Dunkel-Überganges, zum Beispiel wenn der Roboter eine schwarze Linie auf weißem Grund erkennen soll. Das Programm könnte das Abfallen der Helligkeit unter 50% als Anfang der Linie interpretieren, und entsprechend den Anstieg über 50% als Linienende. Diese Methode funktioniert aber nicht zuverlässig. Die Sensorwerte schwanken leicht, so daß am Rand der Linie der Sensor Werte liefert, die ständig um 50% schwanken. Der Roboter würde etliche Linien erkennen statt der einen, die wirklich da ist.

Eine einfache Lösung ist das Hysterese-Verfahren, das in der folgenden Abbildung dargestellt ist.

Lsensor 3

Es werden zwei Schwellwerte festgelegt, zum Beispiel bei 20% und 80%. Der Lichtsensor kann sich in zwei Zuständen befinden, hell und dunkel. Ist er gerade im Zustand dunkel, muß der Meßwert über die obere Schwelle springen, damit der Sensor in den Zustand hell wechselt. Anschließend muß der Meßwert die untere Schwelle erreichen, damit der Sensor auf dunkel umschaltet. Dadurch werden kleine Schwankungen effektiv herausgefiltert. Ein einfaches Schwellwertverfahren mit der Schwelle bei 50% hätte in dem Beispiel 8 Hell-Dunkel-Wechsel erkannt, obwohl nur zwei vorhanden sind. Das Beispielprogramm lightsensor.c zeigt auch das Hysterese-Verfahren.

Auflösungsverbesserung mit Schlitzblenden

Lsensor 4Das Auflösungsvermögen des Lichtsensors ist sehr gering. Sein optisches Element sieht einen relativ großen Bereich, und der Meßwert entspricht daher der mittleren Helligkeit über eine größere Fläche. Details lassen sich so nicht erkennen. Bringt man allerdings eine Blende am Lichtsensor an, verbessert sich die Auflösung.

Ein Nachteil ist dabei aber, daß der Wertebereich umso schmaler wird, je weiter man das Sichtfeld des Sensors einschränkt. Hier gilt es also, einen guten Kompromiß zu finden.

Verschiedenes

Eine Bermerkung gilt noch dem passiven Modus, in dem der Lichtsensor mit abgeschalteter Leuchtdiode die Umgebungshelligkeit liefert. Unsere Erfahrung hat gezeigt, daß die Empfindlichkeit des Sensors in diesem Modus sehr schlecht ist. Daher sollte man immer in den aktiven Modus schalten, auch wenn einen nur um Lichtquellen in der Umgebung interessieren und das reflektierte Licht keine Rolle spielt.