Ультразвуковой датчик измерения расстояния HC-SR04

Общие сведения:

Ультразвуковой датчик расстояния HC-SR04 - позволяет определять расстояние до препятствий находящихся в зоне от 2 мм до 4 м.

Видео:

Спецификация:

  • Входное напряжение: 5 В
  • Потребляемый ток в режиме ожидания: до 2 мА
  • Потребляемый ток в режиме измерений: до 15 мА
  • Частота ультразвука: 40 кГц
  • Измеряемая дальность: 3 … 400 см
  • Точность измерения: от 0,3 см
  • Угол измерения: до 15°
  • Рабочая температура: -30 … 80 °С
  • Габариты: 45x20x15 мм

Подключение:

  • При работе с библиотекой iarduino_HC_SR04, выводы 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, можно рассчитать расстояние до препятствия. 

Принцип действия ультразвукового датчика расстояния HC-SR04

Расстояние вычисляется умножением скорости на время (в данном случае скорости распространения звуковой волны 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

Подставив в формулу известные значения γRM, получим:

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, синтаксис обеих библиотек одинаков. Они сами рассчитывают все значения и возвращают только расстояние в см. Температура по умолчанию установлена в 23°C, но её можно указывать. Работа с библиотеками и их функции описаны ниже.

Для работы с датчиком, нами разработаны две библиотеки iarduino_HC_SR04 и iarduino_HC_SR04_int, синтаксис обеих библиотек одинаков.

  • Преимуществом библиотеки iarduino_HC_SR04 является то, что датчики можно подключать к любым выводам Arduino, а недостаток заключается в том, что библиотека ждёт ответа от датчика, который может длиться до 38 мс.
  • Преимуществом библиотеки iarduino_HC_SR04_int является то, что она не ждёт ответа от датчиков (не приостанавливает выполнение скетча), но выводы ECHO датчиков нужно подключать только к тем выводам Arduino, которые используют внешние прерывания.

Подробнее про установку библиотеки читайте в нашей инструкции.

Примеры:

Определение расстояния с использованием библиотеки iarduino_HC_SR04:

#include <iarduino_HC_SR04.h>           // Подключаем библиотеку
iarduino_HC_SR04 sensor(2,3);           // Объявляем объект sensor, указывая номера arduino подключенные к выводам TRIG и ECHO датчика
                                        // Можно использовать любые выводы Arduino
void setup(){
  Serial.begin(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);                   // Инициализация передачи данных в монитор последовательного порта
}
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:

#include <iarduino_HC_SR04.h>                                 // Подключаем библиотеку
iarduino_HC_SR04     sensor( №_ВЫВОДА_TRIG , №_ВЫВОДА_ECHO ); // Создаём объект sensor с указанием выводов TRIG и ECHO датчика.

Подключение библиотеки iarduino_HC_SR04_int:

#include <iarduino_HC_SR04_int.h>                             // Подключаем библиотеку
iarduino_HC_SR04_int sensor( №_ВЫВОДА_TRIG , №_ВЫВОДА_ECHO ); // Создаём объект sensor с указанием выводов TRIG и ECHO датчика.

Функция distance():

  • Назначение: Возвращает расстояние до препятствия в см
  • Синтаксис: distance( [ ТЕМПЕРАТУРА ] )
  • Параметры: ТЕМПЕРАТУРА - необязательный параметр, целое число, от -128 °C до +127 °C, по умолчанию +23 °C
  • Возвращаемые значения: long расстояние в см
  • Пример:
long A = sensor.distance();   // Присваиваем переменной A расстояние до препятствия при температуре воздуха по умолчанию +23 °C.
long B = sensor.distance(70); // Присваиваем переменной B расстояние до препятствия при температуре воздуха +70 °C.

Усреднение показаний:

Переменная averaging типа long является коэффициентом усреднения выводимых показаний.
Данной переменной можно присвоить положительное целое число (0-без усреднений - значение по умолчанию, 1-слабое усреднение, ..., 10-нормальное усреднение, ..., 100-сильное усреднение, ..., 1000-чрезмерное усреднение, ...).

При снятии показаний без усреднений (по умолчанию) мы можем получать «прыгающие» значения. Например, на дистанции в 2 метра до препятствия, показания могут колебаться от 198 до 202 (это может быть причиной многих факторов: геометрия отражающей поверхности, колебания температуры и состава воздуха, колебания питания датчика, посторонние шумы и многое другое). Для устранения этих факторов можно однократно указать коэффициент усреднения, чем выше его значение, тем плавнее будут меняться данные возвращаемые функцией distance().

#include <iarduino_HC_SR04_int.h>       // Подключаем библиотеку
iarduino_HC_SR04_int sensor(2,3);       // Объявляем объект sensor, указывая номера arduino подключенные к выводам TRIG и ECHO датчика
void setup(){
  Serial.begin(9600);                   // Инициализация передачи данных в монитор последовательного порта
  sensor.averaging=15;                  // Указываем коэффициент усреднения равный 15
}                                       // Коэффициент подбирается экспериментально, в зависимости от условий эксплуатации датчика
void loop(){
  delay(500);                           // Задержка 0,5 сек
  Serial.println(sensor.distance()   ); // Вывод усреднённого расстояния (см) при температуре воздуха, около +23 °C
  Serial.println("==================");
}

Применение:

  • Подвижные механизмы не требующие участие оператора.
  • Системы сигнализаций, где невозможно использовать ИК-датчики.

Ссылки:

Обсуждение