Cześć,
w dzisiejszym kursie pokażemy Wam jak obsługiwać ultradźwiękowy czujnik odległości HC-SR04. Zapraszamy !
Spis treści:
- Zasada działania czujnika HC-SR04
- Podstawowe funkcje
- Przykładowy program- odczyt odległości
- 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():
1 2 3 |
PulseIn(pin, stan); //pin- z jakiego ma być odczytany interwał czasowy ///stan- jakim stanem ma być wyzwolony koniec odczytu |
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():
1 2 3 4 5 |
zmienna = map(zmienna, a, b, x, y) //zmienna- do której przypisujemy skalowanie //a,b -dolny i górny zakres oryginalnej zmiennej //x,y dolny i górny zakres naszej skali |
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:
1 2 3 4 5 |
{ int wartoscPWM= analogRead(0); wartoscPWM = map(wartoscPWM, 0, 1023, 0, 255); analogWrite(dioda, wartoscPWM); } |
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
Jeżeli uważałeś wcześniej to zapewne wiesz jak ten program napiszemy:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
int Trig = 9; //pin do którego podłączamy Trig int Echo = 8; //pin do którego podłączamy Echo int CzasEcho; // Czas trwania sygnału ECHO int Odleglosc; // Odległość w centymetrach int MaksymalnaOdleglosc = 200; // Maksymalna odległość int MinimalnaOdleglosc = 2; // Minimalna odległość void setup() { pinMode(Trig, OUTPUT); pinMode(Echo, INPUT); Serial.begin(9600); digitalWrite(Trig, LOW); } void loop() { //Rozpocznij Pomiar odleglosci digitalWrite(Trig, HIGH); delayMicroseconds(10); digitalWrite(Trig, LOW); //Pomiar zakończony //Odczyt czasu odbioru CzasEcho = pulseIn(Echo, HIGH); // Obliczamy odległość Odleglosc = CzasEcho / 58; //wynik w centymetrach if (Odleglosc >= MaksymalnaOdleglosc) { Serial.println("Nie widze nic w odleglosci 2 metrow"); } if( Odleglosc >= MinimalnaOdleglosc) { Serial.print("Odleglosc: "); Serial.println(Odleglosc); } delay(100); } |
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: