Jython

3. Sensoren


Sensoren sind Messgeräte für die physikalischen Grössen, wie z.B. Abstand, Lichtintensität, Temperatur, Luftfeuchtigkeit usw. Sie wandeln in der Regel nichtelektrische Messgrössen in elektrische Signale um und liefern ihre Messwerte an den Microprozessor. Der mbRobot verfügt über einen Ultraschallsensor und zwei Infrarot Sensoren, mit welchen die Helligkeit der Unterlage gemessen wird. Ausserdem kann der Beschleunigungs- und Kompasssensor des micro:bits verwendet werden.  

Weitere Sensoren können über die I2C-Schnittstelle angeschlossen werden. Einige Beispiel werden in den späteren Kapiteln dieses Tutorials beschrieben.

 

Ultraschallsensor (Distanzsensor)

Der Ultraschallsensor bestimmt die Distanz zu einem Objekt durch die Laufzeit, die ein kurzer Ultraschall-Puls benötigt, um vom Sensor zum Objekt und wieder zurück zu laufen. Der Ultraschallsensor des mbRobot kann die Distanzen im Bereich 2 cm bis ca. 100 cm messen. Die Funktion getDistance() gibt die Entfernung in mm zurück. Die Sensorwerte werden mit Pollen erfasst, d.h. in einer "endlosen" Schleife immer wieder abgefragt.

Beispiel 1: Ein Hindernis registrieren und ausweichen
Der Roboter fährt vorwärts und misst die Entfernung zu Objekten, die vor ihm liegen. Wenn die Entfernung kleiner als 5 cm ist, fährt er eine kurze Strecke zurück, dreht um 90° nach rechts und fährt in der neuen Richtung weiter.

# Mr3a.py
from mbrobot import *
from microbit import *

setSpeed(20)
forward()
while not button_a.was_pressed():
    d = getDistance()
    if d < 100:
        backward()
        sleep(1000)
        right()
        sleep(450)
        forward()
    sleep(200)
exit()
► In Zwischenablage kopieren
 

Erklärungen zum Programmcode:

d = getDistamce() Abstand zum Hindernis in mm
sleep(200) Der Sensorwert wird nur alle 200 Millisekunden abgefragt. Dieser sleep()-Befehl Befehl verhindert, dass der Mikrocontroller in der Schleife nicht unnötig viel Zeit verschwendet und auf andere Befehl reagieren kann, beispielsweise auf den Abbruch des laufenden Programms beim nächsten Programm-Download


Beispiel 2: Ein Regelungssystem für die Distanz zum bewegten Objekt
Der Roboter soll den Handbewegungen folgen, indem er ständig die Distanz 10 cm zu halten versucht. Wenn er eine Distanz kleiner als 10 cm misst, fährt er rückwärts, bei einer Distanz grösser als 10 und kleiner als 30 cm fährt er vorwärts. Wenn sich die Hand zu weit entfernt, bleibt er stehen.

#Mr3b.py
from mbrobot import *
from microbit import *

setSpeed(10)
while not button_a.was_pressed():
    d = getDistance()
    if d < 100:
        backward()
    elif d >= 100 and d < 300: 
        forward()
    else:
        stop()
    sleep(100)    
exit()    
► In Zwischenablage kopieren
 

Erklärungen zum Programmcode:

d >= 100 and d < 300 Verknüpfte Bedingungen. In Python kann auch 100 <= d < 300 geschrieben werden.

 

Infrarotsensoren


Ein Infrarotsensor besteht aus einer Leuchtdiode (LED), welche Licht im Infrarotbereich aussendet und einer Fotodiode, welche die Intensität des reflektierenden Lichtes messen kann.  

Die Infrarotsensoren können die Änderungen im näheren Sichtfeld registrieren und werden in der Praxis häufig als Bewegungsmelder eingesetzt.

Der Rover verfügt über 2 Infrarotsensoren. Man findet sie auf der unteren Seite des Boards, bezeichnet mit Line-R und Line-L. Da das Infrarottlicht an hellen bzw. dunklen Flächen unterschiedlich reflektiert, können die Sensoren zwischen einer hellen und dunklen Unterlage unterscheiden und geben einen digitalen Wert 0 (dunkel) oder 1 (hell) zurück.

 

Beispiel 3: Der Roboter reagiert auf eine dunkle Unterlage
Der Roboter fährt vorwärts auf einer hellen Unterlage. Sobald es mit seinem linken Infrarotsensor eine dunkle Unterlage registriert, fährt er eine kurze Strecke zurück und dann wieder vorwärts. Der Sensor ist am micro:bit Pin 13 angeschlossen (vordefinierter Wert: irLeft).

# Mr3c.py
from microbit import *
from mbrobot import *

setSpeed(10)
forward()

while not button_a.was_pressed():
    v = irLeft.read_digital()
    if v == 0:
        backward()
        sleep(1500)
        forward()        
    sleep(200)
► In Zwischenablage kopieren
 

Erklärungen zum Programmcode:

v = irLeft.read_digital() Gibt den Wert des IR-Sensors als Digitalwert 0 oder 1 zurück, man kann auch
v =pin13.read_digital() schreiben
if v == 0: Die nachfolgenden Zeilen werden ausgeführt, wenn der Roboter eine dunkle Unterlage erkannt hat

 

Beispiel 4: Selbstfahrendes Auto (self-driving car)
Selbstfahrende Autos sind heute bereits eine Realität. Damit das Auto in jeder Situation richtig gesteuert wird, ist ein komplexer Regelungsprozess mit vielen Sensordaten erforderlich. Das nächste Beispiel stellt eine stark vereinfachte Situation dar. Es ist ein Regelungssysten, das den Roboter so steuert, dass er auf den schwarzen Track abfahren kann. Mit Hilfe seiner beiden Infrarotsensoren kann er entscheiden, ob er geradeaus oder auf dem Links- bzw. Rechtsbogen fahren soll.

# Mr3d.py 
from microbit import *
from mbrobot import *

state = "GOTRACK"
setSpeed(10)
while not button_a.was_pressed():
    left = irLeft.read_digital()
    right = irRight.read_digital()
    if left == 0 and right == 0 and state != "FORWARD":  
        forward()
        state = "FORWARD"
    elif left == 0 and right == 1 and state != "LEFT":
        leftArc(0.1)
        state = "LEFT"
    elif left == 1 and right == 0 and state != "RIGHT":
        rightArc(0.1)
        state = "RIGHT"
    elif left == 1 and right == 1:  # out of track
        if state == "LEFT":
            leftArc(0.1)
        elif state == "RIGHT":
            rightArc(0.1)
        state = "GOTRACK"
    sleep(100)
exit()
► In Zwischenablage kopieren
 

Erklärungen zum Programmcode:

Es ist eine typische Aufgabe für die Zustand-Programmierung. Der Roboter kennt im Wesentlichen vier Zustände:
FORWARD: wenn beide Sensoren den Wert 0 liefern
LEFT : wenn der linke Sensor 0 und der rechte 1 meldet. In diesem Fall muss er nach Links korrigieren
RIGHT: wenn der linke Sensor 1 und der rechte 0 meldet, dann muss er mit dem Rechtsbogen korrigieren
GOTRACK: wenn er den Weg verliert (beide Sensoren liefern 1). Die Wegkorrektur ist in diesem Fall davon abhängig, in welchem Zustand er vorher war.

Mit der Zustandsprogrammierung vermeidet man insbesondere, dass Befehle unnötig wiederholt werden. Wenn der Roboter bereits vorwärts fährt und die beide Sensorwerte 0 sind, muss nicht alle 100 ms erneut der Befehl forward() aufgerufen werden, sondern nur dann, wenn sich der Zustand ändert.

 

 


Aufgaben:


1)


Der Roboter fährt vorwärts und misst die Entfernung zum Objekt, welches vor ihm liegt. Wenn die Entfernung kleiner als 10 cm ist, spielt er einen Ton ab und fährt eine kurze Strecke rückwärts. Danach fährt er wieder vorwärts bis seine Distanz zum Objekt kleiner als 10 ist usw.

 


2)

Ein Roboter bewegt sich in einem begrenzten Feld mit dem Ziel, den Ausgang zu finden. Wenn der Abstand zur Begrenzung kleiner als 5 cm ist, so fährt er eine kurze Strecke zurück, dreht um einen kleinen Winkel nach links und fährt anschliessend wieder vorwärts, so lange, bis es ihm gelingt, den Ausgang zu finden.
 



3)

Dein Programm soll mit Hilfe der Infrarotsensoren den Roboter so steuern, dass er möglichst genau der Kante entlang fährt.
 


4)


Ein Roboter soll quer über vier dunkle Streifen fahren und diese mit seinen Infrarotsensoren detektieren. Beim Erkennen des vierten Streifens soll er anhalten.

Bemerkung: Die Lösung ist nicht ganz einfach, denn wenn der Roboter auf einen Streifen fährt und den Streifenzähler um 1 erhöht, 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 beim erstes Fahren auf schwarz, s = 1 beim erstes Fahren auf weiss. Nur wenn der Zustand von weiss auf schwarz ändert, darfst du weiter zählen.