Ардуино радар: делаем акустический радиолокационный дисплей

Акустический радиолокационный дисплей с Ардуино

21 июня в 17:19

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

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

Шаг 1. Комплектующие и инструменты

На фото выше можно увидеть основные комплектующие Ардуино радара. Конструкция проста. В из инструментов всё, что вам нужно, — это два сверла, острый нож, пару резаков и паяльник.

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

Следующие детали были куплены в обычном магазине:

  • 1 — пластиковый контейнер для пищевых продуктов.
  • 1 — миниатюрный переключатель.
  • 1 — лента (используется для крепления проводов от датчика).
  • 1 — лента (используется для крепления датчика).
  • 1 — кусок из алюминия толщиной 20 мм размером 40 х 55 мм.
  • 6 — 9 мм нейлоновых прокладок.
  • 3 — кабельные стяжки.
  • 13 — болтики 3 мм x 6 мм.
  • 1 — 3-мм гайка.
  • 4 — болтики 4 мм x 10 мм.
  • 2 — 4 мм гайки.

Эти детали заказаны на АлиЭкспресс:

  • 1 — микроконтроллер Arduino Uno R3 в комплекте с USB-кабелем.
  • 1 — 28BJY-48 5-вольтовый шаговый двигатель в комплекте с контроллером ULN2003.
  • 1 — 5-миллиметровый латунный шестигранный вал для колесной пары для моделей автомобилей.
  • 1 — ультразвуковой датчик HY-SRF05 (или HC-SRF04).

Шаг 2. Схема подключения

Схема подключения показана на рисунке выше. Дополнительная модификация (на диаграмме синее соединение) показана ниже:

Эта модификация одинакова для ультразвуковых датчиков HC-SR04 и HY-SRF05 и позволяет обнаруживать множественные эхо-сигналы. Если у вас есть HC-SR04, интегральная схема к которой вы припаиваете провод обозначается U2.

Шаг 3. Как это работает

Механика

Все части расположены внутри пластмассового контейнера для пищевых продуктов. Питание обеспечивается от USB-порта. Схема содержит Arduino, ультразвуковой датчик, шаговый двигатель и микропереключатель для перемещения датчика в его «стартовое» положение. Микропереключатель необходим, так как невозможно вращать шаговый двигатель вручную из-за его внутренней зубчатой ​​передачи 64:1.

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

Шаговый двигатель 28BJY-48 имеет «угол шага» 5,625/64 градуса, что означает, что шаги на 1 градус невозможны (хотя сетка обозначена на 0,80 градуса).

К счастью:

180 / (угол поворота) = 180*64 / 5.625 = 2048

который равномерно делится на 8. Если мы увеличим число от 0 до 2048 и разделим на 8, получится 256 вариантов, когда мы получим остаток от нуля. Мы просто отправляем «пинг», когда остаток равен нулю. Это соответствует «пингованию» каждого Пи/256 радианов или 0.703125 градусов.

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

После дисплей принимает управление и постоянно опрашивает Ардуино относительно следующих данных:

  • Азимут
  • Дистанция1 (Distance1)
  • Дистанция2 (Distance2)
  • Направление

Затем на экране отображаются «расстояние(-я)» для каждого «азимута». Информация «направление» используется для создания отображения (визуализации) «точек», появляющихся за «лучом» при вращении.

Arduino автоматически переходит к следующей позиции «ping», когда данные отправляются на дисплей.

Программное обеспечение «Processing 3», используемое для записи дисплея и может быть загружено с processing.org.

«Processing 3» поддерживает 2D и 3D-графику и очень похожа на Arduino IDE (англ. — Integrated Development Environment). Основными визуальными отличиями являются «графическое окно» при запуске кода и использование функции «draw()» вместо «loop()» Ардуино.

Шаг 4. Экран

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

Графика содержит ряд «дуг» и «линий». На фотографии ниже показаны угловые надписи, которые позже были отброшены в пользу горизонтального текста, который легче читать.

Показывает красную линию, изображающую «луч». Текст теперь горизонтальный.

Красная линия на фото выше была повернута на 0.80 градусов по 256 азимутальным позициям. На фотографии ниже внешние части сетки не покрываются, поскольку ширина луча слишком узкая. Это приводит к некоторым странным артефактам.

Увеличение ширины луча устранило эти артефакты.

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

Цветовая схема в итоге была изменена, чтобы добавить оттенок реализма.

Анимация

Анимированные части графического дисплея используют 3D-графику, чтобы значительно упростить код. Чтобы понять, как это возможно, сделаем «30-градусную линию» с постоянным радиусом от начальной координаты XY (0,0).

2D-графика требует использования sin (30) и cos (30) для вычисления конечных координат XY линии:

X=cos(30)*radius = 0.866*radius Y=sin(30)*radius = 0.5*radius line(0,0,X,Y);

3D-графика не требует использования тригонометрии. Мы просто поворачиваем координаты сетки XY вокруг оси Z, затем рисуем горизонтальную линию.

pushMatrix(); //сохранить наши текущие координаты сетки rotateZ(radians(30)); //повернуть наши координаты XY-сетки вокруг оси Z line(0,0,radius,0); //нарисовать «горизонтальную» линию на повернутой сетке popMatrix(); //restore our grid coordinates

В любом случае это работает, но второй метод поддается «ping» интервалам Пи/256 радианов.

Затухающие линии

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

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

Шаг 5. Монтаж кронштейна

Шаблон сверления для подходящего кронштейна из алюминия показан выше. Расположите два наружных «крепежных отверстия» ниже датчиков передачи (T) и приема (R). Лучшие результаты получаются, если сенсор вращается вокруг приемного (R) датчика, а не на полпути между двумя датчиками. Три отверстия дадут возможность поэкспериментировать.

Шаг 6. Сборка

Отверстие для кабеля USB

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

Вал-расширитель

Замените один из 4 мм «зажимных винтов» в удлинителе вала болтом 4 мм x 10 мм. Этот болт используется для активации переключателя.

Переключатель

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

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

Остальные компоненты

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

Монтаж датчика

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

Фото выше показывает вид сбоку узла датчика. Провода привязаны к кронштейну. Этот «предохранитель» предотвращает нежелательное перемещение кабеля при вращении датчика. Также обратите внимание на «серый» провод, подключенный к контакту 10 IC1. Этот провод является дополнительным и передает вторичные эхо-сигналы в Arduino.

Шаг 7. Установка программного обеспечения

Установите всё что нужно в следующем порядке, как написано ниже.

Arduino IDE

Загрузите и установите Arduino IDE (интегрированное окружение разработки), если еще не установлена. Скачать можно здесь.

Processing 3

Загрузите и установите «Processing 3» отсюда.

Передатчик акустического радара

Скопируйте содержимое файла ниже в «эскиз» Arduino, сохраните его, а затем загрузите в свой Arduino Uno R3:

Скачать arduino_radar_sender.ino

Закройте Ardino IDE, но оставьте кабель USB подключенным.

Приемник акустического радара

Скопируйте содержимое файла ниже в скетч для «Processing 3» (может понадобиться переименовать расширение .ino в .pde):

Скачать arduino_radar_receiver.ino

Шаг 8. Итоговый результат

Нажмите левую кнопку «Запустить» (Run) в окне «Processing 3», и ваш проект запустится. Попробуйте обнаружить разные объекты.

Для объектов поблизости требуется, чтобы датчик передачи (Т) был низким, чтобы предотвратить проход «луча» над объектом.

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

На фото показан собранный радар Ардуино.

На этой фотографии показан фактический снимок экрана из семи объектов.

Азимут и расстояние каждого первичного объекта показаны красным цветом. Любое эхо от вторичного объекта отображается синим цветом. Без изменения датчика вы увидите только красные объекты.

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

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

Источник: https://ArduinoPlus.ru/arduino-radar/

Самодельный радар с монитором на Ардуино

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

Но что-то похожее, причём совсем не сложное и не дорогое (пару тысяч рублей) соорудить возможно. Итак, на основе популярного Ардуино вы можете сделать такую себе мини РЛС с помощью ультразвукового детектора и собственно платы Arduino. Схема подсмотрена на сайте «Мехатроник».

 Все, что нужно для этого проекта: ультразвуковой датчик для обнаружения объектов, маленький серводвигатель для поворота датчика и плата Arduino для управления ими. Ну и макетка с проводами.

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

Теперь прикрепите штырьки, на которые припаяем 4 провода для подключения датчика.

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

Мы подключили ультразвуковой датчик HC-sr04 к выводам 10 и 11, а серводвигатель к 12 контакту на плате Arduino.

Исходный код

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

 Здесь будем получать значения для угла и расстояние, измеренное с помощью датчика с платы Arduino на обработку IDE с помощью функции SerialEvent(), которая считывает данные из последовательного порта, и будем ставить значения угла и расстояния в переменные iAngle и iDistance. Эти переменные будут использоваться для построения линии обнаружения объектов.

Для рисования линии, которая движется вдоль радара, сделана функция drawLine(). Переменная iAngle используется как линия, что перерисовывается для каждой ступени.

Для прорисовывания обнаруженных объектов служит функция drawObject(). Она получает расстояние от ультразвукового датчика, преобразует его в пикселах, и в сочетании с углом датчика рисует объект на радаре — экране ЖК монитора.

Текст на экране — функция drawtext(), которая рисует полосы на конкретных местах.

Все эти функции вызываются в основном функцией Draw (), которая повторяется все время и рисует на экране картинку окружающего пространства. Также здесь используется имитации размытия движения и медленное затухание движущейся линии.

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

Видео

А по этой ссылке скачайте полный исходный код обработки радиолокационной станции на Ардуино.

Источник: http://radioskot.ru/blog/samodelnyj_radar_s_monitorom_na_arduino/2016-09-30-459

Радар на arduino

Случилось так, что попалась мне на глаза arduino с некоторым количеством сенсоров. Наигравшись с blink-ами и analog ридами, разумеется, пришел к мысли о покупке собственной платы.

Пробежавшись беглым взглядом по списку готовых шилдов, открыл ебей и заказал Funduino Mega2560 (аналог arduino mega 2560), и некоторое количество дополнительных девайсов к нему.

Среди самых интересных заказанных шидов был цветной TFT дисплей с разрешением 320×240, имеющий 16 битную шину и резистивный тачскрин.

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

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

Теперь это «мама»

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

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

Читайте также:  Невидимая революция: как изменится мир в ближайшие годы - arduino+

Еще бы лазер на 10мВт и — бойтесь мухи!!!

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

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

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

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

#include //Загрузка библиотеки экрана
#include //Загрузка библиотеки сервы
#include //Загрузка библиотеки датчика
Servo servoMain; // Инициализация сервы
Ultrasonic ultrasonic(5, 6);//Инициализация контактов датчика
UTFT myGLCD(ITDB32S, 38,39,40,41);//Инициализация дисплея
int i = 0; //Переменная отвечающая за положение сервы
int dist_cm = 0;//Переменная для хранениия данных датчика
boolean trig = false; //Направление вращения
void setup()
{ servoMain.attach(3); // Серва присоединена к 3 выводу myGLCD.InitLCD(); //Создаем обьект дисплея myGLCD.clrScr();//Очищаем дисплей Serial.begin(9600);//Инициализируем канал вывода данных. Необязательно
} void loop()
{ if(!trig){i++;}//Если trig false увеличиваем i на еденицу каждую итерацию if(trig){i—;}//Если trig true уменьшаем i на еденицу каждую итерацию dist_cm = ultrasonic.Ranging(CM); //Записываем в переменную данные датчика myGLCD.setColor(55,255,55); //Устанавливаем цвет рисования обьекта на экране myGLCD.fillCircle(i, (99 — dist_cm)*2, 2);//Рисуем круг радиусом 2 пикселя, в координатах x = i, y = данные датчика if(i==319) //Если i достигла края экрана { trig = true;//Меняем значение trig на true myGLCD.clrScr();//Очищаем экран } if(i==0) { trig = false;//Меняем значение trig на false myGLCD.clrScr();//Очищаем экран } delay(5);//Задержка в 5мс. Необходима для исключения влияния помех сервы на датчик servoMain.write(i/2); //Поворачиваем серву на значение i/2 delay(5);//Задержка в 5мс. Необходима для исключения влияния помех сервы на датчик
}

Однако не обошлось без проблем. Оказалось что тока выдаваемого USB ну никак не достаточно для полноценной запитки только arduino и дисплея, не говоря уже о серве с УЗ датчиком. Пришлось дополнительно запитать плату от 9 вольтового БП. Однако даже в этом случае УЗ выдавал не верные данные, а его предел измерения ограничивался 50 см в глубину. И это не считая массы помех, подмешиваемых в окончательные данные с датчика. Источником помех, как оказалось, являлась сервомашинка, которая при вращении давала серьезные наводки на УЗ датчик. В результате серву, я запитал от второго блока питания, соединив только минусовой провод с общей цепью. Несмотря на все принятые меры, наводки частично остались, что заметно как на данных с датчика, так и на изображении с дисплея.

Источник: https://habr.com/post/175495/

Разработка радиолокатора с использованием HC-SR04 и Arduino

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

Оказывается, не только подводные лодки и и физики могут использовать ультразвуковые волны в своих корыстных (и не очень) целях.

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

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

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

  • Arduino Uno
  • Сервомоторы SM-S4303R
  • Источник питания 5 В DC
  • Модуль HC-SR04 — ультразвуковой датчик расстояния
  • Металлический конструктор — для механической части проекта
  • Макетная плата и проводники
  • Компьютер с USB кабелем для передачи о обработки данных
  • Ну и всякая мелочевка…

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

Видео завершенного эхолокатора с использованием ультразвукового датчика расстояния и Arduino приведено ниже:

Теоретическая база

Радар (radar (radio detection and ranging)) работает по принципу излучения и получения коротких импульсов электромагнитной радиации. Он отправляет радиоволну в заданном направлении в пространстве. Когда эта волна достигает объекта, она отражается от объекта и поступает обратно на радар, который отслеживает время, которое прошло с момента генерации импульса.

Если знать, с какой скоростью электромагнитный импульс распространяется в той или иной окружающей среде (спойлер: в воздухе скорость составляет около 300,000 км или около 7,5 раз вокруг Земли за одну секунду), можно рассчитать расстояние до преграды, от которой он отразился.

Это расстояние составит половину рассчитанного пути волны (так как импульс перемещается от радара к объекту и потом обратно на радар).

Сонар (sonar (sound navigation and ranging)) работает по тому же принципу, что и радар, но использует короткие звуковые импульсы (“pings”). В основном сонары используются на подводных кораблях и субмаринах. Дельфины и летающие мыши используют тот же принцим для обнаружения препятствий.

HC-SR04 — это дешевый ультразвуковой датчик расстояния, который работает по принципу, описанному выше. Он излучает короткие ультразвуковые импульсы и измеряет время, через которое импульс вернется обратно. В зависимости от времени и скорости звука (около 340 метров в секунду) можно рассчитать расстояние до объекта, от которого отразилась ультразвуковая волна.

После получения отраженного импульса, выход сенсора переключается с 0 В (low) на +5 В (high). Выход остается в режиме high, пока приемник (ресивер) не обнаружит первый отраженный сигнал. После этого происходит перезагрузка и устанавливается режим low. Таким образом, время, пока выход находится в состоянии high, равно времени распространени звуковой волны до преграды и обратно.

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

В даташите нашего ультразвуковой сенсора указано, что угол излучаемой волны составляет около 30°, так что для того, чтобы обнаружить объекты на 360 градусов, нам надо обеспечить его вращение. Для этого нам понадобится вращающаяся платформа с серводвигателем в основании.

Сервы — это двигатели, которые управляются электрическими импульсами. Можно выделить два типа серводвигателей: те, которые вращаются без ограничений и те, у которых ротор перемещается с заранее предусмотренным «шагом».

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

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

В принципе, серводвигатель с управлением по углу поворота ротора — более практичный вариант для сканирующего радиолокатора.

Вы можете обеспечить поворот выходного вала, например, на 5°, снять показания, передать информацию о расстоянии до объекта на ваш контроллер или персональный компьютер, сделать еще один поворот и так далее…

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

Сопротивление на выходе потенциометра можно преобразовать в угол поворота вала. Но в данном случае реализуется другой вариант: в этом случае контролируется скорость вращения вала двигателя и рассчитывается угол в зависимости от скорости. Конструктивное исполнения самого механизма радиолокатора показана на рисунке ниже:

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

Каждая пластина одному из двух контактов на Arduino, которые поддерживают работу прерываний. Количество и номера контактов с прерываниями зависят от модели Arduino, которая используется. На Arduino Uno это два пина: пины 2 и 3). Пины на Arduino подключены к контакту + 5 Вольт через подтягивающие резисторы.

В результате, фольга и пружина выполняют роль кнопки-переключателя. Когда контакт не замкнут — пружина не прижата к фольге — на контакте Arduino 5 В. Когда появляется контакт, соответствующий пин зазенляется и напряжение на нем падает до 0 В.

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

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

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

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

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

После этого проводится вторая итерация калибровки — еще 20 секунд отработки указанного алгоритма. Новые итерации будут повторяться, пока разница между периодами не составит меньше 1/10 секунды. Обычно для этого необходимо 3-4 итерации.

Обмен данными с компьютером

Есть очень простой метод обмена данными между Arduono и персональным компьютером через USB кабель. Подключение реализуется по серийному порт, который дает возможность передавать и принимать данные. В нашем случае Arduino передает данные на персональный компьютер, на котором запущена программа для визуализации показаний радиолокации.

Основная часть программы для визуализации данных с сонара написана на языке программирования Scala. На Java написана небольшая часть кода, которая отвечает за обмен данными с Arduino. За основу был взят вот этот пример this code example с официального сайта Arduino.

В программе добавлен кольцевой буфер (ссылка на API) для хранения данных, которые получены с Arduino без риска переполнения буфера. В скетче Arduino используется функция serialEvent для обработки поступающих данных.

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

Программа запускает и останавливает работу эхолокатора, посылая строки “CONT” и “STOP” на плату Arduino. Как только Arduino получает строку “CONT”, отсылается управляющий сигнал на серву для начала вращения.

Когда серводвигатель работает, Arduino подает команды на ультразвуковой датчик расстояния, который излучает ультразвуковые волны и рассчитывает время до приема отраженной волны. Для снятия показаний с ультразвукового датчика расстояния, использовалась отличная библиотека NewPing library.

Процесс измерений можно увидеть на осциллограмме на видео в начале статьи. Для этого обратите внимание на уровни напряжений high и low на выходе сенсора.

Каждый раз, когда Arduino получает значение расстояния, контроллер проверяет время, которое прошло с момента последнего изменения направления вращения ротора Arduino двигателя и конвертирует это время в угол поворота. Этот угол характеризует угол поворота эхолокатора в полярной системе координат.

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

Скриншот разработанной программы для эхолокации приведен ниже. Красной линией указывается текущее направление. Старые данные постепенно затухают.

Отображение данных с эхолокатора и функция распределения точки

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

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

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

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

Подобную проблему можно решить с помощью видеокамеры. При использовании видеокамеры с Arduino вы можете воспользоваться функцией распределения точки (ФРТ) (point spread function). Камеры не идеальны.

Читайте также:  Установка и подключение библиотек в arduino ide - arduino+

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

Справа — фото той же точки, которое сделано камерой с большим уровнем шумов.

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

Можно провести аналогию, что ФРТ — это изображение очень маленькой (меньше чем один пиксель) точки. Используя самую крутую камеру, вы никогда получите изображение, идентичное оригиналу. То есть, шумы будут всегда.

Если мы знаем spread function нашей камеры, можно корректировать изображение с помощью метода обратной свертки. Это позволяет получить более четкое изображения после его обработки. Кстати, именно эта методика использовалась первые три года на Hubble Space Telescope’s.

Измеряя ФРТ телескопа, астрономы могли корректировать изображения на Земле (через три года были внесены некоторые коррективы в работу телескопа и необходимость в подобной обработке отпала).

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

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

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

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

То есть, использовать наш ультразвуковой датчик, Arduino и предложенный софт в качестве полноценного 3D сканера в медицине, мы не сможем.

А каким же образом реализуются такие сканеры, ведь они работают по тому же принципу и могут обеспечить формирования полную 2D и 3D модель человеческого тела с точным указанием расположения внутренних органов? Разница в принципе работы сенсора.

Медицинский ультразвуковой датчик расстояния посылает короткие ультразвуковые импульсы и ждет их возврата.

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

Таким образом сканер может построить 3D поверхность всего человеяеского тела. Вторая особенность промышленных 3D сканеров: ультразвуковая волна имеет максимально узкую направленность. То есть, вместо 30° покрытия, эти сенсоры генерируют сфокусированную волну.

Так что улучшать предложенный сонар на Arduino есть куда. Во-первых, не стоит использовать серву с управлением по скорости. Конструкция будет гораздо проще, а следовательно — точнее, если использовать серводвигатель с управлением по углу поворота выходного вала.

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

Кроме того, даташит на наш датчик говорит, что минимальное расстояние до объекта, которое контролируется, составляет 2 сантиметра. Над этим тоже можно подумать.

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

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

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

Источник: http://arduino-diy.com/arduino-radiolokator-s-ispolzovaniyem-HC-SR04

[ARDUINO] Собираем собственный РАДАР!

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

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

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

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

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

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

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

Или же получить профессию, например программиста, веб-дизайнера, SEO-оптимизатора и прочее.

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

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

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

Еще для взрослых людей очень хорошо подойдет тема создания и развития собственного бизнеса.

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

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

Желаем Вам приятного и полезного просмотра!

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

Источник: https://imperiya.by/video/zDNu7OBjr3G/ARDUINO-sobiraem-sobstvennyiy-radar.html

Собираем персональный радар малого радиуса действия

Chris

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

https://www.youtube.com/watch?v=fGORD459tZY

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

Описание и цель проекта

Целью проекта было создание функционирующего радара. От системы требуется лишь измерять расстояние под углом в 90 градусов, как показано в примере выше. В зависимости от выбранного сенсора, система функционирует в пределах 4-30 см, 20-150 см и 1-5,5 м.

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

Электронные детали

  • Стабилизатор напряжения LM7805 5 В
  • Микроконтроллер PIC18F452
  • ИК Сенсор GP2D120
  • Кварцевый резонатор на 4 или 8 MHz
  • Переключатель
  • Конденсатор
  • 30-тиконтактный разъем
  • 5 триггеров 74LS373
  • Макетная плата
  • Припой
  • 36 индикаторов
  • Провод 30 AWG
  • Инструменты для работы с проводами
  • Паяльник

Подробный список запчастей

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

Появились три новых объекта, не указанных до этого в проекте: сервосистема, 74HCT373 и ИК сенсоры. Скоро появится описание и ИК датчиков; что касается 74HCT373 — ниже будет пред ставлен краткий обзор.

Вы всегда можете свериться с спецификацией микросхем, просто задав поиск по запросу «74HCT373».

74HCT373

 

74HCT373

Восьмиразрядная микросхема, содержащая в себе трехстабильный триггер. Проще говоря, данный чип способен хранить 8 бит цифровой логики и удерживать в памяти до стирания или изменения ее посредством LE-Latch Enable вывода.

Принципы работы

  • Управляющие выводы LE и OE
  • 8 Ввод данных D0-D7
  • 8 Вывод данных D0-D7

Питание (Vcc & GND.) Активация вывода (ОЕ) позволяет Q0-Q7 выводить данные на данный момент находящиеся в D-триггерах.

Активация триггера (LE) позволяет перезапись данных, содержащихся на D0-D7, в D- триггер.

Обзор схемы

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

  1. Мы сможем программировать изображения с разрабатываемой платы.
  2. Мы будем контролировать сервосистему.
  3. Мы будем снимать данные с ИК сенсора расстояния.
  4. Мы установим 36 LEВ индикаторов для отображения вывода данных, полученных с ИК сенсора.

Нажмите для увеличения

Характеристики схемы

Питание

  • Питание осуществляется через аккумулятор на 9В, подключенный к LM7805 с конденсатором 1uF, подключенным к выводу/заземлению для обеспечения бесперебойного постоянного тока LM7805.
  • Программный цикл
  • Программирование осуществляется посредством подсоединения двух разъемов от контроллера к программатору, предоставляя первому разъему программатора доступ к MCLR*/Vpp-Pin1 на контроллере. В целях безопасности установлен выпрямительный диод.
  • ИК Сенсор Расстояния
  • ИК Сенсор использует один разъем контроллера PIN 2 — RA0. Используются аналоговые возможности этого вывода для получения значения АЦП, так как с ИК сенсора снимается только аналоговый сигнал. Данное значение сообщает, есть ли что-то в радиусе охвата сенсора.

LED индикация

В общей сложности еcть 40 LED индикаторов. Каждый чип 74HCT373 контролирует до 8 индикаторов; так как 40/8=5, нам нужно 5 схем 74HCT373, чтобы управлять всеми 40 индикаторами. Необходимо отметить на схеме, что для всех 5 чипов используется одна шина данных.

Теория

Данная разработка использует три основных прибора для создания персонального радара. ИК сенсор подключается к микроконтроллеру, и затем выводится на сегмент индикаторов. Предоставляется наглядная демонстрация этого процесса:

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

Использование

Итак, взглянем на окончательный вид прибора:

Таков внешний вид собранного прибора. Перейдем к следующему разделу и продолжим сборку прибора.

Дизайн прибора

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

нажмите, для увеличения

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

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

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

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

Скачать программу:
ir_range_project.c

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

  • Управление Сервосистемой
  • Управление LED-индикацией
  • ввод A/D/
Читайте также:  Делаем реальные часы при помощи чипа arduino ds3231 - arduino+

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

Управление Сервосистемой

Управление сервосистемой осуществляется таймерами и прерываниями.

Двумя отдельными прерываниями, срабатывающими одновременно для создания желаемого звука, генерируется сигнал в 50 Ггц, и указатель сервосистемы двигается маленькими шагами регулируя скрипящий звук.

Регулирование LED индикации. Индикаторы регулируются триггерами 74LS373/74HCT373. Система постоянно обновляет данные триггера, выводимые на индикаторы. А/Ц Ввод

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

Завершена сборка и настройка прибора — нужно протестировать его. В заисимости от используемого вами сенсора, индикация будет разная. Сенсоры на выбор GP2D120, GP2Y0A21YK и GP2Y0A700K0F.

Данные и наблюдения

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

На втором видео (на первой страничке) тестируются индикаторы 20 см — 150 см и 1 м — 5.5 м, позволяющие преодолевать более серьезные препятствия. Посмотрите, чтобы понять, о чем идет речь.

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

Обзор персонального радара

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

Действия, которые нужно предпринять

Для увеличения радиуса охвата сенсора планируется использование ультразвуковых датчиков, эквивалентных описанным выше «звуковым сенсорам», передавая данные о расстоянии от вас до объекта. Диапазон ультразвука шире чем у инфракрасного излучения, и он более надежен в неблагоприятных условиях.

Заключение

Проект был увлекательным изучением сенсоров ИК излучения. Он демонстрирует, что результаты могут быть получены и использованы реально. Многие дальнейшие проекты могут быть разработаны на базе этого.

Источник: https://www.rlocman.ru/shem/schematics.html?di=45605

Датчик расстояния Ардуино 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/

Ссылка на основную публикацию