ultrasonic

6. ULTRASCHALLSENSOR

 

 

DU LERNST HIER...

 

wie du einen Ultraschallsensor dafür verwenden kannst, um die Distanz zu einem Objekt (Target) zu bestimmen. Dazu sendet der Sensor ähnlich wie ein Radar einen kurzen Ultraschall-Puls aus und bestimmt die Zeit, die dieser benötigt, um zum Objekt und wieder zurück zu laufen. Daraus kann er aus der bekannten Schallgeschwindigkeit die Distanz ermitteln Der Sensor liefert die Distanz  in cm im Bereich von ca. 5 cm und 100 cm, wobei -1 abgegeben wird, wenn kein Objekt im Messbereich ist.

 

 

MUSTERBEISPIEL

 

Dein Programm soll dafür sorgen, dass der Roboter möglichst gut in einer bestimmten Distanz zu deiner Hand bleibt. Ist er zu Nahe, soll er rückwärts fahren, sonst soll er vorwärts fahren.

Wiederum wird der Sensor durch ein Objekt UltrasonicSensor in das Programm eingebunden. Dein Programm fragt in einer Wiederholschleife jede halbe Sekunde mit getValue() die aktuelle Distanz ab. Je nach dem erhaltenen Wert, sagst du dem Roboter, dass er vorwärts oder rückwärts fahren muss.

 

from raspibrick import *

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

while not isEscapeHit():
    d = us.getValue()
    if d < 20:
        gear.backward()
    else:
        gear.forward()    
robot.exit()
Programmcode markieren (Ctrl+C kopieren, Ctrl+V einfügen)

 

 

MERKE DIR...

 

dass der Ultraschallsensor nicht häufiger als ungefähr alle ½ Sekunde einen Messwert liefern kann. Darum solltest du ihn in der Wiederholschleife auch nicht öfter abfragen. Du kannst das Programm nur für den Realmodus verwenden.

 

 

ZUM SELBST LÖSEN

 

 


1.


Der Roboter soll in senkrechter Richtung zu einer Wand fahren und bei rund 10 cm zur Wand den Rückwärtsgang einschalten und 3 s. rückwärts fahren. Nachher soll er wieder vorwärts fahren.

Für die Simulation verwendest du an Stelle der Wand einen horizontalen Balken, den du mit folgendem Context erzeugt

 
 
target = [[200, 10], [-200, 10], [-200, -10], [200, -10]]
RobotContext.useTarget("sprites/bar0.gif", target, 250, 100)

2a.

Ein Roboter mit einem Ultraschallsensor soll ein höherer Gegenstand (Säule aus Pappkarton, Kerze, leichte Büchse...) finden, hinzufahren und diesen umstossen. Der Roboter steht beim Start in einer beliebigen Richtung, d.h. er muss zuerst am Ort drehen, bis er den Gegenstand registriert.

 

 

2b.

Dasselbe, aber der Roboter soll wenige cm vor der Säule anhalten

2c.

Dasselbe, aber der Roboter soll mehrere Säulen umstossen.
Organisiere einen Wettbewerb. Wem gelingt es am schnellsten?

 

   

 

6-1
Fachliche Hinweise:

Die Liste target definiert das reflektierende Objekt. Sie enthält die Koordinaten der 4 Eckpunkte relativ zum Mittelpunkt des Rechtecks. useTarget() verwendet ein Spritebild bar0.gif zur Darstellung des Objekts.

6-2
Fachliche Hinweise:

Das Problem kann auch im Simulationsmodus gelöst werden. Für die sechseckige Säule in der unteren rechte Ecke wir folgender Context verwendet:

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

Die beiden folgenden Zeilen bewirken, dass in der Simulation der Strahlbereich und ein Messkreis dargestellt werden.

us.setBeamAreaColor(makeColor("green"))  
us.setProximityCircleColor(makeColor("lightgray")

Beachte, dass getDistance() in der Simulation -1 zurückgibt, wenn kein Target gefunden wird.

6-4
Fachliche Hinweise:

Es ist hübsch, den aktuellen Messwert auf dem Siebensegment-Display anzuzeigen. Dazu definiert man mit display = Display() ein Objekt und ruft die Funktion display.showText(text) für die Anzeige von maximal 4 Zeichen auf. Da man den Messwert v als Float erhält, muss man ihn zuerst mit str(v) in einen String konvertieren.