ELECTRONICS

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 микросекунд на сантиметр.

Что понадобится