I use this script http://devilqube.blogspot.nl/2013/02/using-ultrasonic-range-finder-with.html to get values from my ultrasonic sensor. When I run the code and print the distances it results in a lot zeros with sometimes 165.7 as value. Im sure the GPIO setup is correct. Can someone help me with solving this problem?
1 Answer
I have written some java classes to use ultrasonic sensor with one of my project. Here it is.
PiJavaUltrasonic.java
import com.pi4j.io.gpio.GpioController;
import com.pi4j.io.gpio.GpioFactory;
import com.pi4j.io.gpio.GpioPinDigitalOutput;
import com.pi4j.io.gpio.PinState;
import com.pi4j.io.gpio.RaspiPin;
import com.pi4j.io.gpio.*;
//to control pwm pins
//pwm1 23,24 ; pwm0 1, 26
import com.pi4j.wiringpi.Gpio;
import com.pi4j.wiringpi.SoftPwm;
public class PiJavaUltrasonic{
//bcm, GPIO_#
private int PIN_ECHO,PIN_TRIG;
private long REJECTION_START=1000,REJECTION_TIME=1000; //ns
private GpioController gpio;//gpio controller ; using io.gpio
private GpioPinDigitalOutput//gpio output pins; using io.gpio, digital pins
pin_trig;
private GpioPinDigitalInput
pin_echo;
public PiJavaUltrasonic(int ECHO, int TRIG, long REJ_START,long REJ_TIME){ //GPIO
this.PIN_ECHO=ECHO;
this.PIN_TRIG=TRIG;
this.REJECTION_START=REJ_START; this.REJECTION_TIME=REJ_TIME;
gpio=GpioFactory.getInstance();// create gpio controller , io.gpio
//motor_1_left_en=gpio.provisionDigitalOutputPin(RaspiPin.GPIO_01, "motor_1_left_en", PinState.HIGH);
pin_trig=gpio.provisionDigitalOutputPin(RaspiPin.getPinByAddress(PIN_TRIG), "pin_trig", PinState.HIGH);//pin,tag,initial-state
pin_trig.setShutdownOptions(true, PinState.LOW);
pin_echo=gpio.provisionDigitalInputPin(RaspiPin.getPinByAddress(PIN_ECHO),PinPullResistance.PULL_DOWN);//pin,tag,initial-state
}
public int getDistance() throws Exception{ //in milimeters
int distance=0; long start_time, end_time,rejection_start=0,rejection_time=0;
//Start ranging- trig should be in high state for 10us to generate ultrasonic signal
//this will generate 8 cycle sonic burst.
// produced signal would looks like, _|-----|
pin_trig.low(); busyWaitMicros(2);
pin_trig.high(); busyWaitMicros(10);
pin_trig.low();
//echo pin high time is propotional to the distance _|----|
//distance calculation
while(pin_echo.isLow()){ //wait until echo get high
busyWaitNanos(1); //wait 1ns
rejection_start++;
if(rejection_start==REJECTION_START) return -1; //infinity
}
start_time=System.nanoTime();
while(pin_echo.isHigh()){ //wait until echo get low
busyWaitNanos(1); //wait 1ns
rejection_time++;
if(rejection_time==REJECTION_TIME) return -1; //infinity
}
end_time=System.nanoTime();
distance=(int)((end_time-start_time)/5882.35294118); //distance in mm
}
public static void busyWaitMicros(long micros){
long waitUntil = System.nanoTime() + (micros * 1_000);
while(waitUntil > System.nanoTime()){
;
}
}
public static void busyWaitNanos(long nanos){
long waitUntil = System.nanoTime() + nanos;
while(waitUntil > System.nanoTime()){
;
}
}
}
Test_Ultrasonic.java
public class Test_Ultrasonic{
public static void main(String[] args) throws Exception{
PiJavaUltrasonic sonic=new PiJavaUltrasonic(
0,//ECO 11
1,//TRIG 22
1000,//REJECTION_START ; long
23529411 //REJECTION_TIME ; long
);
System.out.println("Start");
while(true){
System.out.println("distance "+sonic.getDistance()+"mm");
Thread.sleep(1000); //1s
}
}
}
python
?