Pokazany na fotografii czujnik ultradźwiękowy HC-SR04 zawiera 8-bitowy mikrokontroler Elan EM78P153S oraz wzmacniacze sygnału akustycznego – wyjściowy i wejściowy. Wzmacniacz wyjściowy służy do wysterowania nadajnika ultradźwięków (miniaturowego głośnika). Ciekawostką jest, że do jego zbudowania użyto układu MAX232, znanego z zupełnie innych zastosowań. Wzmacniacz wejściowy (mikrofonowy) został zrealizowany przy użyciu układu LM324 lub podobnego poczwórnego wzmacniacza operacyjnego. Moduł wyposażony jest w jednorzędowe złącze 4-stykowe.
Poziomy wejściowe sygnałów są zgodne ze standardem logicznym TTL, dzięki czemu możliwa jest współpraca modułu z układami zasilanymi napięciem 5 V lub 3,3 V. Poziomem nieaktywnym obu sygnałów jest poziom niski. W celu wykonania pomiaru odległości należy na wejście Trig podać impuls o poziomie wysokim i czasie trwania nie krótszym od 10 ms. Mikrokontroler modułu emituje wtedy paczkę 8 impulsów ultradźwiękowych o częstotliwości 40 kHz i ustawia linię Echo. Jest ona zerowana po odebraniu przez mikrokontroler modułu HC-SR04 dźwięku odbitego od przeszkody. Czas trwania stanu wysokiego na linii Echo określa czas przemieszczania się dźwięku z modułu do przeszkody i z powrotem. Mierząc ten czas, możemy określić odległość pomiędzy czujnikiem i przeszkodą; przy założeniu, że prędkość dźwięku wynosi około 340 m/s.
Jeżeli moduł nie zarejestruje odbitego dźwięku, linia Echo pozostaje ustawiona i moduł przestaje reagować na kolejne impulsy na linii Trig. W celu ponownego uaktywnienia modułu należy wymusić poziom niski na linii Echo. Ta ważna informacja jest często pomijana w opisach działania modułu.
W praktyce zasięg czujnika odległości nie przekracza 3...5 metrów. Typowo używamy go do pomiaru odległości w zakresie od kilku centymetrów do 2 metrów. Minimalna odległość mierzona wynika z geometrii samego czujnika i wynosi około 2 cm.
Współpraca czujnika z mikrokontrolerem
Typowy scenariusz użycia czujnika odległości zakłada wykonywanie pomiarów odległości ze stałą częstotliwością wynoszącą od 1 do 20 Hz. W celu wykonania pomiaru należy wygenerować impuls na wejściu Trig czujnika i zmierzyć czas trwania impulsu na wyjściu Echo. Aby zagwarantować zakończenie pomiaru, należy również zapewnić kasowanie impulsu na wyjściu Trig poprzez wymuszenie stanu niskiego na linii Trig przy użyciu wyjścia z otwartym drenem. Z doświadczeń wynika, że czas trwania impulsu kasującego powinien wynosić nie mniej niż 30 ms. Oba impulsy – wyzwalający pomiar i kasujący – mogą być wytwarzane przez dwa wyjścia tego samego timera pracującego w trybie PWM. Do pomiaru czasu trwania impulsu na wyjściu Echo należy użyć kanału timera pracującego w trybie capture, zaprogramowanego na pomiar czasu trwania impulsu lub na chwytanie obu zboczy sygnału wejściowego.
Mikrokontrolery STM32 są wyposażone w timery 4-kanałowe, których poszczególne kanały mogą pracować w różnych trybach. Dzięki temu do obsługi czujnika odległości można użyć jednego timera. Co więcej, pojedyncza linia timera może być równocześnie używana w roli wyjścia PWM i wejście Capture, co umożliwia przyłączenie czujnika przy użyciu tylko dwóch wyprowadzeń mikrokontrolera. Do obsługi HC-SR04 można użyć dowolnego z 4-kanałowych timerów TIM1…TIM5. Jedna para kanałów (CH1-CH2 albo CH3-CH4) służy do współpracy z linią Echo. Jeden kanał z drugiej pary jest używany do generowania impulsu wyzwalającego na linii Trig.
Opisany dalej przykład zrealizowano na płytce STM32 Nucleo z mikrokontrolerem STM32F411. Może on zostać łatwo zaadaptowany poprzez modyfikację kodu inicjującego peryferie dla dowolnego mikrokontrolera rodziny STM32F i dowolnego timera 4-kanałowego.
Program przykładowy
Program demonstracyjny wykonuje pomiary odległości ze stałą częstotliwością i przesyła ich wyniki przez port szeregowy. Działa on na płytce Nucleo-F411RE, wyposażonej w interfejs ST-Link/V2-1. Interfejs USART2 mikrokontrolera jest połączony na płytce Nucleo z interfejsem VCOM ST-Link, który jest widoczny w komputerze jako wirtualny port szeregowy. Wyniki pomiarów mogą być na bieżąco wyświetlane na terminalu uruchomionym na PC. Do obsługi portu szeregowego użyto modułu bezpośredniego dostępu do pamięci. Oprogramowanie zostało zrealizowane w strukturze bez pętli zdarzeń. Wszystkie czynności związane z pomiarem odległości są wykonywane w przerwaniu timera.