A robotikában, az automatizálásban gyakori feladat az úgynevezett érintés nélküli távolságmérés. Erre több technikai lehetőség kínálkozik, pl a lézeres megoldás, amit egy másik cikkben már körbejártam, amikor a VL53L0X szenzort mutattam be. Ebben a leírásban egy másik technológiát szeretnék bemutatni, az ultrahangos távolságmérést. Erre a feladatra kiváló példa az olcsó, könnyen programozható HC-SR04 távolságmérő szenzor. Az érzékelő az emberi fül számára nem hallható tartományba eső ultrahangokkal, a szonár elv alapján méri a tárgyak távolságát, amit szoktak pulse-echo módszernek is nevezni.

A pulse-echo módszer nagyon egyszerű elven működik: van egy adóegység, amely általában egy 40KHz-es többnyire 8 impulzusból álló ultrahangcsomagot sugároz ki (pulse) és ha a hang útjába valamilyen tárgy,akadály kerül, akkor arról a kisugárzott impulzus-csomagnak (burst-nek) egy része visszaverődik (reflektálódik) és a vevő egység ezt érzékelheti (echo).

A kisugárzás és a vétel között eltelt idő pontos mérésével (Time of Flight, TOF) valamint ismerve a közeget, amiben az ultrahang terjed, kiszámíthatjuk az objektum távolságát.

Érdemes megemlíteni, hogy ez a mérési megoldás lényegében az állatvilágból ellesett módszer, mert a delfinek és a denevérek is hasonló módon képesek meghatározni a tárgyak, zsákmány távolságát.

Példámban a trigger jelek előállítását, amik az impulzus-csomagok kibocsátását indítják, illetve a visszaverődés (echo) érzékelését egy Raspberry Pi-vel oldottam meg.

A Raspberry és a szenzor összekötése

A fentiek alapján a távolság a következő egyenlettel számíthatjuk ki:

a mi esetünkben:

Az előbbiekből látható, hogy a pontos távolságméréshez két érték precíz ismeretére van szükségünk:

  1. a hang terjedési sebessége az adott közegben és
  2. a kisugárzás és a vétel között eltelt pontos idő.

Mire lesz szükség?

  • Raspberry Pi 3B/3B+
  • HC-SR04 távolságmérő szenzor
  • 1 db 1kΩ ill. 1db 2kΩ 1 db 330Ω ellenállás
  • 1 db LED
  • breadboard
  • jumper kábelek

A felsorolásban láthatsz két ellenállást, (1kΩ, 2kΩ) amiknek a szerepéről beszélnünk kell! A HC-SR04 szenzor 5V-os tápfeszültségről működik, így a kimenetén megjelenő jel nagysága is megegyező, azaz 5V-os érték. A Raspberry Pi bemenetére ezt a jelszintet közvetlenül nem kapcsolhatjuk, a számítógép tönkremenne ebben az esetben. A legegyszerűbb megoldás a szenzor és a Pi illesztésére egy egyszerű osztó áramkör, ami a szükséges jelszintet állítja elő.

Ellenállásosztó építése

A HC-SR04 távolságmérő szenzor bekötése

Összeállítás BreadBoard-on

Ha a fenti ábra alapján elkészítetted a bekötést, az összeállítást az alábbi python programmal tesztelheted:

import RPi.GPIO as GPIO                    #GPIO library importálása
import time                                #time library importálása
GPIO.setmode(GPIO.BCM)                     #GPIO számozás kiválasztása 

TRIG = 23                                  #23-as tüske hozzárendelése a TRIG kimenethez
ECHO = 24                                  #24-es tüske hozzárendelése az ECHO bemenethez

print ("Mérés folyamatban")

GPIO.setup(TRIG,GPIO.OUT)                  #Trigger tüske beállítása kimenetnek
GPIO.setup(ECHO,GPIO.IN)                   #Echo tüske beállítása bemenetnek

while True:

  GPIO.output(TRIG, False)                
  print ("Várakozás a szenzorértékre")
  time.sleep(2)                            

  GPIO.output(TRIG, True)                  
  time.sleep(0.00001)                      
  GPIO.output(TRIG, False)                 

  while GPIO.input(ECHO)==0:               
    pulse_start = time.time()              

  while GPIO.input(ECHO)==1:               
    pulse_end = time.time()                 

  pulse_duration = pulse_end - pulse_start 

  distance = pulse_duration * 17150        
  distance = round(distance, 2)            

  if distance > 2 and distance < 400:      
    print ("Távolság:",distance - 0.5,"cm")  
  else:
    print ("Túl nagy érték!!")                   

A program futása közben a terminál ablakban leolvashatod a szenzor és az elé helyezett tárgy távolságát.

A második példaprogram az előző kiegészítése azzal, hogy a 21-es GPIO tüskére előtét ellenálláson keresztül egy LED-et kötöttem, ami bizonyos távolság alatt bekapcsol. Ezzel a programmal egyszerű „tolatóradart” készíthetsz robotjaidhoz!

import RPi.GPIO as GPIO                    #GPIO library importálása
import time                                #time library importálása
GPIO.setmode(GPIO.BCM)                     #GPIO számozás kiválasztása 

TRIG = 23                                  #23-as tüske hozzárendelése a TRIG kimenethez
ECHO = 24                                  #24-es tüske hozzárendelése az ECHO bemenethez
LED = 21                                   #21-es tüske hozzárendelése a LED kimenethez
print ("Mérés folyamatban")

GPIO.setup(TRIG,GPIO.OUT)                  #Trigger tüske beállítása kimenetnek
GPIO.setup(ECHO,GPIO.IN)                   #Echo tüske beállítása bemenetnek
GPIO.setup(LED,GPIO.OUT)                   #LED tüske beállítása kimenetnek

while True:

  GPIO.output(TRIG, False)                 
  print ("Várakozás a szenzorértékre")
  time.sleep(1)                            

  GPIO.output(TRIG, True)                  
  time.sleep(0.00001)                      
  GPIO.output(TRIG, False)                 

  while GPIO.input(ECHO)==0:               
    pulse_start = time.time()              

  while GPIO.input(ECHO)==1:               
    pulse_end = time.time()                

  pulse_duration = pulse_end - pulse_start 

  distance = pulse_duration * 17150        
  distance = round(distance, 2)            

  if distance > 2 and distance < 400:      
    print ("Távolság:",distance - 0.5,"cm")
    if distance < 15:                      #Ha a távolság kisebb 15cm-nél, a LED bekapcsol 
      GPIO.output(LED,True)
    else:
      GPIO.output(LED,False)
  else:
    print ("Out Of Range")                   

A két forráskód letölthető:

A cikkben használt ultrahangos távolságmérő modul megvásárolható a MálnaPC Webshopjában!