Добавить в корзинуПозвонить
Найти в Дзене
Marfikus Tech Notes

Автоматический ночник на Arduino

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

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

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

Покопавшись в запасах, выбрал следующее:

Компоненты будущего устройства
Компоненты будущего устройства

Тут у нас имеется:

  • Arduino UNO — мозг будущего устройства
  • три ультразвуковых датчика расстояния HC-SR04 — его глаза
  • макетная плата с проводами — полезная вещь для прототипирования простых схем без пайки, экономит время (хотя и не всегда)
  • светодиоды, резисторы — собственно, само освещение
  • блок питания на 5В (старое зарядное устройство от мобильного телефона)

Для создания прототипа этого достаточно (даже блок питания пока не нужен), остальное будет добавляться по ходу дела.

Идея простая: если есть движение в зоне контроля, то включаем освещение. Далее, если движение прекратилось, то через некоторое время выключаем освещение.

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

Да, придётся немного повозиться с настройкой каждого датчика в своём направлении, чтобы они срабатывали достаточно точно и своевременно. С датчиком движения было бы проще: он просто фиксирует инфракрасное излучение в зоне контроля. Точнее, он фиксирует разницу в величинах инфракрасного излучения, попадающего на его сенсоры. Если эта разница становится больше установленного порога, то датчик срабатывает. А такое возможно именно во время движения «тёплого» объекта. Если же это просто горячая батарея (неподвижная), то никакой тревоги не будет. Кому интересно, в Википедии неплохо написано по принципу действия датчиков движения различных типов.

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

Ранее я уже имел некоторый опыт работы с ультразвуковым датчиком, коротко изложу его принцип действия: датчик излучает импульс звука высокой частоты и ждёт, когда этот импульс, отразившись от препятствия, вернётся обратно. Зная время между отправкой и приёмом импульса, а также скорость звука в воздухе (~331 м/c), можно вычислить расстояние до препятствия. Этим собственно и занимается библиотека.

Ну вот, с теорией вроде бы всё, пора переходить к практике.

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

А начинаем с создания прототипа на макетной плате:

Прототип будущего устройства
Прототип будущего устройства

Подключил к ардуино сначала один датчик расстояния и один светодиод. Расписывать подключение и работу, думаю, не имеет смысла, так как подобных уроков достаточно в сети по запросам вида: «arduino работа со светодиодом», «arduino работа с датчиком расстояния». Выбирайте наиболее удобный формат (видео/текст) и вперёд, там всё просто.

Добавлю только немного по расчёту сопротивления резистора для светодиода. Светодиод является нагрузкой для микроконтроллера (МК), а подключать большую нагрузку на него не надо. Микроконтроллер – это мозг, его задача принимать сигналы, обрабатывать и, в соответствии с алгоритмом, раздавать управляющие команды исполнителям. Максимальная нагрузка по току для одного порта МК - 40мА, но рекомендуется не превышать 20мА. Этого вполне достаточно для управления каким-нибудь транзистором, тиристором и тп. А они уже способны коммутировать более мощную нагрузку. Подробнее об этом и вообще о питании ардуино, понятно изложено, например, у Алекса Гайвера.

В моём случае светодиод с резистором потребляют около 13мА, что, в общем, допустимо.

Резистор нужен для того, чтобы немного снизить напряжение, подаваемое на светодиод, и ограничить ток. С МК выходит 5В, а для данного светодиода номинальное напряжение питания около 3В и потребляемый ток около 20мА. Из этого следует, что нам надо «срезать» 2В. Вспоминаем закон Ома:

I = U / R

Выводим из него сопротивление:

R = U / I

где R — искомое значение сопротивления резистора, U — напряжение питания, I — потребляемый светодиодом ток.

Но, поскольку нам надо узнать значение сопротивления, которое позволит нам срезать 2В с 5, то немного модифицируем формулу, подставив вместо напряжения питания, разницу между напряжением питания и рабочим напряжением светодиода:

R = (Uпит – Uраб) / I = (5 — 3) / 0.02 = 100 Ом

Но с резистором на 100 Ом, ток на практике получается около 18мА, что довольно близко к условному пределу (20мА). Поэтому я взял резистор на 150 Ом и получил ток в 13мА, что приемлемо. Так и на МК нагрузка меньше, и светодиод не на пределе, и света от него достаточно.

Ну, вроде с расчётами закончили, теперь прошивка. Примерно за день-полтора я реализовал достаточно удовлетворяющий меня алгоритм. Получилось так: в главном цикле с устанавливаемым интервалом, происходит опрос датчиков (реально пока одного), их значения запоминаются. Далее в цикле происходит сравнение этих значений с пороговыми, которые задаются константами. Если значение меньше порогового, то проверяется: а не равно ли это значение нулю? Эту проверку добавил, как защиту от обрыва датчика: если датчик отключен (в обрыве), то значение будет нулевое. А также для удобства настройки: можно заклеить кусочком изоленты датчик, и тем самым временно его отключить, не нарушая схему.

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

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

Опробовав прошивку на схеме с одним датчиком, добавил ещё два, чтобы была возможность контролировать три направления.

-3

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

Потестировав таким образом прошивку, перешёл к сборке. Начал с датчиков. Первым делом решил заменить впаянные производителем пины для быстрого подключения, на обычные провода – так компактнее и контакт лучше:

Далее, из алюминиевой жести изготовил такой вот незамысловатый кронштейн для датчика:

-5

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

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

-7

Такая конструкция позволяет настраивать направление датчика и направление света, причём, почти независимо.

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

Сделал ещё два датчика, ну и подружил их со светодиодами:

Красота). Немного общего плана:

-10

Рабочий, творческий процесс…

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

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

Разводка проводов
Разводка проводов

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

В итоге получаем вот такую, довольно аккуратную разводку:

-14

Можно проверять. Для питания ардуино я припаял к плате ещё одно гнездо, через которое будет приходить 5В от блока питания. То гнездо, которое уже есть на плате, после себя имеет стабилизатор, поэтому на него нужно подавать большее напряжение (7-12В). Да и стабилизатор тот довольно слабенький, будет греться, а зачем мне лишний источник тепла в корпусе? Пускай греется блок питания, который будет снаружи.

Дополнительное гнездо питания на ардуино
Дополнительное гнездо питания на ардуино

Подключаем гребёнки к плате:

-16

Получилось довольно прикольно, время испытаний:

Ещё немного отладки и, в общем, устройство готово к бою:

Вот как оно выглядит уже на месте:

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

Общий план:

-20

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

А вот как он выглядит в темноте:

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

С текущими настройками свет включается, как минимум, через 150 миллисекунд после появления чего-либо в зоне контроля, что довольно быстро. Затем, если срабатывания прекратились, то через 90 секунд свет начинает выключаться. Затухание я настроил очень плавное: полностью гаснет примерно за 15-20 секунд. Если не следить за ним специально, то и не замечаешь, как он выключается. А если следишь, то прям наслаждаешься процессом). Разумеется, все настройки задаются константами в начале файла прошивки и всё можно подкрутить под себя.

Создание девайса заняло в общем около трёх дней: день-полтора на прошивку и примерно столько же на сборку.

Схема коммутации компонентов (также есть в репозитории):

-22

На этом, пожалуй, всё. Надеюсь, было интересно, а может быть даже кому-то полезно. Спасибо за внимание!

Полезные ссылки:

Репозиторий с прошивкой и схемой

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

Питание ардуино

Ардуино: работа со светодиодом

Ардуино: работа с датчиком расстояния