Дата публикации

Автор статьи: Rinat Khairulin

19

HC-SR04 с Arduino Nano: проверка точности ультразвукового датчика расстояния

Проверяем точность ультразвукового датчика HC-SR04 с Arduino Nano на расстояниях 20, 30 и 50 см. Подключение датчика, принцип измерения, результаты теста и реальные сценарии применения.

Смотреть видео к статье

Что показывает тест HC-SR04

HC-SR04 – это недорогой ультразвуковой датчик, который используют для измерения расстояния до предмета. Его ставят в простые роботы, системы парковки, автоматические крышки, сигнализации и проекты, где нужно заметить препятствие перед устройством.

В этом тесте проверяем не паспортную дальность датчика, а более понятный вопрос: насколько его показания совпадают с реальным расстоянием на обычной сборке с Arduino Nano. Для проверки предмет ставят на расстоянии 20, 30 и 50 см, а результат смотрят в мониторе порта.

Для сборки использовались Arduino Nano, датчик HC-SR04, монтажная плата и соединительные провода. Это минимальная схема, которую можно собрать без дополнительной электроники. Датчик получает питание от Arduino, отправляет ультразвуковой импульс и ждёт отражение от предмета.

HC-SR04 часто используют как ультразвуковой датчик расстояния для Arduino.

Подключение HC-SR04 к Arduino Nano

У HC-SR04 четыре контакта: VCC, GND, Trig и Echo. Питание подключают к 5 В и GND Arduino Nano. Контакт Trig соединяют с цифровым выходом Arduino, а Echo – с цифровым входом, который измеряет длительность отражённого импульса.

Контакт HC-SR04ПодключениеНазначение
VCC5V Arduino NanoПитание датчика
GNDGND Arduino NanoОбщий провод
TrigЦифровой пин ArduinoЗапуск измерения
EchoЦифровой пин ArduinoПриём отражённого импульса

В скетче номера пинов Trig и Echo должны совпадать с реальным подключением. Если провода переставить, а код оставить прежним, датчик не начнёт измерять расстояние правильно. Перед тестом также стоит проверить, что контакты плотно вставлены в макетную плату и общий провод действительно соединён с Arduino.

HC-SR04 работает с логическим уровнем 5 В, поэтому его удобно подключать именно к Arduino Nano. Для плат с логикой 3,3 В сигнал Echo обычно требует отдельного согласования уровня, но в этой сборке оно не нужно.

После загрузки скетча остаётся открыть монитор порта. В нём Arduino выводит рассчитанное расстояние, и показания можно сравнить с рулеткой или линейкой.

Как Arduino рассчитывает расстояние

В этом тесте связка HC-SR04 Arduino Nano измеряет расстояние до предмета по времени возврата ультразвукового импульса.

Измерение начинается с короткого сигнала на контакте Trig. После этого HC-SR04 отправляет ультразвуковой импульс вперёд. Когда волна отражается от предмета и возвращается к датчику, на контакте Echo появляется импульс. Его длительность показывает, сколько времени звук был в пути.

Arduino измеряет эту длительность в микросекундах и переводит её в расстояние. Звук проходит путь до предмета и обратно, поэтому полученное расстояние делят на два.

const byte TRIG_PIN = 5; const byte ECHO_PIN = 6; float readDistanceCm() { digitalWrite(TRIG_PIN, LOW); delayMicroseconds(2); digitalWrite(TRIG_PIN, HIGH); delayMicroseconds(10); digitalWrite(TRIG_PIN, LOW); const unsigned long duration = pulseIn(ECHO_PIN, HIGH, 30000UL); if (duration == 0) { return -1.0; } return duration * 0.0343f / 2.0f; } float readMedianDistanceCm() { const byte count = 7; float values[count]; for (byte i = 0; i < count; i++) { values[i] = readDistanceCm(); delay(30); } for (byte i = 0; i < count - 1; i++) { for (byte j = i + 1; j < count; j++) { if (values[j] < values[i]) { const float temp = values[i]; values[i] = values[j]; values[j] = temp; } } } return values[count / 2]; } void setup() { Serial.begin(9600); pinMode(TRIG_PIN, OUTPUT); pinMode(ECHO_PIN, INPUT); } void loop() { const float distanceCm = readMedianDistanceCm(); if (distanceCm < 0) { Serial.println("Объект не найден"); } else { Serial.print("Расстояние: "); Serial.print(distanceCm, 1); Serial.println(" см"); } delay(100); }

Здесь 0.0343 – это приблизительная скорость звука в сантиметрах за микросекунду. Формула подходит для обычных комнатных условий, но не делает измерение абсолютно точным. На результат влияют температура воздуха, поверхность предмета, его угол относительно датчика и качество самого модуля.

Если предмет расположен прямо перед датчиком и хорошо отражает звук, HC-SR04 обычно показывает стабильный результат. Если поверхность мягкая, наклонная или слишком узкая, часть сигнала может уйти в сторону. Тогда показания становятся менее устойчивыми или датчик вовсе не получает отражение.

Результаты измерений на 20, 30 и 50 см

В тесте предмет последовательно ставили на расстоянии 20, 30 и 50 см. На всех трёх точках показания в мониторе порта были близки к реальному расстоянию. Небольшие изменения значений были заметны, но не выходили примерно за пределы одного сантиметра.

Реальное расстояниеРезультат HC-SR04Наблюдение
20 смОколо 20 смПоказания практически совпадают
30 смОколо 30 смРезультат близок к реальному расстоянию
50 смОколо 50 смЕсть небольшие колебания, но датчик остаётся пригодным для задачи

Такой результат нормален для недорогого ультразвукового датчика. HC-SR04 не предназначен для измерений, где нужна точность рулетки, штангенциркуля или промышленного датчика. Зато для определения, есть ли перед устройством препятствие и находится ли оно ближе заданного расстояния, его точности обычно достаточно.

Что влияет на точность измерения

Главная причина неточных показаний – не только сам датчик, но и условия измерения. HC-SR04 отправляет звук вперёд и ожидает отражение. Если отражение слабое, уходит в сторону или возвращается с задержкой, Arduino получает менее точный результат.

Лучше всего датчик работает с достаточно крупным твёрдым предметом, расположенным прямо перед ним. Плоская коробка, стена или лист материала обычно дают понятное отражение. Наклонная гладкая поверхность может отправить ультразвук в сторону, а мягкая ткань, поролон или рыхлый материал частично поглощают звук.

На показания также влияют:

  • угол предмета относительно датчика;
  • ширина и форма препятствия;
  • температура воздуха;
  • вибрация и плохие контакты на макетной плате;
  • слишком частые измерения без паузы между ними.

Если в проекте важна стабильность, полезно делать несколько измерений подряд и использовать среднее значение. Это помогает убрать отдельные случайные скачки, но не исправит проблему, если датчик физически плохо видит объект.

Где HC-SR04 действительно полезен

HC-SR04 хорошо подходит для проектов, где не нужно знать расстояние с высокой точностью, а важно понять положение препятствия. Например, робот может остановиться, если перед ним стена ближе 20 см. Парктроник может предупредить, что предмет находится слишком близко. Автоматическая крышка может открыться, когда человек подошёл к ней на заданное расстояние.

Датчик также используют в простых системах контроля уровня. Например, его можно установить над контейнером и приблизительно оценивать расстояние до содержимого. Но для жидкости, сыпучих материалов и объектов со сложной поверхностью результат нужно отдельно проверять: отражение ультразвука будет отличаться.

Для обычной Arduino-сборки HC-SR04 остаётся удобным первым датчиком расстояния. Он дешёвый, подключается четырьмя проводами и позволяет сразу увидеть результат в мониторе порта. Тест на 20, 30 и 50 см показывает, что при нормальной установке модуль может давать достаточно близкие показания для роботов, парктроников и обнаружения препятствий.

Товары по теме

Связанные категории

Email не публикуется и используется только для уведомления о модерации. Ссылки в комментариях запрещены. Перед размещением убедитесь, что комментарий не содержит оскорблений.

Комментарии (2)

  1. Данияр

    Почему после подключения HC-SR04 в мониторе порта Arduino IDE отображаются иероглифы?

    1. Редакция Clex.kz

      Сам датчик HC-SR04 здесь ни при чем. Иероглифы появляются, когда скорость порта в программе не совпадает со скоростью, выбранной в мониторе порта Arduino IDE. Например, если в коде указано Serial.begin(9600); то в мониторе порта тоже нужно выбрать 9600 бод. Если там установлено 115200 или другое значение, вместо нормального текста будут отображаться непонятные символы. После выбора одинаковой скорости вывод снова станет читаемым.