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
- int Trig = 2; // Numer pinu wyzwolenia
- int Echo = 3; // Numer pinu odpowiedzi
- int Red = 4; // Numer pinu - dioda czerwona
- int Green = 5; // Numer Pinu - dioda zielona
- long EchoTime; // Czas trwania sygnału ECHO
- int Distance; // Odległość w centymetrach
- int MaximumRange = 200; // Maksymalna odległość
- int MinimumRange = 2; // Minimalna odległość
- void setup()
- {
- // Inicjalizacja portu szeregowego
- Serial.begin(9600);
- // Konfiguracja pinów
- pinMode(Trig, OUTPUT);
- pinMode(Echo, INPUT);
- pinMode(Red, OUTPUT);
- pinMode(Green, OUTPUT);
- }
- void loop()
- {
- // Ustawiamy TRIG w stan niski na 2us
- digitalWrite(Trig, LOW);
- delayMicroseconds(2);
- // Ustawiamy TRIG w stan wysoki na 10us
- digitalWrite(Trig, HIGH);
- delayMicroseconds(10);
- // Ustawiamy TRIG w stan niski - rozpoczynamy pomiar
- digitalWrite(Trig, LOW);
- // Odczytujamy czas trwania stanu wysokiego na pinie ECHO
- EchoTime = pulseIn(Echo, HIGH);
- // Obliczamy odległość
- Distance = EchoTime / 58;
- // Sprawdzamy zakres pomiarowy
- if (Distance >= MaximumRange || Distance <= MinimumRange)
- {
- Serial.println("Poza zakresem");
- } else
- {
- // Jeśli poniżej 11cm zapalamy diodę czerwoną
- // Jeśli powyżej 10cm zapalamy diodę zieloną
- if (Distance < 11)
- {
- digitalWrite(Red, HIGH);
- digitalWrite(Green, LOW);
- } else
- {
- digitalWrite(Red, LOW);
- digitalWrite(Green, HIGH);
- }
- Serial.print("Odleglosc: ");
- Serial.println(Distance);
- }
- // Opóźnienie kolejnego pomiaru
- delay(100);
- }
Uruchomienie
Materiały dodatkowe
Karta katalogowa HC-SR04.pdf
Reklama
Komentarze
Witam
Czy ta linie jest poprawna?
pinMode(EchoTime, INPUT);
Czy nie powinno być:
pinMode(Echo, INPUT); ?
Pozdrawiam
Na jakim interfejsie działa ten czujnik ??
Można powiedzieć, że na żadnym. Na jednym z pinów wysyłasz i odmierzasz czas do odpowiedzi na drugim pinie
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.
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ź :).
Ultra dźwięki to nic innego jak fala dźwiękowa o odpowiednio wysokiej częstotliwości >20kHz do 1GHz
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?
Mój pies nie słyszy, nie rusza go użycie układu.
dziecko fora nie inżynier
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?
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.