Jak podłączyć czujnik odległości HC-SR04 do Arduino?
Czujnik odległości HC-SR04 służy do pomiaru odległości. Wykorzystuje on do działania fale ultradźwiękowe. Znajduje się w nim zarówno generator ultradźwięków oraz ich odbiornik.
Pomiar odległości, za jego pomocą, polega na wysyłaniu fali ultradźwiękowej w kierunku mierzonego obiektu. Fale te po odbiciu powracają do odbiornika. Znając czas między wypuszczoną, a odebraną wiązką, oraz znając prędkość dźwięku w powietrzu jesteśmy w stanie policzyć odległość
HC-SR04P a HC-SR04
Czujnik ultradźwiękowy HC-SR04P to ulepszona wersja dobrze znanego i popularnego czujnika odległości HC-SR04. Jest w pełni kompatybilny z HC-SR04, a oprogramowanie używane do HC-SR04 będzie się nadawało bez przeróbek. Jedną z poprawek jest rozszerzenie zakresu zasilania. HC-SR04P może być zasilany napięciem od 3 V do 5,5 V. Można go dzięki temu użyć bezpośrednio z mikrokontrolerami zasilanymi napięciem 3,3V, takimi jak STM32, ESP32 itp. Zakres pomiarowy poprawionej wersji zależy od napięcia zasilania. Będzie to odpowiednio:
- 2 ÷ 450 cm dla zasilania 5V
- 2 ÷ 400 cm dla zasilania 3V
Podłączenie czujnika do płytki Arduino Uno
Podłącz czujnik do Arduino według poniższego schematu. UWAGA. Nigdy nie podłączaj układu z włączonym zasilaniem. Upewnij się, że Arduino jest odłączone od komputera.
Na początek kilka informacji. W czujniku znajdują się 4 piny:
- VCC – napięcie zasilania. Dla HC-SR04 będzie to 5V
- GND – masa
- Trig – odpowiada za wyzwalanie sygnału ultradźwiękowego. Z perspektywy Arduino będzie to WYJŚCIE
- Echo – służy do pomiarów odległości, ustawimy go dla Arduino jako WEJŚCIE
Gdy podłączysz układ, możesz przejść do pisania kodu. Do zaprogramowania HC_SR04 nie będzie nam potrzebna żadna dodatkowa biblioteka 😊
#define TRIG_PIN 7 #define ECHO_PIN 6 void setup() { Serial.begin(9600); pinMode(TRIG_PIN, OUTPUT); // Trig ustawiamy jako wyjście pinMode(ECHO_PIN , INPUT); // Echo ustawiamy jako wejście digitalWrite(TRIG_PIN, LOW); } void loop() { int Time; digitalWrite(TRIG_PIN, HIGH); delayMicroseconds(10); digitalWrite(TRIG_PIN, LOW); Time = pulseIn(ECHO_PIN, HIGH); // Pomiar czasu trwania impulsu zwrotnego z pinu Echo Serial.print(“Czas: %d us“, Time); delay(100); }
Co tutaj się zadziało? No to po kolei. Na początku zdefiniowaliśmy stałe ECHO_PIN oraz TRIG_PIN jako numery pinów, do których podłączone są sygnały z czujnika. Dzięki temu kod jest bardziej przejrzysty.
Następnie w funkcji setup skonfigurowaliśmy piny odpowiednio – Trig jako wyjście oraz Echo jako wejście naszego Arduino.
Teraz to, co najważniejsze, czyli sam pomiar. W pętli loop została zdefiniowana zmienna typu całkowitoliczbowa „Time”. Ma ona za zadanie przechowywać czas między generacją impulsu przez „Trig” a jego powrotem i wychwyceniem przez „Echo”.
Kolejny fragment kodu dotyczy już samego pomiaru. Polega on na wysyłaniu w odstępach czasowych kolejnych sygnałów ultradźwiękowych. W naszym przypadku jest to 10 mikrosekund.
Po wysłaniu impulsu dokonujemy pomiaru czasu, za pomocą polecenia:
pulseIn(ECHO_PIN, HIGH);
Mamy dopiero czas, a nie odległość. W dalszej części przeliczymy to na odległość.
Na sam koniec wyświetlamy wyniki pomiarów. Spójrzmy zatem na monitor portu szeregowego. Odnajdziemy go na górnym pasku w zakładce narzędzia.
Wyniki wyświetlane w monitorze portu szeregowego
W celu ładniejszej prezentacji wyników można użyć narzędzia Kreślarka. Poniżej znajduje się fragment wykresu z kreślarki. Widać na nim jak jakiś „obiekt” przybliża się i oddala. Kreślarkę możemy znaleźć w narzędziach podobnie jak monitor portu szeregowego.
Zależność czasu od wysłanego impulsu
Mamy zmierzony czas, a potrzebowaliśmy odległość, prawda? Zastanówmy się jak to uzyskać. Potrzebujemy wiedzieć trzy rzeczy:
- Sygnał musi dojść do obiektu, odbić się i wrócić – więc pokonuje on DWUKROTNIE odległość, w jakiej znajduje się przedmiot od czujnika
- Zależność między drogą, czasem a prędkością w ruchu jednostajnym prostoliniowym – s=v*t
- Prędkość, z jaką porusza się fala dźwiękowa w powietrzu – 343 ms
Jak ktoś jest ambitny to może sam policzyć 😊. Jednak w rzeczywistości nie ma takiej potrzeby, bo gotowa zależność jest podana w dokumentacji. Możemy stamtąd wprost wyczytać, że jeśli podzielimy czas przez 58 to otrzymamy odległość w centymetrach.
Po drobnych poprawkach kod prezentuje się następująco:
#define TRIG_PIN 7 #define ECHO_PIN 6 void setup() { Serial.begin(9600); pinMode(TRIG_PIN, OUTPUT); //Trig ustawiamy jako wyjście pinMode(ECHO_PIN, INPUT); //Echo ustawiamy jako wejście digitalWrite(TRIG_PIN, LOW); } void loop() { int Time; double Distance; digitalWrite(TRIG_PIN, HIGH); delayMicroseconds(10); digitalWrite(TRIG_PIN, LOW); Time = pulseIn(ECHO_PIN, HIGH); //Pomiar czasu trwania impulsu Distance = Time / 58; Serial.print(“Dystans: %d cm”, Distance ); delay(100); }
Tak prezentują się wyniki w monitorze portu szeregowego.
Podsumowanie
Jeśli chodzi o samo podłączenie czujnika, to by było na tyle. Jednak to dopiero początek jego możliwości. Może by tak umieścić go na serwomechanizmie i omiatać nim przestrzeń, zamiast tylko prostej? A jakie ty widzisz dla niego zastosowania? Podziel się swoim pomysłem w komentarzu!
Elektronikę w super cenach znajdziesz oczywiście w naszym sklepie 👉 sklep.msalamon.pl 👈
Zapraszamy również na nasze social media, gdzie na bieżąco informujemy o nowych produktach oraz o najciekawszych promocjach 😎👇