Seite 1 von 1

Entfernungsmessung mit dem HC-SR04

Verfasst: Do 28. Jun 2012, 19:37
von Heinrichs
Für etwa 2 Euro inklusive Portokosten kann man in China einen interessanten Ultraschallsensor erstehen, den HC-SR04-Baustein. Er sendet ein Ultraschallsignal aus; dieses wird von einem Hindernis reflektiert. Der Sensor detektiert das Echo dieses Signals und ermittelt damit die Laufzeit dieses Ultraschallsignals; anschließend gibt er an seinem Ausgang ein Signal aus, das genauso lange dauert wie diese Laufzeit. Ein Mikrocontroller kann diese Zeit messen und daraus den Abstand berechnen.

hc-sr04_Attinyplatine2.jpg
Der Ultraschallsensor angeschlossen an der Attiny-Platine 2.0
hc-sr04_Attinyplatine2.jpg (90.14 KiB) 13313 mal betrachtet

Der Baustein hat nur 4 Anschlüsse:

VCC: Pluspol der el. Quelle (5 V); der VCC-Pin kann also direkt mit der 5 V - Buchse der Attiny-Platine angeschlossen werden.
GND: Masse
Trig: Durch einen mindestens 10 μs langen Puls an diesem Pin lösen wir ein Messvorgang aus.
Echo: Der Sensor liefert hier ein Signal, aus dessen Länge sich der Abstand zum Hindernis berechnen lässt; es können hier Zeiten zwischen 150 μs und 25 ms auftreten. Kann der Baustein kein Hindernis feststellen, gibt er ein Signal von 38 ms Länge aus.
hc-sr04-signale.jpg
Signale beim HC-SR04
hc-sr04-signale.jpg (19.04 KiB) 13313 mal betrachtet
Wir beschreiben nun einen einfachen Weg, wie man den Abstand vom Sensor zu einem Hindernis mit unserer Attiny-Platine auf einem LCD anzeigen lassen kann.

Zunächst verbinden wir GND mit einer Masse-Buchse der Attiny-Platine und VCC mit einer 5 V- Buchse. Nun schließen wir den Trigger-Pin an PortB.7 an; dieser Portanschluss wird nicht für das LCD benutzt. Den Echo-Pin werden wir erst später mit PortD.3 (INT1) verbinden. Um nicht mit dem Bootloader in Konflikt zu geraten, darf die Verbindung auf keinen Fall schon bestehen, wenn die Attiny-Platine eingeschaltet wird. Für die Ausgabe schließen wir noch ein LCDisplay an.


Das Programm muss folgendes leisten:

1. Zunächst muss ein Triggerimpuls an PortB.7 ausgegeben werden. Die benötigte Wartezeit von mindestens 10 μs kann mit BASCOM z. B. durch den Befehl waitus 11 erreicht werden.

2. Zur Messung der Zeitdauer des Echo-Pulses benutzen wir den Timer1: Zunächst setzen wir den Timer1 auf 0, warten dann darauf, dass das Echo-Signal auf 1 geht und starten darauf den Timer1 mit einem Prescale von 8. Wenn das Echo-Signal schließlich auf 0 wechselt, wird am PortD.3-Eingang einen INT1-Interrupt ausgelöst. In der zugehörigen Serviceroutine wird der aktuelle Stand von Timer1 in einer Variablen vom Typ word abgespeichert und der Timer1 angehalten.

3. Weil unser Mikrocontroller mit 4 MHz getaktet wird, ist die Zykluszeit 0,25 μs. Bei einem Prescale von 8 erhöht sich daher der Zählerwert von Timer1 jede 2 μs um 1. Wenn das Echo-Signal z. B. 400 μs lang ist, dann ist der Zählerstand am Ende 200. Das entspricht gerade der Laufzeit t des Schalls für die einfache Strecke vom Sensor zum Hindernis.
Die zugehörige Strecke s, der Abstand vom Sensor zum Hindernis, berechnet man mit der Formel s = c * t; dabei ist c die Schallgeschwindigkeit: c = 340 m/s. In unserem Fall ist s = 340 m/s * 200 μs = 64 000 μm = 64 mm = 6,4 cm. Diesen cm-Wert erhalten wir auch etwas einfacher, indem wir den Zählerstand von 200 durch 29 teilen. Allgemein erhalten wir den Abstand in cm, wenn wir den Zählerstand durch 29 teilen.


Das Programm zeitmessung.bas ist nach diesem Konzept aufgebaut. Es beschränkt sich auf die Anzeige der Laufzeit des Schallsignals. Die oben beschriebene Umrechnung auf die Streckenangabe kann leicht ergänzt werden. Wer hier sehr genaue Ergebnisse haben möchte oder muss, sollte berücksichtigen, dass die Schallgeschwindigkeit von der Temperatur abhängt. Für unsere Attiny-Platine würde sich der zusätzliche Einsatz eines Temperatursensors (z. B. LM75) anbieten.

Wir laden nun das Programm auf den Mikrocontroller hoch; dabei darf PortD.3 noch nicht mit dem Echo-Ausgang des HC-SR04 verbunden sein. Erst danach schließen wir den Ausgang Echo an PortD.3 an. Nun wird ungefähr jede 2 Sekunden eine Messung durchgeführt. Auf dem Video im Anhang sieht man, wie der Zeitwert sich verkleinert, wenn die Kamera näher an den Sensor rückt.

.