TigerJython xx
für Gymnasien

Ultraschallsensor

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 Pi2Go-Roboters kann die Distanz im Bereich 5 cm bis ca. 80 cm messen. Die Funktion getValue() gibt die Entfernung in cm zurück. Die Sensorwerte können mit Pollen oder mit Eventmodell erfasst werden.

 

Beispiel 1: Hindernis registrieren und ausweichen
Der Roboter fährt vorwärts und misst die Entfernung zum Objekt, welches vor ihm liegt. Wenn die Entfernung kleiner als 20 ist, dreht er um 90° nach links und fährt in der neuen Richtung weiter.

# Ultrasonic1.py

from raspibrick import *

robot = Robot()
gear = Gear()
us = UltrasonicSensor()
gear.forward()

while not isEscapeHit():
    v = us.getValue()
    print v
    if v < 20: 
        gear.left(550)
        gear.forward()
robot.exit()
Programmcode markieren (Ctrl+C kopieren)
 



Erklärungen zum Programmcode:

us = UltrasonicSensor(): Erzeugt ein Ultraschallsensor-Objekt
us.getValue(): Gibt die Distanz zum Gegenstand zurück. Falls kein Gegenstand detektiert wird, wird -1.

 

Beispiel 1a: Hindernis registrieren im Simulationsmodus
Für die Erfassung eines Objekts durch den simulierten Sensor wird nicht sein Bild, sondern Koordinaten seiner Eckpunkte verwendet. Für die Berechnung der Entfernung wird die Fläche des Objekts in Dreiecksmaschen (mesh) zerlegt.

# Ultrasonic1Sim.py

from raspisim import *

mesh_hbar = [[200, 10], [-200, 10], [-200, -10], [200, -10]]
mesh_vbar = [[10, 200], [-10, 200], [-10, -200], [10, -200]]
RobotContext.useTarget("sprites/bar0.gif", mesh_hbar, 250, 100)
RobotContext.useTarget("sprites/bar0.gif", mesh_hbar, 250, 400)
RobotContext.useTarget("sprites/bar1.gif", mesh_vbar, 100, 250)
RobotContext.useTarget("sprites/bar1.gif", mesh_vbar, 400, 250)

robot = Robot()
gear = Gear()
us = UltrasonicSensor()
us.setBeamAreaColor(Color.green)
us.setProximityCircleColor(Color.lightGray)
gear.setSpeed(25)
gear.forward()
   
while not isEscapeHit():
    distance = us.getDistance()
    print distance
    if distance < 60:
        gear.backward(2000)
        gear.left(1070)
        gear.forward()
Programmcode markieren (Ctrl+C kopieren)
 


Erklärungen zum Programmcode:

mesh_hbar = [[200, 10], [-200, 10], [-200, -10], [200, -10]]: Koordinaten der Eckpunkte eines horizontalne Balkes, Mittelpunkt im Zentum
useTarget("sprites/bar0.gif", mesh_hbar, 250, 100): 250, 100 gibt die Position des Balken.
setBeamAreaColor(Color.green) : veranschaulicht den Sichtwinkel des Sensors
setProximityCircleColor(Color.lightGray): Die Entfernung wird mit einem Kreis dargestellt


Beispiel 2: Ein Objekt finden und hinzufahren
Der Roboter dreht sich wie eine Radarantenne am Ort und sucht nach einem Gegenstand. Falls er ein Objekt entdeckt, fährt er in dieser Richtung hin. Sobald die Distanz zum Objekt kleiner als 10 ist, hält er an.

# Ultrasonic2.py

from raspisim import *
#from raspibrick import *

mesh = [[50, 0], [25, 43], [-25, 43], [-50, 0], 
          [-25, -43], [25, -43]] 
RobotContext.useTarget("sprites/redtarget.gif", 
          mesh, 400, 400)

def searchTarget():
    global left, right
    found = False
    step = 0
    while not isEscapeHit():  
        gear.right(50)
        step = step + 1
        dist = us.getDistance()
        if dist != -1:
            if not found:
                found = True
                left = step
        else:
            if found:    
                right = step
                break

robot = Robot()
gear = Gear()
us = UltrasonicSensor()
us.setBeamAreaColor(Color.green)  
us.setProximityCircleColor(Color.lightGray)
gear.setSpeed(10)
searchTarget()

gear.left((right - left) * 25)
gear.forward()

while not isEscapeHit()and gear.isMoving(): 
    dist = us.getDistance()
    print dist  
    if dist <= 20:
        gear.stop()      
robot.exit()
Programmcode markieren (Ctrl+C kopieren)
 

Erklärungen zum Programmcode:

def searchTaret(): Ein Gegenstand wird gesucht
if dist != -1: Ein gegenstand gefunden
print dist: Im Remote-Modus wird der gemessene Wert im Ergebnisfenster angezeigt
mesh = [[50, 0], [25, 43], [-25, 43], [-50, 0], [-25, -43], [25, -43]] : Maschenkoordinaten für ein 6-Eck mit dem Durchmesser 100
useTarget("sprites/redtarget.gif", mesh, 400, 400): Das Objekt wird auf die Position (400, 400) gesetzt

 

Beispiel 3: Messwerte auf dem Pi2Go-Display anzeigen
Im Remote-Modus können die Sensorwerte im Ausgabefenster des TigerJython-Editors angezeigt werden. Im autonomen Modus kann für das Anzeigen der Messwerte das kleine Digitaldisplay verwendet werden. Dazu erzeugt man zuerst ein Display-Objekt und verwendet die Funktion display.setText(), um die Werte anzuzeigen.

# Ultrasonic3.py

from raspibrick import *

robot = Robot()
us = UltrasonicSensor()
display = Display()

while not isEscapeHit():
    v = str(us.getValue())
    v = v.replace(".", "")
    v = " " + v
    display.showText(v, [0, 1, 0, 0])
    Tools.delay(1000)
robot.exit()
Programmcode markieren (Ctrl+C kopieren)
 

Erklärungen zum Programmcode:

display = Display(): Erzeugt ein Display-Objekt
v = str(us.getValue()): Gibt die Entfernung zum Gegenstand als Text zurück
v = v.replace(".", ""): Ersetzt Dezimalpunkt durch ein Leerzeichen
display.showText(v, [0, 1, 0, 0]): Zeigt die gemessen Distanz im cm an der Position 0 mit einem Dezimalpunkt an


Beispiel 4: Sensorwerte mit Eventmodell erfassen
Da der Ultraschallsensor kontinuierliche Werte liefert definiert man einen bestimmten Messwert als sogenannten TriggerLevel. Ein Event wird dann ausgelöst, wenn dieser Wert überschritten wird, entweder von grösseren zu kleineren Werten oder umgekehrt. Die Callbackfunktionen werden mit benannten Parametern far = onFar, bzw. near = onNear beim Erzeugen des Ultraschallsensors registriert. Der Defaultwert des TriggerLevels ist 20. Dieser kann mit setTriggerLevel(d) neu definiert werden.

Im Beispiel wird ein Event ausgelöst, wenn die Distanz zu den Objekten kleiner als 30 cm ist. Der Raspi dreht er 90° nach links und fährt in der neuen Richtung weiter. Für den realen Modus können die Zeilen mit RobotContext und BeamerArea weglassen werden.

# Ultrasonic4.py

from raspisim import *

mesh_hbar = [[200, 10], [-200, 10], [-200, -10], [200, -10]]
mesh_vbar = [[10, 200], [-10, 200], [-10, -200], [10, -200]]
RobotContext.useTarget("sprites/bar0.gif", mesh_hbar, 250, 100)
RobotContext.useTarget("sprites/bar0.gif", mesh_hbar, 250, 400)
RobotContext.useTarget("sprites/bar1.gif", mesh_vbar, 100, 250)
RobotContext.useTarget("sprites/bar1.gif", mesh_vbar, 400, 250)

def onNear(d):
    print d
    gear.left(900)
    gear.forward()

robot = Robot()
gear = Gear()
us = UltrasonicSensor(near = onNear)
us.setBeamAreaColor(Color.green)
us.setProximityCircleColor(Color.lightGray)
us.setTriggerLevel(30)
gear.setSpeed(30)
gear.forward()
   
while not isEscapeHit():
    continue
robot.exit()
   
Programmcode markieren (Ctrl+C kopieren)
 

Erklärungen zum Programmcode:

us = UltrasonicSensor(near = onNear): Erzeugt ein Ultraschallsensor mit dem benannten Parameter near
onNear(d): Callbackfunktion, die aufgerufen wird, wenn die Distanz d zu den Objekten kleiner als 30 ist.
us.setTriggerLevel(30): Setzt den TriggerLevel auf 30

 


Aufgaben Serie 9:

1)

Der Roboter soll deinen Handbewegungen folgen, indem er ständig die Distanz 20 cm halten versucht. Wenn er eine Distanz grösser als 20 cm misst, fährt er vorwärts, bei einer Distanz kleiner als 20 cm fährt er zurück. Verwende die Digitalanzeige, um die Distanz Modus anzuzeigen.

 

 

 



2)

Ein Roboter mit einem Ultraschallsensor soll drei leichte, nicht stabile Gegenstände (Kerzen, Büchsen...) finden, auf sie zufahren und sie umstossen.

Versuche es zuerst mit einem Gegenstand.
Für die Simulation kannst du folgendes RobotContext verwenden:

mesh = [[-10, 10], [10, 10], [-10, -10], [10, -10]]
RobotContext.useTarget("sprites/square.gif", mesh, 400, 400)

Drei solche Gegenstände kannst du bei der Simulation wie folgt positionieren:

mesh = [[-10, 10], [10, 10], [-10, -10], [10, -10]]
RobotContext.useTarget("sprites/square.gif", mesh, 300, 100)
RobotContext.useTarget("sprites/square.gif", mesh, 400, 300)
RobotContext.useTarget("sprites/square.gif", mesh, 100, 400)