Ultrazvukový dálkoměr

Kamil je vybaven hned třemi ultrazvukovými dálkoměry HC-SR04. Jeden měří vzdálenost vlevo, druhý vpřed a třetí vpravo. Měří vzdálenosti od 2 do 400 cm, vyzařovací úhel je 15°.
Jako jedno z mála zařízení není UZ dálkoměr připojen ke sběrnici I2C, ale ke 2 GPIO pinům. Pro zahájení měření je třeba vyslat na pin Trig (GPIO.OUT) impuls o délce 10 mikrosekund a začít počítat čas, což zařídíme v programovém kódu. Poté, co se na pinu Echo (GPIO.IN) objeví signál ukončeného měření, vypočítáme z uběhlého času měřenou délku. Napájecí napětí dálkoměru je 5V a totéž napětí má i výstup na pinu Echo. Protože Raspberry pracuje s napětím 3.3V, musíme signál Echo převést na toto napětí, jinak by mohlo dojít k poškození elektrického obvodu připojeného GPIO pinu. Nejprve jsem se pro převod snažil použít obousměrný převodník logických úrovní TXS0108E, který mi v jiném zapojení fungoval, takže si snad rozumíme, z nějakého důvodu jsem ale neuspěl, tak jsem použil jednoduchý odporový dělič napětí.

V praxi se, jako správní měřiči, nespokojíme s jedním měřením dané vzdálenosti. Stačí, když kolem dálkoměru přeběhne ve chvíli měření čivava, a chybný údaj je na světě. Při měření také záleží na úhlu, ve kterém UZ vlny dopadají na měřený objekt, při velkém sklonu se přesné hodnoty vzdálenosti nedočkáte. Pravda, existují i laserové měřiče, které by v tomto případě byly vhodnější, pro ty ale musíte sáhnout asi 10x hlouběji do kapsy. Proto u nás robotů měříme vzdálenost ultrazvukem celkem 5x, data uložíme do seznamu, vyhodíme nejmenší a největší hodnotu, a ze zbylých 3 uděláme průměr.  

                                                                                                                                       Jirka

 

Zpět na Robot Kamil HW


#!/usr/bin/python
import time
import RPi.GPIO as GPIO

GPIO.setmode(GPIO.BCM)   # pouzijeme BCM adresaci - GPIO 2-27
GPIO.setwarnings(False)  # potlaceni chybovych GPIO zprav

# Definice pouzitych GPIO pinu
GPIO_TRIG = 19   # vystup
GPIO_ECHO = 20   # vstup

# Nastavime GPIO piny 
GPIO.setup(GPIO_TRIG,GPIO.OUT) 
GPIO.setup(GPIO_ECHO,GPIO.IN)  

hodnoty = [0, 0, 0, 0, 0]   # sem ulozime 5 hodnot mereni

print ("Měřím...")

for i in range(len(hodnoty)):
    GPIO.output(GPIO_TRIG, 0)  # nastavime TRIG na False (Low)
    time.sleep(0.5)            # nechame zarizeni trochu vydechnout

    GPIO.output(GPIO_TRIG, 1)  
    time.sleep(0.00001)        # posleme pres TRIG 10ti mikrosekundový High impuls
    GPIO.output(GPIO_TRIG, 0)
    start = time.time()        # a zaciname merit cas

    while GPIO.input(GPIO_ECHO) == 0:
        start = time.time()   # tohle uz jsme provedli, ale sem se vubec nemusime dostat

    while GPIO.input(GPIO_ECHO) == 1:  # uz je zmereno
        stop = time.time()

    cas = stop - start    # cas mereni
    vzdal = cas * 34300   # vynasobime rychlosti zvuku ve vzduchu (cm/s)

    # Zjistili jsme vzdalenost od dalkomeru k merenemu objektu a zpet, proto delime 2
    vzdal = int(vzdal / 2)
    hodnoty[i] = vzdal
    
print("změřeno", hodnoty)        

min_num = min(hodnoty)  
max_num = max(hodnoty)
hodnoty.remove(min_num)   # nejmensi a nejvetsi hodnotu vyhodim
hodnoty.remove(max_num)
print("optimalizováno", hodnoty)

prumer = sum(hodnoty) / len(hodnoty)
prumer = int(prumer)
print ("průměr", prumer, "cm")

GPIO.cleanup()   # Reset nastaveni GPIO
 


 

  • UZ_dalkomer.py pythonovský kód pro ultrazvukový dálkoměr HC-SR04