Общие сведения:
Ультразвуковой датчик расстояния HC-SR04 - позволяет определять расстояние до препятствий находящихся в зоне от 2 мм до 4 м.
Видео:
Спецификация:
- Входное напряжение: 5 В
- Потребляемый ток в режиме ожидания: до 2 мА
- Потребляемый ток в режиме измерений: до 15 мА
- Частота ультразвука: 40 кГц
- Измеряемая дальность: 3 … 400 см
- Точность измерения: от 0,3 см
- Угол измерения: до 15°
- Рабочая температура: -30 … 80 °С
- Габариты: 45x20x15 мм
Подключение:
- При работе с библиотекой iarduino_HC_SR04 или iarduino_HC_SR04_tmr, выводы TRIG и ECHO датчика можно подключать к любым выводам Arduino.

- При работе с библиотекой iarduino_HC_SR04_int, вывод TRIG датчика подключается к любому выводу Arduino, а вывод ECHO датчика нужно подключить только к тому выводу Arduino, который использует внешнее прерывание.

Вы можете узнать, какие выводы Вашей Arduino используют внешние прерывания, воспользовавшись скетчем описанным в разделе Wiki - определение аппаратных выводов Arduino.
Питание:
Входное напряжение 5 В постоянного тока, подаётся на выводы Vcc и GND датчика.
Подробнее о датчике:
Если подать положительный импульс на вход датчика TRIG длительностью 10 мкс, то датчик отправит звуковую волну (8 импульсов на частоте 40 кГц - ультразвук) и установит уровень логической «1» на выходе ECHO. Звуковая волна отразится от препятствия и вернётся на приёмник датчика, после чего он сбросит уровень на выходе ECHO в логический «0» (то же самое датчик сделает, если звуковая волна не вернётся в течении 38 мс.) В результате время наличия логической «1» на выходе ECHO равно времени прохождения ультразвуковой волны от датчика до препятствия и обратно. Зная скорость распространения звуковой волны в воздухе и время наличия логической «1» на выводе ECHO, можно рассчитать расстояние до препятствия.

Расстояние вычисляется умножением скорости на время (в данном случае скорости распространения звуковой волны V, на время ожидания эха Echo). Но так звуковая волна проходит расстояние от датчика до объекта и обратно, а нам нужно только до объекта, то результат делим на 2:
L = V * Echo / 2
- L – расстояние (м);
- V – скорость звука в воздухе (м/с);
- Echo – время ожидания эха (с).
Скорость звука в воздухе, в отличии от скорости света, величина не постоянная и сильно зависит от температуры:
V2 = γ R T / M
- V – скорость звука в воздухе (м/с)
- γ – показатель адиабаты воздуха (ед.) = 7/5
- R – универсальная газовая постоянная (Дж/моль*K) = 8,3144598(48)
- T – абсолютная температура воздуха (°К) = t°C + 273,15
- M – молекулярная масса воздуха (г/моль) = 28,98
Подставив в формулу известные значения γ, R, M, получим:
V ≈ 20,042 √T
- T – абсолютная температура воздуха (°К) = t°C + 273,15
Осталось объединить формулы вычисления V и L, и перевести L из м в см, Echo из с в мкс, T из °К в °C, получим:
L ≈ Echo √(t+273,15) / 1000
- L – расстояние (см)
- Echo – время ожидания эха (мкс)
- t – температура воздуха (°C)
Для работы с датчиком, нами разработаны три библиотеки: iarduino_HC_SR04, iarduino_HC_SR04_int и iarduino_HC_SR04_tmr. Синтаксис первых двух библиотек одинаков, а у третей добавлены функции begin()
и work()
. Библиотеки сами рассчитывают все значения и возвращают только расстояние в см. Температура по умолчанию установлена в 23°C, но её можно указывать. Работа с библиотеками и их функции описаны ниже.
- Преимуществом библиотеки iarduino_HC_SR04 является то, что датчики можно подключать к любым выводам Arduino, а недостаток заключается в том, что библиотека ждёт ответа от датчика, который может длиться до 38 мс.
Количество подключаемых датчиков ограничено количеством выводов Arduino. - Преимуществом библиотеки iarduino_HC_SR04_int является то, что она не ждёт ответа от датчиков (не приостанавливает выполнение скетча), но выводы ECHO датчиков нужно подключать только к тем выводам Arduino, которые используют внешние прерывания.
Количество подключаемых датчиков ограничено количеством выводов с прерыванием. - Преимуществом библиотеки iarduino_HC_SR04_tmr является то что она не ждёт ответа от датчиков и датчики можно подключать к любым выводам Arduino, но она использует второй аппаратный таймер. При работе с этой библиотекой нельзя устанавливать ШИМ на 3 или 11 выводы, нельзя подключить больше 4 датчиков и нельзя работать с библиотеками которые так же используют второй аппаратный таймер.
Подробнее про установку библиотеки читайте в нашей инструкции.
Примеры:
Определение расстояния с использованием библиотеки iarduino_HC_SR04:
#include <iarduino_HC_SR04.h> // Подключаем библиотеку для работы с датчиком. iarduino_HC_SR04 sensor(2,3); // Объявляем объект sensor, указав номера выводов arduino подключённых к выводам TRIG и ECHO датчика. // Можно использовать любые выводы Arduino. void setup(){ // Serial.begin(9600); // Инициируем работу с шиной UART на скорости 9600 бит/сек, для передачи данных в монитор последовательного порта. } // void loop(){ // delay(500); // Задержка 0,5 сек. Serial.println(sensor.distance() ); // Вывод расстояния (см) при температуре воздуха, около +23 °C. Serial.println(sensor.distance(-20)); // Вывод расстояния (см) при температуре воздуха, около -20 °C. Serial.println("=================="); // } //
Определение расстояния с использованием библиотеки iarduino_HC_SR04_int:
#include <iarduino_HC_SR04_int.h> // Подключаем библиотеку для работы с датчиком. iarduino_HC_SR04_int sensor(2,3); // Объявляем объект sensor, указав номера выводов arduino подключённых к выводам TRIG и ECHO датчика. // Вывод ECHO должен быть подключён к выводу Arduino использующему внешнее прерывание. void setup(){ // Serial.begin(9600); // Инициируем работу с шиной UART на скорости 9600 бит/сек, для передачи данных в монитор последовательного порта. } // void loop(){ // delay(500); // Задержка 0,5 сек. Serial.println(sensor.distance() ); // Вывод расстояния (см) при температуре воздуха, около +23 °C. Serial.println(sensor.distance(-20)); // Вывод расстояния (см) при температуре воздуха, около -20 °C. Serial.println("=================="); // } //
Определение расстояния с использованием библиотеки iarduino_HC_SR04_tmr:
#include <iarduino_HC_SR04_tmr.h> // Подключаем библиотеку для работы с датчиком. iarduino_HC_SR04_tmr sensor(2,3); // Объявляем объект sensor, указав номера выводов arduino подключённых к выводам TRIG и ECHO датчика. // Можно использовать любые выводы Arduino. void setup(){ // Serial.begin(9600); // Инициируем работу с шиной UART на скорости 9600 бит/сек, для передачи данных в монитор последовательного порта. sensor.begin(); // Инициируем работу с датчиком. } // void loop(){ // delay(500); // Задержка 0,5 сек. Serial.println(sensor.distance() ); // Вывод расстояния (см) при температуре воздуха, около +23 °C. Serial.println(sensor.distance(-20)); // Вывод расстояния (см) при температуре воздуха, около -20 °C. Serial.println("=================="); // } //
Результат работы трёх примеров:

Из результата работы примеров видно, что если во время измерений не учитывать температуру воздуха, то можно получить расстояния с высокой погрешностью.
Описание функций библиотек:
Библиотеки iarduino_HC_SR04 и iarduino_HC_SR04_int, имеют только одну функцию - distance()
, а iarduino_HC_SR04_tmr имеет ещё две функции - begin()
и work()
.
Подключение библиотеки iarduino_HC_SR04:
#include <iarduino_HC_SR04.h> // Подключаем библиотеку для работы с датчиком. iarduino_HC_SR04 sensor( №_ВЫВОДА_TRIG , №_ВЫВОДА_ECHO ); // Объявляем объект sensor, указав номера выводов arduino подключённых к выводам TRIG и ECHO датчика.
Подключение библиотеки iarduino_HC_SR04_int:
#include <iarduino_HC_SR04_int.h> // Подключаем библиотеку для работы с датчиком. iarduino_HC_SR04_int sensor( №_ВЫВОДА_TRIG , №_ВЫВОДА_ECHO ); // Объявляем объект sensor, указав номера выводов arduino подключённых к выводам TRIG и ECHO датчика.
Подключение библиотеки iarduino_HC_SR04_tmr:
#include <iarduino_HC_SR04_tmr.h> // Подключаем библиотеку для работы с датчиком. iarduino_HC_SR04_tmr sensor( №_ВЫВОДА_TRIG , №_ВЫВОДА_ECHO ); // Объявляем объект sensor, указав номера выводов arduino подключённых к выводам TRIG и ECHO датчика.
Функция distance():
- Назначение: Возвращает расстояние до препятствия в см.
- Синтаксис: distance( [ ТЕМПЕРАТУРА ] );
- Параметр: int8_t ТЕМПЕРАТУРА - необязательный параметр, целое число, от -128 до +127 °C, по умолчанию +23 °C.
- Возвращаемые значения: long расстояние в см.
- Примечание:
- В библиотеке iarduino_HC_SR04 функция запускает вычисление расстояния и ждёт их завершение, что может занять до 38 мс.
- В библиотеке iarduino_HC_SR04_int функция запускает вычисление расстояния и не дожидаясь его завершения, возвращает предыдущее рассчитанное расстояние. Расчёт осуществляется по прерыванию вывода ECHO.
- В библиотеке iarduino_HC_SR04_tmr функция просто возвращает последнее рассчитанное расстояние. Датчик постоянно опрашивается таймером в процессе выполнения основного скетча.
- Пример:
long A = sensor.distance(); // Присваиваем переменной A расстояние до препятствия при температуре воздуха по умолчанию +23 °C. long B = sensor.distance(70); // Присваиваем переменной B расстояние до препятствия при температуре воздуха +70 °C.
Функция begin():
- Назначение: Инициализация датчика библиотекой iarduino_HC_SR04_tmr.
- Синтаксис: begin( [ ПЕРИОД ОПРОСА ] );
- Параметр: uint16_t ПЕРИОД ОПРОСА - необязательный параметр, целое число, от 50 до 3000 мс, по умолчанию 50 мс. В библиотеке iarduino_HC_SR04_tmr, датчик постоянно опрашивается в фоновом режиме, а период опроса указывает библиотеке, как часто это надо делать.
- Возвращаемые значения: Нет.
- Примечание:
- Функция присутствует только в библиотеке iarduino_HC_SR04_tmr.
- Функцию достаточно однократно вызвать в коде setup(), до обращения к любым другим функциям библиотеки iarduino_HC_SR04_tmr.
- Пример:
sensor.begin(); // Инициируем работу с датчиком. Период опроса датчика в фоновом режиме, по умолчанию равен 50 мс. sensor.begin(1000); // Инициируем работу с датчиком, указав что его необходимо опрашивать в фоновом режиме 1 раз в 1000 мс.
Функция work():
- Назначение: Включает и отключает опрос датчика.
- Синтаксис: work( [ ФЛАГ ] );
- Параметр: bool ФЛАГ указывающий разрешить опрос датчика (true / false).
- Возвращаемые значения: Нет.
- Примечание:
- Функция присутствует только в библиотеке iarduino_HC_SR04_tmr.
- В библиотеке iarduino_HC_SR04_tmr датчик опрашивается в фоновом режиме. Обращение к функции с параметром false остановит опрос датчика, а обращение к функции с параметром true возобновит опрос датчика.
- Если установить несколько датчиков рядом, то звуковая волна отправленная одним датчиком может быть принята другим датчиком и исказить его показания. Функция work() позволяет опрашивать несколько датчиков поочереди, предотвратив пересечение их звуковых волн.
- Отключение опроса датчика не стирает его последнее рассчитанное расстояние.
- Пример:
bool i = millis()%100<50; // Определяем переменную i которая будет менять своё значение (true/false) каждые 50 миллисекунд. sensor1.work( i ); // 1 датчик будет работать при i = true и отключаться при i = false. sensor2.work( !i ); // 2 датчик будет работать при i = false и отключаться при i = true. long A = sensor1.distance(); // Присваиваем переменной A расстояние до препятствия 1 датчика. long B = sensor2.distance(); // Присваиваем переменной B расстояние до препятствия 2 датчика.
Усреднение показаний:
Переменная averaging типа long
является коэффициентом усреднения выводимых показаний. Эта переменная присутствует во всех трёх библиотеках.
Данной переменной можно присвоить положительное целое число: 0-без усреднений - значение по умолчанию, 1-слабое усреднение, ..., 10-нормальное усреднение, ..., 100-сильное усреднение, ..., 1000-чрезмерное усреднение, ...
При снятии показаний без усреднений (по умолчанию) мы можем получать «прыгающие» значения. Например, на дистанции в 2 метра до препятствия, показания могут колебаться от 198 до 202 (это может быть причиной многих факторов: геометрия отражающей поверхности, колебания температуры и состава воздуха, колебания питания датчика, посторонние шумы и многое другое). Для устранения этих факторов можно однократно указать коэффициент усреднения, чем выше его значение, тем плавнее будут меняться данные возвращаемые функцией distance().
// Подключаем одну из трех библиотек. // // void setup(){ // Serial.begin(9600); // Инициируем работу с шиной UART на скорости 9600 бит/сек, для передачи данных в монитор последовательного порта. sensor.averaging=15; // Указываем коэффициент усреднения равный 15. } // Коэффициент подбирается экспериментально, в зависимости от условий эксплуатации датчика. void loop(){ // delay(500); // Задержка 0,5 сек. Serial.println(sensor.distance() ); // Вывод усреднённого расстояния (см) при температуре воздуха, около +23 °C. Serial.println("=================="); // } //
Применение:
- Подвижные механизмы не требующие участие оператора.
- Системы сигнализаций, где невозможно использовать ИК-датчики.
Ссылки:
- Ультразвуковой датчик расстояния HC-SR04
- Библиотека iarduino_HC_SR04, вычисляет данные в режиме реального времени.
- Библиотека iarduino_HC_SR04_int, вычисляет данные по внешнему прерыванию.
- Библиотека iarduino_HC_SR04_tmr, вычисляет данные в фоновом режиме, по 2 таймеру.
- Wiki - Установка библиотек в Arduino IDE.
Обсуждение