Модуль HC-SR04 — это ультразвуковой датчик расстояния, работающий в диапазоне от нескольких сантиметров до нескольких метров. Его можно использовать, например, в умной машине, избегающей препятствий.
HC-SR04, вероятно, самый дешевый модуль измерения расстояния, который известен. Его очень просто использовать совместно с Ардуино.
Технические характеристики HC-SR04
- Рабочий диапазон: 2-200 см
- Разрешение: 0,3 см
- Источник питания: 5В
- Средний ток потребления: 15 мА
- Угол измерения: 30 градусов
- Рабочая частота: 40 кГц
- Размеры: 45 х 20 х 15 мм
Выводы HC-SR04
Vcc, GND — Питание (5В), земля
Trig – Вход. Запуск измерения (высокое состояние продолжительностью 10 мкс)
Ehco — Выход. На нем появляется высокое состояние, продолжительность которого зависит от расстояния между препятствием и датчиком.
(см. подробная распиновка здесь)
Работа датчика
На выводе TRIG модуля подается сигнал высокого уровня на время, по крайней мере, 10мкс. Это запускает измерение расстояния с использованием звуковой волны частотой 40 кГц.
Ультразвуковая волна передается через ультразвуковой передатчик, и после отскока от обнаруженного препятствия, возвращается обратно и улавливается ультразвуковым приемником.
На выходе Echo устанавливается высокое состояние с длительностью, пропорциональной расстоянию от препятствия до модуля (датчика). Расстояние определяется по формуле:
Time [мс] * 343[м/с] / 2
где 343 м/с — скорость звука в воздухе при температуре 20 градусов Цельсия, a Time — длительность сигнала на выходе Echo.
Практический пример
Система работает на Ардуино Uno и LCD Shield. Результаты отображаются как на дисплее, так и отправляются в монитор последовательного порта.
Функция для вычисления расстояния взята из этого источника
#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); }
Кроме того, доступны библиотеки, например Ардуино New Ping. Однако в данном случае использование библиотек — это немного перебор.
Примечание
- Вы можете купить различные зажимы для модуля, в частности те, которые позволяют установить его на сервопривод.
- в datasheet упоминается площадь препятствия не менее 0,5 м2.
- упомянутый выше угол измерения (30 градусов) является максимальным значением и применяется к горизонтальному положению (уровень). По вертикали это значение будет меньше. В теме HC-SR04: тесты на точность, прецизионность и разрешающую способность ультразвуковых измерений один из пользователей указывает, что 4 градуса по вертикали и около 21 градуса по горизонтали являются реальными значениями углов согласно его измерениям.
- модуль может «потеряться» в случае препятствий, расположенных под углом к датчику больше этих 30 градусов.
- Тестируя модуль, после одного из очередных изменений кода, я начал получать в качестве результата 0. После долгих поисков на форумах выяснилось, что использование вывода A1 Ардуино может вызвать проблемы (отсюда и переход на выводы A4 и A5, что принесло улучшение). Цитата на форуме : «Примерно через 2 часа после прочтения дюжины форумов я обнаружил, что основная проблема, из-за которой мой ультразвуковой датчик возвращал ноль при использовании библиотеки NewPing, заключается в том, что контакт 1 и другие контакты приводят к тому, что ультразвуковой датчик HC-SR04 не работает должным образом»