![]() |
| 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