Controlling the US-100 distance sensor with a Raspberry Pi 3

Last Updated on 10. October 2026 by SuffocationLink 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)


Structure

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

Wiring

  • 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).

Source code 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 Class

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.

Source code 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);
        }
    }
}

Fingertips

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.

Related Posts

Sources

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

Attachment

Pin assignment

DateChangeAuthor
10.10.2026Verlorenen Gistpen-Code durch neu erstellten Code (Code-Blöcke) ersetztSuffocation
08.10.2026Überschriften-Hierarchie korrigiert (H1→H2, Unterebenen eine Stufe tiefer)Suffocation
03.10.2026Rechtschreibung korrigiert: Tippfehler, Kommas, Leerzeichen
Log-Liste eingefügt
Suffocation
05.06.2017Post createdSuffocation
Changelog

Leave a Reply

Your email address will not be published. Required fields are marked *