Mit dem Raspberry PI 3 den Entfernungsmesser US-100 ansteuern

Last Updated on 10. Oktober 2026 by sfambachLink-Status: OK

Ansteuerung eines Ultraschall-Entfernungsmessers US-100 mit dem Raspberry PI3 (oder früher). Ich habe nur Tutorials für den SR-04 gefunden, dieser wird allerdings analog zum US-100 eingebunden.


Hardware

PI3 (oder älter, bitte auf die richtigen Pins achten)
US-100 (Ultraschallsensor)
Brot-Board (zum leichteren Aufbau)
Diverse Kabel (vorgefertigte Pin-Header-Kabel)


Aufbau

Der US-100 arbeitet mit 3.3V, womit man ihn direkt am Raspberry betreiben kann.

Verdrahtung

  • Trigger Pin am GPIO 28
  • Echo Pin an den GPIO 25

(Die GPIOs gelten nur in Verbindung mit pi4j und wiringPi)


Software

Entwicklungsumgebung

Als Entwicklungsumgebung verwende ich BlueJ auf dem PI selbst. Hiermit habe ich zwei Klassen erstellt.


Code

Distance-Klasse

Klasse zur Steuerung des US-015, mit den Methoden

  • getDistanceMM – Entfernung in Millimetern
  • getDistanceCM – Entfernung in Zentimetern

Hinweis: Der ursprüngliche Code (WP-Gistpen) ist verloren gegangen. Der folgende Code wurde im Oktober 2026 neu erstellt (kompiliert, aber nicht auf der Hardware getestet).

Quellcode Distance.java

import com.pi4j.io.gpio.GpioController;
import com.pi4j.io.gpio.GpioFactory;
import com.pi4j.io.gpio.GpioPinDigitalInput;
import com.pi4j.io.gpio.GpioPinDigitalOutput;
import com.pi4j.io.gpio.Pin;
import com.pi4j.io.gpio.PinPullResistance;
import com.pi4j.io.gpio.PinState;
import com.pi4j.io.gpio.RaspiPin;

/**
 * Ultraschall-Entfernungsmesser US-100 (Modus Trigger/Echo, wie HC-SR04).
 * Trigger an GPIO 28, Echo an GPIO 25 (pi4j / WiringPi-Nummerierung).
 * www.fambach.net, GPLv2
 */
public class Distance {

    /** Schallgeschwindigkeit in mm pro Nanosekunde, geteilt durch 2 (Hin- und Rückweg) */
    private static final double MM_PER_NANO = 343.0 / 1_000_000.0 / 2.0;
    private static final long TIMEOUT_NANOS = 30_000_000L;

    private final GpioController gpio;
    private final GpioPinDigitalOutput trigger;
    private final GpioPinDigitalInput echo;

    public Distance() {
        this(RaspiPin.GPIO_28, RaspiPin.GPIO_25);
    }

    public Distance(Pin triggerPin, Pin echoPin) {
        gpio = GpioFactory.getInstance();
        trigger = gpio.provisionDigitalOutputPin(triggerPin, "Trigger", PinState.LOW);
        echo = gpio.provisionDigitalInputPin(echoPin, "Echo", PinPullResistance.PULL_DOWN);
        trigger.setShutdownOptions(true, PinState.LOW);
    }

    /** Entfernung in Millimetern, -1 bei Zeitüberschreitung */
    public long getDistanceMM() throws InterruptedException {
        trigger.low();
        Thread.sleep(0, 5_000);

        // 10 µs Impuls startet die Messung
        trigger.high();
        busyWait(10_000);
        trigger.low();

        long start = System.nanoTime();
        while (echo.isLow()) {
            if (System.nanoTime() - start > TIMEOUT_NANOS) {
                return -1;
            }
        }
        long echoStart = System.nanoTime();
        while (echo.isHigh()) {
            if (System.nanoTime() - echoStart > TIMEOUT_NANOS) {
                return -1;
            }
        }
        long duration = System.nanoTime() - echoStart;
        return Math.round(duration * MM_PER_NANO);
    }

    /** Entfernung in Zentimetern, -1 bei Zeitüberschreitung */
    public double getDistanceCM() throws InterruptedException {
        long mm = getDistanceMM();
        return mm < 0 ? -1 : mm / 10.0;
    }

    public void shutdown() {
        gpio.shutdown();
    }

    private static void busyWait(long nanos) {
        long end = System.nanoTime() + nanos;
        while (System.nanoTime() < end) {
            // aktiv warten, Thread.sleep ist für Mikrosekunden zu ungenau
        }
    }
}

Test-Klasse

Klasse mit Main-Methode zum Testen der Distance-Klasse. In der Main-Methode wird alle 5 Sekunden ein neuer Wert vom Sensor abgefragt und auf die Console geschrieben.

Quellcode DistanceTest.java

/**
 * Testet die Klasse Distance: fragt alle 5 Sekunden die Entfernung ab.
 * www.fambach.net, GPLv2
 */
public class DistanceTest {

    public static void main(String[] args) throws InterruptedException {
        Distance distance = new Distance();
        Runtime.getRuntime().addShutdownHook(new Thread(distance::shutdown));

        while (true) {
            double cm = distance.getDistanceCM();
            if (cm < 0) {
                System.out.println("Keine Messung (Zeitüberschreitung)");
            } else {
                System.out.println("Entfernung: " + cm + " cm");
            }
            Thread.sleep(5000);
        }
    }
}

Tips

Bei größerer Beanspruchung des PI ist zu beachten, dass Java die zeitlichen Abfolgen nicht garantiert. Somit kann es zu verfälschten oder keinen Ergebnissen bei der Messung kommen.

Verwandte Beiträge

Quellen

https://www.modmypi.com/blog/hc-sr04-ultrasonic-range-sensor-on-the-raspberry-pi
http://t1m0b0t.blogspot.de/2014/04/using-ultrasonic-range-sensor-on.html
http://www.lediouris.net/RaspberryPI/HC-SR04/readme.htmlhttps://github.com/OlivierLD/raspberry-pi4j-samples/tree/master/RangeSensor
http://pi4j.com/pins/model-3b-rev1.html

Anhang

Pin-Belegung

DatumÄnderungAutor
10.10.2026Verlorenen Gistpen-Code durch neu erstellten Code (Code-Blöcke) ersetztsfambach
08.10.2026Überschriften-Hierarchie korrigiert (H1→H2, Unterebenen eine Stufe tiefer)sfambach
03.10.2026Rechtschreibung korrigiert: Tippfehler, Kommas, Leerzeichen
Log-Liste eingefügt
sfambach
05.06.2017Beitrag erstelltsfambach
Logbuch

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert