Interfacing HC-SR04 Ultrasonic Sensor with Raspberry Pi
Ultrasonic distance sensors are designed to measure distance between the source and target using ultrasonic waves. We use ultrasonic waves because they are relatively accurate across short distances and don’t cause disturbances as they are inaudible to human ear.
HC-SR04 is a commonly used module for non contact distance measurement for distances from 2cm to 400cm. It uses sonar (like bats and dolphins) to measure distance with high accuracy and stable readings. It consist of an ultrasonic transmitter, receiver and control circuit. The transmitter transmits short bursts which gets reflected by target and are picked up by the receiver. The time difference between transmission and reception of ultrasonic signals is calculated. Using the speed of sound and ‘Speed = Distance/Time‘ equation, the distance between the source and target can be easily calculated.
HC-SR04 ultrasonic distance sensor module has four pins :
- VCC – 5V, input power
- TRIG – Trigger Input
- ECHO – Echo Output
- GND – Ground
Working of HC-SR04
- Provide trigger signal to TRIG input, it requires a HIGH signal of atleast 10μS duration.
- This enables the module to transmit eight 40KHz ultrasonic burst.
- If there is an obstacle in-front of the module, it will reflect those ultrasonic waves
- If the signal comes back, the ECHO output of the module will be HIGH for a duration of time taken for sending and receiving ultrasonic signals. The pulse width ranges from 150μS to 25mS depending upon the distance of the obstacle from the sensor and it will be about 38ms if there is no obstacle.
The ECHO output is of 5v. The input pin of Raspberry Pi GPIO is rated at 3.3v. So 5v cannot be directly given to the unprotected 3.3v input pin. Therefore we use a voltage divider circuit using appropriate resistors to bring down the voltage to 3.3V.
The following equation can be used for calculating resistor values,
“Vout = Vin x R2/(R1+R2)”
Time taken by pulse is actually for to and fro travel of ultrasonic signals, while we need only half of this. Therefore Time is taken as Time/2.
Distance = Speed * Time/2
Speed of sound at sea level = 343 m/s or 34300 cm/s
Thus, Distance = 17150 * Time (unit cm)
For accurate distance readings the output can be calibrated using a ruler. In the below program a calibration of 0.5 cm is added.
import RPi.GPIO as GPIO #Import GPIO library import time #Import time library GPIO.setmode(GPIO.BCM) #Set GPIO pin numbering TRIG = 23 #Associate pin 23 to TRIG ECHO = 24 #Associate pin 24 to ECHO print "Distance measurement in progress" GPIO.setup(TRIG,GPIO.OUT) #Set pin as GPIO out GPIO.setup(ECHO,GPIO.IN) #Set pin as GPIO in while True: GPIO.output(TRIG, False) #Set TRIG as LOW print "Waitng For Sensor To Settle" time.sleep(2) #Delay of 2 seconds GPIO.output(TRIG, True) #Set TRIG as HIGH time.sleep(0.00001) #Delay of 0.00001 seconds GPIO.output(TRIG, False) #Set TRIG as LOW while GPIO.input(ECHO)==0: #Check whether the ECHO is LOW pulse_start = time.time() #Saves the last known time of LOW pulse while GPIO.input(ECHO)==1: #Check whether the ECHO is HIGH pulse_end = time.time() #Saves the last known time of HIGH pulse pulse_duration = pulse_end - pulse_start #Get pulse duration to a variable distance = pulse_duration * 17150 #Multiply pulse duration by 17150 to get distance distance = round(distance, 2) #Round to two decimal points if distance > 2 and distance < 400: #Check whether the distance is within range print "Distance:",distance - 0.5,"cm" #Print distance with 0.5 cm calibration else: print "Out Of Range" #display out of range
Run the above program.
Distance is measured every two seconds and displayed.
- For greater accuracy use C over Python as Python on a Linux environment is not good for precise timing. As precise timing is required for accurate distance measurements.
- The sensor has a wide angle of sensitivity. If there are objects near the line of sight it may give shorter readings.
- The ultrasonic sensor touching any surface can give wrong readings.
Any doubts? Comment below.