- Arduino и датчик расстояния HC-SR04
- Описание
- Подключение
- Библиотеки
- Примеры
- Ультразвуковой датчик расстояния Ардуино HC-SR04
- Датчик расстояния в проектах Arduino
- Описание датчика HC SR04
- Где купить модуль SR04 для Ардуино
- Схема взаимодействия с Arduino
- Подключение HC SR04 к Arduino
- Библиотека для работы с HC SR04
- Точность измерения расстояния датчиком HC SR04
- Примеры использования датчика расстояния
- Подключение датчика к ардуино
- Пример скетча
- Скетч с использованием библиотеки NewPing
- Пример подключения ультразвукового дальномера HC SR04 с одним пином
- Краткие выводы
- Ультразвуковой датчик измерения расстояния HC-SR04
- Общие сведения:
- Видео:
- Спецификация:
- Подключение:
- Питание:
- Подробнее о датчике:
- Примеры:
- Определение расстояния с использованием библиотеки iarduino_HC_SR04:
- Определение расстояния с использованием библиотеки iarduino_HC_SR04_int:
- Определение расстояния с использованием библиотеки iarduino_HC_SR04_tmr:
- Результат работы трёх примеров:
- Описание функций библиотек:
- Подключение библиотеки iarduino_HC_SR04:
- Подключение библиотеки iarduino_HC_SR04_int:
- Подключение библиотеки iarduino_HC_SR04_tmr:
- Функция distance():
- Функция begin():
- Функция work():
- Усреднение показаний:
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. В этой статье мы познакомимся с принципом действия датчика расстояния, рассмотрим несколько вариантов подключения к платам Arduino, схему взаимодействия и примеры скетчей.
Датчик расстояния в проектах Arduino
Способность ультразвукового датчика определять расстояние до объекта основано на принципе сонара – посылая пучок ультразвука, и получая его отражение с задержкой, устройство определяет наличие объектов и расстояние до них. Ультразвуковые сигналы, генерируемые приемником, отражаясь от препятствия, возвращаются к нему через определенный промежуток времени. Именно этот временной интервал становится характеристикой помогающей определить расстояние до объекта.
Описание датчика HC SR04
Датчик расстояния Ардуино является прибором бесконтактного типа, и обеспечивает высокоточное измерение и стабильность. Диапазон дальности его измерения составляет от 2 до 400 см. На его работу не оказывает существенного воздействия электромагнитные излучения и солнечная энергия. В комплект модуля с HC SR04 arduino также входят ресивер и трансмиттер.
Ультразвуковой дальномер HC SR04 имеет такие технические параметры:
- Питающее напряжение 5В;
- Рабочий параметр силы т ока – 15 мА;
- Сила тока в пассивном состоянии -6 с.
Датчик оснащен четырьмя выводами (стандарт 2, 54 мм):
- Контакт питания положительного типа – +5В;
- Trig (Т) – выход сигнала входа;
- Echo (R) – вывод сигнала выхода;
- GND – вывод «Земля».
Где купить модуль SR04 для Ардуино
Датчик расстояния – достаточно распространенный компонент и его без труда можно найти в интернет-магазинах. Самые дешевые варианты (от 40-60 рублей за штуку), традиционно на всем известном сайте.
Схема взаимодействия с Arduino
Для получения данных, необходимо выполнить такую последовательность действий:
- Подать на выход Trig импульс длительностью 10 микросек;
- В ультразвуковом дальномере hc sr04 подключенном к arduino произойдет преобразование сигнала в 8 импульсов с частотой 40 кГц, которые через излучатель будут посланы вперед;
- Когда импульсы дойдут до препятствия, они отразятся от него и будут приняты приемником R, что обеспечит наличие входного сигнала на выходе Echo;
- На стороне контроллера полученный сигнал при помощи формул следует перевести в расстояние.
При делении ширины импульса на 58.2, получим данные в сантиметрах, при делении на 148 – в дюймах.
Подключение HC SR04 к Arduino
Выполнить подключение ультразвукового датчика расстояния к плате Arduino достаточно просто. Схема подключения показана на рисунке.
Контакт земли подключаем к выводу GND на плате Arduino, выход питания соединяем с 5V. Выходы Trig и Echo подсоединяем к arduino на цифровые пины. Вариант подключения с помощью макетной платы:
Библиотека для работы с HC SR04
Для облегчения работы с датчиком расстояния HC SR04 на arduino можно использовать библиотеку NewPing. Она не имеет проблем с пинговыми доступами и добавляет некоторые новые функции.
К особенностям библиотеки можно отнести:
- Возможность работы с различными ультразвуковыми датчиками;
- Может работать с датчиком расстояния всего через один пин;
- Отсутствие отставания на 1 секунду при отсутствии пинга эха;
- Для простой коррекции ошибок есть встроенный цифровой фильтр;
- Максимально точный расчет расстояния.
Скачать бибилотеку NewPing можно здесь
Точность измерения расстояния датчиком HC SR04
Точность датчика зависит от нескольких факторов:
- температуры и влажности воздуха;
- расстояния до объекта;
- расположения относительно датчика (согласно диаграммы излучения);
- качества исполнения элементов модуля датчика.
В основу принципа действия любого ультразвукового датчика заложено явление отражения акустических волн, распространяющихся в воздухе. Но как известно из курса физики, скорость распространения звука в воздухе зависит от свойств этого самого воздуха (в первую очередь от температуры). Датчик же, испуская волны и замеряя время до их возврата, не догадывается, в какой именно среде они будут распространяться и берет для расчетов некоторую среднюю величину. В реальных условиях из-за фактора температуры воздуха HC-SR04 может ошибаться от 1 до 3-5 см.
Фактор расстояния до объекта важен, т.к. растет вероятность отражения от соседних предметов, к тому же и сам сигнал затухает с расстоянием.
Также для повышения точности надо правильно направить датчик: сделать так, чтобы предмет был в рамках конуса диаграммы направленности. Проще говоря, “глазки” HC-SR04 должны смотреть прямо на предмет.
Для уменьшения ошибок и погрешности измерений обычно выполняются следующие действия:
- усредняются значения (несколько раз замеряем, убираем всплески, потом находим среднее);
- с помощью датчиков (например, DHT11 или DHT22) определяется температура и вносятся поправочные коэффициенты;
- датчик устанавливается на серводвигатель, с помощью которого мы “поворачиваем голову”, перемещая диаграмму направленности влево или вправо.
Примеры использования датчика расстояния
Давайте рассмотрим пример простого проекта с платой Arduino Uno и датчиком расстояния HC SR04. В скетче мы будем получать значение расстояния до предметов и выводить их в монитор порта в среде Arduino IDE. Вы сможете легко изменить скетч и схему подключения, чтобы датчик сигнализировал о приближении или отдалении предмета.
Подключение датчика к ардуино
При написании скетча использовалась следующий вариант распиновки подключения датчика:
- VCC: +5V
- Trig – 12 пин
- Echo – 11 пин
- Земля (GND) – Земля (GND)
Пример скетча
Начнем работу с датчиком сразу с относительного сложного варианта – без использования внешних библиотек.
В данном скетче мы выполняем такую последовательность действий:
- Коротким импульсом (2-5 микросекунды) переводим датчик расстояния в режим эхолокации, при котором в окружающее пространство высылаются ультразвуковые волны с частотой 40 КГц.
- Ждем, пока датчик проанализирует отраженные сигналы и по задержке определит расстояние.
- Получаем значение расстояния. Для этого ждем, пока HC SR04 выдаст на входе ECHO импульс, пропорциональный расстоянию. Мы определяем длительность импульса с помощью функции pulseIn, которая вернет нам время, прошедшее до изменения уровня сигнала (в нашем случае, до появления обратного фронта импульса).
- Получив время, мы переводим его в расстояние в сантиметрах путем деления значения на константу (для датчика SR04 это 29.1 для сигнала «туда», столько же для сигнала «обратно», что в сумме даст 58.2).
Если датчик расстояния не выполняет считывание сигнала, то преобразование выходного сигнала никогда не примет значения короткого импульса – LOW. Так как у некоторых датчиков время задержки варьируется в зависимости от производителя, рекомендуется при использовании указанных скетчей выставлять его значение вручную (мы это делаем в начале цикла).
Если расстояние составляет более 3 метров, при котором HC SR04 начинает плохо работать, время задержки лучше выставлять более 20 мс, т.е. 25 или 30 мс.
Скетч с использованием библиотеки NewPing
Теперь давайте рассмотрим вариант скетча с использованием библиотеки NewPing. Код существенно упростится, т.к. все описанные ранее действия спрятаны внутри библиотеки. Все, что нам нужно сделать – создать объект класса NewPing, указав пины, с помощью которых мы подключаем датчик расстояния и использовать методы объекта. В нашем примере для получения расстояния в сантиметрах нужно использовать ping_cm().
Пример подключения ультразвукового дальномера HC SR04 с одним пином
Подключение HC-SR04 к Arduino может быть выполнено посредством использования одного пина. Такой вариант пригодится, если вы работаете с большим проектом и вам не хватает свободных пинов. Для подключения вам нужно просто установить между контактами TRIGи ECHO резистор номиналом 2.2K и подключить к ардуино контакт TRIG.
Краткие выводы
Ультразвуковые датчики расстояния достаточно универсальны и точны, что позволяет их использовать для большинства любительских проектов. В статье рассмотрен крайне популярный датчик HC SR04, который легко подключается к плате ардуино (для этого следует сразу предусмотреть два свободных пина, но есть вариант подключения и с одним пином). Для работы с датчиком существуют несколько бесплатных библиотек (в статье рассмотрена лишь одна из них, NewPing), но можно обойтись и без них – алгоритм взаимодействия с внутренним контроллером датчика достаточно прост, мы показали его в этой статье.
Исходя из собственного опыта, можно утверждать, что датчик HC-SR04 показывает точность в пределах одного сантиметра на расстояниях от 10 см до 2 м. На более коротких и дальних дистанциях возможно появление сильных помех, что сильно зависит от окружающих предметов и способа использования. Но в большинстве случаев HC-SR04 отлично справлялся со своей работой.
Источник
Ультразвуковой датчик измерения расстояния 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().
Источник