A R C H L I N U X

- my preferred distribution -

D E B I A N

- also a favourite -

LINKS - RASPBERRY PI


IMPRESSIVE LINKS

DID YOU KNOW ...




H C - S R 0 4
Entfernungsmessung mit Ultraschall

AUTOR: Dirk Schanz (dreamshader)

Allgemeines

Man nehme: ein Ultraschall-Entfernungsmesser-Modul, wie z.B.

SAINSMART Modul

oder

dieses

Anschluss und Spannungsversorgung

Das Modul hat vier Anschluss-Pins: Vcc, Trig, Echo und GND.

Beim 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 werden 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

Das Programm ist ein simples C-Programm ohne weiteren Schnick-Schnack.
Es benötigt zur Übersetzung entweder die 'wiringPi' oder die 'pigpio' library.
Nach einem ersten Test bin ich allerdings zu der Überzeugung gelangt, dass 'wiringPi' nicht zuverlässig genug arbeitet. Vielleicht habe ich da auch was falsch gemacht - egal, ich denke, es ist evtl. auch Geschmackssache.

'wiringPI' erhält man hier:

wiringPI

Der Compileraufruf muß für 'wiringPI' lauten:
gcc -o sonic sonic.c -DUSE_WIRINGPI -L/usr/local/lib -lwiringPi -lrt


Für 'pigpio' - siehe hier:

pigpio

Der Compileraufruf muß für 'pigpio' lauten:
gcc -o sonic sonic.c -DUSE_PIGPIO -I /usr/local/include -L /usr/local/lib -lpigpio -lrt -lpthread

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 in Microsekunden vorliegt, wird jetzt der zurückgelegte Weg des Ultra-Schall-Signals berechnet:

// 343 meters/second
// = 34300 cm/second
// = 343000 mm/second
// = 343 mm/msec
// diff is in usec
// 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 dem Bildschirm ausgegeben.


  • Wer hier andere Pins verwenden möchte, muss die entsprechenden Zeilen im Code anpassen.

    A C H T U N G
    Die Pinbezeichnungen 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 hat aus Sicht des RPi 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.



    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, Näherungsschalter oder einfach als nettes Gimmick.

    Hinweis



    Wer einen Hund, eine Katze oder anderen Vierbeiner sein eigen nennt, sollte vielleicht vorher mal die Verträglichkeit seines Mitbewohners gegenüber Ultraschall testen!


    Vielen Dank an Dirk !





    © my avatar

    © my mascot




    2091 / 1