Ultraschall Distanzsensor


Funktionsweise

Der Ultraschall Distanzsensor misst mithilfe eines akustischen Signals die Distanz zu Objekten. Der Ton liegt dabei im Ultraschallbereich und ist für den Menschen nicht hörbar. Um das Signal von Umgebungsgeräuschen unterscheiden zu können, wird nicht ein langer Ton, sondern kurze pulsierendes Töne ausgeben. Beim im CrowPi verbauten Modell HC-SR04 handelt es sich dabei 8 einzelne Impulse auf einer Frequenz von 40kHz. Wenn diese Töne nun auf ein Objekt treffen, werden sie reflektiert und zurück Richtung Sensor geworfen. Sobald der Sensor seinen eigenen Ton wieder hört, schaltet er entsprechend seinen digitalen Ausgang. Zum Starten des Messvorgangs bietet der Sensor zusätzlich einen digitalen Eingang.

Wenn nun mit einem Programm die Zeit zwischen Aussenden des Tons (Trigger) und dem Wiedereintreffen des Tons gemessen wird, kann daraus mithilfe der Schallgeschwindigkeit die Distanz zum Objekt berechnet werden. Diese Funktion wird von der UltrasonicDistanceSensorComponent übernommen. Sie liefert direkt einen Messwert in Zentimetern.

Mit dem HC-SR04 können Distanzen zwischen von 2 bis 3000 Zentimetern gemessen werden. Dabei ist mit einer Toleranz von etwa 3 Millimetern zu rechnen. Je nach Messdistanz variiert dieser Wert etwas. Genaueres dazu findet sich im Datenblatt des Sensors. Wichtig ist auch zu wissen, dass mehrere Ultraschallsensoren sich gegenseitig stören können. Weiter ist die Schallgeschwindigkeit von der Umgebungstemperatur abhängig. Die Messwerte können einige Prozent schwanken, wenn es kälter oder wärmer ist.

Voraussetzungen

DIP Switches

Für diese Komponente werden keine spezifischen DIP-Switches benötigt, sodass diese in der Standardkonfiguration belassen werden können:

ON(links)12345678ON(rechts)12345678

Verwendung

Nachfolgend wird die Verwendung der Klasse com.pi4j.crowpi.components.UltrasonicDistanceSensorComponent Javadoc beschrieben.

Konstruktoren

Konstruktor Bemerkung
UltrasonicDistanceSensorComponent(com.pi4j.context.Context pi4j) Initialisiert einen Ultraschall Distanz Sensor mit dem Standard-Pin für den CrowPi.
UltrasonicDistanceSensorComponent(com.pi4j.context.Context pi4j, int triggerAddress, int echoAddress) Initialisiert einen Ultraschall Distanz Sensor mit benutzerdefinierten Pins. Trigger ist dabei der digitale Eingang und Echo der Ausgang des Sensors.

Methoden

Methode Bemerkung
double measure() Führt eine Messung aus und gibt die aktuelle Distanz [cm] zurück. Nutzt dabei die aktuelle Temperatureinstellung.
double measure(double temperature) Führt eine Messung aus und gibt die aktuelle Distanz [cm] zurück. Bei der Distanzberechnung wird zudem der Einfluss der Umgebungstemperatur auf die Schallgeschwindigkeit berücksichtigt und kompensiert.
void onObjectFound(SimpleEventHandler handler) Setzt den Event Handler, welcher bei Erkennung eines Objekts aufgerufen werden soll. null deaktiviert diesen Event Listener.
void onObjectDisappeared(SimpleEventHandler handler) Setzt den Event Handler, welcher bei Verschwinden eines Objekts aufgerufen werden soll. null deaktiviert diesen Event Listener.
void setMeasurementTemperature(double temperature) Definiert die Standardmesstemperatur, welche in die Distanzberechnung einbezogen wird.
void setDetectionRange(double minRange, double maxRange) Definiert die Distanz welche gemessen werden muss, um als Objekt erkannt zu werden.

Beispielapplikation

Die nachfolgende Beispielapplikation führt als erstes unter Verwendung von onObjectFound eine Objekterkennung durch. Es wird jeweils ausgegeben, ob ein Objekt gefunden wurde und ebenfalls, wenn es wieder verschwunden ist. Danach werden einige Messwerte mit verschiedenen Temperatureinstellungen ausgegeben. So kann der Einfluss von Temperaturschwankungen auf den Messwert hervorragend analysiert werden. Anschliessend wird eine kurze for-Schleife gestartet welche jede Sekunde einen neuen Messwert ausgibt. Dies verschafft etwas Zeit, um auch einmal die Hand über den Sensor zu halten.

Pfad zum Codebeispiel: src/main/java/com/pi4j/crowpi/applications/UltrasonicDistanceSensorApp.java
Auf GitHub ansehen
package com.pi4j.crowpi.applications;

import com.pi4j.context.Context;
import com.pi4j.crowpi.Application;
import com.pi4j.crowpi.components.UltrasonicDistanceSensorComponent;
import com.pi4j.crowpi.components.exceptions.MeasurementException;

/**
 * Example Application of using the Crow Pi Ultrasonic Distance Sensor.
 */
public class UltrasonicDistanceSensorApp implements Application {
    @Override
    public void execute(Context pi4j) {
        // Create new tilt sensor component
        final var distanceSensor = new UltrasonicDistanceSensorComponent(pi4j);

        // Configures the Sensor to find Object passing in a predefined distance
        System.out.println("Searching for an object now...");
        distanceSensor.setDetectionRange(5,50);
        distanceSensor.setMeasurementTemperature(23);
        distanceSensor.onObjectFound(() -> System.out.println("Sensor has found a Object in Range!"));
        distanceSensor.onObjectDisappeared(() -> System.out.println("Found Object disappeared!"));
        sleep(10000);

        // Clean up event handlers
        System.out.println("Searching completed.");
        distanceSensor.onObjectFound(null);
        distanceSensor.onObjectDisappeared(null);

        // Just printing some text to the users
        System.out.println("Let's find out the impact of temperature to ultrasonic measurements!");

        // Start a measurement with a temperature compensation like it is -10°C while measuring.
        double measurementCold = distanceSensor.measure(-10);
        System.out.println("If you room has -10°C now we measure: " + measurementCold + " cm");

        // Start a measurement with a temperature compensation like it is 30°C while measuring.
        double measurementHot = distanceSensor.measure(30);
        System.out.println("If you room has 30°C now we measure: " + measurementHot + " cm");
        System.out.format("That's a difference of %.2f %%. Only caused by the difference of sonics. Physic is " +
            "crazy\n", (measurementHot - measurementCold) / measurementCold * 100);

        System.out.println("Lets now just measure for 10 Seconds. That gives some time to try the sensor a little.");

        // Loop 10 times through the measurement. Print the result to the user
        for (int i = 0; i < 10; i++) {
            // Measures the current distance without temperature compensation and prints it to the user.
            try {
                System.out.println("Measured distance is: " + distanceSensor.measure() + " cm");
            } catch (MeasurementException e) {
                // If the measurement fails with a MeasurementException, we inform the user and try again next time
                System.out.println("Oh no. Measurement failed... lets try again");
            }

            // Delay the measurements a little. This gives you some time to move in front of the sensor.
            sleep(1000);
        }
    }
}

Weitere Möglichkeiten

  • Das Beispiel um einen Temperatursensor erweitern, um immer korrekte Messwerte zu erhalten.