Afstanden meten met een HC-SR04 ultrasone sensor

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:

hr-sr04 raspberry pi python

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
view raw afstand.py hosted with ❤ by GitHub

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’.

hc-sr04 sensor results raspberry pi

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"

4 gedachten over “Afstanden meten met een HC-SR04 ultrasone sensor”

    • #! /usr/bin/env python3
      #  -*- coding:utf-8 -*-
      ###############################################################
      # kenwaldek                           MIT-license
      #
      # Title: hc 05 test                   Version: 1.0
      # Date:  27_01_17                     Language: python3
      # Description: hc 05 afstands test, python3 script met
      # gpio cleanup en keyboard interrupt
      ###############################################################
      # Share if you care, do something
      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:
        try:
          GPIO.output(TRIG, False)                 #Set TRIG as LOW
          print ("Wachten op sensor")
          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
      
        except KeyboardInterrupt:
          break
      
      GPIO.cleanup()
      Beantwoorden
  1. 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

    Beantwoorden

Plaats een reactie