Kurs Arduino #12: Obsługa czujnika odległości HC-SR04

Cześć,kurs12
w dzisiejszym kursie pokażemy Wam jak obsługiwać ultradźwiękowy czujnik odległości HC-SR04. Zapraszamy !

 

 

 

 

 

Spis treści:

  1. Zasada działania czujnika HC-SR04
  2. Podstawowe funkcje
  3. Przykładowy program- odczyt odległości
  4. Przykład zastosowania #1: detektor odległości

Co będziemy potrzebować:

  • 1x Arduino Uno
  • 1x moduł HC-SR04
  • 1x buzzer 5V
  • 1x rezystor 220 ohm (opcjonalnie do obniżenia głośności buzzera)
  • 1x zestaw przewodów połączeniowych

1.Zasada działania czujnka HC-SR04
Czujnik HC-SR04 to ultradźwiękowy czujnik odległości o zakresie 2-200 centymetrów. Działa na napięciu 5V. Podczas działania pobiera około 15mA prądu. Najlepsze efekty jego działania można uzyskać przy maksymalnym kącie 22,5 stopnia na stronę w poziomie. Oznacza to, tyle, że najlepszy odczyt będziemy mieć jeżeli obiekt będzie na przeciwko, a jak nie może być na przeciwko, to chociaż żeby był maksymalnie o 22,5 stopnia w którąś stronę od niego wysunięty. Co do zasady działania to jest banalnie prosta. Do obsługi tego czujnika nie potrzebujemy nawet bibliotek ponieważ wszystko odbywa się w tym module, ale po kolei. Na pin Trig podajemy stan wysoki na czas 10us, po czym moduł wysyła wiązkę 8 sygnałów ultradźwiękowych o częstotlwości 40kHz. Następnie czekamy, aż sygnały wrócą, po czym z pinu Echo wysyła stan wysoki do Arduino. Następnie mierzymy ile czasu minęło od momentu wysłania do powrotu sygnału. Zalecane jest, aby od momentu wysłania do momentu odebrania sygnału minęło przynajmniej 60ms. Gdy już to mamy to możemy przejść do obliczenia odległości:

Dla centymetrów to:

Odległość = czas powrotu sygnału od momentu jego wysłania / 58

Dla cali:

Odległość = czas powrotu sygnału od momentu jego wysłania / 148


Jak już obliczyliśmy odległość to możemy dopisać resztę programu, która będzie reagować na dane odległości. Uwaga: Z przyczyn mi nieznanych, moduł HC-SR04 może nie działać poprawnie, albo nie działać wcale na Arduino Pro Mini, dlatego zaleca się, aby czujnik podłączyć przynajmniej do Arduino UNO

2.Podstawowe funkcje

W tym przypadku, jak ostatnimi czasy nie ma bibliotek, w których znajdowałoby się specjalne funkcje. Dlatego dzisiaj przedstawimy pewne funkcje językowe dla języka C oraz Arduino.

Pierwsza funkcja to PulseIn():

Funkcja ta zczytuje czas po jakim dany pin został ustawiony w dany stan. W naszym przypadku – jak wcześniej wspomniałem- chcemy oczytać po jakim czasie, na pinie Echo pojawi się stan wysoki oznaczający powracający sygnał. Nasz program będzie w pętli, zatem po ustawieniu pinu Trig w stan wysoki, a następnie wprowadzeniu go w stan niski, będziemy „nasłuchiwać” po jakim czasie wróci sygnał i na pinie Echo pojawi się stan wysoki.

Funkcja map():

Wiem, że może brzmi to strasznie, ale ta funkcja nie robi nic innego jak skaluje naszą oryginalną zmienną dla zmiennej przypisanej do map(). Teraz przedstawię przykład, który z pewnością pokaże Ci o co w tym chodzi. Jak wiemy przetwornik A/C jest 10-bitowy, czyli zwraca nam wartości w zakresie 0-1023. Natomiast PWM zwraca nam wartości w zakresie 0-255. Chcemy zatem przypisać wartości A/C do wartości PWM, ale nie możemy zrobić tego wprost bo 1/4 wartości A/C to będzie cały zakres PWM, dlatego musimy sobie wartość PWM przeskalować w taki sposób:

Ten przykład jest bardzo uproszczony, ale widać na czym to polega. W nawiasach wpisujemy nazwę zmiennej do której chcemy przypisać skalowanie, następnie po przecinkach podajemy minimalną i maksymalną wartość skalowanej zmiennej, a następnie podajemy minimalną i maksymalną wartość naszej skali.

Tyle funkcji, czas napisać jakiś program ;)

3. Przykładowy program- odczyt odległości

kurs 12.1

Jeżeli uważałeś wcześniej to zapewne wiesz jak ten program napiszemy:

W pętli startowej ustawiamy pin Trig w stan niski, zapobiegnie to błędnym pomiarom. Następnie w pętli głównej programu rozpoczynam odczyt odległości, w tym celu wysyłamy na pin Trig stan wysoki, a następnie przy pomocy funkcji delayMicroseconds() odczekujemy 10us po czym ustawiamy pin Trig w stan niski. Teraz przy użyciu PulseIn() odczytujemy czas z jakim powrócił do modułu odbity sygnał. Teraz przy pomocy wzory podanego wcześniej przeliczamy czas na odległość. Gdy już przeliczyliśmy odległość to możemy utworzyć dwie funkcje warunkowe. Jedna będzie sprawdzać czy Odległość przedmiotu jest większa niż Maksymalny zakres odczytu, a druga czy odległość jest większa/równa od minimalnego zakresu. Jeżeli jest większa od maksymalnego zakresu to wyślij napis: „Nie widzę nic w odległości 2 metrów”, a jeżeli mniejsza to wyślij wartość odległości. Po wgraniu programu na monitorze portu szeregowego powinniśmy otrzymać coś takiego:

pomiar