HCSR04 - Ultraschall Modul

Ich möchte hier kurz das HCSR04 Ultraschall Modul vorstellen. Zu kaufen gibt es das Modul in diversen E-Bay Shops wie auch bei größeren deutschen Resellern.

Beschreibung

Mit dem HCSR04 lassen sich unter anderem Entfernungen messen. Genauer gesagt, lässt sich die Zeit messen, welche der Schall zurücklegt. So lässt sich mithilfe der Schallgeschwindigkeit die Entfernung zu einem Objekt messen, indem man die Schallgeschwindigkeit mit der zurückgelegten Zeit multipliziert und durch zwei teilt. (Hin und zurück)
Manche Stoffe wie Vorhänge reflektieren den Schall nicht so gut wie andere Gegenstände. Wasser reflektiert soweit sehr gut. Deshalb benutze ich einen Ultraschall Sensor auch in einer Pegelstandsmessung in einer Zisterne.

Eigenschaften

  • Spannung: 5V DC
  • Strom: 15mA
  • Frequenz: 40 kHz
  • maximaler Abstand: 4 bis 5m
  • minimaler Abstand: 2cm (es geht auch ein bisschen weniger)
  • Abstrahlwinkel: ca. 30°
  • Input Trigger: 5 bis 10µs langer TTL-Pegel, Modul reagiert erst bei fallender Flanke
  • Ausgangssignal: TTL Pegel, Impulsdauer entspricht der zurückgelegten Zeit des Ultraschall-Signals
  • Abmessungen: B: 45 mm H: 20 mm T: 15 mm

Arduino Fritzing

Verbunden werden die Pins:

  • Pin 7 mit Trigger
  • Pin 8 mit Echo
  • GND und 5V mit der Spannungsversorgung des Arduinos

Genauigkeit

Mein erster Versuch die Genauigkeit des Moduls herauszufinden, bestand darin einfach mal mit einem Lineal und einem Pappkarton zu messen. Anfangs mit einem Beispiel-Sketch welches mir die Entfernung in Zentimeter-Genauigkeit ausgab. Da war ich natürlich erstmal begeistert. Das Modul konnte ohne Probleme den genauen Abstand in cm ermitteln. Doch manchmal, gerade wenn der Messwert zwischen zwei Werten Stand, pendelte der Wert des Moduls zwischen verschiedenen Messwerten.
Danach hatte ich das ganze umgebaut und mir ein kleines Beispiel-Sketch gebaut um die Entfernung in mm zu messen und mir gleichzeitig noch die Benötigte Zeit in µs auszugeben.

Mir dieser Methode und einem festen Stand des Moduls erreichte ich schon ganz andere Werte. Hier eine Beispielmessung von über 1700 Werten, mit einer Samplingrate von einer Sekunde.

xD

Der exakte Abstand betrug ca. 100mm. Bei dieser Messung hatte ich leider keine Konstante Temperatur. Deswegen lassen sich viele Ausreisser nicht nur auf das Modul schieben sonder auch auf die Temperaturänderung im Raum.

Was man aber sehr schön an diesem kleinen Experiment sieht, ist die hohe Verteilung von den den Messwerten um 100 mm +/- 1mm.

Weitere Tests ergaben leider keine so guten Messwerte auf eine etwas größere Distanz. Die Präzision, wie auch die Genauigkeit ließ nach. Der Messwert Pendelte bei einem Meter Abstand um +/- 5mm, die Präzision war auch nicht mehr gegeben, ein verrucken des Moduls um 10mm ergab eine Änderung von 40 bis 120mm.

Prinzip Abstandsmessung

Der Abstand zu einem entfernten Objekt lässt sich durch die Schallgeschwindigkeit in der Luft bestimmen.

  • Schallgeschwindigkeit bei 20°C: 343 m/s

Will man die Entfernung mit dem Arduino messen, bietet es sich an die Schallgeschwindigkeit noch in eine sinnvolle Einheit umzuwandeln. Als gemessene Zeit vom Arduino bekommt man Microsekunden. Als sinnvolle Einheite bieten sich 2,915µs/mm oder 0,343 mm/µs an.
Die Schallgeschwindigkeit ist leider Temperaturabhängig, um die Schallgeschwindigkeit in Abhängigkeit von der Temperatur zu bekommen, gibt es eine Näherungsformel:

$$c_{Luft} \approx (331.5 + 0.6\vartheta /^\circ C) \frac{m}{s}$$

(Falls Ihr die Formel nicht lesen koennt, aktiviert bitte JavaScript und lasst das MathJax Plugin zu)

Die Entfernung in Millimeter mit Temperaturkompensation zu bekommen benutzt man einfach folgende Funktion:

		getDistanceTempCInMils(temp);

als Parameter übergibt man die Temperatur als Gleitkommazahl, Integer geht natürlich auch.

Ultraschall Library

Zum Download bei GitHub.

Hier ein kleines Beispiel-Sketch wie die Ultraschall-Library genutzt wird:

#include "Ultraschall.h"

Ultraschall ultra(7,8);

void setup() {
	Serial.begin(9600);
	while (!Serial) {;}  
	Serial.println("Ultraschall Test");
	Serial.println("distance in cm:");   
}

void loop() {	
	
	///for uncompensated distance in cm
	Serial.print(ultra.getDistanceInCM());
	Serial.print("\r");
	delay(500);	
	
	///for temperature compensated distance in mm
	Serial.print(ultra.getDistanceTempCInMils(26.5); ///temperature in degree celsius
	Serial.print("\r");
	delay(500);	
	
}

Eine ausführlichere Dokumentation, wie auch noch andere Beispiel-Sketches werde ich demnächst hier und auf GitHub veröffentlichen.

Hinterlasst mir gerne Kommentare, Anregungen, Fragen etc.