SantyagoSantyago
Avatar

Witaj!
Blog archiwalny. Już niebawem nowy serwis!

YouTube RSS Facebook GitHub

Arduino poradnik

Wstęp

Teoria

Biblioteki

Komponenty

Czujniki i sensory

Rozwiązania i algorytmy

Narzędzia

Mikrokontrolery i Arduino IDE

Arduino i klony

Poradniki wideo

Reklama na Blogu

Najnowsze poradniki

Ostatnie komentarze

Ostatnie fotografie

polskie-gorypolskie-gorypolskie-gorypolskie-gorypolskie-gorypolskie-gorypolskie-gorypolskie-gorypolskie-gorywieliczka-szyb-danilowicza

Ultradźwiękowy czujnik odległości HC-SR04

HC-SR04 to czujnik ultradźwiękowy działający w zakresie od 2 do 200 cm, zasilany napięciem 5V. Mierzony za jego pomocą czas trwania sygnału wejściowego, jest proporcjonalny do mierzonej odległości. Typowy pobór prądu podczas pomiaru wynosi około 15mA.

Posiada cztery piny, dwa zasilające oraz dwa do wyzwolenia i odczytania pomiaru.

Aby rozpocząć pomiar odległości należy podać na pin TRIG impuls napięciowy w stanie wysokim 5V przez czas 10μs, następnie dokonywany jest pomiar odległości przy pomocy fali ultradźwiękowej o częstotliwości 40kHz, która odbijając się od napotkanej przeszkody, wraca do czujnika. Kiedy pomiar zostanie wykonany, na pin ECHO wystawiany jest sygnał, którego czas trwania zależy od odległości znajdującej się od przeszkody.

Pierwszą metodę pomiaru opisuje prosta zależność, w której mierzony jest czas (T1) w sekundach od momentu wyzwolenia sygnału na TRIG do momentu pojawienia się odpowiedzi na pinie ECHO:

odległość = (T1 * prędkość rozchodzenia się dźwieku)  /  2

Interesuje nas prędkość rozchodzenia się dźwięku w powietrzu, a więc 340 m/s:

odległość [m] = ( T1 [s] * 340 [m/s] )  /  2

HC-SR04 posiada jednak opcję, która pozwoli nam na określenie odległości od przeszkody na podstawie czasu trawania sygnału ECHO (T2) mierzoną w mikrosekundach. Łatwo policzyć więc, że fala dźwiękowa pokonuje jeden centymetr w czasie 29us, a więc ułatwiając sobie powyższą zależność, otrzymamy wzór i wynik w centymetrach:

odległość [cm] = T2 [us] / 58

Jeśli interesuje nas wynik w calach, powyższy wzór będzie wyglądał następująco:

odległość [inch] = T2 [us]  / 148

Schemat połączeń

Oprócz podłączenia czujnika do Arduino, wykorzytamy jeszcze dwie diody LED (czerwoną i zieloną) do sygnalizacji dystansu poniżej i powyżej 10cm.

Program

  1. int Trig = 2;   // Numer pinu wyzwolenia
  2. int Echo = 3;   // Numer pinu odpowiedzi
  3. int Red = 4;    // Numer pinu - dioda czerwona
  4. int Green = 5;  // Numer Pinu - dioda zielona
  5.  
  6. long EchoTime;  // Czas trwania sygnału ECHO
  7. int  Distance;  // Odległość w centymetrach
  8. int  MaximumRange = 200; // Maksymalna odległość
  9. int  MinimumRange = 2;   // Minimalna odległość
  10.  
  11. void setup()
  12. {
  13.   // Inicjalizacja portu szeregowego
  14.   Serial.begin(9600);
  15.  
  16.   // Konfiguracja pinów
  17.   pinMode(Trig, OUTPUT);
  18.   pinMode(Echo, INPUT);
  19.   pinMode(Red, OUTPUT);
  20.   pinMode(Green, OUTPUT);
  21.  
  22. }
  23.  
  24. void loop()
  25. {
  26.   // Ustawiamy TRIG w stan niski na 2us
  27.   digitalWrite(Trig, LOW);
  28.   delayMicroseconds(2);
  29.  
  30.   // Ustawiamy TRIG w stan wysoki na 10us
  31.   digitalWrite(Trig, HIGH);
  32.   delayMicroseconds(10);
  33.  
  34.   // Ustawiamy TRIG w stan niski - rozpoczynamy pomiar
  35.   digitalWrite(Trig, LOW);
  36.  
  37.   // Odczytujamy czas trwania stanu wysokiego na pinie ECHO
  38.   EchoTime = pulseIn(Echo, HIGH);
  39.  
  40.   // Obliczamy odległość
  41.   Distance = EchoTime / 58;
  42.  
  43.   // Sprawdzamy zakres pomiarowy
  44.   if (Distance >= MaximumRange || Distance <= MinimumRange)
  45.   {
  46.     Serial.println("Poza zakresem");  
  47.   } else  
  48.   {
  49.     // Jeśli poniżej 11cm zapalamy diodę czerwoną
  50.     // Jeśli powyżej 10cm zapalamy diodę zieloną
  51.     if (Distance < 11)
  52.     {
  53.       digitalWrite(Red, HIGH);      
  54.       digitalWrite(Green, LOW);
  55.     } else
  56.     {
  57.       digitalWrite(Red, LOW);      
  58.       digitalWrite(Green, HIGH);
  59.     }    
  60.       
  61.     Serial.print("Odleglosc: ");
  62.     Serial.println(Distance);
  63.   }
  64.  
  65.   // Opóźnienie kolejnego pomiaru
  66.   delay(100);
  67. }

Uruchomienie

Materiały dodatkowe

Karta katalogowa HC-SR04.pdf

Reklama

Komentarze Komentarze
Avatar 1
Dawid Windows 7 / Safari 537.36
14 August 2014 - 10:49 Brak informacji

Witam
Czy ta linie jest poprawna?
pinMode(EchoTime, INPUT);

Czy nie powinno być:
pinMode(Echo, INPUT); ?

Pozdrawiam

Avatar 2
Korneliusz Linux x86_64 / Mozilla Firefox 30.0
16 August 2014 - 17:36 Bytom

Zgadza się :)

Avatar 1
wera Windows / Internet Explorer 9.0
15 October 2014 - 12:25 Brak informacji

Na jakim interfejsie działa ten czujnik ??

Avatar 2
Korneliusz Linux x86_64 / Mozilla Firefox 31.0
15 October 2014 - 19:38 Bytom

Można powiedzieć, że na żadnym. Na jednym z pinów wysyłasz i odmierzasz czas do odpowiedzi na drugim pinie

Avatar 1
bartekh7 Windows 7 / Mozilla Firefox 33.0
28 November 2014 - 13:58 Rzeszów

Witam

Podłączyłem mój układ tak,że mam tylko czujnik podpięty do Arduino. Program wygląda następująco:

int Trig = 2;
int Echo = 3;

long EchoTime;
int Distance;
int MaximumRange = 200;
int MinimumRange = 2;

void setup()
{
Serial.begin(9600);
pinMode(Trig, OUTPUT);
pinMode(Echo, INPUT);
}

void loop()
{
digitalWrite(Trig, LOW);
delayMicroseconds(2);
digitalWrite(Trig, HIGH);
delayMicroseconds(10);
digitalWrite(Trig, LOW);
EchoTime = pulseIn(Echo, HIGH);
Distance = EchoTime / 58;
if (Distance >= MaximumRange || Distance <= MinimumRange)
{
Serial.println("Poza zakresem");
}
else
{
Serial.print("Odleglosc: ");
Serial.println(Distance);
}

delay(100);
}

a wyświetla tylko "Poza zakresem". W czym tkwi problem?

Pozdrawiam.

Avatar 1
Magda Windows 7 / Safari 537.36
30 May 2015 - 14:12 Warszawa

Czy orientuje się ktoś w jaki sposób urządzenie wytwarza ultradźwięki? Jest tam jakiś geenrator piezoelektryczny? Pytam bo potrzebuję takiej informacji do inżynierki. Z góry dziękuję za odpowiedź :).

Avatar 2
Korneliusz Linux x86_64 / Mozilla Firefox 34.0
04 June 2015 - 13:33 Bytom

Ultra dźwięki to nic innego jak fala dźwiękowa o odpowiednio wysokiej częstotliwości >20kHz do 1GHz

Avatar 1
Tomekb Windows XP / Mozilla Firefox 42.0
16 November 2015 - 11:50 Brak informacji

Z dokumentacji wynika, że ten układ wysyła impulsy o częstotliwości 40kHz. Ze strony http://www.swiatczarnegoteriera.republika.pl/a-rozmaitosci_zmysly.html wynika, że pies słyszy do 47.000-65.000 Hz, a więc czy ten układ nie będzie drażnił psa?

Avatar 1
Andrzej Windows / Safari 537.36
08 May 2016 - 20:23 Ruda Śląska

Mój pies nie słyszy, nie rusza go użycie układu.

Avatar 1
staszek Windows XP / Safari 537.36
12 June 2015 - 22:47 Stalowa Wola

dziecko fora nie inżynier

Avatar 1
dps Windows / Safari 537.36
16 October 2016 - 22:19 Bytom

Jaki wpływ na pomiary ma odległość "czujnika" od mikroprocesora? Czy transmisja danych po 4m kabla 2x2x0,5mm2 wprowadzi znaczące opóźnienia, a co za tym idzie niewłaściwe wyniki pomiarów? Czy ewentualnie można zastosować współczynniki korygujące?

Avatar 1
pit Windows / Mozilla Firefox 58.0
14 February 2018 - 19:53 Warszawa

Mój problem z tym czujnikiem jest taki że ma słabą powtarzalność błąd pomiaru potrafi osiągać 20%. Zastanawiam się nad przyczyną: błąd w kodzie za długi kabel czy słabe zasilanie. Podczas testów na biurku wyglądało to nieźle.