КОРЗИНА
магазина
8 (499) 500-14-56 | ПН. - ПТ. 12:00-18:00
ЛЕСНОРЯДСКИЙ ПЕРЕУЛОК, 18С2, БЦ "ДМ-ПРЕСС"

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

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

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

Видео:

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

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

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

  • При работе с библиотекой 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

Подставив в формулу известные значения γ, 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("=================="); //
}                                       //

Применение:

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

Ссылки:




Обсуждение

Гарантии и возврат Используя сайт Вы соглашаетесь с условями