Python Online
Home     .
lichtsensor

4. LICHTSENSOR

 

 

DU LERNST HIER...

 

wie ein Roboter mit einem Lichtsensor die Helligkeit der Umgebung erfassen kann.

 

 

LICHT- UND COLORSENSOR

 
Ein Lichtsensor ist mit einer roten Leuchtdiode (LED) und einer Fotodiode ausgestattet. Die Leuchtdiode wird dazu verwendet, die darunterliegende Fläche zu beleuchten, damit die Fotodiode die reflektierte Lichtintensität messen kann.  
Lightsensor

Colorsensor

Der Farbsensor (Colorsensor), der im EV3-Bausatz mitgeliefert wird, kann Farben erkennen und damit ebenfalls die Helligkeit berechnen. Einen EV3-Colorsensor kannst du also auch als Lightsensor verwenden.

 

 

MUSTERBEISPIEL

 

Der Roboter soll mit seinem Lichtsensor erkennen, ob er sich auf einer schwarzen oder weissen Unterlage befindet und der Kante entlang fahren.

Mit ls = LightSensor(SensorPort.S3) erzeugst du ein Lichtsensor-Objekt mit dem beliebig gewählten Namen ls und schliesst ihn mit robot.addPart(ls) am Port S3 des  Bricks an.

Um einen Messwert der Lichtintensität zu erhalten, rufst du die Funktion ls.getValue() auf. Diese liefert den momentanen Helligkeitswert im Bereich 0 bis 1000.

 

Der Algorithmus für das Kantenfahren ist einfach: In einer endlosen while-Schleife werden die Sensorwerte ständig abgefragt. Wenn der Helligkeitswert kleiner als 500 ist "sieht er dunkel" und korrigiert die Richtung mit einem Linksbogen, sonst ist die Unterlage hell und der Roboter fährt auf einem Rechtsbogen.

Programm:

from ev3robot import *
  
robot = LegoRobot()
gear = Gear()
robot.addPart(gear)
ls = LightSensor(SensorPort.S3)
robot.addPart(ls)
gear.forward()

while not robot.isEscapeHit():
    v = ls.getValue()
    if v < 500:
        gear.leftArc(0.1)
    else:
        gear.rightArc(0.1)
robot.exit()
► In Zwischenablage kopieren

 

 

MERKE DIR...

 

dass Sensoren ebenfalls als Objekte aufgefasst werden und man üblicherweise mit der Funktion getValue() einen Messwert holen kann.

Beim Drücken der  ESCAPE-Taste wird die Bedingung robot.isEscapeHit()  wahr und die while-Schleife bricht ab.

 

 

ZUM SELBST LÖSEN

 

 

1a)

Untersuche, ob das Programm im Musterbeispiel auch richtig ist, wenn der Roboter sich in der anderen Richtung bewegen soll.

1b)

Untersuche, wie sich die Wahl des Kurvenradius (hier 0.1) auf die Bewegung auswirkt. Verstehst du das Verhalten?


2.


Der Roboter soll sich endlos auf einem quadratischen Tisch mit weissem Innenkreis bewegen, ohne herunterzufallen. (Es kann sich auch um eine Papiervorlage auf dem Boden handeln.) 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.

 

 
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).

 

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, wenn er weiterfährt. Du kannst das Problem so lösen, dass du dir einer Variablen s mit den Werten 0, 1, usw.  merkst, in welchem "Zustand" sich der Roboter momentan befindet. Falls du beim Programmieren stecken bleibst, so kannst du hier ein wenig spicken.

4*.

Hier brauchst du zwei Lichtsensoren.

Das Fahrzeug soll in einer bestimmten Richtung die Achterbahn durchfahren. Folgende Strategie hat sich bewährt:

  • Sehen beide Lichtsensoren schwarz, so fährst du gerade aus
 
  • Sieht der linke weiss und der rechte schwarz, so fährst du einen Rechtsbogen
  • Sieht der rechte weiss und der linke schwarz, so fährst du einen Linksbogen
  • Sehen beide weiss, so fährst du rückwärts

 

   

 

4-3
Fachliche Hinweise:

Das Fahren auf einer Kante ist eigentlich ein Regelungsprozess. Der Kurvenradius ist ein Regelkreisparameter und man erkennt bei der Bewegung das für Regelprozesse typische Schwingen um den Sollwert.

 

4-2
Fachliche Hinweise:

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

s = 0
while s < 3:
    v = ls.getValue()
    if v < 400 and s == 0:
        # Bei Haltestelle
        s = 1
        ...
    if v > 400 and s == 1:   
        # Auf weisser Zwischenfahrt
        s = 2
    if v < 400 and s == 2:
        # Am Endbahnhof
        s = 3