A Java Class to Interface Ultrasonic Sensor (HC-SR04) with Raspberry Pi
I am working on an embedded system project (A Telepresence Robot) which the main program is written using Java. The single board computer we have used for this project is Raspberry Pi 3 model B with Raspbian OS. In order to detect and meaure distances to near by objects we have used few ultrasonic sensors.
I had to write a Java class to interface the HC-SR04 ultrasonic sensor with the Raspberry Pi using GPIO pins. To controll the GPIO pins I have used the pi4j library.
***
For the following sample program, I have used GPIO pin 0 as the ECHO PIN and GPIO pin 1 as the TRIG PIN.
The third argument is REJECTION_START (long). To explain you the purpose of this argument, let me breifly explain you how the distance measurement is done in HC-SR04 module.
First we need to keep the TRIG pin in high state for 10us. If the TRIG pin is kept in high state for 10us, the sensor generate a ultrasonic burst having 8 cycles and put the ECHO pin to high state. The state of ECHO is changed to low state once the reflection of transmitted ultrasonic burst reaches the sensor.
In practical conditions, sometimes eventhough we kept the TRIG pin in high state for 10us the sensor may not triggered to generate that ultrasonic burst. In such cases there is a possibilty that we might get incorrect readings. Therefore, after keeping the TRIG pin in high state for 10us the program will wait for REJECTION_START number of nano seconds and see whether the sensor is actually triggered. If not, it returns a negative value.
HC-SR04 can only be used to measure distances within a certain range. After refering the datasheets and depending on your requirement you could decide the maximum distance you are going to measure, and the associated time for that. You could set that time in nano seconds in the REJECTION_TIME (long) parameter.
See the GitHub Code
Test Program
public class Test_Ultrasonic{
public static void main(String[] args) throws Exception{
PiJavaUltrasonic sonic=new PiJavaUltrasonic(
0,//ECO PIN (physical 11)
1,//TRIG PIN (pysical 22)
1000,//REJECTION_START ; long (nano seconds)
23529411 //REJECTION_TIME ; long (nano seconds)
);
System.out.println("Start");
while(true){
System.out.println("distance "+sonic.getDistance()+"mm");
Thread.sleep(1000); //1s
}
}
}