Как сделать ультразвуковой дальномер на ардуино и жк дисплея

Обновлено: 06.07.2024

Ультразвуковые датчики расстояния Ардуино очень востребованы в робототехнических проектах из-за своей относительной простоты, достаточной точности и доступности. Они могут быть использованы как приборы, помогающие объезжать препятствия, получать размеры предметов, моделировать карту помещения и сигнализировать о приближении или удалении объектов. Одним из распространенных вариантов такого устройства является датчик расстояния, в конструкцию которого входит ультразвуковой дальномер HC SR04. В этой статье мы познакомимся с принципом действия датчика расстояния, рассмотрим несколько вариантов подключения к платам Arduino, схему взаимодействия и примеры скетчей.

Датчик расстояния в проектах Arduino

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

Внимание! Так как в основу принципа действия положен ультразвук, то такой датчик не подходит для определения расстояния до звукопоглощающих объектов. Оптимальными для измерения являются предметы с ровной гладкой поверхностью.

Описание датчика HC SR04

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

Датчик расстояния Ардуино является прибором бесконтактного типа, и обеспечивает высокоточное измерение и стабильность. Диапазон дальности его измерения составляет от 2 до 400 см. На его работу не оказывает существенного воздействия электромагнитные излучения и солнечная энергия. В комплект модуля с HC SR04 arduino также входят ресивер и трансмиттер.

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

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

Датчик оснащен четырьмя выводами (стандарт 2, 54 мм):

Где купить модуль SR04 для Ардуино

Схема взаимодействия с Arduino

Для получения данных, необходимо выполнить такую последовательность действий:

  • Подать на выход Trig импульс длительностью 10 микросек;
  • В ультразвуковом дальномере hc sr04 подключенном к arduino произойдет преобразование сигнала в 8 импульсов с частотой 40 кГц, которые через излучатель будут посланы вперед;
  • Когда импульсы дойдут до препятствия, они отразятся от него и будут приняты приемником R, что обеспечит наличие входного сигнала на выходе Echo;
  • На стороне контроллера полученный сигнал при помощи формул следует перевести в расстояние.

При делении ширины импульса на 58.2, получим данные в сантиметрах, при делении на 148 – в дюймах.

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

Подключение HC SR04 к Arduino

Выполнить подключение ультразвукового датчика расстояния к плате Arduino достаточно просто. Схема подключения показана на рисунке.

Подключение датчика расстояния HC-SR04

Контакт земли подключаем к выводу GND на плате Arduino, выход питания соединяем с 5V. Выходы Trig и Echo подсоединяем к arduino на цифровые пины. Вариант подключения с помощью макетной платы:

Подключение датчика HC-SR04 к плате ардуино

Библиотека для работы с HC SR04

Для облегчения работы с датчиком расстояния HC SR04 на arduino можно использовать библиотеку NewPing. Она не имеет проблем с пинговыми доступами и добавляет некоторые новые функции.

К особенностям библиотеки можно отнести:

  • Возможность работы с различными ультразвуковыми датчиками;
  • Может работать с датчиком расстояния всего через один пин;
  • Отсутствие отставания на 1 секунду при отсутствии пинга эха;
  • Для простой коррекции ошибок есть встроенный цифровой фильтр;
  • Максимально точный расчет расстояния.

Точность измерения расстояния датчиком HC SR04

Точность датчика зависит от нескольких факторов:

  • температуры и влажности воздуха;
  • расстояния до объекта;
  • расположения относительно датчика (согласно диаграммы излучения);
  • качества исполнения элементов модуля датчика.

В основу принципа действия любого ультразвукового датчика заложено явление отражения акустических волн, распространяющихся в воздухе. Но как известно из курса физики, скорость распространения звука в воздухе зависит от свойств этого самого воздуха (в первую очередь от температуры). Датчик же, испуская волны и замеряя время до их возврата, не догадывается, в какой именно среде они будут распространяться и берет для расчетов некоторую среднюю величину. В реальных условиях из-за фактора температуры воздуха HC-SR04 может ошибаться от 1 до 3-5 см.

Фактор расстояния до объекта важен, т.к. растет вероятность отражения от соседних предметов, к тому же и сам сигнал затухает с расстоянием.

Для уменьшения ошибок и погрешности измерений обычно выполняются следующие действия:

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

Давайте рассмотрим пример простого проекта с платой Arduino Uno и датчиком расстояния HC SR04. В скетче мы будем получать значение расстояния до предметов и выводить их в монитор порта в среде Arduino IDE. Вы сможете легко изменить скетч и схему подключения, чтобы датчик сигнализировал о приближении или отдалении предмета.

Подключение датчика к ардуино

При написании скетча использовалась следующий вариант распиновки подключения датчика:

Пример скетча

Начнем работу с датчиком сразу с относительного сложного варианта – без использования внешних библиотек.

В данном скетче мы выполняем такую последовательность действий:

  • Коротким импульсом (2-5 микросекунды) переводим датчик расстояния в режим эхолокации, при котором в окружающее пространство высылаются ультразвуковые волны с частотой 40 КГц.
  • Ждем, пока датчик проанализирует отраженные сигналы и по задержке определит расстояние.
  • Получаем значение расстояния. Для этого ждем, пока HC SR04 выдаст на входе ECHO импульс, пропорциональный расстоянию. Мы определяем длительность импульса с помощью функции pulseIn, которая вернет нам время, прошедшее до изменения уровня сигнала (в нашем случае, до появления обратного фронта импульса).
  • Получив время, мы переводим его в расстояние в сантиметрах путем деления значения на константу (для датчика SR04 это 29.1 для сигнала «туда», столько же для сигнала «обратно», что в сумме даст 58.2).

Если датчик расстояния не выполняет считывание сигнала, то преобразование выходного сигнала никогда не примет значения короткого импульса – LOW. Так как у некоторых датчиков время задержки варьируется в зависимости от производителя, рекомендуется при использовании указанных скетчей выставлять его значение вручную (мы это делаем в начале цикла).

Если расстояние составляет более 3 метров, при котором HC SR04 начинает плохо работать, время задержки лучше выставлять более 20 мс, т.е. 25 или 30 мс.

Скетч с использованием библиотеки NewPing

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

Подключение HC-SR04 к Arduino может быть выполнено посредством использования одного пина. Такой вариант пригодится, если вы работаете с большим проектом и вам не хватает свободных пинов. Для подключения вам нужно просто установить между контактами TRIGи ECHO резистор номиналом 2.2K и подключить к ардуино контакт TRIG.

Краткие выводы

Исходя из собственного опыта, можно утверждать, что датчик HC-SR04 показывает точность в пределах одного сантиметра на расстояниях от 10 см до 2 м. На более коротких и дальних дистанциях возможно появление сильных помех, что сильно зависит от окружающих предметов и способа использования. Но в большинстве случаев HC-SR04 отлично справлялся со своей работой.

DSC00603_

Принцип действия

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

HC-SR04_polar_pattern

Как видно на диаграмме, угол обзора самого простого УЗ дальномера составляет примерно 50-60 градусов. Для типичного варианта использования, когда датчик детектирует препятствия перед собой, такой угол обзора вполне пригоден. Ультразвук сможет обнаружить даже ножку стула, тогда как лазерный дальномер, к примеру, может её не заметить.

Если же мы решим сканировать окружающее пространство, вращая дальномер по кругу как радар, УЗ дальномер даст нам очень неточную и шумную картину. Для таких целей лучше использовать как раз лазерный дальномер.

Также следует отметить два серьезных недостатка УЗ дальномера. Первый заключается в том, что поверхности имеющие пористую структуру хорошо поглощают ультразвук, и датчик не может измерить расстояние до них. Например, если мы задумаем измерить расстояние от мультикоптера до поверхности поля с высокой травой, то скорее всего получим очень нечеткие данные. Такие же проблемы нас ждут при измерении дистанции до стены покрытой поролоном.

Второй недостаток связан со скоростью звуковой волны. Эта скорость недостаточно высока, чтобы сделать процесс измерения более частым. Допустим, перед роботом есть препятствие на удалении 4 метра. Чтобы звук слетал туда и обратно, потребуется целых 24 мс. Следует 7 раз отмерить, прежде чем ставить УЗ дальномер на летающих роботов.

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

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

DSC00600_

Подключение HC-SR04

Датчик HC-SR04 имеет четыре вывода. Кроме земли (Gnd) и питания (Vcc) еще есть Trig и Echo. Оба этих вывода цифровые, так что подключаем из к любым выводам Ардуино Уно:

HC-SR04GNDVCCTrigEcho
Arduino UnoGND+5V32

Принципиальная схема устройства

sonic_схема

Внешний вид макета

sonic_bb

Программа

HC-SR04_sequence_chart

На диаграмме видно, что для начала измерения нам необходимо сгенерировать на выводе Trig положительный импульс длиной 10 мкс. Вслед за этим, датчик выпустит серию из 8 импульсов и поднимет уровень на выводе Echo, перейдя при этом в режим ожидания отраженного сигнала. Как только дальномер почувствует, что звук вернулся, он завершит положительный импульс на Echo.

Получается, что нам нужно сделать всего две вещи: создать импульс на Trig для начала измерения, и замерить длину импульса на Echo, чтобы потом вычислить дистанцию по нехитрой формуле. Делаем.

Функция pulseIn замеряет длину положительного импульса на ноге echoPin в микросекундах. В программе мы записываем время полета звука в переменную duration. Как мы уже выяснили ранее, нам потребуется умножить время на скорость звука:

s = duration * v = duration * 340 м/с

Переводим скорость звука из м/с в см/мкс:

s = duration * 0.034 cм/мкс

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

s = duration * 1/29 = duration / 29

А теперь вспомним, что звук прошел два искомых расстояния: до цели и обратно. Поделим всё на 2:

s = duration / 58

Теперь мы знаем откуда взялось число 58 в программе!

Загружаем программу на Ардуино Уно и открываем монитор последовательного порта. Попробуем теперь наводить датчик на разные предметы и смотреть в мониторе рассчитанное расстояние.

Задания

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

Заключение

Так получилось, что в университете я изучаю C/C++. Для души пробую делать небольшие проекты на Python. Я много слышал про платформу Arduino, смотрел видео на YouTube, частенько посещал Arduino Project Hub и вот мне стало интересно самому поэкспериментировать, углубясь в разработку под микроконтроллеры. Купив стартовый набор с самой платой и горстью электронных компонентов и попробовав собрать проекты из обучающей брошюры, понял, что надо двигаться дальше. Продумав саму идею следующей самоделки, отправился на просторы Google и обнаружил, что не могу найти всего, что мне нужно на одном ресурсе. Безусловно, мне несложно было посетить несколько сайтитов и блогов с информацией, но я бы сильно сэкономил время, если бы нашел все в одном месте. Так и появилась эта статья-туториал.

Суть проекта

Мне хотелось сделать дальномер. Во-первых, из-за того, что у меня был ультразвуковой датчик и надо было научиться с ним взаимодействовать. Во-вторых, я хотел выводить всю информацию на OLED-дисплей. В статьях, которые я находил, либо рассказывалось про работу с дисплеем и датчиком по отдельности, либо они являлись частью совершенно другого проекта. Я собрал все необходимое тут и надеюсь, что это сможет как-то помочь другим.

Любая плата Arduino (у меня Uno);

Ультразвуковой дальномер HC-SR04;

OLED-дисплей на 0,96 дюймов;

Работа с OLED-дисплеем

OLED-дисплей идеально подходит для DIY-устройств. Во-первых, мы имеем достаточно высокое разрешение экрана — 128x64 пикселя. Во-вторых, дисплей работает без модуля подсветки, что обеспечивает низкое потребление энергии. В-третьих, для подключения используется всего четыре разъема — два для питания и два для обмена информацией. Но несмотря на это, у OLED-дисплеев есть и минусы. Со временем пиксели могут тускнеть и перегорать.

Вот таким образом можно подключить дисплей:

Схема подключения

Схема подключения

Есть несколько библиотек для работы с OLED-дисплеями, мне больше нравится OLED_I2C. Мне она кажется очень простой и максимально понятной. Следующим образом выведем классический «Hello, world!» на дисплей:

Если функции без параметров понятны сразу и не вызывают вопросов, то с функциями вывода на дисплей могут быть вопросы. Давайте сразу с ними разберемся, их существует всего три вида:

print(st, x, y) — печать строки на дисплей.
Параметры:
st: строка для печати;
x: координата верхнего левого угла первого символа по горизонтали;
y: координата верхнего левого угла первого символа по вертикали.
В качестве координат можно использовать как сами координаты, так и литералы LEFT, CENTER, RIGHT.

printNumI(num, x, y, [length, [filler]]) — печать целого числа на дисплей.
Параметры:
num: Число для вывода на экран (от -2147483648 до 2147483647);
x: координата верхнего левого угла первой цифры/знака по горизонтали;
y: координата верхнего левого угла первой цифры/знака по вертикали;
length: <необязательный параметр> минимальное количество цифр для отображения на экране;
filler: <необязательный параметр> Символ для заполнения, чтобы получить минимальную длину. По умолчанию “ “.
В качестве координат можно использовать как сами координаты, так и литералы LEFT, CENTER, RIGHT.

printNumF(num, dec, x, y, [divider, [length, [filler]]]) — печать числа с плавающей точкой на дисплей.
Параметры:
num: Число для вывода на экран (от -2147483648 до 2147483647);
dec: количество цифр после запятой (в дробной части) (допустимые значения 1-5);
x: координата верхнего левого угла первой цифры/знака по горизонтали;
y: координата верхнего левого угла первой цифры/знака по вертикали;
divider: <необязательный параметр> Одиночный символ для использования в качестве десятичной точки. По умолчанию '.';
length: <необязательный параметр> минимальное количество цифр для отображения на экране;
filler: <необязательный параметр> Символ для заполнения, чтобы получить минимальную длину.
По умолчанию “ “.В качестве координат можно использовать как сами координаты, так и литералы LEFT, CENTER, RIGHT.

Работа с ультразвуковым дальномером

Ультразвуковой датчик расстояния работает по принципу эхолокации — посылает пучок ультразвука и получает его отражение с некоторой задержкой, с помощью которой и можно высчитать расстояние до объекта. Работает датчик от напряжения в 5V на расстоянии от 2 до 400 сантиметров.

Для получения данных с датчика необходимо:

Подать на выход Trig импульс длительностью 10 микросекунд;

Трансмиттер отправит 8 импульсов с частотой 40 кГц;

Когда импульсы отразятся от препятствия и будут приняты ресивером, то на выходе Echo образуется входной сигнал;

С помощью формулы данные преобразуются в расстояние. Чтоб получить расстояние в сантиметрах, нам необходимо разделить ширину импульса на 58, для получения расстояния в дюймах — на 148.

Подключить датчик к плате можно следующим образом:

Схема подключения

Схема подключения

Финальный проект

Теперь, когда мы разобрались с работой с каждого элемента по отдельности, можно перейти к основному проекту дальномера.

Подключим все элементы к плате следующим образом:

Схема проекта

Схема проекта

Финальный проект в работе выглядит следующим образом:


Что дальше?

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

Перенести все на монтажную плату и избавиться от макетки. Тогда получится цельное устройства без торчащих проводов;

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


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

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


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

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

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

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


Для того чтобы инициализировать отправку сигнала дальномером, необходимо подать высокий сигнал длительностью 10 μs на пин Trig . После получения высокого сигнала длительностью 10 μs на пин Trig , модуль генерирует пучок из восьми сигналов частотой 40 кГц и устанавливает высокий уровень на пине Echo . После получения отраженного сигнала модуль устанавливает на пине Echo низкий уровень.

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

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

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

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

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

distance = duration * 1/29 = duration / 29

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

distance = duration / 58

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


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

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

Предлагается проект дальномера, основанного на ультразвуковом датчике HC-SR04 и Arduino. Показания датчика отображаются на жидкокристаллическом дисплее, а питание осуществляется от батареи на 9 вольт.

1 Сборка ультразвукового дальномера

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

Я буду использовать в проекте Arduino Nano, и размещу его на макетной плате. На нижней части Arduino расположен кварцевый генератор. Он довольно высокий, поэтому я для него вырежу отверстие, иначе вся плата будет выступать и занимать гораздо больше места. Тут же на макетной плате будет размещён переменный резистор на 10 кОм.

Приобрести ультразвуковой датчик по очень хорошей цене можно на этом сайте, а Arduino Nano – здесь.

2 Электрическая схема ультразвукового дальномера

Теперь рассмотрим схему нашего прибора.

Схема ультразвукового дальномера с HC-SR04 и Arduino

Схема ультразвукового дальномера с HC-SR04 и Arduino

3 Скетч Arduino для ультразвукового дальномера

Напишем скетч для нашего дальномера:

Вариант готового прибора показан на фотографии. Он достаточно компактен и удобен в использовании.

Вариант компоновки ультразвукового дальномера
Вариант компоновки ультразвукового дальномера
Внешний вид готового ультразвукового дальномера
Внешний вид готового ультразвукового дальномера

Но следует иметь в виду несколько важных замечаний при его использовании:

  • Ультразвук лучше отражается от гладких поверхностей, чем от поглощающих (например, мягкого ковра). Поэтому следует выбирать место расположения дальномера при измерении так, чтобы напротив дальномера располагалась гладкая отражающая поверхность (например, стена).
  • Показания прибора могут существенно отличаться в зависимости от угла направления на цель. Поэтому лучше всего провести несколько измерений, немного изменяя угол направления на цель, и взять среднее значение от всех измерений.

4 Калибровка ультразвукового дальномера

После небольшого опыта использования данного прибора, выявилось, что измеренное расстояние отличается от действительного, причём чем больше расстояние от датчика до цели, тем больше отклонение. В связи с этим возникла необходимость в корректировке показаний дальномера.

Для этого я измерил на всём рабочем диапазоне датчика (от 0 до 400 см) расстояния и составил таблицу из двух столбцов: реальное расстояние и показания датчика. По этим данным построил график:

График отклонения показаний ультразвукового дальномера

График отклонения показаний ультразвукового дальномера

Здесь зелёным цветом показан график для идеального дальномера, как должно быть, а красным – реального, который в моём случае занижает показания.

Зависимость получилась линейная. Прекрасно! Из курса геометрии мы помним, что уравнение прямой, проходящей через две точки: (x − x1)/(x2 − x1) = (y − y1)/(y2 − y1)

Подставив вместо x1, 2 и y1, 2 значения из таблицы и упростив выражение, я получил уравнение для графика измерений ультразвукового дальномера: y = 0,97x + 0,27

В уравнении прямой коэффициент 0,97 возле «икс» является тангенсом угла наклона прямой к оси абсцисс. Назовём его tg(α). Можно посчитать, что угол наклона прямой равняется 44,13 градусам (арктангенс от 0,97), а в идеальном случае он должен быть равен 45 градусам (и уравнение прямой идеального дальномера очень простое: y = x, то есть каждому измеренному числу соответствует точно такое же реальное расстояние). Постоянная 0,27 – это смещение графика относительно нуля по оси ординат.

Посмотрим на следующий рисунок. Видны два прямоугольных треугольника, приподнятые над осью OX. Один из катетов, назовём его h, треугольника с углом α равен измеренному дальномером расстоянию Rизм за вычетом константы b, равной 0,27. Катет другого треугольника равен реальному расстоянию Rреал. У обоих треугольников катеты h равны. Зная длину катета h и тангенс угла α (равный 0,97), мы узнаем реальное расстояние Rреал, поделив, длину катета h на tg(α),

Последовательность коррекции показаний ультразвукового дальномера

Последовательность коррекции показаний ультразвукового дальномера

Таким образом, для того чтобы скорректировать ошибку при измерениях дальномера, нужно следовать формуле: Rреал = (Rизм − b) / tg(α) = (Rизм − 0,27) / 0,97 Обратите внимание, что это выражение можно было получить из предыдущего уравнения, выразив x через y.

В вашем случае коэффициент и константа, естественно, будут отличаться. Эту коррекцию следует внести в скетч для Arduino. После этого ультразвуковой дальномер на датчике HC-SR04 будет показывать расстояние более точно.

Напоследок приведу видеодемонстрацию работы готового ультразвукового дальномера (до калибровки).

Читайте также: