Last Updated on 31. Mai 2019 by sfambach
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 wirePi)
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
import com.pi4j.io.gpio.GpioPinDigitalInput;
import com.pi4j.io.gpio.GpioPinDigitalOutput;
public class Distance
{
// instance variables - replace the example below with your own
public static final int DIVISOR = 58200;
public static final int ERROR_NO_MEASUREMENT = -1;
public static final int ERROR_DIST_TO_SHORT = -2;
private GpioPinDigitalInput echo = null;
private GpioPinDigitalOutput trigger = null;
private long timeOut = 250000000; // in ns/ time for 4m for 20°C ~232
private long triggerTime = 2; // 10ms for SR04, 2 for US-100
private long initTime = 2; // default 2 ms
/**
* Constructor for objects of class Distance
*/
public Distance(GpioPinDigitalOutput trigger, GpioPinDigitalInput echo)
{
this.echo = echo;
this.trigger = trigger;
}
/**
* get the distance in mm
*/
public double getDistMM()
{
return aquire()*1000;
}
/**
* get the distance in cm
*/
public double getDistCM()
{
return aquire();
}
/**
* returns the time in milli xeconds
*/
public double aquire(){
long start = 0;
double diff = 0;
try {
trigger.low();
Thread.sleep(initTime);
trigger.high();
Thread.sleep(triggerTime);
trigger.low();
while (echo.isLow()) {
start = System.nanoTime();
}
while (echo.isHigh()) {
//System.out.print((System.nanoTime() - start)+",");
if((System.nanoTime() - start) > timeOut){
return ERROR_NO_MEASUREMENT;
}
}
// check if distance is to short and return errror
diff = ((System.nanoTime() - start) / DIVISOR );
return diff;
} catch (InterruptedException e) {
e.printStackTrace();
}
return -1.0;
}
}
Test-Klasse
Klasse mit Main-Methode zum Testen der Distance-Klasse. In der Main-Methode wird alle 5 Sekunde ein neuer Wert vom Sensor abgefragt und auf die Console geschrieben.
import com.pi4j.io.gpio.GpioController;
import com.pi4j.io.gpio.GpioFactory;
import com.pi4j.io.gpio.GpioPinDigitalOutput;
import com.pi4j.io.gpio.GpioPinDigitalInput;
import com.pi4j.io.gpio.GpioPin;
import com.pi4j.io.gpio.Pin;
import com.pi4j.io.gpio.PinState;
import com.pi4j.io.gpio.RaspiPin;
import com.pi4j.io.gpio.PinPullResistance;
public class TestDistance
{
public static void main(String args[]){
final GpioController gpio = GpioFactory.getInstance();
//range sensor pins
GpioPinDigitalOutput sensor_trigger = gpio.provisionDigitalOutputPin(RaspiPin.GPIO_28,
"Sensor Trigger", PinState.LOW);
GpioPinDigitalInput sensor_echo = gpio.provisionDigitalInputPin(RaspiPin.GPIO_25,
"Sensor Echo", PinPullResistance.PULL_DOWN);
// Create the range sensor
Distance rangesensor = new Distance(sensor_trigger, sensor_echo);
int i = 0;
do {
i++;
// Get the range
double distance = rangesensor.getDistCM();
System.out.println("RangeSensorresult =" + distance + "cm");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
} while (i < 1000);
gpio.unprovisionPin(gpio.getProvisionedPins().toArray(new GpioPin[]{sensor_trigger, sensor_echo}));
}
}
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.