Работа с ультразвуковым датчиком расстояния hc-sr04 в bascom-avr

Измерение расстояний с помощью микроконтроллера AVR и датчика HC-SR04

В этой статье мы рассмотрим схему для измерения расстояний, построенную с использованием ультразвукового датчика HC-SR04 и микроконтроллера ATmega32 (семейство AVR). Датчик HC-SR04 использует технологию под названием “ECHO” (эхо), то есть испускает ультразвуковой сигнал и потом анализирует отраженный от препятствий сигнал.

Принцип работы ультразвукового датчика HC-SR04

Мы знаем, что звуковые волны не могут проникать через твердые тела. Эти волны распространяются по воздуху со скоростью примерно 220 м/с. Когда они достигают нашего уха, мы слышим их как звук. Но когда эти колебания (звуковые волны) встречают на своем пути твердые тела это равносильно тому, что они встречают на своем пути непроходимую стену, поэтому они отражаются от них с такой же самой скоростью, с которой они распространялись до этого. Этот эффект называется эхо.

Ультразвуковой датчик HC-SR04 обеспечивает на своем выходе сигнал, пропорциональный дистанции до препятствия. Датчик генерирует звуковые колебания в ультразвуковом диапазоне (после получения управляющего импульса) и после этого ждет когда они вернутся к нему (эхо), отразившись от какого-нибудь препятствия. Затем, основываясь на скорости звука (220 м/с) и времени, необходимом для того чтобы эхо достигло источника (нашего датчика), датчик обеспечивает на своем выходе сигнал, пропорциональный расстоянию до препятствия.

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

Расстояние при этом рассчитывается по следующей формуле: distance (in cm) = width of pulse output (in uS) / 58. То есть дистанция (в сантиметрах) равна длительности выходного импульса датчика (в микросекундах), деленная на 58.

Необходимые компоненты

Аппаратное обеспечение

  1. Микроконтроллер ATmega32 (купить на AliExpress).
  2. Программатор AVR-ISP (купить на AliExpress), USBASP (купить на AliExpress) или другой подобный.
  3. Ультразвуковой датчик HC-SR04 (купить на AliExpress).
  4. JHD_162ALCD (ЖК дисплей 16×2) (купить на AliExpress).
  5. Конденсатор 1000 мкФ (купить на AliExpress).
  6. Резистор 10 кОм (2 шт.) (купить на AliExpress).
  7. Источник питания с напряжением 5 Вольт.

Программное обеспечение

  1. Atmel Studio версии 6.1 (или выше).
  2. Progisp или flash magic (необязательно).

Работа схемы

Схема устройства приведена на следующем рисунке.

В представленной схеме PORTB микроконтроллера ATmega32 соединен с портом данным жидкокристаллического (ЖК) дисплея. Если вы не хотите трогать фьюзы (FUSE BITS) микроконтроллера, то не используйте PORTC, поскольку PORTC содержит специальные функции (типы связи), которые можно деактивировать только с помощью изменения фьюзов.

В ЖК дисплее (если мы не хотим использовать черный цвет) можно задействовать только 14 его контактов: 8 контактов для передачи данных (7-14 или D0-D7), 2 контакта для подачи питания (1&2 или VSS&VDD или gnd&+5v), 3-й контакт для управления контрастностью, 3 контакта для управления (RS&RW&E).

В представленной схеме мы использовали только 2 контакта управления ЖК дисплея для лучшего понимания работы схемы. Бит контраста и READ/WRITE используются нечасто, поэтому они могут быть замкнуты на землю. Это обеспечивает ЖК дисплею максимальную контрастность и переводит его в режим чтения. Теперь нам всего лишь нужно контролировать контакты ENABLE и RS чтобы передавать на ЖК дисплей символы и данные. Также на нашем сайте вы можете прочитать более подробную статью о подключении ЖК дисплея к микроконтроллеру AVR ATmega32.

В схеме необходимо сделать следующие соединения с ЖК дисплеем:
PIN1 или VSS — земля
PIN2 или VDD или VCC — +5v питание
PIN3 или VEE — земля (обеспечивает максимальный контраст ЖК дисплею)
PIN4 или RS (Register Selection) – контакт PD6 микроконтроллера
PIN5 или RW (Read/Write) — земля (переводит ЖК дисплей в режим чтения что упрощает взаимодействие с ним для начинающих)
PIN6 или E (Enable) — контакт PD5 микроконтроллера
PIN7 или D0 — контакт PB0 микроконтроллера
PIN8 или D1 — контакт PB1 микроконтроллера
PIN9 или D2 — контакт PB2 микроконтроллера
PIN10 или D3 — контакт PB3 микроконтроллера
PIN11 или D4 — контакт PB4 микроконтроллера
PIN12 или D5 — контакт PB5 микроконтроллера
PIN13 или D6 — контакт PB6 микроконтроллера
PIN14 или D7 — контакт PB7 микроконтроллера

В схеме мы использовали 8-битную связь (D0-D7) ЖК дисплея с микроконтроллером, хотя можно было ограничиться и 4-битной – но в этом случае код программы стал бы немного сложнее. Таким образом, мы использовали 10 контактов ЖК дисплея, 8 из которых будут использоваться для передачи данных и 2 для управления.

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

  • PIN1 — VCC или +5V – контакт для подачи питающего напряжения;
  • PIN2 — TRIGGER – триггерный контакт. На него подается управляющий импульс для запуска работы датчика;
  • PIN3 — ECHO – на его выходе формируется выходной (эхо) сигнал;
  • PIN4 — GROUND – земля.

Контакт 3 (ECHO) датчика подсоединен к микроконтроллеру как источник внешнего прерывания – то есть к контакту INT0 (interrupt 0) или PD2 микроконтроллера.

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

  1. Подать на триггерный вход датчика импульс длительностью не менее 12 мкс (с запасом, как говорится).
  2. После того как отраженный сигнал (эхо) вернется к датчику на его выходе ECHO появится сигнал высокого напряжения, которое мы в микроконтроллере должны обработать как внешнее прерывание и запустить счетчик времени.
  3. Как только на выходе ECHO датчика снова появится сигнал низкого напряжения (выходной импульс закончится) мы должны остановить счетчик времени.
  4. Таким образом, во время действия выходного импульса на контакте ECHO датчика счетчик времени микроконтроллера измеряет длительность этого импульса. Потом мы измеренную длительность этого импульса пересчитываем в расстояние.
  5. Измеренное расстояние отображается на ЖК дисплее 16×2.
    Для выполнения этой последовательности действий нам необходимо установить значения в ряде регистров, показанных на рисунке.

BLUE (синий, INT0 – внешнее прерывание 0): этот бит должен быть установлен в 1 для того чтобы разрешить обработку внешнего прерывания 0 (interrupt0). Если мы сделали это, то после этого мы можем отслеживать изменения логических уровней на контакте D2 микроконтроллера.

BROWN (коричневый, ISC00, ISC01): эти два бита настраиваются для контроля логических уровней на контакте D2 микроконтроллера, который в данной случае рассматривается как источник внешнего прерывания.

То есть, как мы уже говорили ранее, нам необходимо прерывание чтобы запустить наш счетчик времени и потом остановить его. Таким образом мы устанавливаем бит ISC00 в единицу и получаем прерывание когда имеем переход с логического LOW на HIGH на входе INT0, другое прерывание мы получаем когда имеем переход с логического HIGH на LOW.

RED (красный, CS10): это бит используется для того, чтобы активировать и деактивировать счетчик времени. И хотя он работает вместе с другими битами (CS11, CS12), нам они не важны поскольку в данном случае нам не нужно устанавливать предварительный делитель частоты.

Перед началом программирования микроконтроллера необходимо уяснить две важные вещи:

  • мы используем внутренний тактовый генератор микроконтроллера ATMEGA32A, который работает на частоте 1 МГц. Мы не используем здесь предварительный делитель частоты и не выполняем какой либо сложной обработки прерываний, поэтому нам не нужно никакой сложной установки регистров;
  • значение счетчика времени после завершения счета сохраняется в 16 битном регистре TCNT1 микроконтроллера.

Исходный код программы на языке С (Си) с пояснениями

Программа для рассматриваемой схемы представлена следующим фрагментом кода на языке С (Си). Комментарии к коду программу поясняют принцип работы отдельных команд.

Ультразвуковой датчик расстояния Ардуино 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 — это ультразвуковой датчик, позволяющий измерять расстояние до преграды в диапазоне от 2 до 400 см. Он представляет собой плату, на которой размещены излучатель и приемник ультразвука и управляющая электронная схема. Датчик имеет небольшие габариты и простой интерфейс: два вывода питания, один вход и один выход. Может быть использован в качестве датчика присутствия в умном доме или охранной системе, а также для всяких роботизированных поделок. Также на нем можно сделать парктроник для машины, только в уличных условиях он быстро загрязнится.

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

Плата датчика имеет 4 вывода:

— плюсовой вывод питания (Vcc)
— вход TRIG
— выход ECHO
— ноль питания (GND)

На выводы питания подается постоянное напряжение 5 В. По даташиту датчик потребляет в рабочем режиме 15 мА. У меня на макете мультиметр показывал потребление

6.5 мА, но я выполнял замеры расстояния с низкой частотой (единицы герц).

Вход TRIG подключается к любому выводу микроконтроллера. На этот вывод нужно подавать импульсный цифровой сигнал длительностью 10 мкс. По сигналу на входе TRIG датчик посылает пачку ультразвуковых импульсов.

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

Временная диаграмма работы датчика HC-SR04 показана на рисунке ниже.

Расстояние можно посчитать по следующей формуле:

S = Tus/58, [см]

где Tus — длительность эхо импульса в микросекундах, а 58 — константа.

Тестовый проект AVR + HC-SR04

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

Я написал программный модуль для работы с датчиком HC-SR04 так, чтобы можно было использовать внешние прерывания INT0, INT1 или INT2 и любой из аппаратных таймеров. Используемый таймер просто непрерывно считает тактовые импульсы в режиме Normal (от 0 до максимума), вызывая прерывания после переполнения счетного регистра. Делитель для таймера может быть любым, главное указать его в программном модуле датчика. Значение предделителя таймера используется при расчете длительности эхо сигнала и, следовательно, влияет на расчет расстояния.

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

Модуль представляет собой два файла usens.h и usens.c. Набор функций модуля такой:

void USENS_Init(void) — настройка используемых выводов, инициализация внутренних переменных. Эта функция вызывается в начале main функции.

void USENS_Handler(void) — запускает процесс измерения, формируя сигнал для входа TRIG, а по окончании измерения вычисляет расстояние до объекта. Эту функцию нужно запихнуть в бесконечный цикл.

uint16_t USENS_GetDistance(void) — возвращает расстояние до объекта, если оно было измерено. В противном случае возвращает 0. Может вызываться в любое время.

void USENS_CountingOvf(void) — эту функцию нужно запихнуть в прерывание используемого таймера. Она подсчитывает число переполнений таймера.

В заголовочном файле модуля есть настройки. Они все прокомментированы, здесь я их описывать не буду. Не думаю, что многие будут использовать мой код.

Тестовый проект измеряет расстояние до объекта и выводит результат на LCD дисплей. Схема моего макета была такой.

Точность датчика HC-SR04

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

По паспорту датчик измеряет расстояние с разрешением

3 мм в диапазоне от 3 до 400 см.

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

Читайте также  Шокер с регулируемым выходным напряжением

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

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

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

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

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

Ультразвуковой датчик Ардуино HC-SR04 ► расскажем, как подключить ультразвуковой дальномер HC-SR04 с библиотекой Ultrasonic Arduino для управления платой.

Ультразвуковой датчик расстояния Ардуино HC-SR04 рассмотрим на этом занятии. Расскажем, как подключить ультразвуковой дальномер HC-SR04. Разберем скетч для датчика, который может прекрасно служить для робота при определении расстояния до объектов или обнаружения препятствия. Также рассмотрим самую популярную библиотеку для ультразвуковых дальномеров на Arduino — Ultrasonic.h.

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

Ультразвуковой датчик (ещё его часто называют сонаром или ультразвуковым дальномером) определяет расстояние до объекта так же, как это делают летучие мыши или дельфины. Датчик HC-SR04 генерирует узконаправленный сигнал на частоте 40 кГц и ловит отраженный сигнал (эхо). По времени распространения звука до объекта и обратно можно достаточно точно определить расстояние до него.

По этому же принципу работает множество приборов для исследования пространства — эхолот, сонар, радиолокатор и даже полицейский радар для определения скорости автомобиля. Все эти приборы излучают узконаправленный ультразвуковой сигнал и получают обратно отраженный сигнал. В отличии от инфракрасных дальномеров (IR), на показания ультразвукового датчика (сонара) не влияет цвет объекта.

Принцип работы ультразвукового дальномера HC-SR04

Но при настройке ультразвукового датчика на Ардуино могут возникнуть трудности с определением расстояния до звукопоглощающих объектов, поскольку они способны полностью погасить излучаемый сигнал. Для идеальной точности измерения расстояния, поверхность изучаемого объекта должна быть ровной и гладкой. Принцип работы ультразвукового датчика hc-sr04 показан на рисунке выше.

Как подключить ультразвуковой датчик к Ардуино

Для этого занятия нам потребуется:

  • плата Arduino Uno / Arduino Nano / Arduino Mega;
  • макетная плата;
  • УЗ дальномер HC-SR04;
  • 1 светодиод и резистор 220 Ом;
  • провода «папа-папа» и «папа-мама».

Схема подключения указана на рисунке выше. Отметим, что ультразвуковой дальномер HC-SR04 имеет диапазон измерения от 2 см до 400 см, работает при температурах от 0° до 60° С. Точность измерения составляет ± 1 см, рабочее напряжение датчика до 5,5 В. Для начала мы используем простой скетч, без использования библиотеки Ultrasonic. После подключения к Arduino дальномера HC-SR04 загрузите следующий скетч:

Читайте также  Инфракрасный датчик препятствия на компараторе lm393

Скетч для подключения датчика hc-sr04 к Arduino

Пояснения к коду:

  1. для подключения выходов Trig и Echo на датчике сонара Ардуино можно использовать любые цифровые входы на микроконтроллере;
  2. чтобы получить значение датчика в миллиметрах следует использовать следующую формулу для расчета: cm = duration / 5,8; .

Ультразвуковой датчик и светодиод Ардуино

Представленный скетч работает без библиотеки, поэтому в коде многовато строчек. Мы воспользуемся библиотекой для ультразвуковых дальномеров, что позволит нам значительно упростить скетч. Для начала установите библиотеку Ultrasonic (инструкция по установке библиотек в Arduino IDE) и загрузите следующую программу в Ардуино. Ссылка на скачивание архива со скетчами и библиотекой Ultrasonic.h — здесь.

Подключите дополнительно к плате RGB светодиод или несколько светодиодов, для создания мини проекта. Цвета светодиода будут переключаться, в зависимости от расстояния от датчика расстояния до предмета. Для управления светодиодами от УЗ датчика в программе используется условные операторы if. После сборки схемы, как на картинке выше, загрузите в микроконтроллер следующую программу.

Измеритель расстояния на HC-SR04 без микроконтроллера

В этой статье пошагово соберем схему измерителя расстояния из нескольких микросхем стандартной логики.

Зачем

Все just-for-fun. Конечная схема является тривиальной и не несет новых технических решений. Автор не является профессиональным конструктором электроники и некоторые решения могут не отвечать принятым стандартам.

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

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

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

Задача

Хотим получать устройство, представляющее расстояние в сантиметрах в десятичной системе счисления. Минимальное значение – 1 см, максимальное – 254 см. Для отображения используем 7-сегментный индикатор с 3 знакоместами, для измерения расстояния – модуль ультразвукового датчика HC-SR04 или аналог.

Да, я понимаю, что в модуле датчика скорее всего используется микроконтроллер. Это не считается.

Собираем

HC-SR04 – очень популярный, дешевый и неточный ультразвуковой датчик. Кратко о интерфейсе. Датчик имеет две сигнальные линии TRIG (вход) и ECHO (выход).

На вход TRIG подаем импульс запуска измерения и через некоторое время получаем положительный импульс на выходе ECHO . Длительность импульса ECHO умноженная на некоторую константу K равна измеренному расстоянию.

Вся задача сводится к измерению длительности импульса в единицах времени K, для чего нам понадобится 8-битный счетчик, который будем тактировать частотой 1/K Гц. Выход счетчика будет отражать расстояние в сантиметрах (в двоичном представлении).

При этом, мы не хотим, чтобы в процессе счета на индикаторе отображалось постепенно увеличивающееся значение – это будет мешать чтению результата. Поэтому возьмем счетчик 74HC590 со встроенным выходным буферным регистром.

Выводами СЕ (разрешение счета) и OE (включение выходов) мы управлять не будем. На вход тактирования счетчика CPC подан сигнал CLK0 задающего генератора (

= 58мкс или 17240 Гц).

Нам нужно сбросить счетчик по фронту ECHO и сохранить состояние счетчика в выходной регистр по спаду. Сбросом занимается вывод MRC , а записью в выходной регистр – вывод CPR . Сброс происходит по низкому уровню, как нам и нужно, а вот запись – по фронту (не по спаду, как хотелось бы). Придется добавить инвертор. Для уменьшения количества корпусов в качестве инвертора возьмем 74HC00 (4 элемента И-НЕ), далее нам еще понадобятся элементы И-НЕ.

Тут сталкиваемся с первой небольшой проблемой. После спада ECHO сигнал на вывод MRC придет чуть быстрее, чем на CPR , так как инвертор вносит некоторую задержку. Состояние счетчика будет сохраняться сразу после сброса, то есть сохранится ноль. Обычно для дополнительной задержки сигала ставят буферы, но мы не будем разбрасываться элементами и внесем задержку с помощью RC цепочки.

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

По достижению счетчиком значения 255 RCO переходит в низкое состояние отключая тактирование счетчика, что «замораживает» его значение до сброса (следующего измерения). Еще мы тут «случайно» инвертировали сигнал тактирования (с целью не добавлять новый корпус и использовать оставшиеся элементы И-НЕ), в данном случаи это не приведет к проблемам.

Теперь нужно сформировать сигнал TRIG , запускающий измерения. Его период должен быть на несколько порядков больше CLK0 (>60мс). Для этого можно использовать отдельный низкочастотный генератор или поставить делитель на сигнал тактирования. Снова стремясь уменьшить количество элементов, пойдем вторым путем.

Возьмём CD4060 – делитель с коэффициентом деления до 2 14 с двумя встроенными инверторами (на которых мы соберем задающий RC генератор).

Генератор по схеме из даташита CD4060 запускаться у автора отказался, поэтому схема была изменена.

Для запуска измерения подадим сигнал с Q13 (

4 Гц) на TRIG . Частота у него подходящая, а коэффициент заполнения (50%) – нет. Нам не нужен сигнал высокого уровня длительностью в 125мс, нам нужно всего около 0.02-1 мкс. Решим эту проблему еще одной RC цепочкой в режиме high-pass фильтра.

Вы, наверное, заметили появление кнопки на схеме. Она реализует функцию «HOLD»: при ее удержании подавляются сигналы запуска измерения, тем самым на выходе счетчика будет удерживаться значение последнего измерения.

Запустив схему в таком виде с подключенными к выходу счетчика светодиодами мы уже сможем порадоваться значениям измеренного расстояния… в бинарном виде. Не сильно user-friendly, согласитесь, нужно срочно переводить в десятичную систему счисления. Сделать это можно несколькими способами, все они ужасны (требуют много корпусов), поэтому начинаем читерить (=.

Да, да, будет ПЗУ (параллельная EEPROM, в данном случаи). Тут многие могут возразить: «Как же так, без микроконтроллера, а программировать все равно нужно?! Заголовок – клик-бейт!» Что еще будет, когда придется показать, как прошивалась ПЗУ без покупки программатора.

В качестве программатора берем ардуину и кучку проводов. Прищурив глаза будем смотреть на ПЗУ как на гигантский декодер адреса и 8192 диода в одном корпусе.

Описание процесса программирования ПЗУ выходит за рамки статьи. Скажу лишь, что с ардуино сделать это довольно просто. Самое неудобное – необходимость формирования двух источников напряжения 14В (для стирания) и 12В (для записи). Скетч «программатора» приведен с файлами проекта в конце статьи.

При формировании содержимого ПЗУ, преобразование числа 255 было заменено на вывод трех прочерков «—«, что означает неудачное измерение.

Входов у ПЗУ много, а вот выходов хватит только на одну цифру 7-сегментного индикатора, потому будем использовать динамическую индикацию. Входы A8 и A9 в бинарном коде выбирают одну из трех отображаемых цифр, четвертое состояние не используется и соответствует погашенным сегментам. Для активации цифры индикатора (в зависимости от кода на A8 и A9 ) понадобится 2-битный дешифратор с инвертированными выходами (т.к. нам нужно управлять общими катодами индикатора). Сделать дешифратор можно так (четвертый код мы не используем).

Теперь осталось подключить наш дешифратор и ПЗУ к делителю частоты, который будет заниматься формированием сигналов для A8 , A9 и IN0 , IN1 , тем самым последовательно перебирая десятичные цифры.

На входы A0-7 подано значение 0b10110000 = 176, CLK4-5 подключены к выходам делителя Q4, Q5. gif по кадрам

Цифры будут переключаться с частотой

1кГц, поэтому не страшно, что они переключаются не по порядку, глазу это будет не заметно.

Однако, выходы делителя рассчитаны на нагрузку около 1мА, чего недостаточно для управления индикатором (на схеме выше сигнал CLK5 с делителя напрямую подключен к индикатору). Нас тут спас бы еще один инвертор (или буфер) перед CLK5 , но мы уже использовали все 4 элемента И-НЕ из 74HC00. Не добавлять же ради одного элемента еще один корпус. Используем вместо этого свободный выход D7 ПЗУ, запрограммировав его так, чтобы на D7 всегда была инверсия A9 . (Можно было бы и без инверсии, просто так сложилось.) Нагрузочная способность выхода ПЗУ достаточна для управления индикатором.

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

Правильно собранное устройство настройки не требу —

Калибровка

Для правильного измерения расстояния нам нужно подстроить частоту задающего генератора подстрочным резистором. Сделать это можно так: размещаем датчик напротив ровной стены на известном расстоянии (чем больше, тем лучше точность калибровки). Расстояние выбираем как N+0.5 см, где N – целое. Далее ищем положение резистора, при котором значение на индикаторе самопроизвольно переключается между N и N+1. (Например, между 127 и 128, если выбранное расстояние – 127.5 см.)

Теоретическая точность измерений +/- 1см, не считая погрешность датчика. На самом деле все еще хуже, т.к. частота генератора плавает.

14мА, предполагается питание от «кроны». Даже плохой батарейки должно хватить на 6-8 часов.

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

Схема была отлажена на бредборде.

Потом решил заказать плату, для эстетического удовольствия.

Знаете, как называется, когда берешь первую непроверенную плату и впаиваешь в нее ПЗУ без каретки?

Смелость и слабоумие, конечно.

В процессе переноса схемы с бредборда была допущена ошибка: перепутаны общие катоды двух крайних индикаторов (число 123 отображается как 321). Благо, это было исправлено через перепрошивку ПЗУ. Так что даже не пришлось резать и подпаивать проводки.