Entfernungsmessung mit Ultraschall

  • 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:

    Code
    gcc -o sonic sonic.c -DUSE_WIRINGPI -L/usr/local/lib -lwiringPi -lrt

    wenn es die wiringPi-API bzw.

    Code
    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-

  • Hallo ds,

    "sauber sog i" :thumbs1:

    Danke für Deine Mühe und auch die Hinweise im anderen thread! Nachdem das Teil recht präzise mißt (erstaunlich zu diesem Preis), werde ich es doch einsetzen - es wird dank Deiner Vorarbeit dann gleich auf eine Platine gelötet.

    Weitere feedbacks kommen vermutlich erst in ca. 6 Wochen ;)

    Gruß, mmi


  • Urlaub? Na dann lass kracha ;) ... schöne Zeit Dir und Deinem Umfeld,
    -ds-

    Mit "6 Wochen" meinte ich eher andere, die erstmal bestellen und warten müssen, bis die Ware aus cn kommt. ;)


  • Danke fuer die Anleitung,

    Kannst du mal bitte testen, ob die Entfernung zu Wasseroberflaechen auch korrekt gemessen wird? Dann kann man den Sensor auch fuer die Regentonnen verwenden :)

    Gruss
    Himbeerfreund

    Ja hey Himbeerfreund,

    mal sehen, ob ich dazu komme ... ein wenig schwierig mit Breadboard und RPi ...

    Ich würde für Deine Regentonne eher einen Schwimmschalter empfehlen. Wie willst Du im Aussenbereich das Ultraschall-Modul witterungsbeständig anbringen?

    cu,
    -ds-

  • Ich moechte ja wissen wieviel Wasser da ist und nicht ob Wasser da ist :) Ja wenn der vom Breadbord ins Wasser faellt waere nicht schoen, dafuer kennt man die Wasserentfernung genau :stumm:
    Was hast du denn fuer deinen geplant? Wasserdicht ist so eine Sache. Man kann an ja alles vergiessen bis auf die Schallkapseln. Eine Saison wird es schon halten und fuer 1,70E Ebay Australien wuerde ich mir auch ueberlegen viel Zeit darein zu investieren oder den naechsten zu ordern. Fuer einen Dauereinsatz waere aber ein wasserdichter besser.

    Gruss
    Himbeerfreund

    • Offizieller Beitrag


    Wie willst Du im Aussenbereich das Ultraschall-Modul witterungsbeständig anbringen?

    Hier eine kleine Anregung: :thumbs1:

    [youtube]GNJ4CEoOg4g[/youtube]

    http://www.geek.com/chips/neverwet…rproof-1564340/

    Well in my humble opinion, of course without offending anyone who thinks differently from my point of view, but also by looking into this matter in a different way and without fighting and by trying to make it clear and by considering each and every one's opinion, I honestly believe that I completely forgot what I was going to say.

  • Ich schätze, daß trotzdem anschliessend einiges Müll war. Aber jedenfalls werbewirksam in Szene gesetzt. ;)

    Gruß, mmi


  • Ich schätze, daß trotzdem anschliessend einiges Müll war. Aber jedenfalls werbewirksam in Szene gesetzt. ;)

    Gruß, mmi

    Naja ... nachdenken sollte man darüber nicht ;) ....

    In destilliertem Wasser z.B. sollte auch nix passieren ... oder in reinem Alkohol.
    BTW: Handy ins Wasser gefallen -> aufschrauben -> in reinen Alkohol legen -> nach ein paar Minuten rausholen, trocknen lassen -> soll angeblich super funktionieren, weil der Alkohol das Wasser verdrängt ;)

    cu,
    -ds-


  • Klappt das denn jetzt mit der Entfernung auf wasser?

    Hallo Racer,

    keine Ahnung ... da bin ich noch nicht dazu gekommen. Steht, wenn ich ehrlich bin, auch ziemlich weit hinten meiner Liste.
    Ich möchte meine derzeitige kreative Phase lieber für das µC Netz nutzen, bevor ich da die Hälfte von dem, was mir so im Kopf rumspukt, wieder vergesse ;) ...

    ciao,
    -ds-

  • Hi,
    also ich benutze das um den Stand meiner Beregnungsanlage für mein Terrarium mir anzeigen zu lassen. Funktioniert ziemlich gut. Ich denke zu etwa 99% exakt. Alternativ kannst du einfach ein Styroporplättchen basteln und dieses schwimmen lassen.
    mfg
    Balli

  • Hi,

    könnte man denn auch mehrere dieser Sensoren an einen Pi hängen (irgendwie 1wire-mäßig)?
    Ich plane einen RGB Tisch (WS2801) mit Näherungssensoren (Hand hin -> LED an).

    Gruß,
    Mick

  • Hallo Mick,

    Die Ultraschall-Teile sind keine 1Wire Module, Du bräuchtest für jedes zusätzliche Modul zwei Pins.
    Also vier könnte man imho problemlos anschliessen ( = 8 GPIOs + Spannungsversorgung ).

    Aber - da würde sich m.E. eher ein PIR anbieten, meinst Du nicht?

    ciao,
    -ds-

  • Hi -ds-,

    ja, das hört sich auch nicht schlecht an. Allerdings lassen sich da auch nicht mehrere (immerhin sprechen wir über 50 - 100) an einen Pi anschließen.
    Eventuell wären ein paar kleine Arduinos doch "geschickter"?

    Mick

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!