Speed measurement with ultrasonic sensor HC-SR04 (Python)
This tutorial guides you through calculating a relative velocity by using the distance measurement of the HC-SR04 sensor over the time.
In order to be able to measure a speed at all, we must first be able to measure a distance to an object. Ultimately, the ultrasonic sensor can do no more. Therefore, first read Distance measurement with ultrasonic sensor HC-SR04 (Python).
Calculating the speed
Let's take another closer look at the triangle from the previous chapter:
So we need
Speed = Distance / Time
However, we do not want to go to the speed of sound now and check whether there is a deviation here.
I will show you how to measure the speed of movement of an object using this sensor. For that purpose we need to take two distance measurements in a short time apart and we have:
distance2 - distance1 = distance speed at a given time
If we make the measurements in a time period of 1 second, then we get the speed of movement of the object in cm/s.
When the object is moving in the opposite direction, the speed represented on the display has a negative sign.
Programming the speed measurement
We change our code from the previous example as follows:
# import libraries import RPi.GPIO as GPIO import time # GPIO Modus (BOARD / BCM) GPIO.setmode(GPIO.BCM) # assign GPIO Pins GPIO_TRIGGER = 18 GPIO_ECHO = 24 # Set direction of GPIO pins (IN --> Input / OUT --> Output) GPIO.setup(GPIO_TRIGGER, GPIO.OUT) GPIO.setup(GPIO_ECHO, GPIO.IN) def distance(): # set trigger to HIGH GPIO.output(GPIO_TRIGGER, True) # set trigger after 0.01 ms to LOW time.sleep(0.00001) GPIO.output(GPIO_TRIGGER, False) startTime = time.time() arrivalTime = time.time() # store startTime while GPIO.input(GPIO_ECHO) == 0: startTime = time.time() # store arrivalTime while GPIO.input(GPIO_ECHO) == 1: arrivalTime = time.time() # Time difference between start and arrival timeElapsed = arrivalTime - startTime # multiply by the speed of sound (34300 cm/s) # and divide by 2, there and back again distance = (timeElapsed * 34300) / 2 return distance def speed(): # calls the distance() function above distance1 = distance() # giving a time gap of 1 sec time.sleep(1) # calls the distance() function above a second time distance2 = distance() # formula change in distance divided by change in time # as the time gap is 1 sec we divide it by 1. speed = (distance2 - distance1)/1.0 return speed if __name__ == '__main__': try: while True: speed = speed() print ("Measured speed = %.1f cm" % speed) time.sleep(1) # When canceling with CTRL+C, resetting except KeyboardInterrupt: print("Measurement stopped by user") GPIO.cleanup()
Now that we know what we can measure with the HC-SR04 and how, we can write our driver and wrap it in ROS in the next chapter. Please read for this Writing your HC-SR04 driver (Python).