De HC-SR04 is een ultrasone sensor die gebruikt kan worden om de afstand te bepalen tot een object. De sensor is voorzien van een ultrasone zender en ontvanger die zeer nauwkeurige metingen geeft in een bereik van 2cm tot 4 meter. Dit alles maakt de sensor uitermate geschikt om afstanden te meten op bijvoorbeeld een robot-auto of de nabijheid van een object te controleren.
Met behulp van het onderstaande aansluitschema en Python voorbeeldscript kun je de sensor aansluiten op een Raspberry Pi.
Gebruikte componenten
• HC-SR04 sensor (link)
• 10K Weerstand (link)
• 4.7K Weerstand (link)
• Dupont verbindingskabels (link)
Raspberry Pi Zero, Raspberry Pi 2, Raspberry Pi 3
Raspbian Jessie (2016-11-25 kernel 4.4)
Aansluitschema
Raspberry Pi | RPI Pin | HC-SR04 |
---|---|---|
VCC 5V | #2 | VCC |
GND | #6 | GND |
GPIO 23 | #16 | TRIG |
GPIO 24 | #18 | ECHO |
De output van de ECHO pin is 5v, wat te hoog is voor de GPIO 3.3v van de Raspberry Pi. Om beschadigingen te voorkomen gebruiken we twee weerstanden van 4.7K en 10K om het ECHO signaal terug te brengen naar 3.3v. Zie onderstaande schema:
HC-SR04 demoscript
Nadat de sensor is aangesloten kunnen we met behulp van het onderstaande script metingen gaan uitvoeren.
Allereerst wordt er een trigger gegenereerd op de TRIG input, hierdoor worden er 8 ultrasonische (40Khz) signalen verstuurd. Als er zich obstakels bevinden voor de sensor dan zullen de ultrasonische signalen reflecteren. Wanneer het signaal terugkomt wordt de ECHO output module bepaalde tijd actief en wordt op basis van terug ontvangen pulse signalen (150μS tot 25mS) de afstand berekent.
#!/usr/bin/env python | |
# Control HC-SR04 ultrasone sensor from Raspberry Pi | |
# https://raspberrytips.nl/hc-sr04-ultrasone-sensor/ | |
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 "Waiting 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 |
Plaats het bovenstaande script op je Raspberry Pi met behulp van een editor, of download deze met:
wget https://raspberrytips.nl/afstand.py
Start het script met:
python afstand.py
Na enkele seconden zullen de eerste meetresultaten verschijnen. Is de afstand grote dan 4 meter dan verschijnt de melding ‘Out Of Range’.
Meeting kalibreren
Mochten de meetresultaten niet 100% kloppen dan kun je deze kalibreren, in het script wordt rekening gehouden met een afwijking van -0,5 cm. Deze waarde kun je eventueel aanpassen, meet hiervoor een afstand van 15cm en controleer dit met een meetlat. De afwijking kun je in de onderstaande regel van het Python script aanpassen:
print "Afstand:",distance - 0.5,"cm"
als je met python3 werkt is de print statement
$ print (“iets”) anders zal het niet werken
mag je samenvoegen maar ook cleanup van de gpio pinnen zou een plaatsje kunnen hebben in de code.
$ GPIO.cleanup()
Tsja,
Er is een verschil tussen digitaal en analoog. Laat ik het zo zeggen: de tijd die verstrijkt tussen LOW en HIGH op de echo-pin geeft de afstand weer. Die low/high is digitaal. Met een spanningsdeler bestaande uit weerstanden maak je die in feite analoog, want hoewel de digitale uitgang HIGH wordt duurt het even voordat de spanningsdeler deze High ook echt als HIGH doorgeeft. Ik gebruik deze sensor om de watervoorraad in de tank in mijn camper te bepalen. De maximale tijd die gemeten moet worden is dan de tijd van een geluidsgolf over 40 cm en dat is ongeveer 4-duizendste. gebruik dan een LLC (4060) en geen analoge spanningsdeler, zou ik zeggen