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 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.
Für diese Komponente werden keine spezifischen DIP-Switches benötigt, sodass diese in der Standardkonfiguration belassen werden können:
Nachfolgend wird die Verwendung der Klasse
com.pi4j.crowpi.components.UltrasonicDistanceSensorComponent
Javadoc
beschrieben.
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. |
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. |
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.
src/main/java/com/pi4j/crowpi/applications/UltrasonicDistanceSensorApp.java
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);
}
}
}
Das Beispiel um einen Temperatursensor erweitern, um immer korrekte Messwerte zu erhalten.
Je näher etwas dem Sensor kommt, könnte der Buzzer schneller Piepen, ähnlich wie bei einer Einparkhilfe.