lichtsensor

5. LICHTSENSOR

 

 

DU LERNST HIER...

 

wie der EV3 mit seinen Lichtsensoren die Helligkeit der Unterlage messen kann.


 

WIE FUNKTIONIERT EIN LICHTSENSOR?

 

Der Color-Sensor, der im EV3-Bausatz mitgeliefert wird, kann Farben erkennen und auch als Lichtsensor die Helligkeit der Unterlage messen.

 

Er ist mit einer roten Leuchtdiode (LED) und einer Fotodiode ausgestattet. Die LED beleuchtet die darunterliegende Fläche, die Fotodiode misst die Intensität des reflektierten Lichts. Die Sensorwerte liegen zwischen 0 und 1023 (je heller umso grösser ist der Wert).


 

MUSTERBEISPIELE

 

Beispiel 1: Kante folgen
Der Roboter mit einem Lichtsensor soll am Rand einer dunklen Fläche fahren. Je nachdem, ob er schwarz oder weiss "sieht", korrigiert er die Fahrtrichtung mit einem Links- oder Rechtsbogen. Die Sensorwerte werden in einer Endlos-Schleife mit der Messperiode von 100 ms abgefragt.

Mit der Anweisung v = ls3.getValue() wird die Intensität des Lichts in der Variablen v gespeichert (ls3 bedeutet, dass der Lichtsensor am Port 3 angeschlossen ist).

 


from grobot import *

repeat:
   v = ls3.getValue()
   if v < 500:
      rightArc(0.2)
   else: 
      leftArc(0.2)
   delay(100)
► In Zwischenablage kopieren

Du kannst das Programm auch im Simulationsmodus ausführen. Dazu musst du gerade nach der Importzeite folgende zwei Zeilen einfügen:

RobotContext.useBackground("sprites/blackarea.gif") 
RobotContext.setStartPosition(430, 350)

Die erste Zeile fügt das Hintergrundbild "blackarea.gif" hinzu, die zweite Zeile bestimmt die Position, an der der Roboter zu Beginn erscheint. (Das Grafikfenster ist 500 x 500 Pixel gross, die Koordinate (0,0) ist oben links). Alle Bilder, die in den Beispielen und Aufgaben verwendet werden, sind in der TigerJython-Distribution enthalten (Bilderbibliothek). Du kannst auch eigene Hintergrundbilder verwenden.

Im Realmodus werden die Zeilen mit RobotContext nicht berücksichtigt. Du kannst das gleiche Programm auch im Realmodus ausführen. Du siehst bereits im Simulationsmodus, dass die Robotersteuerung vom Radius des Links- bzw. Rechtsbogen abhängig ist. Ist er zu klein (z.B. 0.05), bewegt sich der Roboter sehr langsam und unruhig. Ist er zu gross (z.B. 0.6), so verliert er oft die Spur.


Beispiel 2: Einem Weg folgen
Um einem Weg zu folgen, so wie es selbstfahrende Autos tun, brauchst du mehrere Sensoren. In einer stark vereinfachten Version eines autonomen Fahrzeuges verwendest du zwei Lichtsensoren.

Die Messwerte des rechten und des linken Sensors speicherst du in den Variablen vR und vL
vR = ls1.getValue()
vL = ls2.getValue()

Danach entwickelst du ein Algorithmus, mit dem der Roboter den Weg möglichst genau folgen kann.

 

 
from grobot import *

RobotContext.useBackground("sprites/trail.gif")

setSpeed(20)
repeat:
    vR = ls1.getValue()
    vL = ls2.getValue()   
    if vL < 500 and vR < 500:
        forward()  
    elif vL > 500 and vR < 500:
        rightArc(0.1)        
    elif vL < 500 and vR > 500:
        leftArc(0.1)    
    delay(100)
► In Zwischenablage kopieren

Für die Simulation verwendest du das Hintergrundbild trail.gif. Im Realmodus musst du je nach grösse der nachgebauten Vorlage die Geschwindigkeit und den Radius der Kreisbögen anpassen. Auch der Schwellenwert 500 muss je nach Helligkeit der Unterlage angepasst werden. Mit print(vR) und print(vL) kannst du die Messwerte im Terminalfenster anzeigen.



Beispiel 3: Quadrat fahren

Im realen Modus ist es schwierig Motoren so zu steuern, dass der Roboter eine längere Zeit auf einer quadratischen Bahn bleibt. Mit Hilfe der Lichtsensoren kann der Roboter seine Richtung selbst korrigieren. Um das Programm besser zu strukturieren, definierst du eine Funktion keepOnTrack(), die die Bewegung des Roboters auf den geraden Wegstücken steuert. Eine rechtwinklige Richtungsänderung erfolgt, wenn der Roboter mit beiden Sensoren hell "sieht". Dann dreht er 90° nach links und setzt seine Fahrt auf dem Streifen fort.

 

 
from grobot import *

RobotContext.useBackground("sprites/field1.gif")
RobotContext.setStartPosition(380, 400)

def keepOnTrack():
    if vL < 500 and vR < 500: 
        forward()
    elif vL < 500 and vR > 500: 
        leftArc(0.1)
    elif vL > 500 and vR < 500:
        rightArc(0.1)
        
repeat:
    vR = ls1.getValue()
    vL = ls2.getValue()
    if vL > 500 and vR > 500:
        left()
        delay(500)
    else:    
        keepOnTrack()
    delay(100)        
► In Zwischenablage kopieren

Für die Simulation verwendest du das Hintergrundbild field1.gif.

 

 

MERKE DIR...

 

Mit einem Lichtsensor kannst du die Helligkeit der Unterlage messen. Der Befehl ls1.getValue() liefert den Wert des Lichtsensors, der am Sensorport 1 angeschlossen ist, als Wert zwischen 0 und 1023. Je grösser der Wert, umso heller ist die Unterlage. Mit zwei Lichtsensoren, lässt sich der Roboter beim Fahren auf den Tracks besser steuern.

 

 

ZUM SELBST LÖSEN

 

 


1.


Der Roboter soll sich endlos auf einem quadratischen Tisch mit einem weissem Innenkreis bewegen, ohne herunterzufallen. Dabei startet er in der Mitte und fährt geradeaus. Erkennt er den Rand, so fährt er rückwärts, dreht um ungefähr 90 Grad nach links und fährt dann wieder vorwärts.

Für die Simulation kannst du das Hintergrundbild circle.gif verwenden.

 
 
RobotContext.useBackground("sprites/circle.gif")

2.

Bei Wegen mit Kreuzungen verliert der Roboter oft die Spur, insbesondere, wenn du ihn schneller fahren lässt. Ergänze das Programm aus dem Beispiel 2 für den Fall, dass der Roboter die Spur verliert (hell-hell "sieht"). Überlege, was er in diesem Fall tun kann.

Für die Simulation kannst du das Hintergrundbild track.gif verwenden:

 
RobotContext.useBackground("sprites/track.gif")

3.

Der Roboter soll auf weisser Unterlage starten und dann beim Erkennen des ersten schwarzen Streifens 2 Sekunden anhalten und weiterfahren (wie bei einer Haltestelle). Beim Erkennen des zweiten Streifens stoppt er definitiv (Endbahnhof).

 

Für den Simulationsmodus benötigst du folgenden Context:

RobotContext.useBackground("sprites/blacktapes.gif")
RobotContext.setStartPosition(490, 450)
RobotContext.setStartDirection(0)

Bemerkung: Die Lösung ist nicht ganz einfach, denn wenn der Roboter bei der Haltestelle anhält, weil er schwarz "sieht", so "sieht" er immer noch schwarz, auch wenn er über den Streifen weiterfährt. Du musst dir mit einer Variablen s merken, in welchem Zustand der Roboter gerade ist, z.B.
s = 0: erstes Fahren auf weiss,
s = 1: Haltestelle angehalten,
s = 2:  zwischen Haltestelle und Endbahnhof auf weiss.
Falls du beim Programmieren stecken bleibst, so kannst du hier ein wenig spicken.

 

 

ANMERKUNG

 

Die Bibliothek grobot enthält nur die Lichtsensor-Funktionen des Colorsensors. Falls du den Colorsensor auch für die Farberkennung verwenden willst, musst du die OOP-Bibliothek ev3robot verwenden (siehe Colorsensor).

 

   

 

5-3
Fachliche Hinweise:

Viele Hintergrundbilder für die Simulation stehen im TigerJython zur Verfügung (siehe "Hilfe/APLU-Dokumentation/Bilderbibliothek"). Du kannst auch eigene Hintergrundbilder erstellen. Sie müssen 500x500 Pixel gross und im gif- oder png-Format sein. Du muss sie im auf deinem Computer im Unterverzeichnis /bin des TigerJython-Installationsvezeichnisses speichern (dort wo siche die Datei tigerjython2.jar befindet). Wenn du im Unterverzeichnis /bin einen Ordner sprites einrichtest, kannst du die Bilder in deinem Programm wie gewöhnt aufrufen mit:
Unter Windows z.B.
RobotContext.useBackground("c:/users/UrsMeier/desktop/bilder/mybackground.gif")
oder RobotContext.useBackground("d:/bilder/bild.gif") 

Unter MacOS z.B.
RobotContext.useBackground("/Users/UrsMeier/Desktop/Bilder/mybackground.gif")  

Unter Windows kannst du die eigenen Hintergrundbilder auch im Unterverzeichnis sprites des Unterverzeichnisses /bin des Installationsverzeichnisses speichern. Dann werden die Bilder mit
RobotContext.useBackground("sprites/mybackground.gif")
automatisch in deinem Programm integriert.

5-4
Fachliche Hinweise:

Zu Beginn wird die Zustandsvariable s auf null gesetzt. In der while-Schleife schaltet man den Zustand um:

....

s = 0
forward()
repeat:
    v = ls1.getValue()
    if v < 500 and s == 0:
        # Bei Haltestelle
        s = 1
        ...
    if v > 500 and s == 1:   
        # Auf weisser Zwischenfahrt
        s = 2
    if v < 500 and s == 2:
        # Am Endbahnhof
        ...