Moduł HC-SR04 |
Specyfikacja
- zakres pracy 2 - 200cm
- rozdzielczość 0,3cm
- zasilanie 5V
- średni pobór prądu: 15 mA
- kąt pomiaru 30 stopni
- częstotliwość pracy: 40 kHz
- wymiary: 45 x 20 x 15 mm
Piny
Vcc, GND | Zasilanie (5V), masa |
Trig | Wejście. Wyzwalanie pomiaru (stan wysoki na 10us) |
Echo | Wyjście. Sygnał echa, Pojawia się na nim stan wysoki o czasie trwania zależnym od odległości między przeszkodą a czujnikiem |
Działanie
Na pin TRIG modułu podaje się stan wysoki na czas co najmniej 10us. To wyzwala pomiar odległości przy użyciu fali dźwiękowej o częstotliwości 40kHz. Fala jest wysyłana przez czujniki ultradźwiękowe i po odbiciu od napotkanej przeszkody wraca ponownie do czujników. Na wyjściu Echo jest ustawiany stan wysoki o czasie trwania zależnym (proporcjonalnym) od odległości przeszkody od modułu (czujnika). Odległość określa wzór
a Time to czas trwania sygnału na wyjściu Echo
Przekładając ten wzór na cm mamy w przybliżeniu:
Uruchomienie
Na pin TRIG modułu podaje się stan wysoki na czas co najmniej 10us. To wyzwala pomiar odległości przy użyciu fali dźwiękowej o częstotliwości 40kHz. Fala jest wysyłana przez czujniki ultradźwiękowe i po odbiciu od napotkanej przeszkody wraca ponownie do czujników. Na wyjściu Echo jest ustawiany stan wysoki o czasie trwania zależnym (proporcjonalnym) od odległości przeszkody od modułu (czujnika). Odległość określa wzór
Time[us] * 343[m/s] / 2gdzie 343m/s to prędkość dźwięku w powietrzu dla temperatury 20 stopni Celsjusza.
a Time to czas trwania sygnału na wyjściu Echo
Przekładając ten wzór na cm mamy w przybliżeniu:
Time[us] / 58a w przypadku cali:
Time[us] / 148
Uruchomienie
Układ uruchomiłem na Arduino Uno i shield'em LCD. Wyniki są prezentowane zarówno na wyświetlaczu, jak i wysyłane na terminal. Kod (funkcja) wyliczająca odległość została zaczerpnięta ze źródła 1. Uprościłem jedynie ostatnią linię wyliczającą odległość.
Pomiar odległości |
#include <LiquidCrystal.h> LiquidCrystal lcd(8, 9, 4, 5, 6, 7); const int TrigPin = A5; const int EchoPin = A4; void setup() { pinMode(TrigPin, OUTPUT); pinMode(EchoPin, INPUT); lcd.begin(16, 2); Serial.begin(9600); } void loop() { int distance = getDistance(); lcd.setCursor(0,0); lcd.print("Distance [cm]:"); lcd.setCursor(0,1); lcd.print(distance); Serial.print("Distance [cm]: "); Serial.println(distance); delay(1000); lcd.clear(); } /** * Speed of Sound: 343 m/s */ int getDistance() { long time; // Low (5us) digitalWrite(TrigPin, LOW); delayMicroseconds(5); // High (15us) digitalWrite(TrigPin, HIGH); delayMicroseconds(15); // Low digitalWrite(TrigPin, LOW); time = pulseIn(EchoPin, HIGH, 50000); return round(time / 58); }
Poza tym są dostępne biblioteki, takie jak na przykład Arduino New Ping. W tym jednak przypadku, myślę, że używanie bibliotek to lekka przesada.
Uwagi
- można dokupić różne obejmy dla modułu, w szczególności takie, które umożliwiają montaż na ramieniu serwo
- w instrukcji (3) mowa jest o powierzchni przeszkody nie mniejszej niż 0,5m2
- wspomniany wyżej kąt pomiaru jest wersją optymistyczną i dotyczy pozycji horyzontalnej (poziom). W pionie wynosi będzie to mniej. W temacie HC-SR04: tests on accuracy, precision and resolution of ultrasonic measurement jeden z użytkowników pisze o ok. 4 stopniach w pionie i ok 21 stopniach w poziomie jako realne wartości kątów pomiaru. Wartości te wynikają z jego własnych pomiarów.
- moduł może "gubić się" w przypadku przeszkód ustawionych pod kątem do czujnika większych niż owe 30 stopni (przykład w źródle 4)
- w czasie "zabawy" z modułem po jednej z kolejnych zmian w kodzie zacząłem otrzymywać jako wynik 0 i dociskanie kabelków/pinów nic nie zmieniało. Po dłuższym poszukiwaniu na forach, wyszło, że użycie PINu 1 może rodzić problemy (stąd zmiana na A4 i A5, co przyniosło poprawę). Cytat z forum: "I found about 2 hours later, after reading a dozen forums, that the main issue that was causing my ultrasonic sensor to return zero while using the NewPing library is that pin 1 and other pins cause the ultrasonic sensor to not function properly" :)
Opisywany miernik odległości zastosowałem w praktyce w układzie Ultradźwiękowego miernika odległości na Digispark ATtiny85.
Źródła
Brak komentarzy:
Prześlij komentarz