A09|04 Der Ultraschall Abstandsmesser
HC-SR04 Blue Ultrasonic Sensor
Sensorwerte / Distanzen messen
Das Ultraschall-Modul bietet eine hervorragende berührungslose Entfernungsmessung zwischen 2cm und 400cm mit einer Genauigkeit von 3mm. Der Sensor erfasst über Schallwellen berührungslos und verschleißfrei zahlreiche Objekte mit unterschiedlichen Eigenschaften – egal, ob undurchsichtig, metallisch, nicht-metallisch, körnig, fest, transparent, pulverförmig oder sogar flüssig. Sie sind stromsparend (geeignet für batteriebetriebene Geräte), preiswert, einfach anzuschließen und bei Bastlern sehr beliebt. Da er mit 5 Volt betrieben wird, kann er direkt an einen Arduino angeschlossen werden.
Spezifikationen
- Signalart: digital
- Spannung: 3,3V – 5V
- Pinabstand: 2,54mm
- Stromverbrauch: 15mA
- Reichweite: 2 bis 450cm
- Messwinkel: 15 Grad
- Betriebsstrom 15mA
- Betriebsfrequenz 40KHz
- Messgenauigkeit 3mm
- Trigger-Eingangssignal 10µS TTL-Impuls
Ultraschallsensoren haben den Vorteil, dass sie alle Materialarten erfassen und unter sehr vielen ungünstigen Bedingungen arbeiten. Sie werden nicht durch atmosphärischen Staub, Regen, Schnee usw. beeinträchtigt. Im Vergleich zu induktiven oder kapazitiven Näherungssensoren hat er einen deutlich größeren Erfassungsbereich. In der Regel sind sie daher optischen Sensoren in solchen Einsatzbereichen überlegen. Vor allem liefert er gute Messwerte bei der Erkennung großer Objekte mit harten Oberflächen.
Leider ist er sehr empfindlich gegenüber Temperaturschwankungen, die das Messergebnis beeinträchtigen. Dieses Manko kann aber durch einen Temperatursensor ausgleichen werden, vorausgesetzt, dass die Lufttemperatur im Messbereich gleichbleibend ist. Bei der Detektierung hat er größere Schwierigkeiten mit Reflexionen von weichen, gekrümmten und kleinen Objekten. Schallabsorbierende Materialien wie Watte oder weiche Schaumstoffe können das Messergebnis beeinträchtigen, reduzieren. Heiße Objekte wie z.B. Flüssigkeiten oder feste Materialien sind nur bedingt messbar, da die Geschwindigkeit, mit der sich der Schall ausbreitet, von der Lufttemperatur abhängt.
Was ist Ultraschall?
Ultraschall sind Schallwellen mit Frequenzen, die oberhalb der Hörgrenze des menschlichen Gehörs liegen. Das menschliche Gehör kann Schallwellen wahrnehmen, die im Bereich von etwa 20 Mal pro Sekunde (tiefes Grollen) bis etwa 20.000 Mal pro Sekunde (hohes Pfeifen) schwingen. Ultraschall hat jedoch eine Frequenz von über 20.000Hz und ist daher für den Menschen unhörbar.
Funktionsweise des Ultraschall-Abstandsmessers
Ultraschallwellen basieren auf dem Prinzip des Schalls. Im Grunde ist es ein Ton, den Menschen nicht wahrnehmen können. Als Schall werden mechanische Schwingungen bezeichnet, die sich durch Gase, Flüssigkeiten oder Festkörper verbreiten. Diese Schwingungen pflanzen sich in Form von Schallwellen fort. Im Medium Luft sind Schallwellen Druckschwankungen. Die Schallgeschwindigkeit ist die Geschwindigkeit, mit der sich Schallwellen durch die Luft fortbewegen.
Die Schallgeschwindigkeit ist im allgemeinen abhängig vom Medium (insbesondere Elastizität und Dichte) und der Temperatur. In Gasen wie die Luft spielt einzig die Temperaturabhängigkeit eine nennenswerte Rolle (bei Bedingungen um 1bar und 20°C). Die Schallgeschwindigkeit in trockener Luft und bei 20°C ist 343,2m/s schnell. Das entspricht 1235,5 km/h.
Der HC-SR04 Abstandssensor besteht im Wesentlichen aus zwei Ultraschall-Elementen. Auf der Vorderseite des HC-SR04 Sensors befinden sich zwei silberne Zylinder, von denen einer der Sender und der andere der Empfänger der Schallwellen ist.
Der Sensor sendet eine Schallwelle mit einer ganz konkreten Frequenz aus. Dann wartet er darauf, dass diese Schallwelle an einem Objekt abprallt und zurück reflektiert wird (siehe untere Abbildung). Es wird die Zeit zwischen dem Aussenden und der Rückkehr der Schallwelle gemessen. Wenn man weiß, wie schnell sich etwas bewegt und wie lange es unterwegs ist, kann man die zurückgelegte Entfernung mit der Distanz-Gleichung berechnen.
Lass uns diesen Prozess etwas genauer betrachten. Im Folgenden gehen wir auf die einzelnen Prozessschritte ein. Siehe hierzu die untere Abbildung an:
Der HC-SR04 hat vier Pins, VCC, GND, TRIG und ECHO. Sie alle haben unterschiedliche Funktionen. Die Pins VCC und GND sind die einfachsten, sie versorgen den HCSR04 mit Strom.
#1 Der TRIG-Pin ist für die Steuerung des Sensors zuständig und startet die Messung => Er ist verantwortlich für das Senden des Ultraschallimpulses. Die Messung beginnt, wenn ein Impuls von mindestens 10µs (10 Mikrosekunden) Dauer vom Arduino zum TRIG-Pin des Sensors angelegt wird. TRIG ist die Abkürzung für Trigger und bedeutet Auslöser.
#2 Der ECHO-Pin ist die Datenleitung, der das Messergebnis später an das Arduino schickt. Sobald der TRIG-Pin einen Impuls von mindestens 10µs bekommt, wird der ECHO-Pin auf HIGH geschaltet und bleibt auf HIGH. Damit wird die Startzeit der gesendeten Ultraschallwellen markiert.
#3 Jetzt sendet der Sensor Ultraschallsignale von 8 Impulsen mit 40kHz aus. Dieses 8-Impulse-Muster macht die Ultraschallsignatur des Geräts einzigartig und ermöglicht es dem Empfänger, das gesendete Muster von den Ultraschallgeräuschen der Umgebung zu unterscheiden.
#4 Die Schallwelle trifft auf ein Objekt und wird zum Sensor zurückgeworfen. (Siehe untere Abb.)
#5 Sobald die Schallwelle auf den Empfänger trifft, werden sie eingelesen und die interne Elektronik des Ultraschallsensors schaltet den ECHO von HIGH auf LOW (siehe untere Abb.). Damit wird die Stopzeit markiert. Jetzt wird die vergangene Sendezeit mit der Empfängerzeit verglichen. Die Differenz beider Werte variiert zwischen 150µs und 25ms. Dies ist die Zeit, die der Ultraschall gebraucht hat. Das Signal wird über den ECHO-Pin an das Arduino gesendet. Der Wechsel des ECHO von HIGH auf LOW wird später zur Berechnung der Entfernung verwendet. Dies kann mithilfe der einfachen Distanzgleichung berechnet werden: Distanz = Zeit x Geschwindigkeit.
Wie du die Entfernung berechnest
Die Distanz-Berechnung kennst du sicherlich noch vom Schulunterricht. Jetzt hat dieser Stoff endlich einen relevanten Wert: Wir brauchen sie tatsächlich für eine reale Anwendung.
Bei der Berechnung der Distanz gibt es zwei Formeln: die gleichförmige Bewegung und die gleichförmig beschleunigte Bewegung. Da Ultraschall im Allgemeinen nicht beschleunigt, verwenden wir die Formel für die gleichförmige Bewegung. Folgende zwei Eigenschaften sind hier wichtig:
- Die Geschwindigkeit der Wellen ist immer gleich schnell.
- Die Beschleunigung ist Null, sprich die Wellen werden weder abgebremst, noch werden sie schneller.
Die Formel der gleichförmigen Bewegung setzt die Informationen Strecke, Geschwindigkeit und Zeit zueinander in Relation. Es folgt die allgemeine Formel zur Berechnung der Geschwindigkeit aus der Physik für gleichförmige Bewegungen:
s = v · t
Strecke = Geschwindigkeit x Zeit
"s" ist die Strecke in Meter [m]
"v" ist die Geschwindigkeit in Meter pro Sekunde [m/s]
"t" ist die Zeit in Sekunden [s]
Lass uns eine Beispiel-Berechnung anstellen: Nehmen wir an, dass sich vor dem Sensor ein Objekt. Die Ultraschallwellen wurden gesendet, reflektiert und empfangen werden. Jetzt wird am ECHO-Pin ein Impuls der Breite 400µs empfangen. Damit haben wir bereits die Zeit. Jetzt brauchen wir nur noch die Geschwindigkeit. Auch diese ist bereits bekannt. Beim Ultraschall handelt es sich um ein Gerät, welches Luftmoleküle in Bewegung bringt und hierdurch Schallwellen erzeugt. Wir haben bereits besprochen, dass sich Schall mit einer Geschwindigkeit von 343,2m/s fortbewegt. Wir müssen die Schallgeschwindigkeit in cm/µs umrechnen, um sie in die Formel ein zusetzen. Die Schallgeschwindigkeit in Zentimetern pro Mikrosekunde ergibt gerundet 0,034cm/µs.
Strecke = Geschwindigkeit x Zeit
Strecke = 0,034cm/µs x 400µs
Eine wichtige Sache müssen wir noch beachten. Vergessen wir nicht, dass die Zeitangabe von 400µs die Strecke ist, die die Wellen brauchen, um ausgesendet UND reflektiert zu werden. Das Ergebnis muss also halbiert werden:
Strecke = (0,034cm/µs x 400µs) / 2
Strecke = 6,8cm
Jetzt wissen wir also, dass das Objekt 6,8cm vom Sensor entfernt ist.
Der Aufbau
VCC ist die Stromversorgung für den HC-SR04 Ultraschall-Sensor, den wir an den 5V-Pin des Arduino anschließen. GND wird mit dem GND des Arduino verbunden. Trig (Trigger) Pin wird verwendet, um die Ultraschall-Impulse von 10µs auszulösen. Der Echo-Pin erzeugt Impulse zwischen 150µs und 25ms, wenn das reflektierte Signal empfangen wird und wird am Pin 4 des Arduinos verbunden.
Der minimal Sketch
Der Sketch misst die Distanz zum Objekt und sendet das Ergebnis an den seriellen Monitor. Kopiere den unteren Sketch, füge ihn in die Arduino IDE ein und lade ihn auf das Arduino-Board rauf.
/**************************************************
A09|04 Der Ultraschall-Abstandsmesser
Mr Robot UXSD / www.mrrobotuxsd.com
***************************************************/
//Trig- und Echo-Pin definieren:
#define trigPin 2 //startet die Messung
#define echoPin 3 //Datenleitung zum Arduino
//Definiere die Variablen:
long duration; //Variable um die Dauer zu speichern
int distance; //Variable um die Distanz zum Objekt zu speichern
void setup()
{
//Definiere Ein- und Ausgänge:
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
//Initialisiere die Serielle Kommunikation mit 9600 Bits pro Sekunde:
Serial.begin(9600);
}
void loop()
{
//Lösche den trigPin, indem wir ihn auf LOW setzen:
digitalWrite(trigPin, LOW);
delayMicroseconds(5);
//Triggere den Sensor, indem wir den trigPin für 10ms auf HIGH setzen:
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
//Lese den echoPin.
//pulseIn() gibt die Dauer des Impulses in Mikrosekunden zurück:
duration = pulseIn(echoPin, HIGH);
//Berechne die Entfernung: Strecke = Geschwindigkeit x Zeit
distance = duration * 0.034 / 2;
//Sende die Entfernung zum seriellen Monitor:
Serial.print("Distanz = ");
Serial.print(distance);
Serial.println(" cm");
delay(50);
}
Der Sketch im Detail
Der Sketch beginnt mit der Initialisierung von unterschiedlichen Variablen:
Mit trigPin startet wir die Messung.
Der echoPin schickt das Ergebnis ans Arduino.
duration ist die Variable, die die “Reisedauer“ der Ultraschallwelle zwischen speichert.
Mit der Variablen distance wird das Messergebnis gespeichert.
//Trig- und Echo-Pin definieren:
#define trigPin 2 //startet die Messung
#define echoPin 3 //Datenleitung zum Arduino
//Definiere die Variablen:
long duration; //Variable um die Dauer zu speichern
int distance; //Variable um die Distanz zum Objekt zu speichern
Im void setup() wird trigPin als OUTPUT und echoPin als INPUT deklariert. Zusätzlich wird die serielle Kommunikation mit 9600bits pro Sekunde initialisiert.
void setup()
{
//Definiere Ein- und Ausgänge:
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
//Initialisiere die Serielle Kommunikation mit 9600 Bits pro Sekunde:
Serial.begin(9600);
}
In der loop-Schleife muss zuerst sichergestellt werden, dass der trig-Pin von vorherigen Signalen (HIGH/LOW) befreit wird, also müssen wir diesen Pin für kurze Zeit (5µs) auf einen LOW-Status setzen.
//Lösche den trigPin, indem wir ihn auf LOW setzen:
digitalWrite(trigPin, LOW);
delayMicroseconds(5);
Um nun die Ultraschallwelle zu erzeugen, müssen wir den trig-Pin mindestens 10µs auf HIGH setzen. Der Sensor erzeugt dann ein 8-Impuls-Muster mit 40kHz. Dieser Schallimpuls breitet sich mit Schallgeschwindigkeit aus, prallt zurück und wird vom Empfänger des Sensors empfangen.
//Triggere den Sensor, indem wir den trigPin für 10ms auf HIGH setzen:
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
Bestimmen wir nun die Sende- und Empfangszeit. Als wir den Trig-Pin mit den 10µs versorgt haben, hat der Sensor automatisch den ECHO-Pin auf HIGH gesetzt. Sobald der Empfänger den Schallimpuls einliest, wird automatisch der ECHO von HIGH auf LOW geändert. Die Zeit, die zwischen diesen beiden Zuständen entsteht, ist die Reisezeit der Schallwellen. Es existiert eine Funktion, die diesen Wechsel der Zustände messen kann.
Es handelt sich dabei um die pulseIn()-Funktion. PulseIn() liest den Zustand (HIGH oder LOW) eines Digitalpins. Wenn der Wert z.B. HIGH ist, wartet pulseIn() darauf, dass der Pin von LOW auf HIGH wechselt, startet die Zeitmessung, wartet dann darauf, dass der Pin auf LOW geht und beendet die Zeitmessung. Das Ergebnis ist die Länge des Impulses in Mikrosekunden.
Mit der pulseIn()-Funktion lesen wir die Laufzeit aus und speichern diesen Wert in der Variable duration. Die Funktion hat zwei Parameter, der erste ist der Name des Echo-Pins und für den zweiten kann man entweder HIGH oder LOW schreiben. In diesem Fall bedeutet HIGH, dass die Funktion pulseIn() darauf wartet, dass der Pin durch die zurückgeworfene Schallwelle auf HIGH geht und die Zeitmessung beginnt, dann wartet sie darauf, dass der Pin auf LOW geht, wenn die Schallwelle endet, was die Zeitmessung beendet.
//Lese den echoPin. pulseIn() gibt die Dauer des Impulses in Mikrosekunden zurück:
duration = pulseIn(echoPin, HIGH);
Um den Abstand zum Objekt zu erhalten, multiplizieren wir die Dauer mit 0,034 und dividieren sie durch 2: Strecke = Geschwindigkeit x Zeit / 2. Am Ende geben wir den Wert der Entfernung auf dem seriellen Monitor aus.
//Berechne die Entfernung: Strecke = Geschwindigkeit x Zeit / 2
distance = duration * 0.034 / 2;
//Sende die Entfernung zum seriellen Monitor:
Serial.print("Distanz = ");
Serial.print(distance);
Serial.println(" cm");
Schalte den seriellen Monitor ein, indem du in der Arduino IDE in der Menüleiste auf Werkzeuge > Serieller Monitor gehst.
Du solltest nun die folgende Anzeige sehen:
Falls du die hier beschriebenen Elektronik-Module nicht hast, kannst du sie in meiner Einkaufsliste finden. Warum ich selber hauptsächlich mit Modulen der Marke Keyestudio arbeite, erläutere ich unter diesem Blog-Artikel.