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 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:
- a hang terjedési sebessége az adott közegben és
- 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ő.
A HC-SR04 távolságmérő szenzor bekötése
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!