HC-SR04 и Arduino: схема подключения, распиновка и скетч измерения расстояния
HC-SR04 — это два цилиндра на плате, похожие на глаза робота. Один излучает короткий ультразвуковой писк, второй ловит эхо. Датчик не считает расстояние сам: он лишь сообщает, сколько микросекунд шёл звук туда и обратно. В сантиметры это превращает ваш код.
Формула простая. Звук в воздухе идёт примерно 340 метров в секунду, то есть один сантиметр за 29 микросекунд. Путь двойной — туда и обратно, — поэтому измеренное время делят на 29 и ещё пополам.
Схема подключения
Распиновка
| Провод | Куда и зачем |
|---|---|
| VCC | Питание 5 В. |
| TRIG | Вход. Импульс 10 мкс запускает измерение. |
| ECHO | Выход. Длина импульса равна времени полёта звука. |
| GND | Земля. |
Характеристики
- Диапазон измерения
- 2–400 см
- Реальная точность
- ±3 мм на коротких дистанциях
- Угол обзора
- около 15°
- Питание
- 5 В, около 15 мА
- Частота ультразвука
- 40 кГц
Библиотека
не нужна— Всё делается встроенными функциями digitalWrite и pulseIn. Библиотеки вроде NewPing удобны, когда датчиков несколько, но для одного это лишняя зависимость.
Готовый скетч
const int TRIG_PIN = 9;
const int ECHO_PIN = 10;
void setup() {
Serial.begin(9600);
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
}
void loop() {
// короткий импульс запускает измерение
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
// ждём эхо, но не дольше 30 мс — иначе зависнем
long duration = pulseIn(ECHO_PIN, HIGH, 30000);
if (duration == 0) {
Serial.println("Эхо не вернулось");
} else {
long distance = duration / 29 / 2; // мкс -> см
Serial.print(distance);
Serial.println(" см");
}
delay(100);
}Скетч собирается arduino-cli под Arduino UNO
Третий аргумент pulseIn — таймаут. Без него, если преграды нет вовсе, функция будет ждать эхо целую секунду, и вся программа встанет колом.
Частые ошибки
Расстояние скачет или показывает ноль
Чаще всего мешает мягкая или наклонная поверхность: ткань глушит ультразвук, а наклонная стена отражает его в сторону. Проверяйте датчик на ровной твёрдой преграде.
Датчик врёт ближе двух сантиметров
Это физический предел: приёмник ещё не успел переключиться с передачи. Всё, что ближе двух сантиметров, датчик показать не может в принципе.
Программа зависает
Забыли таймаут в pulseIn. Функция будет честно ждать эхо, которого нет, и loop остановится.
Показания уползают при смене температуры
Скорость звука зависит от температуры воздуха: на морозе он медленнее. Если нужна точность на улице, добавьте датчик температуры и считайте скорость, а не берите 29 микросекунд на сантиметр.
Что понадобится
- Дальномер HC-SR04
- Arduino UNO
- Провода «папа-мама»