Ultradźwiękowy czujnik odległości HC-SR04


Tym razem odpalamy czujnik odległości. Jest to ciekawy element robotów jeżdżących, także stanowi to ciekawą opcję na rozwój projektu.



Na powyższym zdjęciu możecie zobaczyć jak wygląda czujnik. Jego zasada dzialania polega na wysyłaniu fali dźwiękowej i pomiarze czasu do chwili, aż fala ta powróci do czujnika. Znając prędkość dźwięku możemy ustalić odległość.

Czujnik posiada cztery wejścia. Vcc czyli zasilanie 5V, GND czyli masę, TRIG czyli pin wejściowy do każdorazowego uruchomienia pomiaru, oraz ECHO czyli pin wyjściowy do odbioru sygnału z czujnika.

Zasada działania jest prosta. Podajemy na pin TRIG sygnał wysoki, który trwa 10 mikro sekund. Sygnał ten jest wysyłany przez czujnik przed siebie. Następnie gdy czujnik odbierze wracający sygnał, na pinie ECHO pojawi się stan wysoki.

Małym elementem komplikującym współpracę z RPi jest fakt, że czujnik działa na napieciu 5V i o takim napięciu podaje sygnał wyjściowy. Ponieważ stan logiczny wysoki to ok. 3,3 V, trzeba zastosować coś co sięnazywa dzielnik napiecia. Na poniższym rysunku możecie zauważyć jak to działa. Stosujemy w nim dwa rezystory. Idea jest taka aby podzielić napięcie wejściowe (5V) na dwa rezystory i do maliny podać napięcie tylko z drugiego rezystora.

Skoro już wiemy, że jakie mamy napiećia, to wiemy jaki jest ich stosunek, a dzieki temu możemy wyliczyć wartości rezystorów R1 i R2. Na poniższym rysunku wzory i dobrane rezystory.



Stan wysoki 3,3V to wartość teoretycznie wymagalna, ponieważ rozpoznawanie sygnałów elektronice wiąże sięz pewną tolerancją. Jeżeli napięcie (wynikające z dobranych rezystorów) będzie wynosić 2,9V lub 3,5V, to malina też to rozpozna jako stan wysoki. Oczywiscie tolerancja ma swoje granice.

Na poniższym zdjeciu możecie zobaczyć jak wygląda połączenie układu w rzeczywistości. Vcc podpięte jest do pinu 2, GND do pinu 6, TRIG do pinu 12, a ECHO do pinu 16, za pośrednictwem dzielnika napięcia. Zwracam uwagę, że podane przed chwilą numery pinów są w nomenklaturze "board" a nie "BCM".



A teraz kod w Python'ie.

	import RPi.GPIO as GPIO	3 importujemy biblioteki
	import time
	
	GPIO.setmode(GPIO.BCM)	# definiujemy zasady pracy pinów
	GPIO.setwarnings(False)
	
	tri=18		#określamy numery pinów
	echo=24
	
	GPIO.setup(tri,GPIO.OUT)	# określamy charakter pinów in czy out
	GPIO.setup(echo,GPIO.IN)
	
	GPIO.output(tri,True)	#podajemy na czujnik sygnał wysoki trwający 10 mikro sekund - wyzwalamy czujnik
	time.sleep(0.00001)
	GPIO.output(tri,False)
	
	start=time.time()	# po podaniu sygnału wyzwalajacego zapisujemy czas startu pomiaru
	
	while GPIO.input(echo)==0:	# dopóki nie zmieni się stan czujnika na wyjściowy zawieszamy program w pętli
		start=time.time()
			
	while GPIO.input(echo)==1:	# gdy stan pinu wyjściowego z czujnika zmieni się na 1, zapisujemy czas powrotu sygnału
		stop=time.time()
		
	odleglosc = ((stop-start)*34300)/2	# obliczamy odległość mnożąc czas razy prędkość dźwięku, tj.34000 cm/s i dzielimy dystans na 2.
	
	print 'Odległość wynosi ',odleglosc,' cm.'
	


Prędkość dźwięku w powietrzu to 340m/s. Jeżeli chcemy podać wynik w cm, musimy pomnożyć to przez 100, czyli 34000cm/s. Ponieważ zasięg czujnika wynosi 200 cm, najczęściej stosować będziemy właśnie taką jednostkę miary.

Teraz możemy montować czujnik na naszych robotach... :)

:)