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

AVR: подключаем ультразвуковой дальномер HC-SR04 к atmega8

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

  • Измеряемый диапазон: 2 см — 500 см
  • Точность: 0,3 см
  • Угол обзора: < 15 °
  • Напряжение питания 5V

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

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

Модуль датчика расстояния HC-SR04 имеет 4 вывода:

  • VCC:  питание 5 вольт
  • Trig:  вход триггера, запускающего измерения
  • Echo:  выход, на котором генерируется импульс, длительность которого пропорциональна расстоянию
  • GND:  земля

В документации на модуль датчика расстояния HC-SR04 указано, что для запуска измерений на вход Trig надо подать импульс  длительностью 10-15 микросекунд.  После чего на выходе Echo появится импульс  длительностью 150мкс — 25мс.

  Длительность этого импульса пропорциональна расстоянию до объекта, от которого отразился ультразвуковой сигнал.

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

D = T/58

где: T — длительности сигнала в микросекундах

D — расстояние  в сантиметрах

Если же отраженный сигнал не дошёл до приёмника, то на выходе Echo будет импульс длительностью 38 попугаев миллисекунд,

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

Описание программы для avr atmega: программа запускает измерения, генерируя импульс 10 мкс. на выходе PD3, соединённого с входом Trig.  Выход Echo подключён к PD2, который используется как внешнее прерывание. По переднему фронту на PD2 сбрасываем в ноль таймер счетчик timer1.

По заднему фронту на PD2 запоминается значение таймера счетчика timer1. Далее, полученная длина импульса переводится в сантиметры и выводится в uart. Через 1 секунду цикл измерений повторяется. Так как timer1 настроен так, что длительность тика равна 8.

68 мкс ( 1/(7372800/64) ), то используется пересчитанный коэффициент для перевода в сантиметры 58/8.68 = 6.68, округляем до 7;

Далее приведён исходный текст только основных функций для avr atmega, целиком исходники проекта avr-gcc (WinAvr) можно скачать тут.

#include
#include
#include
#include “uart.h”
#include “ext_int.h”
#include “timer1.h”
 
//порт для генерирования сигнала TRIG
#define HC_SR04_TRIG_PORT PORTD
#define HC_SR04_TRIG_DDR DDRD
#define HC_SR04_TRIG_BIT _BV(3)
 
//порт для измерения длительности импульса
#define HC_SR04_ETHO_PIN PIND
#define HC_SR04_ECHO_BIT _BV(2)
 
//состояние измерения
#define HC_SR04_START 0 //запуск
#define HC_SR04_MEAS 1 //в процессе
#define HC_SR04_END 2 //окончено
volatile unsigned char hc_sr04_status;
 
//измеренная длительность импульса
volatile unsigned short hc_sr04_cnt;
 
//функция обработчик внешнего прерывания INT0
void hc_sr04_int_handler( void )
{ //проверяем уровень сигнала PD2( ECHO ) if( HC_SR04_ETHO_PIN & HC_SR04_ECHO_BIT ) { //передний фронт – сбрасываем в 0 таймер timer1_clr(); hc_sr04_status = HC_SR04_MEAS; } else { //задний фронт – запоминаем значение таймера hc_sr04_cnt = timer1_cnt(); hc_sr04_status = HC_SR04_END; }
}
 
void hc_sr04_init( void )
{ //устанавливаем функцию для обработки внешнего прерывания INT0 int0_set_handler( hc_sr04_int_handler );
  //разрешаем внешнее прерывание INT0 int0_enable();
  //настраиваем внешнее прерывание INT0 на срабатывание любому изменению int0_set_source( INT0_ANY_CHANGE );
  //настраиваем timer1д timer1_init();
  //настраиваем PD3(TRIG) на выход HC_SR04_TRIG_PORT |= ~HC_SR04_TRIG_BIT; HC_SR04_TRIG_DDR |= HC_SR04_TRIG_BIT;
}
 
//измерение дальности, возвращает значение в см
unsigned short hc_sr04_meas( void )
{ //состояние – начало измерений hc_sr04_status = HC_SR04_START;
  //генерируем импульс 10 мкс на входе trig HC_SR04_TRIG_PORT |= HC_SR04_TRIG_BIT; _delay_us( 10 ); HC_SR04_TRIG_PORT &= ~HC_SR04_TRIG_BIT;
  //ждем окончания измерения while( hc_sr04_status != HC_SR04_END );
  // 58/8.68 = 6.68 ~ 7 //переводим в сантиметры return hc_sr04_cnt/7;
}
 
FILE uart_stream = FDEV_SETUP_STREAM( uart_putc, NULL, _FDEV_SETUP_WRITE );
 
int main( )
{ unsigned short sm; //настройка uart uart_init(); //инициализация датчика hc_sr04_init();
  stdout = &uart_stream;
  sei();
  while( 1 ) { //измерение sm = hc_sr04_meas(); printf( “sm = %u
“, sm ); //задержка 1 сек _delay_ms( 1000 ); } return 0;
}

#include #include #include #include “uart.h” #include “ext_int.h” #include “timer1.

h” //порт для генерирования сигнала TRIG #define HC_SR04_TRIG_PORT PORTD #define HC_SR04_TRIG_DDR DDRD #define HC_SR04_TRIG_BIT _BV(3) //порт для измерения длительности импульса #define HC_SR04_ETHO_PIN PIND #define HC_SR04_ECHO_BIT _BV(2) //состояние измерения #define HC_SR04_START 0 //запуск #define HC_SR04_MEAS 1 //в процессе #define HC_SR04_END 2 //окончено volatile unsigned char hc_sr04_status; //измеренная длительность импульса volatile unsigned short hc_sr04_cnt; //функция обработчик внешнего прерывания INT0 void hc_sr04_int_handler( void ) { //проверяем уровень сигнала PD2( ECHO ) if( HC_SR04_ETHO_PIN & HC_SR04_ECHO_BIT ) { //передний фронт – сбрасываем в 0 таймер timer1_clr(); hc_sr04_status = HC_SR04_MEAS; } else { //задний фронт – запоминаем значение таймера hc_sr04_cnt = timer1_cnt(); hc_sr04_status = HC_SR04_END; } } void hc_sr04_init( void ) { //устанавливаем функцию для обработки внешнего прерывания INT0 int0_set_handler( hc_sr04_int_handler ); //разрешаем внешнее прерывание INT0 int0_enable(); //настраиваем внешнее прерывание INT0 на срабатывание любому изменению int0_set_source( INT0_ANY_CHANGE ); //настраиваем timer1д timer1_init(); //настраиваем PD3(TRIG) на выход HC_SR04_TRIG_PORT |= ~HC_SR04_TRIG_BIT; HC_SR04_TRIG_DDR |= HC_SR04_TRIG_BIT; } //измерение дальности, возвращает значение в см unsigned short hc_sr04_meas( void ) { //состояние – начало измерений hc_sr04_status = HC_SR04_START; //генерируем импульс 10 мкс на входе trig HC_SR04_TRIG_PORT |= HC_SR04_TRIG_BIT; _delay_us( 10 ); HC_SR04_TRIG_PORT &= ~HC_SR04_TRIG_BIT; //ждем окончания измерения while( hc_sr04_status != HC_SR04_END ); // 58/8.68 = 6.68 ~ 7 //переводим в сантиметры return hc_sr04_cnt/7; } FILE uart_stream = FDEV_SETUP_STREAM( uart_putc, NULL, _FDEV_SETUP_WRITE ); int main( ) { unsigned short sm; //настройка uart uart_init(); //инициализация датчика hc_sr04_init(); stdout = &uart_stream; sei(); while( 1 ) { //измерение sm = hc_sr04_meas(); printf( “sm = %u
“, sm ); //задержка 1 сек _delay_ms( 1000 ); } return 0; }

Запись опубликована в рубрике Микроконтроллеры avr с метками atmega, avr. Добавьте в закладки постоянную ссылку.

Источник: http://mainloop.ru/avr-atmega/avr-ultrasonic-sensor-hc-sr04.html

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

Подписка

  • Магазины Китая
  • BANGGOOD.COM
  • Радиотовары
  • Сделано руками

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

Разве что какой заказ прибудет в экстраординарной упаковке или супер непотребном виде… Возникла идея автоматически включать свет при посещении сортира и так же выключать при покидании оного.

Был заказан pir-выключатель для этих целей, а так же pir-датчик отдельно, на всякий…
Выключатель был установлен в однозначно посещаемом всеми членами семьи помещении и… И оказалось, что плясать лезгинку, при выполнении процедур характерных для посещения сортира, никто не в состоянии, а замирание в привычной позе характерно для всех.

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

Так что выключатель и неиспользованный pir-датчик были отправлены на длительное хранение до лучших времен, а их место занял…

Комбинированный радар для воротных систем CONDOR, пока никуда не пристроенный.

Микроволновый блок естественно был отключен, зачем нам подставлять макушку под микроволны. Осталась только ИК матрица. Штука довольна специфическая. Минимальная зона у него размером с помещение. Свет включает и выключает при посещении на ура. Но есть один недостаток. Датчик очень педантичен и любит, чтобы все стояло на своих местах. Передвинул рулончик бумажки или опустил/поднял стульчак, требуется перенастройка. Да и ценник у него не сортирный. Так что поиск решения был продолжен.

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

Тема показалась интересной, тем более изобретать велосипед с прошивкой не надо, автор постарался за нас, за что ему спасибо. Схема есть, прошивки есть. Осталось сделать печатку и получить на выходе полноценный датчик присутствия. Или не получить… посмотрим… Датчик был заказан на banggood'e.

Нравится мне этот магазин стабильностью сроков доставки. Безтреком 28-30 дней и заказ у меня. Приехал безтреком в срок. Упаковка для посылок без трека у banggood'а стандартная, мусорный мешок и все… Датчик был упакован в антистатик, что подозреваю и спасло его от почтовых неприятностей.

:0) К сожалению мусорный мешок выбросил по пути домой, а антистатик уже дома, так что показать кроме датчика вам нечего, да и сам датчик уже потрепался (ножки выпрямил) в процессе изготовления устройства. ТТХ датчика: — 45*20*23 мм.

ДхШхГ (Г — с выпрямленными ножками) — вес — 8,28 грамм — напряжение питания — DC 5V — ток потребления — 15mA — минимальное рабочее расстояние — 2 см. — максимальное рабочее расстояние — 4 метра — угол зоны обнаружения — 15 градусов Кратко. Датчик работает по принципу эха.

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

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

Если длительность нового импульса меньше того что в памяти, микроконтроллер решает, что в зоне обнаружение есть объект и нужно включить нагрузку… Если длинна импульса больше, то ничего не делаем или выключаем нагрузку, если она включена. Далее: Сам датчик.Маркировка на микросхемах стерта.

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

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

Здесь ссылка на скачивание того, что я собрал по теме, плюс схема и печатка платки в Diptrace.

Несколько фоток. Подготавливаем платку и шаблон. Фоторезист нанесен.Засвечиваем, промываем, травим.Травим, смываем фоторезист.Наносим маску, засвечиваем шаблон.Режем платку, сверлим.
Сама платка. Собрана схема на ATtiny13. Зачем для тестов такая красивая? Просто она делалась попутно с другой платой, под эл. нагрузку.

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

В результате получаем готовый бескорпусной датчик присутствия с питанием пять вольт, кушающее 30mA, способное обнаруживать посторонние предметы в заранее запрограммированной зоне обнаружения с углом в 15 градусов и расстоянием от 2 сантиметров, до 3,5 метров. При обнаружении включать светодиод. Принцип работы прост. Направляем датчик, куда нам нужно. Нажимаем кнопку.

Настроечный светодиод (у меня он красненький) начинает мигать. Мигает он в 3-х режимах: 10% светодиод включен— объект вне зоны действия, нагрузка выключена. 90% светодиод включен— объект в зоне действия, нагрузка включена.

50% светодиод включен— зона обнаружения свободна, идет отсчет 60 или 10 секунд, или одна секунда, в зависимости от прошивки, до выключения, лампа включена. Дальше у вас есть 10 секунд чтобы уйти из зоны обнаружения. Можно ограничить зону. Для этого нужно в момент запоминания настроек встать на границе зоны, тем самым зона будет ограничена.

Паспортные минимальные 2 сантиметра я подтверждаю. Если ограничить зону как на фото, то при просовывании пальца между коробкой и датчиком светодиод загорается, убираем палец, гаснет. Если подвинуть коробку на полсантиметра ближе, то свтодиод загорается, устройство настраиваться отказывается.Максимальные 4 метра подтвердить не удалось.

Максимальное расстояние которое удалось подтвердить, где устройство уверенно фиксирует человека равно 3.5 метра. На з-х метрах уверенно фиксирует мою руку с коробкой 15х15 сантиметров. Включает нагрузку и не отключает, пока коробку не уберешь. Выводы. — Получившийся датчик присутствия мне понравился. — Простейшая и удобная настройка. — Реально работает.

— Дешево и сердито. В общем, вот такое получилось годное устройство на ультразвуковом модуле измерения расстояния HY-SRF05. В недалеком будущем я приспособлю его по месту, только коробку подберу. Теперь можно будет замирать в нужной позе не боясь отключения света.

Желающие думаю могут придумать еще множество способов его использования. Особенно ардуинщики, для кого этот датчик в принципе и разработан. А может и не для них…

Планирую купить +41 Добавить в избранное Обзор понравился +41 +81

Источник: https://mysku.ru/blog/china-stores/40359.html

Датчик расстояния Ардуино HC SR04

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

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

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

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

Принцип работы ультразвуковых датчиков

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

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

Именно этот временной интервал становится характеристикой помогающей определить расстояние до объекта.

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

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

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

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

  • Питающее напряжение 5В;
  • Рабочий параметр силы т ока – 15 мА;
  • Сила тока в пассивном состоянии < 2 мА;
  • Обзорный угол — 15°;
  • Сенсорное разрешение – 0,3 см;
  • Измерительный угол — 30°;
  • Ширина импульса – 10-6 с.

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

  • Контакт питания положительного типа — +5В;
  • Trig (Т) – выход сигнала входа;
  • Echo (R) – вывод сигнала выхода;
  • GND – вывод «Земля».

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

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

  • Подать на выход 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 мс.

#define PIN_TRIG 12
#define PIN_ECHO 11 long duration, cm; void setup() { // Инициализируем взаимодействие по последовательному порту Serial.begin (9600); //Определяем вводы и выводы pinMode(PIN_TRIG, OUTPUT); pinMode(PIN_ECHO, INPUT);
} void loop() { // Сначала генерируем короткий импульс длительностью 2-5 микросекунд. digitalWrite(PIN_TRIG, LOW); delayMicroseconds(5); digitalWrite(PIN_TRIG, HIGH); // Выставив высокий уровень сигнала, ждем около 10 микросекунд. В этот момент датчик будет посылать сигналы с частотой 40 КГц. delayMicroseconds(10); digitalWrite(PIN_TRIG, LOW); // Время задержки акустического сигнала на эхолокаторе. duration = pulseIn(PIN_ECHO, HIGH); // Теперь осталось преобразовать время в расстояние cm = (duration / 2) / 29.1; Serial.print(“Расстояние до объекта: “); Serial.print(cm); Serial.println(” см.”); // Задержка между измерениями для корректной работы скеча delay(250);
}

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

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

Все, что нам нужно сделать —  создать объект класса NewPing, указав пины, с помощью которых мы подключаем датчик расстояния и использовать методы объекта.

В нашем примере для получения расстояния в сантиметрах нужно использовать ping_cm().

#include #define PIN_TRIG 12
#define PIN_ECHO 11 #define MAX_DISTANCE 200 // Константа для определения максимального расстояния, которое мы будем считать корректным. // Создаем объект, методами которого будем затем пользоваться для получения расстояния.
// В качестве параметров передаем номера пинов, к которым подключены выходы ECHO и TRIG датчика NewPing sonar(PIN_TRIG, PIN_ECHO, MAX_DISTANCE); void setup() { // Инициализируем взаимодействие по последовательному порту на скорости 9600 Serial.begin(9600);
} void loop() { // Стартовая задержка, необходимая для корректной работы. delay(50); // Получаем значение от датчика расстояния и сохраняем его в переменную unsigned int distance = sonar.ping_cm(); // Печатаем расстояние в мониторе порта Serial.print(distance); Serial.println(“см”); }

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

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

#include #define PIN_PING 12 // Пин с Arduino соединен с пинами trigger и echo на датчике расстояния
#define MAX_DISTANCE 200 // Максимальное расстояние, которое мы способны контролировать (400-500см). NewPing sonar(PIN_PING, PIN_PING, MAX_DISTANCE); // Регулировка пинов и максимального расстояния void setup() { Serial.begin(9600); // Открывается протокол с данными и частотой передачи 115200 бит/сек.
} void loop() { delay(50); // Задержка в 50 мс между генерируемыми волнами. 29 мс – минимально допустимое значение unsigned int distanceSm = sonar.ping(); // Создание сигнала, получение параметра его продолжительности в мкс (uS). Serial.print(“Ping: “); Serial.print(distanceSm / US_ROUNDTRIP_CM); // Пересчет параметра времени в величину расстояния и вывод результата (0 соответствует выходу за допустимый предел) Serial.println(“cm”);
}

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

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

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

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

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

Источник: https://ArduinoMaster.ru/datchiki-arduino/ultrazvukovoj-dalnomer-hc-sr04/

Ссылка на основную публикацию
Adblock
detector
",css:{backgroundColor:"#000",opacity:.6}},container:{block:void 0,tpl:"
"},wrap:void 0,body:void 0,errors:{tpl:"
",autoclose_delay:2e3,ajax_unsuccessful_load:"Error"},openEffect:{type:"fade",speed:400},closeEffect:{type:"fade",speed:400},beforeOpen:n.noop,afterOpen:n.noop,beforeClose:n.noop,afterClose:n.noop,afterLoading:n.noop,afterLoadingOnShow:n.noop,errorLoading:n.noop},o=0,p=n([]),h={isEventOut:function(a,b){var c=!0;return n(a).each(function(){n(b.target).get(0)==n(this).get(0)&&(c=!1),0==n(b.target).closest("HTML",n(this).get(0)).length&&(c=!1)}),c}},q={getParentEl:function(a){var b=n(a);return b.data("arcticmodal")?b:(b=n(a).closest(".arcticmodal-container").data("arcticmodalParentEl"),!!b&&b)},transition:function(a,b,c,d){switch(d=null==d?n.noop:d,c.type){case"fade":"show"==b?a.fadeIn(c.speed,d):a.fadeOut(c.speed,d);break;case"none":"show"==b?a.show():a.hide(),d();}},prepare_body:function(a,b){n(".arcticmodal-close",a.body).unbind("click.arcticmodal").bind("click.arcticmodal",function(){return b.arcticmodal("close"),!1})},init_el:function(d,a){var b=d.data("arcticmodal");if(!b){if(b=a,o++,b.modalID=o,b.overlay.block=n(b.overlay.tpl),b.overlay.block.css(b.overlay.css),b.container.block=n(b.container.tpl),b.body=n(".arcticmodal-container_i2",b.container.block),a.clone?b.body.html(d.clone(!0)):(d.before("
"),b.body.html(d)),q.prepare_body(b,d),b.closeOnOverlayClick&&b.overlay.block.add(b.container.block).click(function(a){h.isEventOut(n(">*",b.body),a)&&d.arcticmodal("close")}),b.container.block.data("arcticmodalParentEl",d),d.data("arcticmodal",b),p=n.merge(p,d),n.proxy(e.show,d)(),"html"==b.type)return d;if(null!=b.ajax.beforeSend){var c=b.ajax.beforeSend;delete b.ajax.beforeSend}if(null!=b.ajax.success){var f=b.ajax.success;delete b.ajax.success}if(null!=b.ajax.error){var g=b.ajax.error;delete b.ajax.error}var j=n.extend(!0,{url:b.url,beforeSend:function(){null==c?b.body.html("
"):c(b,d)},success:function(c){d.trigger("afterLoading"),b.afterLoading(b,d,c),null==f?b.body.html(c):f(b,d,c),q.prepare_body(b,d),d.trigger("afterLoadingOnShow"),b.afterLoadingOnShow(b,d,c)},error:function(){d.trigger("errorLoading"),b.errorLoading(b,d),null==g?(b.body.html(b.errors.tpl),n(".arcticmodal-error",b.body).html(b.errors.ajax_unsuccessful_load),n(".arcticmodal-close",b.body).click(function(){return d.arcticmodal("close"),!1}),b.errors.autoclose_delay&&setTimeout(function(){d.arcticmodal("close")},b.errors.autoclose_delay)):g(b,d)}},b.ajax);b.ajax_request=n.ajax(j),d.data("arcticmodal",b)}},init:function(b){if(b=n.extend(!0,{},a,b),!n.isFunction(this))return this.each(function(){q.init_el(n(this),n.extend(!0,{},b))});if(null==b)return void n.error("jquery.arcticmodal: Uncorrect parameters");if(""==b.type)return void n.error("jquery.arcticmodal: Don't set parameter \"type\"");switch(b.type){case"html":if(""==b.content)return void n.error("jquery.arcticmodal: Don't set parameter \"content\"");var e=b.content;return b.content="",q.init_el(n(e),b);case"ajax":return""==b.url?void n.error("jquery.arcticmodal: Don't set parameter \"url\""):q.init_el(n("
"),b);}}},e={show:function(){var a=q.getParentEl(this);if(!1===a)return void n.error("jquery.arcticmodal: Uncorrect call");var b=a.data("arcticmodal");if(b.overlay.block.hide(),b.container.block.hide(),n("BODY").append(b.overlay.block),n("BODY").append(b.container.block),b.beforeOpen(b,a),a.trigger("beforeOpen"),"hidden"!=b.wrap.css("overflow")){b.wrap.data("arcticmodalOverflow",b.wrap.css("overflow"));var c=b.wrap.outerWidth(!0);b.wrap.css("overflow","hidden");var d=b.wrap.outerWidth(!0);d!=c&&b.wrap.css("marginRight",d-c+"px")}return p.not(a).each(function(){var a=n(this).data("arcticmodal");a.overlay.block.hide()}),q.transition(b.overlay.block,"show",1*")),b.overlay.block.remove(),b.container.block.remove(),a.data("arcticmodal",null),n(".arcticmodal-container").length||(b.wrap.data("arcticmodalOverflow")&&b.wrap.css("overflow",b.wrap.data("arcticmodalOverflow")),b.wrap.css("marginRight",0))}),"ajax"==b.type&&b.ajax_request.abort(),p=p.not(a))})},setDefault:function(b){n.extend(!0,a,b)}};n(function(){a.wrap=n(document.all&&!document.querySelector?"html":"body")}),n(document).bind("keyup.arcticmodal",function(d){var a=p.last();if(a.length){var b=a.data("arcticmodal");b.closeOnEsc&&27===d.keyCode&&a.arcticmodal("close")}}),n.arcticmodal=n.fn.arcticmodal=function(a){return e[a]?e[a].apply(this,Array.prototype.slice.call(arguments,1)):"object"!=typeof a&&a?void n.error("jquery.arcticmodal: Method "+a+" does not exist"):q.init.apply(this,arguments)}}(jQuery)}var debugMode="undefined"!=typeof debugFlatPM&&debugFlatPM,duplicateMode="undefined"!=typeof duplicateFlatPM&&duplicateFlatPM,countMode="undefined"!=typeof countFlatPM&&countFlatPM;document["wri"+"te"]=function(a){let b=document.createElement("div");jQuery(document.currentScript).after(b),flatPM_setHTML(b,a),jQuery(b).contents().unwrap()};function flatPM_sticky(c,d,e=0){function f(){if(null==a){let b=getComputedStyle(g,""),c="";for(let a=0;a=b.top-h?b.top-h{const d=c.split("=");return d[0]===a?decodeURIComponent(d[1]):b},""),c=""==b?void 0:b;return c}function flatPM_testCookie(){let a="test_56445";try{return localStorage.setItem(a,a),localStorage.removeItem(a),!0}catch(a){return!1}}function flatPM_grep(a,b,c){return jQuery.grep(a,(a,d)=>c?d==b:0==(d+1)%b)}function flatPM_random(a,b){return Math.floor(Math.random()*(b-a+1))+a}