HC-SR04 – ultradźwiękowy czujnik odległości, który umożliwia wykonywanie pomiaru odległości od obiektu poprzez wysyłanie i odbieranie fali ultradźwiękowej. To znakomity moduł do zastosowania w robotach jeżdżących – dzięki takiemu czujnikowi przeszkody na torze jazdy zostają odpowiednio szybko wykryte, aby robot zdążył je bezpiecznie ominąć.
Konstrukcja czujnika składa się ze sparowanych ze sobą elementów głównych – nadajnika i odbiornika, a także układu sterowania i generatora sygnału pomiarowego. Nadajnik wysyła sygnał ultradźwiękowy, który zostaje odbity od obiektu, względem którego jest mierzona odległość, a fala ultradźwiękowa powraca do odbiornika i podlega procesowi przetwarzania w celu obliczenia różnicy czasu, który mija od chwili wysłania sygnału pomiarowego, do chwili jego odebrania. Sygnał wyjściowy z czujnika może być przekazany do dalszego przetwarzania przez zewnętrzny mikrokontroler współpracujący w celu obliczenia odległości czujnika względem pobliskiego obiektu. HR-SR04 jest niedrogim czujnikiem, a przy tym odznacza się bardzo dobrą dokładnością pomiaru na poziomie ±0,3 cm. Czujnik może współpracować zarówno z płytkami Arduino, jak i Raspberry Pi, przy czym podłączając czujnik HC-SR04 do Raspberry Pi, należy skorzystać z konwertera poziomów logicznych, który obniża napięcie 5,0V z czujnika na poziom 3,3V, zgodny z wyprowadzeniami GPIO w Raspberry Pi.
Budowa i zasada działania ultradźwiękowego czujnika odległości
Moduł czujnika HC-SR04 ma cztery wyprowadzenia:
- “Vcc” – wejście napięcia zasilającego 5V
- “Trig” – wejście sygnału wyzwalającego cykl pomiarowy
- “Echo” – wyjście sygnału odwzorowującego czas przemieszczania się fali ultradźwiękowej
- “Gnd” – masa zasilania
Wyprowadzenia “Vcc” i “Gnd” muszą być podłączone do pinów zasilania napięciem 5V (“VCC”) i masy (“GND”) w Arduino, a wyprowadzenia “Trig” i “Echo” należy podłączyć do osobnych wyprowadzeń dwustanowych. Po podaniu na wejście “Trig” sygnału stanu wysokiego o czasie trwania wynoszącym 10µs wbudowany generator podaje na nadajnik czujnika sygnał ultradźwiękowy o częstotliwości 40kHz przez czas 200µs. Po zakończeniu wysyłania tego sygnału pin “Echo” zostaje przerzucony w stan wysoki i rozpoczyna się pomiar. Wyemitowana fala ultradźwiękowa jest wysyłana w powietrze i gdy napotka na drodze przeszkodę, zostaje odbita w stronę odbiornika wbudowanego w module czujnika. Zmierzony czas trwania stanu wysokiego na pinie “Echo” jest proporcjonalny do odległości czujnika od przeszkody. Cały cykl pomiarowy obrazują oscylogramy przedstawione na rys. 1.
Rys 1 – relacja między przebiegami czasowymi sygnałów czujnika HC-SR04
Aby obliczyć odległość pokonaną przez falę ultradźwiękową, trzeba wiedzieć, że prędkość dźwięku w powietrzu wynosi ok. 340 m/s, przy czym do naszych obliczeń użyjemy przeliczenia na 0,034cm/µs. Przykładowo, gdy przeszkoda jest umieszczona 10 cm od czujnika, wówczas czas trwania cyklu pomiarowego będzie trwał ok. 592µs. Czas zmierzony przez czujnik obejmuje wysłanie fali ultradźwiękowej oraz jej powrót do źródła, a więc dwukrotną odległość czujnika od punktu odbicia fali ultradźwiękowej. Z tego względu otrzymany wynik pomiaru należy podzielić przez 2. Obliczeń należy dokonać zgodnie z zależnościami (1.1) i (1.2).
Specyfikacja techniczna ultradźwiękowego czujnika odległości HC-SR04
- Napięcie zasilania: 5V
- Maksymalny pobór prądu: 20mA
- Poziom logiczny stanu wysokiego: 5V
- Poziom logiczny stanu niskiego: 0V
- Zakres temperatury roboczej: -15 – +70°C
- Kąt pomiaru: 30°
- Kąt odbicia fali ultradźwiękowej: °15
- Częstotliwość sygnału pomiarowego: 50kHz
- Zakres pomiarowy czujnika: ±0,02 – 2,00m
- Dokładność pomiaru: 0,003m
- Wymiary czujnika: 45 x 20 x 15mm
Ultradźwiękowe czujniki odległości
Przykładowy kod programu w środowisku Arduino IDE
Aby zrealizować przykładowy program na Arduino do obsługi czujnika HC-SR04, w pierwszej kolejności należy przypisać odpowiednie wyprowadzenia, do których są podłączone piny czujnika “Trig” i “Echo”. W przykładowym programie przyjęto, że piny czujnika są połączone z wyprowadzeniami Arduino o numerach odpowiednio 5 i 6 – są to wyprowadzenia dwustanowe. Następnie definiujemy zmienne określające parametry pomiaru, tj. czas trwania cyklu pomiarowego (zmienna typu “long”) oraz zmierzoną odległość czujnika od obiektu (zmienna typu “int”). Pin nr 5 (“Trig”) jest określony jako wyjście, a pin nr 6 (“Echo”) jako wejście. W celu podglądu wyniku pomiaru wprowadzamy uruchomienie transmisji danych przez interfejs UART za pomocą instrukcji Serial.begin(). Na początku każdego cyklu pomiarowego pin “Trig” jest ustawiany w stan logiczny niski. Po odczekaniu 2 mikrosekund pin “Trig” jest przerzucany w stan logiczny wysoki na czas 10µs, po czym ponownie jest zerowany. Wówczas pin “Echo” zostaje przerzucony w stan wysoki, co jest równoznaczne z wysłaniem fali ultradźwiękowej i rozpoczęciem cyklu pomiarowego.
Czas trwania cyklu pomiarowego jest odmierzany za pomocą funkcji pulseIn() – w omawianym przypadku funkcja ta wykonuje pomiar czasu trwania stanu wysokiego na pinie “Echo”. Po zakończeniu cyklu pomiarowego zmierzony czas trwania impulsu “czaspomiaru” jest podstawiany do wzoru w następnej linijce kodu – w ten sposób zostaje obliczona wartość zmiennej “odległość”, która obrazuje rzeczywistą odległość czujnika od obiektu. Obliczony wynik jest wysyłany do komputera, a jego wartość zostaje wyświetlona w monitorze portu szeregowego. Kolejny pomiar jest wykonywany w taki sam sposób w pętli.
Kod programu
/* *Program obsługujący ultradźwiękowy czujnik odległości HC-SR04 */ // Przypisanie pinów funkcyjnych czujnika do ponumerowanych wyprowadzeń Arduino const int Trig = 5; const int Echo = 6; // Definiowanie zmiennych określających parametry pomiaru long czaspomiaru; // Czas trwania cyklu pomiarowego int odleglosc; // Zmierzona odległość czujnika od obiektu // Ustawienie funkcji sprzętowych void setup() { pinMode(Trig, OUTPUT); // Ustawienie pinu Trig jako wyjście pinMode(Echo, INPUT); // Ustawienie pinu Echo jako wejście Serial.begin(9600); // Uruchomienie transmisji danych przez interfejs UART; Prędkość transmisji: 9600 bitów na sekundę } void loop() { digitalWrite(Trig, LOW); // Wyzerowanie pinu sygnału Trigger delay(0.002); // odczekanie 2 mikrosekund digitalWrite(Trig, HIGH); // Ustawienie pinu sygnału Trigger w stan wysoki delay(0.010); // odczekanie 10 mikrosekund digitalWrite(Trig, LOW); // Ustawienie pinu sygnału Trigger w stan wysoki - start pomiaru czaspomiaru = pulseIn(Echo, HIGH); //pomiar czasu trwania impulsu (stanu wysokiego) na pinie Echo odleglosc = czaspomiaru*0.034/2; // Obliczanie odległości czujnika od obiektu // Wyświetlanie wartości zmierzonej odległości obiektu od czujnika w oknie monitora portu szeregowego Serial.print("Odleglosc zmierzona: "); Serial.println(odleglosc); }
Jak oceniasz ten wpis blogowy?
Kliknij gwiazdkę, aby go ocenić!
Średnia ocena: 4.2 / 5. Liczba głosów: 5
Jak dotąd brak głosów! Bądź pierwszą osobą, która oceni ten wpis.