ультразвуковой сонар радар hc-sr04 и urm37

Идем летучих мышек пугать!
Забавная штука — роботов научили определять препятствия с помощью ультразвука, а обрабатывает сигнал Ардуино.
Здесь несколько неожиданное применение — для спелеолога, хочется чтобы он составил карту пещеры по данным измерений прямо пока лезем,
и вывел ее на планшет например. Поворота датчика на 180 градусов хватит, 6 метров чувствительности и точности 1 см — вообще идеально, четкости только будет мало.
Такая система есть , только с лазерным дальномером, Disto-X.

Основное преимущество ультразвука.. он видит сквозь стены только может с другим датчиком — титанат бария с покрытием серебром. Это второй этап будет- пластина есть от эхолота, это он и есть вообще то — можно взять самую простую от увлажнителя, но есть и советская 6 мм и 50 в диаметре, подписана 70 килогерц 600 вольт. Такой датчик сканирует на километр в глубину если в воде, он и как передатчик и очень чувствительный приемник. ( а может узи разобрать.. )

* это не готовое изделие да и не мое пока. Взять исправить и поменять кое что, записывать например как у эхолота синими чернилами на ленту из бумаги, получится пещере узи и экг сразу. Ниже будет как вариант присобаченый дисплейчик и скетч для ардуино. Радар кстати .. нормальный на отражательном клистроне 90 ватт — сойдет как вариант, и п о цене не сильно дороже лазерного дальномера, не на порядок, и тоже сигнал проходит на метра 2 — 3 и больше через породу. Георадар — не, здесь не буду придумывать, есть уже готовый. Да еще излучение магнетрона это та же микроволновка зажарит на раз два три. Лампе надо 800 вольт и примерно парочку ампер, это без генератора сложновато.

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

С появлением Arduino, идея о системе ультразвукового зрения не покидают многих.http://arduino-diy.com&dtd=644

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

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

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

В проекте использовались сервомоторы SM-S4303R, которые обеспечивают вращение ротора без ограничения угла поворота. Не самый популярный ход, но зато процесс разработки становится гораздо интереснее. http://arduino-diy.com&dtd=1733

Видео завершенного эхолокатора с использованием ультразвукового датчика расстояния и Arduino приведено ниже: https://www.youtube.com/embed/Le5e26gyc0M

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

Радар (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). Камеры не идеальны. Всегда есть определенный уровень шума, который зависит от расстояния до объекта. ФРТ — это способ описать эти шумы. Представьте, что вы делаете фотография маленькой черной точки на белом фоне. На рисунке ниже слева показана маленькая черная точка на белом фоне. Справа — фото той же точки, которое сделано камерой с большим уровнем шумов.Функция распределения точки

Обратите внимание, что очертания точки слева очень четкие. Если же фотография делается плохой камерой, точка будет выглядеть как показано справа. Во-первых, ее размеры кажутся больше, а границы размыты. Можно провести аналогию, что ФРТ — это изображение очень маленькой (меньше чем один пиксель) точки. Используя самую крутую камеру, вы никогда получите изображение, идентичное оригиналу. То есть, шумы будут всегда. Если мы знаем spread function нашей камеры, можно корректировать изображение с помощью метода обратной свертки. Это позволяет получить более четкое изображения после его обработки. Кстати, именно эта методика использовалась первые три года на Hubble Space Telescope’s. Измеряя ФРТ телескопа, астрономы могли корректировать изображения на Земле (через три года были внесены некоторые коррективы в работу телескопа и необходимость в подобной обработке отпала).

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

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

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

А каким же образом реализуются такие сканеры, ведь они работают по тому же принципу и могут обеспечить формирования полную 2D и 3D модель человеческого тела с точным указанием расположения внутренних органов? Разница в принципе работы сенсора. Медицинский ультразвуковой датчик расстояния посылает короткие ультразвуковые импульсы и ждет их возврата. Но, в отличие от нашего датчика, он не контролирует промежуток времени, через который вернулся первый отраженный сигнал, а фиксирует все отраженные сигналы через на протяжении некоторого периода времени. Каждый принятый импульс является отраженной от определенного органа ультразвуковой волной. Таким образом сканер может построить 3D поверхность всего человеяеского тела. Вторая особенность промышленных 3D сканеров: ультразвуковая волна имеет максимально узкую направленность. То есть, вместо 30° покрытия, эти сенсоры генерируют сфокусированную волну.

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

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

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

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

https://diyprojects.io/hc-sr04-ultrasound-vs-sharp-gp2y0a02yk0f-ir-vl53l0x-laser-solutions-choose-distance-measurement-arduino-raspberrypi/

радар с ардуино и с этим датчиком — собирать из набора. (там уже есть програмка выводящая измерения на компьютер — по крайней мере нарисовано на экране.) Платформа вращается. датчик можно заменить на более современный набор с передачей и расшифровкой кода rc5 sony теми же ультразвуковыми передатчиками и приемниками. Стоит на али 7 долларов . Именно его пробовал как он измеряет расстояния в домике до 6 метров, точно довольно — точность 1 см.

* есть и лазерный датчик но он до 2 метров только и как мне кажется не так интересно. vl53l0x .

есть еще в сети вариант подключения сразу 4-х датчиков и их опрос из программы sketch arduino для примера.

https://aliexpress.ru/item/32956670149.html а оно надо самим придумывать программу и все собирать.. все готово и открыто. Я как программист скажу что проще посидеть за монитором день вечер и потом раздать всем результат работы, кому интересно посмотрят. Подправить для себя или что доделать тоже можно. Не так как некоторые , срезают на деталях название и все прячут с тройной защитой, лишь бы не стащили. Не , возьмут у других где открыто и еще лучше что можно разобраться и что то улучшить или доработать.

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

Еще. чтобы не просто так копировать — купил на али немножко другой датчик за 18 долларов — он на декодере RC5 от Сони, прямоугольная такая микросхема. Сенсоры там от URM37, hc- sr04. 7 метров рисует — пишет цифру на дисплее.

Ультразвуковой радар на Arduino и Processing.

Ноябрь 28, 2017 http://psenyukov.ru

Чтоб сделать Ультразвуковой радар нам понадобится:

Arduino uno : http://ali.pub/1th4sk

Ультразвуковой дальномер HC-SR04: http://ali.pub/22b4n1

Servo: http://ali.pub/22b4xq

Среда разработки Processing: https://www.processing.org/download/

Ультразвуковой радар – это радар который с помощью ультразвука, в данном случае с помощью датчика ультразвука hs-sr04, может определить какой – либо объект.

Работает данный проект таким образом: Ультразвуковой дальномер крепится на сервомашинку, и начинает поворачиваться на 90 градусов.  В свою очередь программа написанная в среде Processing это демонстрирует визуально в виде радара. Как только объект или препятствие ближе чем 40 см на радаре это все визуально показывается в виде красных линий. выгляди это вот так:

Скетч для среды разработки Processing: https://yastatic.net/safeframe-bundles/0.69/1-1-0/render.html

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129import processing.serial.*; import java.awt.event.KeyEvent; import java.io.IOException; Serial myPort;  String angle="";String distance="";String data="";String noObject;float pixsDistance;int iAngle, iDistance;int index1=0;int index2=0;PFont orcFont; void setup() { size (1366, 700);smooth();myPort = new Serial(this,"COM3", 9600); myPort.bufferUntil('.');  } void draw() { fill(98,245,31); noStroke();fill(0,4); rect(0, 0, width, 1010);  fill(98,245,31);  drawRadar(); drawLine();drawObject();drawText();} void serialEvent (Serial myPort) {  data = myPort.readStringUntil('.');data = data.substring(0,data.length()-1); index1 = data.indexOf(","); angle= data.substring(0, index1); distance= data.substring(index1+1, data.length());   iAngle = int(angle);iDistance = int(distance);} void drawRadar() {pushMatrix();translate(683,700); noFill();strokeWeight(2);stroke(98,245,31); arc(0,0,1300,1300,PI,TWO_PI);arc(0,0,1000,1000,PI,TWO_PI);arc(0,0,700,700,PI,TWO_PI);arc(0,0,400,400,PI,TWO_PI); line(-700,0,700,0);line(0,0,-700*cos(radians(30)),-700*sin(radians(30)));line(0,0,-700*cos(radians(60)),-700*sin(radians(60)));line(0,0,-700*cos(radians(90)),-700*sin(radians(90)));line(0,0,-700*cos(radians(120)),-700*sin(radians(120)));line(0,0,-700*cos(radians(150)),-700*sin(radians(150)));line(-700*cos(radians(30)),0,700,0);popMatrix();} void drawObject() {pushMatrix();translate(683,700); strokeWeight(9);stroke(255,10,10); pixsDistance = iDistance*22.5; // 40 cm if(iDistance<40){ line(pixsDistance*cos(radians(iAngle)),-pixsDistance*sin(radians(iAngle)),700*cos(radians(iAngle)),-700*sin(radians(iAngle))); } popMatrix(); } void drawLine() { pushMatrix(); strokeWeight(9); stroke(30,250,60); translate(683,700); line(0,0,700*cos(radians(iAngle)),-700*sin(radians(iAngle))); popMatrix(); } void drawText() { pushMatrix(); if(iDistance>40) {noObject = "Out of Range";}else {noObject = "In Range";}fill(0,0,0);noStroke();rect(0, 1010, width, 1080);fill(98,245,31);textSize(25);text("10cm",800,690);text("20cm",950,690);text("30cm",1100,690);text("40cm",1250,690);textSize(40);text("Object: " + noObject, 240, 1050);text("Angle: " + iAngle +" °", 1050, 1050);text("Distance: ", 1380, 1050);if(iDistance<40) {text("        " + iDistance +" cm", 1400, 1050);}textSize(25);fill(98,245,60);translate(390+960*cos(radians(30)),780-960*sin(radians(30)));rotate(-radians(-60));text("30°",0,0);resetMatrix();translate(490+960*cos(radians(60)),920-960*sin(radians(60)));rotate(-radians(-30));text("60°",0,0);resetMatrix();translate(630+960*cos(radians(90)),990-960*sin(radians(90)));rotate(radians(0));text("90°",0,0);resetMatrix();translate(760+960*cos(radians(120)),1000-960*sin(radians(120)));rotate(radians(-38));text("120°",0,0);resetMatrix();translate(840+900*cos(radians(150)),920-960*sin(radians(150)));rotate(radians(-60));text("150°",0,0);popMatrix(); }

Здесь главная строчка это ” myPort = new Serial(this,”COM3″, 9600);” здесь нужно указать номер ком порта к которому подключена ардуино, чтоб брать из ком порта информацию посылаемую ардуинкой.

Ссылка на скетч processing: https://yadi.sk/d/43u3Uwki3Q7gGA

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

import processing.serial.*; // imports library for serial communication
import java.awt.event.KeyEvent; // imports library for reading the data from the serial port
import java.io.IOException;
Serial myPort; // defines Object Serial
// defubes variables
String angle="";
String distance="";
String data="";
String noObject;
float pixsDistance;
int iAngle, iDistance;
int index1=0;
int index2=0;
void setup() {
  
 size (1920, 1080); // ***CHANGE THIS TO YOUR SCREEN RESOLUTION***
 smooth();
 myPort = new Serial(this,"COM4", 9600); // starts the serial communication
 myPort.bufferUntil('.'); // reads the data from the serial port up to the character '.'. So actually it reads this: angle,distance.
}
void draw() {
  
  fill(98,245,31);
  // simulating motion blur and slow fade of the moving line
  noStroke();
  fill(0,4); 
  rect(0, 0, width, height-height*0.065); 
  
  fill(98,245,31); // green color
  // calls the functions for drawing the radar
  drawRadar(); 
  drawLine();
  drawObject();
  drawText();
}
void serialEvent (Serial myPort) { // starts reading data from the Serial Port
  // reads the data from the Serial Port up to the character '.' and puts it into the String variable "data".
  data = myPort.readStringUntil('.');
  data = data.substring(0,data.length()-1);
  
  index1 = data.indexOf(","); // find the character ',' and puts it into the variable "index1"
  angle= data.substring(0, index1); // read the data from position "0" to position of the variable index1 or thats the value of the angle the Arduino Board sent into the Serial Port
  distance= data.substring(index1+1, data.length()); // read the data from position "index1" to the end of the data pr thats the value of the distance
  
  // converts the String variables into Integer
  iAngle = int(angle);
  iDistance = int(distance);
}
void drawRadar() {
  pushMatrix();
  translate(width/2,height-height*0.074); // moves the starting coordinats to new location
  noFill();
  strokeWeight(2);
  stroke(98,245,31);
  // draws the arc lines
  arc(0,0,(width-width*0.0625),(width-width*0.0625),PI,TWO_PI);
  arc(0,0,(width-width*0.27),(width-width*0.27),PI,TWO_PI);
  arc(0,0,(width-width*0.479),(width-width*0.479),PI,TWO_PI);
  arc(0,0,(width-width*0.687),(width-width*0.687),PI,TWO_PI);
  // draws the angle lines
  line(-width/2,0,width/2,0);
  line(0,0,(-width/2)*cos(radians(30)),(-width/2)*sin(radians(30)));
  line(0,0,(-width/2)*cos(radians(60)),(-width/2)*sin(radians(60)));
  line(0,0,(-width/2)*cos(radians(90)),(-width/2)*sin(radians(90)));
  line(0,0,(-width/2)*cos(radians(120)),(-width/2)*sin(radians(120)));
  line(0,0,(-width/2)*cos(radians(150)),(-width/2)*sin(radians(150)));
  line((-width/2)*cos(radians(30)),0,width/2,0);
  popMatrix();
}
void drawObject() {
  pushMatrix();
  translate(width/2,height-height*0.074); // moves the starting coordinats to new location
  strokeWeight(9);
  stroke(255,10,10); // red color
  pixsDistance = iDistance*((height-height*0.1666)*0.025); // covers the distance from the sensor from cm to pixels
  // limiting the range to 40 cms
  if(iDistance<40){
    // draws the object according to the angle and the distance
  line(pixsDistance*cos(radians(iAngle)),-pixsDistance*sin(radians(iAngle)),(width-width*0.505)*cos(radians(iAngle)),-(width-width*0.505)*sin(radians(iAngle)));
  }
  popMatrix();
}
void drawLine() {
  pushMatrix();
  strokeWeight(9);
  stroke(30,250,60);
  translate(width/2,height-height*0.074); // moves the starting coordinats to new location
  line(0,0,(height-height*0.12)*cos(radians(iAngle)),-(height-height*0.12)*sin(radians(iAngle))); // draws the line according to the angle
  popMatrix();
}
void drawText() { // draws the texts on the screen
  
  pushMatrix();
  if(iDistance>40) {
  noObject = "Out of Range";
  }
  else {
  noObject = "In Range";
  }
  fill(0,0,0);
  noStroke();
  rect(0, height-height*0.0648, width, height);
  fill(98,245,31);
  textSize(25);
  
  text("10cm",width-width*0.3854,height-height*0.0833);
  text("20cm",width-width*0.281,height-height*0.0833);
  text("30cm",width-width*0.177,height-height*0.0833);
  text("40cm",width-width*0.0729,height-height*0.0833);
  textSize(40);
  text("Object: " + noObject, width-width*0.875, height-height*0.0277);
  text("Angle: " + iAngle +" °", width-width*0.48, height-height*0.0277);
  text("Distance: ", width-width*0.26, height-height*0.0277);
  if(iDistance<40) {
  text("        " + iDistance +" cm", width-width*0.225, height-height*0.0277);
  }
  textSize(25);
  fill(98,245,60);
  translate((width-width*0.4994)+width/2*cos(radians(30)),(height-height*0.0907)-width/2*sin(radians(30)));
  rotate(-radians(-60));
  text("30°",0,0);
  resetMatrix();
  translate((width-width*0.503)+width/2*cos(radians(60)),(height-height*0.0888)-width/2*sin(radians(60)));
  rotate(-radians(-30));
  text("60°",0,0);
  resetMatrix();
  translate((width-width*0.507)+width/2*cos(radians(90)),(height-height*0.0833)-width/2*sin(radians(90)));
  rotate(radians(0));
  text("90°",0,0);
  resetMatrix();
  translate(width-width*0.513+width/2*cos(radians(120)),(height-height*0.07129)-width/2*sin(radians(120)));
  rotate(radians(-30));
  text("120°",0,0);
  resetMatrix();
  translate((width-width*0.5104)+width/2*cos(radians(150)),(height-height*0.0574)-width/2*sin(radians(150)));
  rotate(radians(-60));
  text("150°",0,0);
  popMatrix(); 
}

Ультразвуковой датчик нужно подключать к 10 и 11 пинам ардуино. А серву к 12 пину ардуино.

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

Здесь серво подключается к 12 пину ардуино. Пин Tring ультразвукового дальномера подключается к 10 пину, а Пин echo к 11 пину.

Скетч: https://yadi.sk/d/JQ7QhOWy3Q7gna

Демонстрация работы данной программы можно увидеть в видео приведенном в конце статьи.

Сюда жми если хочеш чтобы все получилось

https://money.yandex.ru/quickpay/shop-widget?writer=seller&targets=%D0%9F%D0%BE%D0%B4%D0%B4%D0%B5%D1%80%D0%B6%D0%B0%D1%82%D1%8C%20%D0%B0%D0%B2%D1%82%D0%BE%D1%80%D0%B0&targets-hint=&default-sum=100&button-text=11&payment-type-choice=on&mobile-payment-type-choice=on&hint=&successURL=&quickpay=shop&account=410013154289364

Свежие записи

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

Не знаю кто как, но я давно хотел сделать радар, такой чтоб туда-сюда излучатель крутился и на экране видно было наличие и дистанцию до объектов. Конечно в домашних условиях вещь, подобную военным или авиа службам сделать не получится — там и мощности, и размеры недосягаемые. Но что-то похожее, причём совсем не сложное и не дорогое (пару тысяч рублей) соорудить возможно. Итак, на основе популярного Ардуино вы можете сделать такую себе мини РЛС с помощью ультразвукового детектора и собственно платы Arduino. Схема подсмотрена на сайте «Мехатроник». Все, что нужно для этого проекта: ультразвуковой датчик для обнаружения объектов, маленький серводвигатель для поворота датчика и плата Arduino для управления ими. Ну и макетка с проводами. Сначала сделаем крепление для подключения ультразвукового датчика к серводвигателю. Изготавливаем его, как это показано на рисунке ниже, потом он приклеивается и крепится к двигателю с помощью винта. Теперь прикрепите штырьки, на которые припаяем 4 провода для подключения датчика. Прикрепите мотор сервопривода к плате Arduino, используя обычную резинку для волос. Мы подключили ультразвуковой датчик HC-sr04 к выводам 10 и 11, а серводвигатель к 12 контакту на плате Arduino. Исходный код Теперь нужно взять код и загрузить его на плату Ардуино, которая позволит взаимодействовать между Arduino и обработкой сигнала. Здесь будем получать значения для угла и расстояние, измеренное с помощью датчика с платы Arduino на обработку IDE с помощью функции SerialEvent(), которая считывает данные из последовательного порта, и будем ставить значения угла и расстояния в переменные iAngle и iDistance. Эти переменные будут использоваться для построения линии обнаружения объектов. void drawRadar() {
  pushMatrix();
  translate(960,1000); // moves the starting coordinats to new location
  noFill();
  strokeWeight(2);
  stroke(98,245,31);
  // draws the arc lines
  arc(0,0,1800,1800,PI,TWO_PI);
  arc(0,0,1400,1400,PI,TWO_PI);
  arc(0,0,1000,1000,PI,TWO_PI);
  arc(0,0,600,600,PI,TWO_PI);
  // draws the angle lines
  line(-960,0,960,0);
  line(0,0,-960*cos(radians(30)),-960*sin(radians(30)));
  line(0,0,-960*cos(radians(60)),-960*sin(radians(60)));
  line(0,0,-960*cos(radians(90)),-960*sin(radians(90)));
  line(0,0,-960*cos(radians(120)),-960*sin(radians(120)));
  line(0,0,-960*cos(radians(150)),-960*sin(radians(150)));
  line(-960*cos(radians(30)),0,960,0);
  popMatrix();
} Для рисования линии, которая движется вдоль радара, сделана функция drawLine(). Переменная iAngle используется как линия, что перерисовывается для каждой ступени. void drawLine() {
  pushMatrix();
  strokeWeight(9);
  stroke(30,250,60);
  translate(960,1000); // moves the starting coordinats to new location
  line(0,0,950*cos(radians(iAngle)),-950*sin(radians(iAngle))); // draws the line according to the angle
  popMatrix();
} Для прорисовывания обнаруженных объектов служит функция drawObject(). Она получает расстояние от ультразвукового датчика, преобразует его в пикселах, и в сочетании с углом датчика рисует объект на радаре — экране ЖК монитора. void drawObject() {
  pushMatrix();
  translate(960,1000); // moves the starting coordinats to new location
  strokeWeight(9);
  stroke(255,10,10); // red color
  pixsDistance = iDistance*22.5; // covers the distance from the sensor from cm to pixels
  // limiting the range to 40 cms
  if(iDistance<40){
    // draws the object according to the angle and the distance
  line(pixsDistance*cos(radians(iAngle)),-pixsDistance*sin(radians(iAngle)),950*cos(radians(iAngle)),-950*sin(radians(iAngle)));
  }
  popMatrix();
} Текст на экране — функция drawtext(), которая рисует полосы на конкретных местах. Все эти функции вызываются в основном функцией Draw (), которая повторяется все время и рисует на экране картинку окружающего пространства. Также здесь используется имитации размытия движения и медленное затухание движущейся линии. void draw() {
  
  fill(98,245,31);
  textFont(orcFont);
  // simulating motion blur and slow fade of the moving line
  noStroke();
  fill(0,4); 
  rect(0, 0, width, 1010); 
  
  fill(98,245,31); // green color
  // calls the functions for drawing the radar
  drawRadar(); 
  drawLine();
  drawObject();
  drawText();
} Вот окончательный внешний вид радара. Как видите, ничего сложного нет. И хоть мощность и дальность небольшие, но тут главное понять сам принцип и заставить хотя бы это заработать. А дальше, при желании, можно экспериментировать над увеличением дальности и чёткости засекания предметов.

доработка надо — не надо еще добавляет эхо сигналы https://arduinoplus.ru/arduino-radar/

https://github.com/santosha2003/ArduinoRadar

Download Attachments

  • 1 rar radar_kod
    Размер файла: 3 KB Кол-во скачиваний: 4
  • 2 txt ultrasonic_radar.pde
    Размер файла: 3 KB Кол-во скачиваний: 2
  • 3 pdf kp813b1
    Размер файла: 146 KB Кол-во скачиваний: 2
  • 4 ultrasonic_radar
    Размер файла: 899 B Кол-во скачиваний: 2
  • 5 arduino_radar_receiver
    Размер файла: 9 KB Кол-во скачиваний: 1
  • 6 arduino_radar_sender
    Размер файла: 9 KB Кол-во скачиваний: 2
Перейти к верхней панели