TigerJython4Kids
HomeTurtlegrafikRobotikDatenbanken
irlightsensor

4. INFRAROT-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 erkennen, wenn er auf einer schwarzen oder weissen Unterlage fährt. Dazu muss die Helligkeit mit einem Lichtsensor (hier für infrarotes Licht) gemessen 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 ist ein Infrarot-Lichtsensor ein Objekt InfraredSensor und die beiden Motoren ein Objekt Gear, die du mit den Variablen irLeft, irRight und gear definierst. Um einen Messwert zu erhalten, rufst du die Funktion getValue() auf, was dir entweder 0 oder 1 zurückgibt, je nachdem ob der Sensor ein kleine (dunkel) oder eine grosse (hell) Lichtintensität feststellt.

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

 

Die Strategie hättest auch du selbst herausgefunden. Damit das Fahrzeug auf der Kante mit der schwarzen Fläche auf der rechten Seite fährt, musst du geradeaus fahren, wenn der linke Sensor hell und der rechte Sensor dunkel sieht. Du fährst einen Rechtsbogen, wenn beide Sensoren hell sehen und einen Linksbogen, wenn beide Sensoren dunkel "sehen".

 

from raspisim import *
#from raspibrick import *

RobotContext.useBackground("sprites/oval.gif")
RobotContext.setStartPosition(250, 460)
  
robot = Robot()
gear = Gear()
irLeft = InfraredSensor(IR_LINE_LEFT)
irRight = InfraredSensor(IR_LINE_RIGHT)
gear.forward()

while not isEscapeHit():
    vLeft = irLeft.getValue()
    vRight = irRight.getValue()
    if vLeft == 1 and vRight == 0:
        gear.forward()
    elif vLeft == 1 and vLeft == 1:   
        gear.rightArc(0.1)
    elif vLeft == 0 and vRight == 0:
        gear.leftArc(0.1)    
robot.exit()
Programmcode markieren (Ctrl+C kopieren, Ctrl+V einfügen)

 

 

MERKE DIR...

 

dass Sensoren als Objekte aufgefasst werden und man 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 auf 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():

Du kannst einen oder zwei Sensoren verwenden. Mit zwei ist die Bewegung aber regelmässiger.


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

Das Fahrzeug soll in eine 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, 450)

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

Es kann sinnvoll sein, zu einem späteren Zeitpunkt aufzuzeigen, wie man Sensor- und Aktorobjekte konstruiert, d.h. wie mit Aufrufen des GPIO-Interfaces Sensoren und Aktoren angesprochen werden.

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 = is.getValue()
    if v == 0 and s == 0:
        # Bei Haltestelle
        s = 1
        ...
    if v == 1 and s == 1:   
        # Auf weisser Zwischenfahrt
        s = 2
    if v == 0 and s == 2:
        # Am Endbahnhof
        s = 3