Работа с дальномером ардуино

Ультразвуковой дальномер HC-SR04: подключение, схема и примеры работы

Ультразвуковой дальномер рассчитан на определение расстояния до объектов в радиусе четырёх метров.

Работа модуля основана на принципе эхолокации. Модуль посылает ультразвуковой сигнал и принимает его отражение от объекта. Измерив время между отправкой и получением импульса, не сложно вычислить расстояние до препятствия.

Подключение ультразвукового дальномера к Arduino

Модуль подключается четырьмя проводами. Контакты VCC и GND служат для подключения питания, а Trig и Echo — для отправки и приема сигналов дальномера. Подключим их к пинам 10 и 11 соответственно.

Напряжение питания дальномера 5 В. Модуль работает и с платами, напряжение которых 3,3 В — в этом случае подключайте его к пинам группы с P8 по P13. Установите джампер выбора питания V2 на Troyka Shield в положение V2+5V. Пин микроконтроллера, соединённый с пином Echo должен быть толерантен к 5 В. Приведённая схема подходит для подключения дальномера к Iskra JS.

Пример работы

Рассмотрим как работает дальномер.

Зная продолжительность высокого сигнала на пине Echo можем вычислить расстояние, умножив время, которое потратил звуковой импульс, прежде чем вернулся к модулю, на скорость распространения звука в воздухе (340 м/с).

Функция pulseIn позволяет узнать длительность импульса в μs . Запишем результат работы этой функции в переменную duration.

Теперь вычислим расстояние переведя скорость из м/с в см/мкс:

distance = duration * 340 м/с = duration * 0.034 м/мкс

Преобразуем десятичную дробь в обыкновенную

distance = duration * 1/29 = duration / 29

Принимая во внимание то, что звук преодолел расстояние до объекта и обратно, поделим полученный результат на 2

distance = duration / 58

Оформим в код всё вышесказанное и выведем результат в Serial Monitor

Работа с библиотекой

Количество строк кода можно существенно уменьшить, используя библиотеку для работы с дальномером.

Источник

Arduino и датчик расстояния HC-SR04

Описание

HC-SR04 – ультразвуковой датчик расстояния. Характеристики:

  • Питание: 5V
  • Рабочий ток: 15 мА
  • Звуковая частота: 40 кГц
  • Угол измерения: 15 градусов
  • Диапазон измерения: 2 см.. 4 м
  • Точность:

1 мм при грамотной фильтрации

Датчик работает довольно интересно: подаём импульс с продолжительностью 10 мкс на пин Trig, модуль посылает ультразвуковой импульс, он отражается от препятствия и детектируется. Затем с пина Echo возвращается импульс по продолжительности соответствующий времени путешествия звуковой волны. Ардуина этот импульс должна измерить.

Подключение

Подключаем к питанию и любым цифровым пинам:

Библиотеки

С датчиком можно работать без библиотек, стандартными средствами Arduino. Но есть и библиотеки:

  • HC-SR04 – можно установить по названию HC-SR04 из менеджера библиотек (автор Dirk Sarodnick)
  • NewPing – можно установить по названию NewPing из менеджера библиотек

Примеры

Небольшой момент: чтобы датчик не ловил “эхо” от самого себя – его не рекомендуется опрашивать чаще 30 мс!

Для опроса используем встроенные Arduino-функции

Подвигаю рукой перед датчиком:

Отфильтруем данные при помощи простейшего экспоненциального фильтра

Данная библиотека умеет выдавать результат только в целых сантиметрах

Кстати, опрос датчика при помощи pulseIn() , не так плох, как про него пишут на форумах: погрешность измерения составляет всего 0.5 мкс:

что в пересчёте на расстояние даёт точность 0.17 мм! На деле точность получается в два раза выше, так как фактически мы измеряем сигнал два раза (путь до препятствия и обратно). Сам датчик шумит гораздо сильнее, поэтому миллиметровую точность получить абсолютно не проблема. Но есть проблема в другом: выполнение кода блокируется на время измерения, например на трёх метрах это будет 17 мс. Вроде и немного, но для некоторых задач это будет весьма критично.

Ещё один момент: скорость звука зависит от температуры: при +20°С это 343 м/с, а при -20°С – 318 м/с! А ведь это целых 318/343=7%, что на расстоянии в 1 метр даст погрешность 7 сантиметров. Много, гораздо больше возможных погрешностей в измерении. Давайте это исправим.

В диапазоне -50.. 50°С зависимость является линейной и аппроксимируется уравнением V = 0.609 * t + 330.75 :

Таким образом для нахождения более точного расстояния с поправкой на температуру достаточно делить время импульса не на 58, а на.. кстати, откуда берётся 58? Для прохождения 1 м звуку понадобится 1 / 343 = 0.0029 с, или 2.915 мс. Мы получаем время туда и обратно, поэтому умножаем ещё на 2. В и для сантиметров – ещё на 10, и получаем 58.3. Гораздо понятнее было бы умножать время импульса на скорость звука и делить пополам.

Таким образом для расчёта расстояния в миллиметрах с учётом температуры в °С получим формулу:

Настолько высокая точность нам не нужна, поэтому можно избавиться от float , чтобы код весил меньше (третье уравнение). Погрешность составит не более 1 мм на 1 метр. И финальный пример тогда (подставим в первую программу):

Источник

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

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

Ультразвуковой датчик расстояния 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 – время ожидания эха (с).

Скорость звука в воздухе, в отличии от скорости света, величина не постоянная и сильно зависит от температуры:

V 2 = γ 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:

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

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

Результат работы трёх примеров:

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

Описание функций библиотек:

Библиотеки iarduino_HC_SR04 и iarduino_HC_SR04_int, имеют только одну функцию — distance() , а iarduino_HC_SR04_tmr имеет ещё две функции — begin() и work() .

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

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

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

Функция distance():

  • Назначение: Возвращает расстояние до препятствия в см.
  • Синтаксис: distance( [ ТЕМПЕРАТУРА ] );
  • Параметр: int8_t ТЕМПЕРАТУРА — необязательный параметр, целое число, от -128 до +127 °C, по умолчанию +23 °C.
  • Возвращаемые значения: long расстояние в см.
  • Примечание:
    • В библиотеке iarduino_HC_SR04 функция запускает вычисление расстояния и ждёт их завершение, что может занять до 38 мс.
    • В библиотеке iarduino_HC_SR04_int функция запускает вычисление расстояния и не дожидаясь его завершения, возвращает предыдущее рассчитанное расстояние. Расчёт осуществляется по прерыванию вывода ECHO.
    • В библиотеке iarduino_HC_SR04_tmr функция просто возвращает последнее рассчитанное расстояние. Датчик постоянно опрашивается таймером в процессе выполнения основного скетча.
  • Пример:

Функция begin():

  • Назначение: Инициализация датчика библиотекой iarduino_HC_SR04_tmr.
  • Синтаксис: begin( [ ПЕРИОД ОПРОСА ] );
  • Параметр: uint16_t ПЕРИОД ОПРОСА — необязательный параметр, целое число, от 50 до 3000 мс, по умолчанию 50 мс. В библиотеке iarduino_HC_SR04_tmr, датчик постоянно опрашивается в фоновом режиме, а период опроса указывает библиотеке, как часто это надо делать.
  • Возвращаемые значения: Нет.
  • Примечание:
    • Функция присутствует только в библиотеке iarduino_HC_SR04_tmr.
    • Функцию достаточно однократно вызвать в коде setup(), до обращения к любым другим функциям библиотеки iarduino_HC_SR04_tmr.
  • Пример:

Функция work():

  • Назначение: Включает и отключает опрос датчика.
  • Синтаксис: work( [ ФЛАГ ] );
  • Параметр: bool ФЛАГ указывающий разрешить опрос датчика (true / false).
  • Возвращаемые значения: Нет.
  • Примечание:
    • Функция присутствует только в библиотеке iarduino_HC_SR04_tmr.
    • В библиотеке iarduino_HC_SR04_tmr датчик опрашивается в фоновом режиме. Обращение к функции с параметром false остановит опрос датчика, а обращение к функции с параметром true возобновит опрос датчика.
    • Если установить несколько датчиков рядом, то звуковая волна отправленная одним датчиком может быть принята другим датчиком и исказить его показания. Функция work() позволяет опрашивать несколько датчиков поочереди, предотвратив пересечение их звуковых волн.
    • Отключение опроса датчика не стирает его последнее рассчитанное расстояние.
  • Пример:

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

Переменная averaging типа long является коэффициентом усреднения выводимых показаний. Эта переменная присутствует во всех трёх библиотеках.

Данной переменной можно присвоить положительное целое число: 0-без усреднений — значение по умолчанию, 1-слабое усреднение, . 10-нормальное усреднение, . 100-сильное усреднение, . 1000-чрезмерное усреднение, .

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

Источник

Adblock
detector