In diesem Artikel wollen wir uns mit dem HC-SR04 Ultraschallsensor beschäftigen. Mit einem solchen Ultraschallsensor, den man bereits für sehr kleines Geld (2..3€) im Internet bekommt, kann man Distanzen messen. Der HC-SR04 ist dabei für einen Messbereich von 2 bis 300 cm vorgesehen. Ich setze eines dieser Module bei meinem Roboter Robby RP6 ein um ihn einen Weitblick zu verschaffen. Den Sensor habe ich auf einer Erweiterungsplatine angebracht um den direkt darunter befindlichen Infrarot-Empfänger nicht zu blockieren. In meiner Konfiguration wird der SR04 von einem PIC18F45K22 angesteuert und ausgewertet.
Das Prinzip bei der Distanzmessung mit solchen Modulen ist dabei denkbar einfach: Ultraschall bzw. dessen Laufzeit wird gemessen. Das Modul, das sowohl den Empfänger als auch den Sender darstellt, sendet zunächst ein Signal (Ultraschall) aus und wartet im Anschluss auf das Echo dieses Signales. Die ausgesandten Ultraschallwellen werden am Messobjekt reflektiert. Dabei wird ein Teil wieder in Richtung des Modules reflektiert.
Mit Hilfe dieser Laufzeit, also wie lange es dauert bis die Schallwellen (das Echo) wieder am Modul ankommen und der allgemeinen Information der Schallgeschwindigkeit, kann die Distanz zum Messobjekt bestimmt werden. Die Distanz zum Messobjekt berechnet sich also wie folgt:
Die Schallgeschwindigkeit ist dabei mit beziehungsweise
gegeben. Über eine entsprechende Berechnung lässt sich dann die Distanz ermitteln, die der Zeit, die das Echo vom Sender zum Messobjekt und zurück gebraucht hat, entspricht. Da der Schall den doppelten Weg zurück legen muss, wird die Zeit durch Zwei dividiert.
Funktionsweise des SR04-Moduls
Das Modul hat lediglich vier Anschlusspins und ist entsprechend recht einfach anzuschließen. Während und
jeweils an +5V und 0V angeschlossen werden, können die Anschlüsse
und
direkt mit dem Controller verbunden werden. Somit ergibt sich folgende Beschaltung:
- Vcc mit Vcc (+5V) eures Systems verbinden *
- GND mit GND eures System verbinden
- Trig und Echo mit einem IO eures Controllers verbinden
Eine Messung starten
Damit das Modul eine Messung startet müsst Ihr nichts weiter tun als den Trigger-Eingang für mindestens 10 µs auf Low zu ziehen. Das Modul beginnt dann damit ein Ultraschallsignal auszusenden. Das Echo-Signal wird dann direkt vom Modul auf High gezogen, das signalisiert den Beginn der Zeitmessung. Wenn das Echo am Modul angekommen ist, fällt der Pegel des Echo-Signals wieder auf Low und die Zeitmessung ist abgeschlossen. Eine neue Messung darf frühestens nach 20 ms nach fallender Flanke des Trigger-Signals stattfinden! Wenn das Modul kein Echo bekommt (es befindet sich kein Objekt, das den Ultraschall reflektieren könnte, in Reichweite) wird das Echo-Signal für 200 ms auf High gehalten, so wird eine erfolglose Messung signalisiert *. Im Anschluss wartet das Modul dann wieder auf eine fallende Flanke am Trigger-Eingang.
Für die Messung der Impulsbreite des Echo-Signals, also der Zeit, die zwischen Aussenden des Ultraschalls und dem Eintreffen des Echos vergangen ist, empfehle ich das Capture Modul eures Controllers zu verwenden.
Messung auswerten
Für das Auswerten der Zeitmessung bzw. Distanzmessung ist es nun entscheidend, mit welcher Frequenz ihr gemessen habt. Wenn ihr das Capture Modul eures Controllers verwendet, dann wird automatisch der Messwert bei fallender Flanke des Echo-Signals gesichert. Dieses lest Ihr dann aus und müsst es in eine Längeninformation umrechnen. Die entscheidende Information dabei ist, welche Zeitdauer einem Timer-Tick entsprechen. Wenn der Timer zum Beispiel pro µs um hochzählt, dann habt Ihr entsprechend eine Auflösung von . Also nur noch den Timerwert in eine Distanz umwandeln und entsprechend verwenden 🙂
*Achtung: Es sind diverse Module des SR04 im Umlauf bei denen es zu einem speziellen Problem mit dem Echo-Signal kommt. Wenn dieses Modul kein Echo empfängt, dann bleibt das Echo-Signal dauerhaft auf High. Es geht nie wieder zurück auf Low! Hier wurde ein entsprechender Timeout im Modul vergessen (im Original vorhanden, bei den billig China-Kopien nicht). Es hilft auch nicht, wenn man erneut mit dem Trig-Eingang das Modul triggert. Die einzige Hilfe ist es das Modul aus- und wieder einzuschalten. Im Internet kursieren auch Ansätze, die den Echo-IO des Mikrocontrollers auf Ausgang konfigurieren, das Potential dieses Ausgangs auf Low zu setzen, ein paar Millisekunden zu warten und im Anschluss wieder auf Eingang zu gehen. Dies soll bewirken, dass sich Kapazitäten im Modul entladen und der Lock-Zustand vom Echo-Signal gelöst wird. Bei mir hat diese Methode leider nicht geholfen, ich möchte sie aber nicht unerwähnt lassen. Ich habe einfach einen NPN-Transistor in die Versorgungsleitung des Moduls gelegt. Immer wenn sich das Modul aufhängt (=kein Objekt im Messbereich), starte ich es neu. Das funktioniert wunderbar. Wenn Ihr euren Controller mit 5V betreibt, kann das SR04 evtl. auch direkt an einem IO betrieben werden (ungetestet).