TigerJython4Kids
HomeTurtlegrafikRobotikDatenbanken
lichtsensor

4. LICHTSENSOR

 

 

DU LERNST HIER...

 

dass die meisten Roboter mit Sensoren ausgerüstet sind, die wie unsere menschlichen Sinne die Umgebung erfassen und wie Messgeräte die Messdaten an den eingebauten Mikroprozessor melden, der sie  auswertet und entsprechende Aktionen ausführt.

 

 

MUSTERBEISPIEL

 

Dein Roboter soll mit seinem Lichtsensor erkennen, wenn er auf einer schwarzen oder weissen Unterlage fährt. Dazu muss die Helligkeit mit einem Lichtsensor gemessen werden und der digitalisierte Wert dem Mikroprozessor übergeben werden. Dieser soll dann über einen Motortreiber den linken und rechten Motor so steuern, dass der Roboter der Kante entlang fährt. Du brauchst dazu folgende Komponenten:

Softwaremässig sind der Lichtsensor ein Objekt LightSensor und die beiden Motoren ein Objekt Gear, die du mit den Variablen ls und gear definierst.

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

In der virtuellen Welt musst du noch ein Bild des Hintergrunds angeben, sowie festlegen, wo sich der Roboter beim Start befindet.

 

Der Farbsensor (Colorsensor), der im EV3-Bausatz mitgeliefert wird, kann Farben erkennen und damit ebenfalls die Helligkeit berechnen. Ein EV3-Colorsensor kann also auch als Lightsensor verwendet werden.Schliesse den Sensor, wie im Programm vorgesehen, am Sensorport S3 an!

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.

 

from simrobot import *
#from ev3robot import *

RobotContext.useBackground("sprites/oval.gif")
RobotContext.setStartPosition(250, 460)
  
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()
Programmcode markieren (Ctrl+C kopieren, Ctrl+V einfügen)

 

 

MERKE DIR...

 

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

Du kannst das Programm im autonomen, fremdgesteuerten oder Simulationsmodus laufen lassen.

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. Für den Simulationsmodus benötigst du folgenden Context:

 
 
RobotContext.useBackground("sprites/circle.gif")
RobotContext.setStartPosition(250, 200)

Verwende wieder eine Schleife
while not robot.isEscapeHit():

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/twostrips.gif")
RobotContext.setStartPosition(250, 450)

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 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, s = 3: am Endbahnhof. 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

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

RobotContext.useBackground("sprites/track.gif")
RobotContext.setStartPosition(250, 490)

Verwende wieder eine Schleife
while not robot.isEscapeHit():

 

   

 

4-1
Fachliche Hinweise:

Die Messwerte können als analoge Grössen, d.h. als Spannung in einem bestimmten Bereich (z.B. zwischen 0 und 5V) oder als digitale Grössen, d.h. als zwei Spannungspegel (z.B. 0 oder 5V) an das eingebettete Microkontroller-System übermittelt werden. Analoge Werte werden dann mit einem Analog-Digital-Konverter in eine ganze Zahl umgewandelt (z.B. als 8 bits im Bereich 0 und 255 oder 10 bits im Bereich 0..1000). Digitale Werte entsprechen den Logikwerten 0 oder 1 bzw. False oder True.

4-2
Didaktische Hinweise:

In diesem Zusammenhang spricht man davon, dass man die Wirklichkeit softwaremässig abstrahiert oder modelliert. Eine adäquate Umsetzung bzw. Abbildung der Wirklichkeit in die Software gehört zu den wichtigsten Aufgaben der Informatik. Hier zeigt sich, dass die objektorientierte Programmierung den Problemen aus der Mess- und Steuerungstechnik und der Robotik perfekt angepasst ist, da man ja auch in der realen Welt Sensoren und Aktoren als Objekte auffasst.

 

4-3
Fachliche Hinweise:

Das Koordinatensystem der virtuellen Welt hat die x-Achse im Bereich 0...500 nach rechts und die y-Achse im Bereich 0..500 nach unten mit dem Nullpunkt in der oberen linken Ecke.

4-4
Didaktische 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-5
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