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:

  1. Sygnał musi dojść do obiektu, odbić się i wrócić – więc pokonuje on DWUKROTNIE odległość, w jakiej znajduje się przedmiot od czujnika
  2. Zależność między drogą, czasem a prędkością w ruchu jednostajnym prostoliniowym – s=v*t
  3. 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 😎👇


Podobne wpisy

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *