Детектор движения с камерой android на базе arduino

Детектор движения — умная скрытая камера у вас в кармане

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

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

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

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

Знакомство с приложением будет практически мгновенным. Пользователю не понадобится создавать новую учётную запись или авторизовываться при помощи социальных сетей. Всё, что нужно для начала работы, — стандартные разрешения на использование программой камеры и микрофона. «Детектор движения» настроен и готов к использованию.

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

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

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

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

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

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

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

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

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

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

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

Название: Детектор движения
Издатель/разработчик: Sipan Davoian
Цена: 149 рублей
Встроенные покупки: Нет
Совместимость: Универсальное приложение
Ссылка: Установить

Источник: https://AppleInsider.ru/obzory-prilozhenij/detektor-dvizheniya-umnaya-skrytaya-kamera-u-vas-v-karmane.html

Беспроводная сигнализация на базе Arduino

Здравствуйте посетители сайта «В Гостях У Самоделкина»
Я, просматривая разные сайты, нашел очень полезную самоделку для охраны дома, на системе Arduino.Её автор хотел выполнить самоделку, чтобы она была дешевой и беспроводной.

Эта самоделка использует PIR датчик движения, а передача информации происходит при помощи RF модуля.

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

Для того, чтобы посетителям было удобнее просматривать сборку сигнализации, я решил поделить статью на 5 этапов:Этап 1: Создание передатчика. Этап 2: Создание приемника.Этап 3: Установка программного обеспечения.Этап 4: Тестирование собранных модулей.Этап 5: Сборка корпуса и установка в него модуля.

Итак, начнем пожалуй с авторского видеоролика.

Все что понадобилось автору, это:

— 2 платы ARDUINO UNO/ARDUINO MINI/ARDUINO NANO для приёмника и передатчика;- RF приёмопередающий модуль (433 MHZ);- PIR датчик движения;- 9В батарейки ( 2 штуки) и коннекторы к ним;- Зуммер;- Светодиод;- Резистор с сопротивлением 220 Ом;- Макетная плата;- Джамперы/провода/перемычки;- Монтажная плата;- Межплатные штыревые соединители;- Переключатели;- Корпуса для приёмника и передатчика;- Цветная бумага;- Монтажный скотч;- Наборной скальпель;- Термоклеевой пистолет;- Паяльник;- Кусачки /инструмент для снятия изоляции;- Ножницы по металлу.
Этап 1.Начинаем создание передатчика.Ниже предоставлена схема работы датчика движения.
Сам передатчик состоит из:— Датчика движения;- Платы Arduino;- Модуль передатчика.В качестве управляющей платы автор использовал Arduino Nano.

Собирал автор по такой схеме:

Сам датчик имеет три вывода:— VCC;- GND;- OUT.

Потом автор подключил выводы датчика с выводами платы Arduino:

— Vcc > 5v;- GND > GND;- Out > D2.После чего, проверил работу датчика
Внимание!!!Перед загрузкой прошивки, автор убеждается в том, что в настройках Arduino IDE верно установлена текущая плата и последовательный порт. После чего загрузил скетч:

sketch-test-code.docx [12.26 Kb] (скачиваний: 328)

Посмотреть онлайн файл: sketch-test-code.docxПозже, как датчик движения зафиксирует движение перед собой, засветится светодиод, а также в мониторе вы сможете увидеть соответствующее сообщение.Далее автор подключает RF Передатчик.По схеме чуть ниже.
Передатчик имеет 3 вывода (VCC, GND, и Data), соединяем их:— VCC > 5В выводом на плате;- GND > GND ;- Data > 12 выводом на плате.

Этап 2.

Сам приёмник состоит из:— Модуля RF приёмника;- Платы Arduino- Зуммера (динамика).

Схема Приемника:

Приемник, как и передатчик, имеет 3 вывода (VCC, GND, и Data), соединяем их:- VCC > 5В выводом на плате;- GND > GND ;- Data > 12 выводом на плате.
Этап 3.
Основой всей прошивки автор выбрал файл-библиотеки. Скачал, который он здесь, и поместил его в папку с библиотеками Arduino.

ПО для передатчика.

Перед тем, как загружать код прошивки в плату, автор выставил следующие параметры IDE:- Board -> Arduino Nano (или та плата, которую вы используете);- Serial Port -> COM XX (проверьте com порт, к которому подключено ваша плата).После установки параметров, автор скачал файл прошивки Wireless_tx и загрузил его на плату:

wireless_tx.docx [14.59 Kb] (скачиваний: 277)

Посмотреть онлайн файл: wireless_tx.docx

ПО для приемника

Автор повторяет те же действия и для принимающей платы:- Board -> Arduino UNO (или та плата, которую вы используете);- Serial Port -> COM XX (проверьте com порт, к которому подключено ваша плата).
После того как автор установил параметры, скачивает файл wireless_rx и загружает его в плату:

wireless_rx.docx [13.3 Kb] (скачиваний: 195)

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

Этап 4.

Далее , после загрузки ПО автор решил проверить, все ли работает должным образом. Автор подсоединил источники питания, и провел рукой перед датчиком, и у него заработал зуммер, а значит все работает как надо.
Этап 5.
Финальная сборка передатчикаСначала автор срезал выступающие выводы с приемника, передатчика, плат arduino, и т. д.

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

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

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

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

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

Для расчета длины антенны нужно определить длину волны, а для этого нужно скорость света разделить на частоту, и потом разделить получившееся число на 4. У автора частота 433 МГц, а скорость света 3*10^8 м/с.Тогда длина волны= (3×10^8) / (433×10^6)= 0.69284 м., А длина антенны=0.69284/4 = 0.1732 м =17.32 см Потом автор отрезал два куска нужной длины, и запаял их в отверстия в каждый модуль.

И в конце концов у него получилась беспроводная сигнализация на базе arduino.
Становитесь автором сайта, публикуйте собственные статьи, описания самоделок с оплатой за текст. Подробнее здесь.

Идея

Описание

Исполнение

Итоговая оценка: 8.67

Источник: https://USamodelkina.ru/9381-besprovodnaya-signalizaciya-na-baze-arduino.html

Про датчик движения и подключение его к Arduino

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

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

Форм факторов этих датчиков существует великое множество, но мы рассмотрим именно модуль датчика движения для подключения к платам Arduino, и именно от фирмы RobotDyn.

  Почему именно этой фирмы? Я не хочу заниматься рекламой этого магазина и его продукции, но именно продукция данного магазина была выбрана в качестве лабораторных образцов благодаря качественной подаче своих изделий для конечного потребителя. Итак, встречаем — датчик движения(PIR Sensor) от фирмы RobotDyn:

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

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

 

Основные технические характеристики датчика движения(PIR Sensor):

Зона работы датчика: от 3 до 7 метров

Угол слежения: до 110о

Рабочее напряжение: 4,5…6 Вольт

Потребляемый ток: до 50мкА

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

Читайте также:  Микроконтроллеры: что это такое и зачем нужны - arduino+

Инициализация устройства.

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

Угол и область обнаружения.

Угол обнаружения(слежения) составляет 110 градусов, диапазон расстояния обнаружения от 3 до 7 метров, иллюстрация ниже показывает всё это:

Регулировка чувствительности(дистанции обнаружения) и временной задержки. 

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

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

  • PIR Sensor[PIN GND] — Arduino Nano[PIN GND]
  • PIR Sensor[PIN 5V]   — Arduino Nano[PIN 5V]
  • PIR Sensor[PIN OUT] — Arduino Nano[PIN A0]
  • PIR Sensor[PIN IN] — для датчика освещенности
  • PIR Sensor[PIN GND] — для датчика освещенности

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

Скетч демонстрирующий работу датчика движения(используем программу Serial Monitor Pro):

/*  * PIR Sensor[PIN GND] -> Arduino Nano[PIN GND]  * PIR Sensor[PIN 5V]  -> Arduino Nano[PIN 5V]  * PIR Sensor[PIN OUT] -> Arduino Nano[PIN A0]  */ void setup() {   //Установить соединение с монитором порта   Serial.begin(9600); } void loop() {   //Считываем пороговое значение с порта А0   //обычно оно выше 500 если есть сигнал   if(analogRead(A0) > 500)   {     //Сигнал с датчика движения     Serial.println(«Есть движение !!!»);   }   else   {     //Нет сигнала     Serial.println(«Всё тихо…»);   } }

Скетч является обычной проверкой работы датчика движения, в нём есть много недостатков, таких как:

  1. Возможные ложные срабатывания, датчику необходима самоинициализация в течение одной минуты.
  2. Жесткая привязка к монитору порта, нет выходных исполнительных устройств(реле, сирена, светоиндикация)
  3. Слишком короткое время сигнала на выходе датчика, при обнаружении движения необходимо программно задержать сигнал на более долгий период времени.

Усложнив схему и расширив функционал датчика, можно избежать вышеописанных недостатков. Для этого потребуется дополнить схему модулем реле и подключить обычную лампу на 220 вольт через данный модуль. Сам же модуль реле будет подключен к пину 3 на плате Arduino Nano. Итак принципиальная схема:

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

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

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

/*  * PIR Sensor[PIN GND]  -> Arduino Nano[PIN GND]  * PIR Sensor[PIN 5V]   -> Arduino Nano[PIN 5V]  * PIR Sensor[PIN OUT]  -> Arduino Nano[PIN A0]  * Relay Module[PIN IN] -> Arduino Nano[PIN 3]  */  //relout — пин(выходной сигнал) для модуля реле const int relout = 3; //prevMillis — переменная для хранения времени предидущего цикла сканирования программы //interval — временной интервал для отсчета секунд до выключения реле unsigned long prevMillis = 0; int interval = 1000; //DelayValue — период в течение которого реле удерживается во включенном состоянии int DelayValue = 10; //initSecond — Переменная итерации цикла инициализации   int initSecond = 60; //countDelayOff — счетчик временных интервалов static int countDelayOff = 0; //trigger — флаг срабатывания датчика движения static bool trigger = false; void setup() {   //Стандартная процедура инициализации порта на который подключен модуль реле   //ВАЖНО!!! — чтобы модуль реле оставался в первоначально выключенном состоянии   //и не срабатывал при инициализации, нужно записать в порт входа/выхода   //значение HIGH, это позволит избежать ложных «перещелкиваний», и сохранит   //состояние реле таким, каким оно было до включения всей схемы в работу   pinMode(relout, OUTPUT);   digitalWrite(relout, HIGH);   //Здесь всё просто — ждем когда закончатся 60 циклов(переменная initSecond)   //продолжительностью в 1 секунду, за это время датчик «самоинициализируется»   for(int i = 0; i < initSecond; i ++)   {     delay(1000);   } } void loop() {   //Считать значение с аналогового порта А0   //Если значение выше 500   if(analogRead(A0) > 500)   {     //Установить флаг срабатывания датчика движения     if(!trigger)     {       trigger = true;     }   }   //Пока флаг срабатывания датчика движения установлен   while(trigger)   {     //Выполнять следующие инструкции     //Сохранить в переменной currMillis     //значение миллисекунд прошедших с момента начала     //выполнения программы     unsigned long currMillis = millis();     //Сравниваем с предидущим значением миллисекунд     //если разница больше заданного интервала, то:     if(currMillis — prevMillis > interval)     {       //Сохранить текущее значение миллисекунд в переменную prevMillis       prevMillis = currMillis;       //Проверяем счетчик задержки сравнивая его со значением периода       //в течение которого реле должно удерживаться во включенном       //состоянии       if(countDelayOff >= DelayValue)       {         //Если значение сравнялось, то:         //сбросить флаг срабатывания датчика движения         trigger = false;         //Обнулить счетчик задержки         countDelayOff = 0;         //Выключить реле         digitalWrite(relout, HIGH);         //Прервать цикл         break;       }       else       {         //Если значение всё еще меньше, то         //Инкрементировать счетчик задержки на единицу         countDelayOff ++;         //Удерживать реле во включенном состоянии         digitalWrite(relout, LOW);       }     }   } }

В программе присутствует конструкция:

unsigned long prevMillis = 0;

int interval = 1000;

    …

unsigned long currMillis = millis();

if(currMillis — prevMillis > interval)

{

    prevMillis = currMillis;

    ….

    // Наши операции заключенные в тело конструкции

    ….

}

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

Сначала, переменной currMillis присваивается значение возвращаемое при вызове функции millis(). Функция millis() возвращает количество миллисекунд прошедших с начала программы.

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

Если же разница currMillis — prevMillis меньше чем значение переменной interval, то между циклами сканирования программы еще не прошло секунды, и операции заключенные в теле конструкции пропускаются.   

Ну и в завершение статьи видео от автора:

Источник: http://arduino.on.kg/podklyuchenie-datchika-dvizheniya-k-Arduino

Датчик движения ардуино

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

 В этой статье мы рассмотрим подключение в проектах ардуино PIR-сенсоров: пассивных инфракрасных датчиков или пироэлектрических сенсоров, которые реагируют на движение.

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

Описание датчика движения ардуино

Конструкция ПИР датчика движения не очень сложна – он состоит из пироэлектрического элемента, отличающегося высокой чувствительностью (деталь цилиндрической формы, в центре которой расположен кристалл) к наличию в зоне действия определенного уровня инфракрасного излучения. Чем выше температура объекта, тем больше излучение.

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

Чаще всего в качестве линзы применяют линзу Френеля, которая за счет концентрации теплового  излучения позволяет расширить диапазон чувствительности инфракрасного датчика движения Ардуино.

PIR-sensor конструктивно разделен на две половины. Это обусловлено тем, что для устройства сигнализации важно именно наличие движения в зоне чувствительности, а не сам уровень излучения. Поэтому части установлены таким способом, что при улавливании одной большего уровня излучения, на выход будет подаваться сигнал со значением high или low.

Основными техническими характеристиками датчика движения Ардуино являются:

  • Зона обнаружения движущихся объектов составляет от 0 до 7 метров;
  • Диапазон угла слежения — 110°;
  • Напряжение питания – 4.5-6 В;
  • Рабочий ток – до 0.05 мА;
  • Температурный режим – от -20° до +50°С;
  • Регулируемое время задержки от 0.3 до 18 с.

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

Принцип работы датчика движения на Arduino следующий:

  • Когда устройство установлено в пустой комнате, доза излучения, получаемая каждым элементом постоянна, как и напряжение;
  • При появлении в комнате человека, он первым делом попадает в зону обозрения первого элемента, на котором появляется положительный электрический импульс;
  • Когда человек перемещается по комнате, вместе с ним перемещается и тепловое излучение, которое попадает уже на второй сенсор. Этот PIR-элемент генерирует уже отрицательный импульс;
  • Разнонаправленные импульсы регистрируются электронной схемой датчика, которая делает вывод, что в поле зрения Pir-sensor Arduino находится человек.

Для надежной защиты от внешних шумов, перепадов температуры и влажности, элементы Pir-датчика на Arduino устанавливаются в герметичный металлический корпус. На верхней части корпуса по центру находится прямоугольник, выполненный из материала, который пропускает инфракрасное излучение (чаще всего на основе силикона). Чувствительные элементы устанавливаются за пластиной.

Схема подключения датчика движения к Ардуино

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

Поэтому, прежде чем выполнить подключение датчика к Arduino необходимо ознакомиться с обозначениями. Один выход идет к земле (GND), второй – обеспечивает выдачу необходимого сигнала с сенсоров (+5В), а третий является цифровым выходом, с которого снимаются данные.

Подключение Pir-сенсора:

  • «Земля» – на любой из коннекторов GND Arduino;
  • Цифровой выход – на любой цифровой вход или выход Arduino;
  • Питание – на +5В на Arduino.

Схема подключения инфракрасного датчика к Ардуино представлена на рисунке.

Пример программы

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

  • Вероятность ложных срабатываний, за счет того, что для самоинициализации датчика требуется одна минута;
  • Отсутствие выходных устройств исполнительного типа – реле, сирены, светоиндикации;
  • Короткий временной интервал сигнала на выходе сенсора, который необходимо на программном уровне задержать, в случае появления движения.
Читайте также:  Как выбрать инвертор для солнечных батарей? - arduino+

Указанные недостатки устраняются при расширении функционала датчика.

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

#define PIN_PIR 2
#define PIN_LED 13 void setup() { Serial.begin(9600); pinMode(PIN_PIR, INPUT); pinMode(PIN_LED, OUTPUT); } void loop() { int pirVal = digitalRead(PIN_PIR); Serial.println(digitalRead(PIN_PIR)); //Если обнаружили движение if (pirVal) { digitalWrite(PIN_LED, HIGH); Serial.println(«Motion detected»); delay(2000); } else { //Serial.print(«No motion»); digitalWrite(PIN_LED, LOW); }
}

Возможные варианты проектов с применением датчика

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

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

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

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

Источник: https://ArduinoMaster.ru/datchiki-arduino/arduino-datchik-dvizheniya/

Ведроид-мобиль — робот на Arduino — Часть 4. Подключаем ультразвуковой дальномер

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

А прошлой статье я описывал процесс реализации управления роботом по Bluetooth через смартфон на Android. Это был первый режим работы робота. После этой статьи у нас появится второй режим. В будущем я планирую добавить еще несколько.

Создание шилда управления роботом

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

Для этого нам понадобятся следующие детали:

  • Светодиоды — 7 штук
  • Кнопки — 3 штуки
  • Резисторы на 220 Ом — 6 штук
  • Резисторы на 10 кОм — 2 штуки
  • Перемычки — 5 штук
  • Разъём PBS (мама) на 16 контактов — 1 штука
  • Миниатюрная макетная плата — 1 штука

Все компоненты запаиваем на Proto Shield по указанной схеме (вид со стороны деталей):

Размещение элементов на плате:

В левом нижнем углу я вывел кнопку RESET. Она замыкает выводы RESET и GND. В левом верхнем — разъем подключения сервоприводов. Вверху светодиод с 13 дискретного вывода. Справа 2 кнопки переключения режимов (след / пред).

Каждая кнопка подтянута к земле резистором на 10 кОм.

Далее размещены 6 светодиодов, которые подключены к панельке контактов через резисторы на 220 Ом.

Светодиоды будут служить индикаторами режимов работы робота.

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

Подключение шилда управления роботом

Подключим провода к разъему на 16 контактов. Описывать буду назначение контактов сверху вниз. LED 1..6 — выводы светодиодов, BTN 1..2 — кнопки.

  • 1 — LED 1 — к 22 дискретному выводу Arduino
  • 2
  • 3
  • 4 — LED 2 — к 23 дискретному выводу Arduino Mega 2560
  • 5
  • 6 — BTN 1 — к 28 дискретному выводу Arduino Mega 2560
  • 7 — LED 3 — к 24 дискретному выводу Arduino Mega 2560
  • 8 — GND — к GND Arduino Mega 2560
  • 9 — +5 V — к +5 V Arduino Mega 2560
  • 10 — LED 4 — к 25 дискретному выводу Arduino Mega 2560
  • 11 — BTN 2 — к 29 дискретному выводу Arduino Mega 2560
  • 12
  • 13 — LED 5 — к 26 дискретному выводу Arduino Mega 2560
  • 14
  • 15
  • 16 — LED 6 — к 27 дискретному выводу Arduino Mega 2560

Сразу восстановим подключение Bluetooth модуля JY-MCU к Arduino Mega 2560

  • VCC на JY-MCU подключаем к +5В Arduino
  • GND на JY-MCU подключаем к GND Arduino
  • TXT на JY-MCU подключаем к дискретному PIN 50 на Arduino
  • RXD на JY-MCU подключаем к дискретному PIN 51 на Arduino

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

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

Для создания крепления под ультразвуковой дальномер HC-SR04 я использовал кусок платы от Proto Shield и панельку контактов.

Откусил от панельки контактов две части по 4 контакта и запаял их на плату параллельно.

Перед подключением дальномера я сперва “раскорячил” его контакты, чтобы они плотно держались в разъеме.

Проковырял в плате дырку под болт.

Закрепил модуль на сервоприводе.

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

Осталось только подключить провода к контактной панельке на плате дальномера и завести их на контакты Arduino Mega 2560. Этим и займемся.

  • VCC HC-SR04 подключим к +5V на Arduino Mega 2560
  • Trig HC-SR04 к цифровому пину 31 на Arduino Mega 2560
  • Echo HC-SR04 к цифровому пину 30 на Arduino Mega 2560
  • GND HC-SR04 к GND на Arduino Mega 2560

Алгоритм объезда препятствий

С алгоритмом я особо не заморачивался. Все достаточно просто и интуитивно понятно.

Из исходного положения проверяем расстояние впереди. Если оно больше 30 сантиметров, то продолжаем двигаться вперед, иначе:

  • останавливаем двигатели
  • поворачиваем сервопривод на углы от 0 до 180 градусов с шагом в 15 градусов и измеряем расстояния на этих углах
  • заносим полученные значения в массив
  • поворачиваем сервопривод на угол 90 градусов (прямо)
  • ищем в массиве позицию с максимальным значением данных
  • если это значение меньше 30 сантиметров, то едем назад
  • если это значение больше 30 сантиметров, то проверяем какому углу поворота сервопривода оно соответствует и в зависимости от этого поворачиваем влево или вправо

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

Скетч реализации алгоритма объезда препятствий

//Создаем объекты для двигателей AF_DCMotor motor1(1); //канал М1 на Motor Shield — задний левый AF_DCMotor motor2(2); //канал М2 на Motor Shield — задний правый AF_DCMotor motor3(3); //канал М3 на Motor Shield — передний левый AF_DCMotor motor4(4); //канал М4 на Motor Shield — передний правый // Создаем объект для сервопривода Servo vservo; // Прописываем пины используемые модулем Bluetooth SoftwareSerial BTSerial(50, 51); // RX, TX // Создаем переменную для команд Bluetooth char vcmd; // Создаем переменные для запоминания скорости левых и правых двигателей int vspdL, vspdR; /* Создаем переменную, на значение которой будет уменьшаться скорость при плавных поворотах. Текущая скорость должна быть больше этого значения.  В противном случае двигатели со стороны направления поворота просто не будут вращаться */ const int vspd = 200; // Заносим в массив пины, к которым подключены светодиоды const int vledpins[6]={ 22,23,24,25,26,27}; // Создаем переменную для сохранения режима работы int vmode; // Создаем переменную для сохранения предыдущего режима работы int vmodeprev = -1; // Заносим в массив пины, к которым подключены кнопки const int vbtn[2]={ 28,29}; // Массив для хранения углов поворота сервопривода (шаг 15 градусов) const int vservo_array[13]={ 0,15,30,45,60,75,90,105,120,135,150,165,180}; // Массив для хранения данных о расстоянии под различными углами поворота сервопривода int vHC_SR04_array[13]; // Пины, используемые ультразвуковым дальномером const int vTrig = 31; const int vEcho = 30; // Переменные, для хранения данных с дальномера unsigned int vtime_us=0; unsigned int vdistance_sm=0; // Минимальное расстояние в сантиметрах, при котором нужно искать новый маршрут движения const int vmindistance = 30; // Переменная для циклов перебора значения массивов vservo_array и vHC_SR04_array int vservo_int; // Переменные для цикла поиска максимального значения в массивах int vmaxarrayindex_int;

int vmaxarrayvalue_int;

void setup() { // Устанавливаем скорость передачи данных по Bluetooth BTSerial.begin(9600); // Устанавливаем скорость передачи данных по кабелю Serial.begin(9600); // Выбираем пин к которому подключен сервопривод vservo.attach(9); // или 10, если воткнули в крайний разъём // Поворачиваем сервопривод в положение 90 градусов при каждом включении vservo.

write(90); // Устанавливаем максимальную скорость вращения двигателей vspeed(255,255); /* Устанавливаем все выводы, к которым подключены светодиоды, в OUTPUT. Зажигаем и гасим светодиоды с интервалом в 0.

5 сек для проверки */ for (vmode = 0; vmode < 6; vmode = vmode + 1) { pinMode(vledpins[vmode], OUTPUT); digitalWrite(vledpins[vmode], HIGH); delay (500); digitalWrite(vledpins[vmode], LOW); } /* Устанавливаем выводы, к которым подключены кнопки, в INPUT.

*/ pinMode(vbtn[0], INPUT); pinMode(vbtn[1], INPUT); // Устанавливаем значение первого режима работы робота vmode = 0; // Устанавливаем значение для пинов, к которым подключен ультразвуковой дальномер pinMode(vTrig, OUTPUT); pinMode(vEcho, INPUT);

}

void loop() { /* Переключение режимов работы робота */ // Кнопка переключения на следующий режим — BTN1 if (digitalRead(vbtn[0]) == HIGH) { vmode = vmode + 1; vmodeprev = vmode — 1; if (vmode > 5) { vmode = 0; vmodeprev = 5; } vrelease(); delay (500); } // Кнопка переключения на предыдущий режим — BTN2 if (digitalRead(vbtn[1]) == HIGH) { vmode = vmode — 1; vmodeprev = vmode + 1; if (vmode < 0) { vmode = 5; vmodeprev = 0; } vrelease(); delay (500); } // Засвечиваем светодиод текущего режима работы digitalWrite(vledpins[vmode], HIGH); // Гасим светодиод предыдущего режима работы if (vmodeprev > -1) { digitalWrite(vledpins[vmodeprev], LOW); } /* Выбор режима работы */ switch (vmode) { case 0: // Режим ожидания break; case 1: // Режим работы с использованием ультразвукового дальномера vultrasoundmode(); break; case 2: // Режим break; case 3: // Режим управления через Bluetooth vbluetoothmode(); break; case 4: // Режим break; case 5: // Режим break; } } /* Режим работы с использованием ультразвукового дальномера */ void vultrasoundmode(){ vservo.write(90); delay(200); Serial.print(«Now «); Serial.println(vHC_SR04()); // Если расстояние меньше наименьшего, то if (vHC_SR04() < vmindistance) { // Останавливаем двигатели vrelease(); // Крутим серву измеряя расстояния и занося данные в массив for (vservo_int = 0; vservo_int < 13; vservo_int = vservo_int + 1) { vservo.write(vservo_array[vservo_int]); delay(200); vHC_SR04_array[vservo_int] = vHC_SR04(); // Выводим данные для отладки Serial.print(vservo_int); Serial.print(" "); Serial.println(vHC_SR04_array[vservo_int]); } vservo.write(90); delay(500); // Поиск в массиве позиции с максимальным значением vmaxarrayindex_int = 0; vmaxarrayvalue_int = 0; for (vservo_int = 0; vservo_int < 13; vservo_int = vservo_int + 1) { if (vHC_SR04_array[vservo_int] > vmaxarrayvalue_int) { vmaxarrayindex_int = vservo_int; vmaxarrayvalue_int = vHC_SR04_array[vservo_int]; } } Serial.print(«Max index «); Serial.println(vmaxarrayindex_int); // Проверка — если максимальное значение массива меньше минимального расстояния, то едем назад if (vHC_SR04_array[vmaxarrayindex_int] < vmindistance) { vbackward(); delay(500); } /* Проверка - если индекс максимального значения массива меньше 6 то поворачиваем вправо, иначе влево */ if (vmaxarrayindex_int < 6) { vright(); delay(500); } else { vleft(); delay(500); } } else { // Едем прямо vforward(); }

}

/* Режим управления через Bluetooth */ void vbluetoothmode() { // Если есть данные с Bluetooth if (BTSerial.available()) { /* Читаем команды и заносим их в переменную. (char) преобразует код символа команды в символ */ vcmd = (char)BTSerial.read(); // Отправляем команду в порт, чтобы можно было их проверить в «Мониторе порта»

Читайте также:  Блок питания на ардуино: виды, особенности, возможная схема

Serial.println(vcmd);

// Вперед if (vcmd == 'F') { vforward(); } // Назад if (vcmd == 'B') { vbackward(); } // Влево if (vcmd == 'L') { vleft(); } // Вправо if (vcmd == 'R') { vright(); } // Прямо и влево if (vcmd == 'G') { vforwardleft(); } // Прямо и вправо if (vcmd == 'I') { vforwardright(); } // Назад и влево if (vcmd == 'H') { vbackwardleft(); } // Назад и вправо if (vcmd == 'J') { vbackwardright(); } // Стоп if (vcmd == 'S') { vrelease(); } // Скорость 0% if (vcmd == '0') { vspeed(0,0); } // Скорость 10% if (vcmd == '1') { vspeed(25,25); } // Скорость 20% if (vcmd == '2') { vspeed(50,50); } // Скорость 30% if (vcmd == '3') { vspeed(75,75); } // Скорость 40% if (vcmd == '4') { vspeed(100,100); } // Скорость 50% if (vcmd == '5') { vspeed(125,125); } // Скорость 60% if (vcmd == '6') { vspeed(150,150); } // Скорость 70% if (vcmd == '7') { vspeed(175,175); } // Скорость 80% if (vcmd == '8') { vspeed(200,200); } // Скорость 90% if (vcmd == '9') { vspeed(225,225); } // Скорость 100% if (vcmd == 'q') { vspeed(255,255); } }

}

/* Функция определения расстояния с дальномера */ int vHC_SR04() { digitalWrite(vTrig, HIGH); // Подаем сигнал на выход микроконтроллера delayMicroseconds(10); // Удерживаем 10 микросекунд digitalWrite(vTrig, LOW); // Затем убираем vtime_us=pulseIn(vEcho, HIGH); // Замеряем длину импульса vdistance_sm=vtime_us/58; // Пересчитываем в сантиметры return vdistance_sm; // Возвращаем значение

}

/* Функции управления двигателями */

// Вперед void vforward() { vspeed(vspdL,vspdR); vforwardRL();

}

// Вперед для RL void vforwardRL() { motor1.run(FORWARD); motor2.run(FORWARD); motor3.run(FORWARD); motor4.run(FORWARD);

}

// Назад void vbackward() { vspeed(vspdL,vspdR); vbackwardRL();

}

// Назад для RL void vbackwardRL() { motor1.run(BACKWARD); motor2.run(BACKWARD); motor3.run(BACKWARD); motor4.run(BACKWARD);

}

// Влево void vleft() { vspeed(vspdL,vspdR); motor1.run(BACKWARD); motor2.run(FORWARD); motor3.run(BACKWARD); motor4.run(FORWARD);

}

// Вправо void vright() { vspeed(vspdL,vspdR); motor1.run(FORWARD); motor2.run(BACKWARD); motor3.run(FORWARD); motor4.run(BACKWARD);

}

// Вперед и влево void vforwardleft() { if (vspdL > vspd) { vspeed(vspdL-vspd,vspdR); } else { vspeed(0,vspdR); } vforwardRL();

}

// Вперед и вправо void vforwardright() { if (vspdR > vspd) { vspeed(vspdL,vspdR-vspd); } else { vspeed(vspdL,0); } vforwardRL();

}

// Назад и влево void vbackwardleft() { if (vspdL > vspd) { vspeed(vspdL-vspd,vspdR); } else { vspeed(0,vspdR); } vbackwardRL();

}

// Назад и вправо void vbackwardright() { if (vspdR > vspd) { vspeed(vspdL,vspdR-vspd); } else { vspeed(vspdL,0); } vbackwardRL();

}

// Стоп void vrelease(){ motor1.run(RELEASE); motor2.run(RELEASE); motor3.run(RELEASE); motor4.run(RELEASE);

}

// Изменение скорости void vspeed(int spdL,int spdR){ if (spdL == spdR) { vspdL=spdL; vspdR=spdR; } motor1.setSpeed(spdL); motor2.setSpeed(spdR); motor3.setSpeed(spdL); motor4.setSpeed(spdR);

}

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

Демонстрация робота на Arduino

P.S

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

Источник: https://GeekElectronics.org/arduino/vedroid-mobil-robot-na-arduino-chast-4-podklyuchaem-ultrazvukovoj-dalnomer.html

Создание охранной сигнализации с датчиком движения на базе Arduino и инфракрасных датчиков

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

Обзор

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

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

Если отражения нет, нет и объекта.

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

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

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

Принцип действия инфракрасного датчика расстояния

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

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

Чтобы сбросить срабатывание сигнализации, пользователь может нажать на кнопку.

Комплектующие

  • 2 x ИК-датчик расстояния;
  • 1 x Arduino Mega 2560;
  • 1 x зуммер;
  • 1 x кнопка;
  • 1 x резистор 470 Ом;
  • 1 x NPN транзистор;
  • перемычки.

Схема соединений

Схема для данного проекта показана на рисунке ниже. Выходы двух ИК-датчиков подключены к выводам A0 и A1. Два других вывода подключены к выводам 5V и GND. 12-вольтовый зуммер подключен к выводу 3 через транзистор, а кнопка, используемая для отключения сигнализации, подключена к выводу 4.

Схема соединений охранной сигнализации на Arduino

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

Макет охранной сигнализации на Arduino

Установка

  1. Подключите выводы 5V и GND платы Arduino к выводам питания и GND датчиков. Вы также можете подавать на них внешнее питание.
  2. Подключите выходные выводы датчиков к выводам A0 и A1 платы Arduino.

  3. Подключите вывод 3 Arduino к базе транзистора через резистор 1 кОм.
  4. Подайте напряжение 12 В на коллектор транзистора.
  5. Подключите положительный вывод 12-вольтового зуммера к эмиттеру, а отрицательный – к шине земли.

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

  7. Подключите плату Arduino к компьютеру через USB кабель и загрузите программу в микроконтроллер, используя Arduino IDE.
  8. Подайте на плату Arduino питание, используя блок питания, аккумулятор или USB кабель/

Код

const int buzzer=3; // вывод 3 – это выход на зуммер const int pushbutton=4; // вывод 4 – это вход для кнопки void setup() { pinMode(buzzer,OUTPUT); // настроить вывод 3 на выход pinMode(pushbutton,INPUT); // настроить вывод 4 на вход } void loop() { // прочитать выходной сигнал обоих датчиков и сравнить результат с пороговым значением int sensor1_value = analogRead(A0); int sensor2_value = analogRead(A1); if (sensor1_value > 400 || sensor2_value > 400) { while(true) { digitalWrite(buzzer,HIGH); // включить сигнал тревоги if(digitalRead(pushbutton) == HIGH) break; } } else { digitalWrite(buzzer,LOW); // выключить сигнал тревоги } }

Видео

Оригинал статьи:

Источник: https://radioprog.ru/post/206

Слежение за объектом с помощью ультразвукового датчика HC-SR04 и сервомотора

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

Позже обязательно опишу данный проект.

У меня возникла идея заставить ардуино следить за объектом в трех направлениях, с использованием ультразвукового датчика HC-SR04 и сервомотора.

НАМ ПОНАДОБИТСЯ

  • Плата Arduino Uno или любая ардуино совместимая
  • Ультразвуковой датчик HC-SR04
  • Сервомотор SG-90
  • Провода

                

СХЕМА ПОДКЛЮЧЕНИЯ

КОД ПРОГРАММЫ

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include //подключаем библиотеку для сервомотора
#include «Ultrasonic.h» //подключаем библиотеку для ультразвукового датчика

Servo servoneck; // создаем объект серво-шея
Ultrasonic ultrasonic(12,11); //trigPin — 12; echoPin — 11;
const int ledPin = 13; // пин 13 – светодиод
void setup() { Serial.begin(9600); pinMode(ledPin, OUTPUT); // задаем светодиод — выходной пин servoneck.attach(9); // attaches the servo on pin 9 to the servo object servoneck.write(150); digitalWrite(ledPin, 0); // выключаем светодиод }
 
void loop() { if (ultrasonic.Ranging(CM)>30){ digitalWrite(ledPin, 0); // выключаем светодиод servoneck.write(90); delay(500);
  if (ultrasonic.Ranging(CM)>30){ digitalWrite(ledPin, 0); // выключаем светодиод servoneck.write(150); delay(500); } if (ultrasonic.Ranging(CM)>30){ digitalWrite(ledPin, 0); // выключаем светодиод servoneck.write(90); delay(500); } if (ultrasonic.Ranging(CM)>30){ digitalWrite(ledPin, 0); // выключаем светодиод servoneck.write(30); delay(500); } } else digitalWrite(ledPin, 1); // включаем светодиод
delay(500); }

В данном скетче сервомотор поворачивает ультразвуковой датчик дискретно в диапазоне от 30 до 150 градусов. Угол обзора можно задать для SG90 от 0 до 180 градусов. Это три положения: 30, 90 и 150 градусов.

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

Светодиод Pin13 расположен непосредственно на плате Arduino и на схеме не показан.

Библиотека для ультразвукового датчика HC-RS04 Ultrasonic.h

Библиотека для сервомотора включена в состав программы Arduino IDE.

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

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

Чтобы в зону осмотра не попадали предметы, ближе заданного расстояния.

Вот скетч, где добавлен второй сервомотор для кивания головой:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
#include //подключаем библиотеку для сервомотора

#define trigPin 12 // подключаем Trig к пин 12. отправка сигнала
#define echoPin 11 // подключаем Echo к пин 11. прием ответа
Servo servoneck; // создаем объект серво-шея
Servo servohead; // создаем объект серво-голова
int s1, s2, s3; //создаем переменные для записи расстояний по трем направлениям
//————————————————————————————
//будем замер делать дважды и высчитывать среднюю арифметическую. для исключения ошибок.
//результат измерений будет записываться последовательно в переменные s_1 и s_2
int get_distance(){ long duration; int s_1, s_2, average = -1;
// запись в s_1 digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); duration = pulseIn(echoPin, HIGH); s_1 = (int) duration / 58.2; // запись в s_2 digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); duration = pulseIn(echoPin, HIGH); s_2 = (int) duration / 58.2; // подсчитываем среднее арифметическое s_1 и s_2 average = (int) (s_1 + s_2) / 2; //Serial.print(«distance: «); //Serial.println(average); return average;
}
//—————————————————————
void setup() { Serial.begin(9600); pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); servoneck.attach(9); // подключаем servoneck к pin 9 servohead.attach(10); // подключаем servohead к pin 10 servoneck.write(30); // устанавливаем серво-шея в первоначальное положение servohead.write(30); // устанавливаем серво-голова в первоначальное положение
}
 
void loop() { s1 = get_distance(); //делаем замер s1 в направлении 30 град. if (s1

Источник: http://publicatorbar.ru/2016/05/03/slezhenie-za-obektom-s-pomoshhyu-ultrazvukovogo-datchika-hc-sr04-i-servomotora/

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