Ультразвуковой дальномер HC-SR04: обзор и подключение
Для чего он нужен
HC-SR04 — ультразвуковой дальномер, с которого начинается почти каждый проект про роботов и умные вещи. Два «глаза» на плате: левый излучатель посылает пакет ультразвука, правый ловит отражение. Модуль возвращает длительность полёта звука, а пересчёт в сантиметры занимает одну строчку кода. Стоит копейки и есть почти в каждом стартовом наборе Arduino. Типовые применения: парковочный ассистент, робот, объезжающий препятствия, контроль уровня воды в баке, высотомер дрона на малой высоте.

Как работает измерение
Вы подаёте на вывод Trig импульс 10 микросекунд. Модуль выстреливает восемь ультразвуковых импульсов частотой 40 кГц и поднимает вывод Echo. Пока Echo держится в высоком уровне, звук летит до препятствия и обратно. Дальше школьная формула: расстояние = скорость звука × время / 2. Скорость звука в воздухе — около 343 м/с, то есть 0,0343 см за микросекунду. Делим пополам, потому что путь звук проходит дважды: туда и обратно.
Нюанс: скорость звука зависит от температуры воздуха, поэтому зимой и летом показания уедут на несколько процентов. Для точных приборов вводят поправку, для робота или парковочного сигнализатора хватает заводской точности.
Характеристики по паспорту
| Параметр | Значение |
|---|---|
| Рабочее напряжение | 5 В постоянного тока |
| Рабочий ток | 15 мА |
| Ультразвуковая частота | 40 кГц |
| Частота измерений | до 40 раз в секунду |
| Минимальная дальность | 2 см |
| Максимальная дальность | 4 м |
| Угол измерения | 15° |
| Импульс на входе Trig | 10 мкс, уровень TTL |
| Размеры | 45 × 20 × 15 мм |
Выводов четыре, шаг 2,54 мм: VCC, Trig, Echo, GND. Питание — строго 5 вольт: при 3,3 В модуль запускается, но дальность резко падает и показания врут.
Подключение к Arduino
С Arduino Uno или Nano всё тривиально: VCC — к 5V, GND — к GND, Trig — к пину 9, Echo — к пину 10. Логика у платы пятивольтовая, согласовывать уровни не нужно.
Подключение к ESP32
Питание берите с пина VIN (там 5 В от USB), а вот Echo требует осторожности: он выдаёт 5 вольт, а входы ESP32 рассчитаны на 3,3. Прямое подключение — верный способ сжечь GPIO. Ставим делитель напряжения: Echo → резистор 1 кОм → пин ESP32, и от этой же точки резистор 2 кОм на GND. На входе получится 5 × 2/3 ≈ 3,3 В. Trig ведите напрямую — порог срабатывания у модуля TTL-совместимый, и 3,3 В для него достаточно.
Код для Arduino
// Дальномер HC-SR04 на Arduino Uno
const int TRIG_PIN = 9; // Trig — командный вход
const int ECHO_PIN = 10; // Echo — выход длительности эха
void setup() {
Serial.begin(9600);
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
}
void loop() {
// Стартовый импульс: 2 мкс тишины, затем 10 мкс HIGH
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
// Ждём эхо: сколько микросекунд Echo был в HIGH
long duration = pulseIn(ECHO_PIN, HIGH, 30000); // таймаут 30 мс
// Пересчёт в сантиметры: 0,0343 см/мкс, пополам за путь туда-обратно
float distance = duration * 0.0343 / 2;
Serial.print("Расстояние: ");
Serial.print(distance);
Serial.println(" см");
delay(500); // не чаще пары замеров в секунду
}
Таймаут 30 мс подобран под паспортный максимум: звуку до препятствия на 4 метрах и обратно нужно около 23 мс. Всё, что дольше, — модуль честно отвечает «не увидел», и pulseIn вернёт ноль.
На ESP32 код тот же, меняются только номера пинов: Trig на GPIO 5, Echo — на GPIO 18 через делитель. Функции pulseIn и delayMicroseconds в ESP32-ядре работают без переделок.
Частые ошибки
- Echo без делителя на ESP32. Первая по популярности причина мёртвых GPIO: 5 вольт на вход, рассчитанный на 3,3, — и пин выходит из строя.
- Замер «в упор». Ближе 2 см эхо возвращается раньше, чем модуль успевает переключиться в режим приёма. Показания обнуляются или замирают на одном числе.
- Стрельба без паузы. Если запускать замеры чаще, чем раз в 25 мс, остатки предыдущего эха попадают в новый замер — числа скачут. Держите интервал от 60 мс.
- Мягкие и наклонные поверхности. Ковёр и ткань глотают ультразвук, наклонная плоскость уводит отражение в сторону — датчик молчит или врёт.
- Несколько дальномеров рядом. Ультразвуковые пакеты накладываются, датчики слышат друг друга. Разносите их во времени: один замерил — затем второй.
- Пыль и конденсат на излучателях. Мембраны под металлической сеткой забиваются, дальность падает. Чистить бережно, без растворителей.
Что дальше
Дальномер хорошо дружит с остальной периферией: добавьте реле-модуль — и получится автодолив бака или включение света, когда кто-то подходит к двери. А если задача — не измерять расстояние, а фиксировать присутствие человека, загляните в обзор датчика движения HC-SR501: он ловит инфракрасное излучение тела и стоит ещё дешевле.
Информация собрана из открытых источников и паспортов производителей и не является истиной в последней инстанции. Характеристики, распиновку и совместимость проверяйте по документации конкретной партии модуля перед покупкой и подключением.