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
![]() |
![]() |
![]() |
#!/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