ultrasonic

4. ULTRASCHALLSENSOR (DISTANZSENSOR)

 

 

DU LERNST HIER...

 

wie du mit einen Ultraschallsensor Distanzen messen und auswerten kannst.


 

WIE FUNKTIONIERT EIN ULTRASCHALLSENSOR?

 
Ein Ultraschallsensor hat einen Sender und einen Empfänger für Ultraschallwellen. Bei der Distanzmessung sendet er einen kurzen Ultraschallpuls und misst die Zeit, die dieser benötigt, um zum Objekt und wieder zurück zu laufen. Daraus kann er mit Hilfe der bekannten Schallgeschwindigkeit die Distanz ermitteln.  

Der EV3-Sensor kann die Distanzen im Bereich von ca. 5 bis 200 cm messen und liefert die Werte in cm zurück. Wenn kein Objekt im Messbereich ist, gibt er den Wert 255 zurück.


 

MUSTERBEISPIELE

 

Beispiel 1: Ein Objekt erkennen und anhalten
Der Roboter fährt vorwärts und misst alle 200 Millisekunden die Entfernung zum Objekt, der sich vor ihm befindet. Wenn die Entfernung kleiner als 20 cm ist, hält er an. Schliesse den Ultraschallsensor am Sensorport 1 an

 
from grobot import *

forward()
repeat:
#while not button_escape.was_pressed():
    d = us1.getDistance()
    print(d)    
    if d < 20:
        stop()    
    delay(100)
#exit()    
► In Zwischenablage kopieren

Ist der Sensor am Port 1 angeschlossen, gibt der Befehl us1.getDistance() die Distanz zum Objekt zurück. Der Sensorwert wird in einer Endlosschleife abgefragt und in der Variablen d gespeichert. delay(200) gibt die Messperiode an. Für die Überprüfung der Sensorwerte verwendest du die if-Struktur. Die eingerückte Anweisung stop() wird nur dann ausgeführt, wenn die Bedingung nach if erfüllt ist. Mit print(d) werden die Sensorwerte im Terminalfenster angezeigt.

Anmerkung: Die Sensorwerte werden in einer "endlosen" repeat-Schleife abgefragt. Wenn du das Programm beenden willst, muss du ihn mit gleichzeitigem Drücken der Buttons Enter + Down auf dem EV3-Brück unterbrechen. Dabei wird aber auch das Brickgate-Programm beendet und du muss ihn mit Entert-Button erneut starten, bevor du das nächste Programm ausführen kannst. Eleganter ist, anstelle repeat: die hier auskommentierte while-Schleife mit exit() in der letzten Zeile zu verwenden. Dann kannst du das Programm mit der Escape-Taste auf dem EV3 Brück beenden.


Beispiel 2: Ein Regelungssystem für die Distanz
zum Objekt

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

Für die Auswertung der Sensorwerte verwendest du die if-else-Struktur. Falls die Bedingung nach if stimmt, wird die Anweisung nach if ausgeführt, sonst die Anweisung nach else.

 

 


from grobot import *

forward()
setSpeed(10)
repeat:
    d = us1.getDistance()
    if d < 20:
        backward()
    else: 
        forward()    
    delay(100)
► In Zwischenablage kopieren

Anstelle der repeat-Schleife kannst du die while-Schleife, wie im Beispiel 1 verwenden. Dann kannst du das Programm mit dem Escape-Button beenden.

Beispiel 3: Objekt suchen
Ein Roboter mit einem Ultraschallsensor soll ein Objekt finden und danach zu ihm fahren und ihn umstossen. Der Roboter steht beim Start in einer beliebigen Richtung, d.h. er muss zuerst drehen, bis er den Gegenstand detektiert.

 

from grobot import *

def searchTarget():
   repeat:  
      right()
      delay(50)    
      dist = us1.getDistance()
      if dist != 255:
         right()
         delay(500)
         break
 
setSpeed(10)
searchTarget()
forward()
► In Zwischenablage kopieren

Den Suchvorgang definierst du in der Funktion searchTarget(). Der Roboter dreht jeweils um einen kleinen Winkel nach rechts und misst die Distanz. Falls er ein Objekt detektiert (der Sensor gibt nicht mehr den Wert 255 zurück), dreht er noch ein wenig weiter, damit er gegen Mitte des Objekts gerichtet ist. Mit break kannst du die repeat-Schleife abbrechen und damit den Suchvorgang beenden. Im Hauptprogramm wird die Funktion searchTarge() aufgerufen und der Roboter fährt nach dem erfolgreichen Suchvorgang zum Objekt.

Eine moderne Industrieanlage ohne Sensoren ist heute kaum mehr denkbar. Auch in unserem Alltag umgeben uns Sensoren. Die modernen Autos verfügen über 50 - 100 verschiedene Sensoren: Abstandsensoren, Drehzahl- und Geschwindigkeitsensoren, Füllstansensor des Benzintanks, Temperatursensor usw.

Beim Einparkieren werden Distanzsensoren verwendet, die ähnlich funktionieren, wie diejenigen unseres kleinen mbRobots.

 

 

 

 

MERKE DIR...

 

Die Anweisung us1.getDistance() gibt den Wert des Ultraschalsensors, der am Sensorport 1 angeschlossen ist zurück. Die Sensorwerte werden in einer repeat-Schleife periodisch gemessen, delay(100) bestimmt die Messperiode. Dieser Befehl ist wichtig, das sonst die Werte zu häufig abgefragt werden, was zur Überlastung des Mikroprozessors führen kann.

Mit break kannst du eine Schleife (auch Endlosschleife) abbrechen. Das Programm wird danach mit der nachfolgenden Zeile fortgesetzt.

 

 

ZUM SELBST LÖSEN

 

 

1.

Das Regelungssystem im Beispiel 2 ist noch nicht optimal. Wenn du die Hand ganz wegnimmst, reagiert der Roboter oft verwirrt, da er entweder weit entfernte Gegenstände oder gar nichts detektiert. Optimiere das Programm so, dass der Roboter im Fall, dass die Distanz grösser als 50 cm ist, stehen bleibt.

 
if d < 20:
   ... 
elif d >= 20 and d < 50:
   ... 
else:
   ...    
  Dazu verwendest du die if-elif-else-Struktur, mit welcher du eine mehrfache Auswahl programmieren kannst.

2a.

Ein Roboter mit einem Ultraschallsensor soll einen höherer Gegenstand (Säule aus Pappkarton, Kerze, leichte Büchse...) finden, indem er am Ort langsam dreht und die Distanz misst. Falls er ein Objekt detektiert, löst er für 4 Sekunden einen Alarm aus.


 
2b.

Ein Roboter mit einem Ultraschallsensor soll ein Objekt finden, danach zu ihm fahren und wenige cm vor ihm anhalten

2c.

Der Roboter soll nach einander drei Säulen finden und alle umstossen.

3.
Ein Roboter mit einem Ultraschallsensor versucht den Ausgang aus einem begrenzten Raum zu finden. Er dreht zuerst langsam am Ort und wenn er keine Wand detektiert, fährt er los.  

 

 

ZUSATZSTOFF: ULTRASCHALLSENSOR IM SIMULATIONSMODUS

 

Die Distanzmessung mit einem Ultraschallsensor lässt sich auch im Simulationsmodus ausführen. Dazu musst du die die Koordinaten der Objekte (target) im Grafik-Fenster angegeben. Für die Simulation musst du den Sensor immer am Port 1 anschliessen.

Beispiel 3: Ultraschallsimulation
Der Roboter soll zum Hindernis fahren. Wenn die Distanz kleiner als 30 cm ist, fährt er eine kurze Strecke rückwärts und danach wieder vorwärts.

Für die Simulation verwendest als Hindernis einen horizontalen Balken, den du mit folgendem Context erzeugst:

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

In der ersten Zeile sind die Koordinaten der Eckpunkte des Objekts (ein Rechteck mit dem Mittelpunkt bei (0,0)). Im Grafikfenster wird das Objekt an der Position (250, 100) mit dem Bild bar0.gif dargestellt. Die Bilder sind in der TigerJython-Distribution enthalten (Bilderbibliothek).

from grobot import *

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

forward()
repeat:
    d = us1.getDistance()
    if d < 30:
        backward()
        delay(2000)
    else: 
        forward()    
    delay(100)
► In Zwischenablage kopieren

Der Ultraschallsensor ist beim simulierten EV3 oben auf dem Brick und nicht vorne platziert. Deswegen fährt der Roboter etwas näher zum Balken hin.

Beispiel 4: Ultraschalsimulation (Objekt suchen)
Ein Roboter mit Ultraschallsensor dreht sich langsam am Ort. Wenn er einen Gegenstand detektiert, fährt er hinzu und hält kurz vor ihm an.
Du schreibst eine Funktion searchTarget(), die den Suchvorgang definiert: Der Roboter dreht in kleinen Schritten nach rechts und misst dabei die Distanz dist. Wenn er ein Objekt detektiert (dist != -1), dreht er ein wenig weiter und unterbricht den Suchvorgang mit break.

 

Danach fährt er mit Hilfe einer zweiten repeat-Schleife so lange vorwärts, bis die Distanz zum Objekt kleiner als 30 ist. Mit dem Befehl setBeamAreaColor() kannst du den Suchvorgang besser veranschaulichen.

from grobot import *

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

def searchTarget():
   repeat:  
      right()
      delay(50)    
      dist = us1.getDistance()
      if dist != -1: #real != 255
         right()
         delay(600)
         break
 
setBeamAreaColor(Color.green) 
setSpeed(10)
searchTarget()
forward()

repeat:
   dist = us1.getDistance()
   print(dist)
   if dist < 30:
      stop()
      break
► In Zwischenablage kopieren

Das Objekt ist mit den Koordinaten eines Sechsecks mit dem Mittelpunkt (0, 0) beschrieben und mit dem Bild redtarget.gif an der Position (400, 400) dargestellt wird.


 

MERKE DIR...

 

Die Beispiele mit einem Ultraschalsensor kannst du simulieren. Dabei musst du das Hindernis mit den Koordinaten der Eckpunkte beschreiben. Wenn der simulierte Sensor kein Objekt detektiert, gibt er den Wert -1 zurück (der reale Roboter gibt 255 zurück). Sonst kannst du die Programme ohne Änderung im Realmodus ausführen. Die Zeilen mit RobotContext werden im Realmodus nicht berücksichtigt.


 

ZUM SELBST LÖSEN

 
4.

Löse die Aufgabe 2c) im Simulationsmodus. Ein Roboter soll mit seinem Ultraschallsensor soll drei Gegenstände nach einander finden. Er dreht am Ort und wenn er ein Objekt detektiert, fährt er los und bleibt kurz vor stehen. Danach sucht er das nächste Objekt.

Im Simulationsmodus kannst du squaretarget.gif verwenden, um die Gegenstände darzustellen. Verwende die folgenden Vorlage:

 

 
mesh = [[-30, -30], [-30, 30], [30, -30], [30, 30]]  
RobotContext.useTarget("sprites/squaretarget.gif", mesh, 350, 250)  
RobotContext.useTarget("sprites/squaretarget.gif", mesh, 100, 150)  
RobotContext.useTarget("sprites/squaretarget.gif" ,mesh, 200, 450)  
RobotContext.setStartPosition(40, 450)