Hallo zusammen,
man nehme: ein Ultraschall-Enternungsmesser-Modul wie z.B. dieses oder dieses hier.
Anschluss und Spannungsversorgung:
Das Modul hat vier Anschluss-Pins - Vcc, Trig, Echo und Gnd.
Nach dem obligatorischen Durchmessen stellte sich heraus, dass die Ströme und Spannungen problemlos von den GPIOs des RPi zur Verfügung gestellt werden können.
Einzige Ausnahme ist der „Echo“-Pin des Moduls.
Hier würden 5V vom Modul in den RPi eingespeist und der Ausdruck „wholy smoke“ würde eine ganz andere Bedeutung erhalten …
Um mal was anderes auszuprobieren, wurde dieses Problem in der Schaltung durch einen Spannungsteiler gelöst. Alternativ könnten auch ein Pegelwandler oder eine Z-Diode die Spannung auf ein RPi verträgliches Maß reduzieren.
Funktionsweise des Moduls:
Das Mess-Modul ist mit einer ganzen Menge Hardware ausgestattet und arbeitet praktisch autark.
Es erwartet einen mindestens 10 Microsekunden dauernden HIGH-Pegel auf dem Trigger-Eingang um den Messvorgang zu starten.
Nach einer gewissen Zeit springt der Echo-Pin auf HIGH und hält diesen Pegel genau so lange, wie das ausgesandte Ultra-Schall-Signal brauchte um wieder empfangen zu werden.
Verschwand das ausgesandte Signal, weil es nirgendwo reflektiert wurde, bleibt der Echo-Pin auf LOW.
Somit kann der vom Signal zurückgelegte Weg über die Schallgeschwindigkeit berechnet werden.
Die Software:
Sie benötigt zur Übersetzung entweder die wiringPi oder die pigpio-Library.
Nach einem ersten Test bin ich allerdings zu der Überzeugung gelangt, dass mir die wiringPi-Bibliothek nicht zuverlässig genug arbeitet. Vielleicht habe ich da auch was falsch gemacht … egal, ich denke, das ist Geschmackssache.
WiringPi kann hier heruntergeladen werden.
Die pigpio-Library erhaltet ihr hier herunterladen könnt.
Auf der Homepage des Autors findet ihr weitere Informationen zu diesem Projekt, das mittlerweile scheinbar auch den Zugriff aus anderen Sprachen, u.a. script-Sprachen, unterstützt.
Das Programm ist ein simples C-Programm ohne weiteren Schnick-Schnack.
Übersetzt werden kann es mit:
wenn es die wiringPi-API bzw.
gcc -o sonic sonic.c -DUSE_PIGPIO -I /usr/local/include -L /usr/local/lib -lpigpio -lrt -lpthread
wenn es mit der pigpio-Library arbeiten soll.
Ich beschränke meine Beschreibung auf die Version mit der pigpio-API. Die Version mit der wiringPi-Library ist sehr ähnlich, hat aber ein paar kleine Unterschiede aufgrund der verschiedenen APIs.
Das Programm besteht aus einem Initialisierungs-Teil und einer Endlosschleife.
Zunächst wird die Bibliothek initialisiert, anschliessend der GPIO23 als Input- und GPIO24 als Output-Pin definiert.
Als letzter Schritt der Initialisierung wird ein Alarm-Handler installiert, der bei jedem Zustandswechsel von GPIO23 aufgerufen wird.
In einer Endlosschleife wird ein 10 Microsekunden Burst an GPIO24 gesendet.
Anschliessend erfolgt die Prüfung ob beide Status-Wechsel (->HIGH->LOW) an GPIO23 stattgefunden haben und falls ja, die Zeit, die das Signal unterwegs war, berechnet.
Mit diesem Wert, der als Microsekunden vorliegt, wird jetzt der zurückgelegte Weg des Ultra-Schall-Signals berechnet:
// 343 meters/second
// = 34300 cm/second
// = 343000 mm/second
// = 343 mm/msecond
// diff is in usecond
// distance in mm = diff * 343 / 1000
Da das Signal diesen Weg zweimal zurücklegen musste – einmal hin und einmal wieder zurück – ist die Distanz zum Objekt die Hälfte dieses Wertes.
Wurde kein Echo empfangen, dann wird durch einen delay der CPU die Chance gegeben, andere Aufgaben zu erledigen.
Je näher ein Objekt ist, desto schneller hintereinander werden die Messungen ausgeführt.
Die jeweilige Distanz wird auf den Bildschirm ausgegeben.
Wer hier andere Pins verwenden möchte, muss die entsprechenden Zeilen im Code anpassen.
Achtung: die Pinbezeichnung für wiringPi und pigpio stimmen nicht überein!
Die Schaltung:
Die Schaltung ist ziemlich einfach.
Vcc und Gnd des Moduls können direkt an die entsprechenden GPIOs angeschlossen werden. Dasselbe gilt für das Trigger-Signal. Da es nur ein Ausgang ist, kann es ebenfalls direkt an z.B. GPIO24 (Pin 18) abgenommen werden.
Das Eingangssignal aus Sicht des RPi hat 5V und wird über einen 330 Ohm Widerstand auf GPIO23 gelegt. Ein zweiter Widerstand mit 470 Ohm leitet die überschüssige Spannung nach Gnd ab.
Tja, ich denke mal, das war alles.
Ich habe das nur grob getestet und das Modul ist erstaunlich genau.
Evtl. muss man von Fall zu Fall einen Korrekturwert einbringen.
Anwendungen sehe ich als Einparkhilfe (ps915 verwendet das offensichtlich schon dazu), Näherungsschalter oder einfach als nettes Gimmick.
Vielleicht noch ein Hinweis, der mir gerade so einfällt: wer einen Hund, eine Katze oder anderen Vierbeiner sein eigen nennt, sollte vielleicht vorher mal die Verträglichkeit seines Mitbewohners gegenüber Ultraschall testen.
Wer Rechtschreibfehler findet, darf sie gerne behalten oder verkaufen und wer Probleme mit dem Programm hat darf sich gerne melden.
//UPDATE 15.09.2014:
Ich habe ein neues Demoprogramm erstellt, das wesentlich stabiler läuft und die Werte zuverlässiger berechnet. Es heisst distance.c und ihr findet es im Anhang.
Und nun viel Spass damit,
-ds-