Начинается лето, а с ним, как всегда неожиданно, приходит жара. На такой случай у меня есть неплохой компактный вентилятор, питающийся от USB. Дует он хорошо, но часто мимо, так как я работаю на разных концах своего большого стола. А нельзя ли смастерить устройство, которое бы поворачивало вентилятор, направляя поток свежего воздуха непосредственно мне в лицо? Не просто крутило его, то направо, то налево, а автоматически отслеживало цель. Причем с учетом окружающей обстановки, дабы в его прицел не попадали случайные объекты. Интересная задача? Попробуем ее решить.
Первое, что приходит на ум, - взять мини-компьютер Raspberry Pi с камерой, и при помощи машинного зрения распознавать движение или цвет - яркую футболку, например. Правда, обойдется эта затея недешево. По сравнению с ней использование платформы Arduino выйдет бюджетнее, пожалуй, на порядок. Но с камерой она не справится. А так ли она нужна? Существуют ведь и другие способы найти цель. Есть, например, буквально копеечный ультразвуковой датчик расстояния. Как-то раз я наткнулся в интернете на подобную разработку: радар на базе Arduino и именно с таким датчиком. Само по себе устройство было довольно бесполезным, но идея замечательная - вращать датчик расстояния и сканировать пространство, привязываясь к углу поворота сканера. Вот и давайте попробуем применить этот принцип на практике.
Итак, датчик должен поворачиваться. Для этого возьмем обычный сервопривод, известный каждому моделисту - это моторчик с редуктором и обратной связью по углу, то есть мы можем задать ему угол поворота, и он на него повернется. Не будем особо мудрить и для первого эксперимента просто закрепим на нем ультразвуковой датчик с помощью резинового колечка, отрезанного от старой велокамеры. Качалку машинки зафиксируем скотчем на столе, а схему соберем на макетной плате.
Теперь нужно загрузить программу в Arduino. Я слегка переписал оригинальный скетч, потому как местами он сделан не оптимально и сильно тормозит. В моей версии использована более быстрая библиотека. Загружаем прошивку в плату, и радар оживает.
Теперь на компьютере нужно запустить программу, которая будет принимать данные от радара. Она есть в папке по указанной ссылке, но для начала ее работы нужна среда Processing (программное приложение, позволяющее создавать визуальные интерактивные интерфейсы, его можно скачать на официальном сайте www.processing.org). Открываем «блокнот», и здесь необходимо настроить всего один пункт - номер порта, к которому подключена плата Arduino. Он тот же, который выбран в программе Arduino IDE. Запускаем, и… наш радар начинает отображать расстояния до обнаруженных препятствий. Причем, с достаточной точностью он может засечь как крупную цель (человека, например, или его голову в нашем случае), так и различную мелочевку, что может дать множество идей для различных вариантов его использования.
Продумаем алгоритм работы самонаведения системы. Понятно, что возможности радара ограничены умением определять лишь расстояние до объекта. Тем не менее, мы знаем, что каждое такое измерение соответствует определенному углу положения датчика. Это дает возможность построить карту рабочей области. То есть, совершаем один проход и запоминаем, на каком углу какое было расстояние. А при последующих проходах можем найти разницу для каждого угла положения радара, и таким образом обнаружим на карте новый объект, который будет выделяться на фоне уже известных значений.
Научим систему находить объект наведения. Попробуем такой вариант: будем считать количество выделяющихся точек, расположенных друг за другом. И зададим нашей целью область больше какого-то определенного размера, что позволит отфильтровать все шумы измерений (впрочем, отдельные ошибки возможны, поскольку ультразвуковой датчик не идеален).
КАК ЗАГРУЗИТЬ ПРОШИВКУ НА ПЛАТУ ARDUINO
Скачать архив с необходимыми материалами.
Установить библиотеки (папка Libraries) в C:\ProgramFiles\Arduino\ Libraries).
Подключить Arduino к компьютеру с помощью Data-кабеля.
Открыть файл прошивки желаемой версии (файлы прошивок лпо находятся в соответствующих папках архива).
Настроить Arduino IDE (указать COM-порт, куда подключена плата, и модель Arduino).
Внести по желанию дополнительные настройки в прошивку и нажать «Загрузить».
Что имеем? Радар может распознать некую область в секторе сканирования, то есть он знает угол положения ее границ, где эта зона начинается и где заканчивается. Остается вычислить середину этой области, направить в нее взгляд радара и пусть он больше не двигается - это будет режим удержания позиции цели. Продолжим измерять расстояние, и если объект сместится из зоны видимости датчика, то через некоторое время радар снова перейдет к режиму поиска. А затем, найдя его, опять остановится.
Компьютер, необходимый для настройки, больше уже не нужен - плата Arduino прошла обучение и далее все делает сама. Подаем на нее питание от 5-вольтового блока (подойдет «зарядник» любого сотового телефона). Сначала выполняется калибровка «от края до края». Система запоминает расстояния в калибровочный массив, и запускается рабочий режим: сканируется заданная область, если в ней замечена цель, то определяется ее угловой размер и радар выставляется по биссектрисе угла, то есть точно в центр объекта. Сразу приходят мысли о создании мини-турели «защитника рабочего стола», или еще для чего-нибудь интересного. При этом все временные паузы могут быть настроены - в программе есть множество возможностей, с которыми можно поиграться, чтобы отладить собственные режимы.
В целом «мозги» самонаводящегося вентилятора готовы, приступим к сборке «железа». Как я уже упоминал, у меня небольшой китайский агрегат, питающийся от USB, такой легко можно купить где угодно. Снимаю заднюю крышку и понимаю, что под ней вполне достаточно свободного места для установки электроники. Кстати, если внутрь вашей модели не поместится плата Arduino Nano - не забывайте, что еще есть и версия Arduino Mini. Она без программатора на борту, зато совсем миниатюрная, впишется куда угодно.
НАСТРОЙКИ В ПРОШИВКЕ ARDUINO
#define STEP DELAY 20 // скорость сервопривода (меньше 5 не ставить, сонар «тупит»)
#define TIMEOUT 2000 // таймаут на новый поиск цели из режима удержания
#define PWR_TIMEOUT 10000 // таймаут на выключение вентилятора
#defineMAX_ANGLE 150 // максимальный угол поворота #define MIN ANGLE 10 // минимальный угол поворота #define DIST MAX 150 // макс, расстояние (в см), датчик работает до 4 м, но будут шумы
#define DEADZONE 20 // зона нечувствительности (мин. разность с калибровкой)
#define MIN_CATCH 5 // мин. количество точек подряд, чтобы считать объект целью
#define MISTAKES 2 // допустимое количество пропусков при сканировании цели
Примеряя компоновку, подумал, а почему бы не управлять подачей питания на вентилятор непосредственно с Arduino, отказавшись от кнопки? Места мало, конечно, реле под крышку не влезет, так что будем использовать полевой транзистор. Плюс к нему нужны еще два резистора: на 100 Ом и 10 кОм. В принципе, можно приобрести готовый модуль силового ключа, но совершенно очевидно, что в мой вентилятор он не поместится.
Дальномер подключен к плате шлейфом от жесткого диска. Также в схему входит конденсатор - eго установка необязательна, но желательна, так как сервопривод дает весьма ощутимые для USB выбросы тока, и это может сказаться на измерениях расстояния. К слову, к выводам этой емкости я и припаял провода питания для всех элементов - оказалось удобно.
Для загрузки прошивки в Arduino Mini требуется внешний программатор - на «алиэкспрессе» он стоит как банка газировки, и подключается к плате, как показано на схеме. Никаких дополнительных особенностей у самой загрузки нет. Выполнив ее, закрываю крышку, а провода вывожу через отверстие от выключателя.
Монтируем сервопривод. Поскольку вентилятор я решил подвесить на полку над столом, то креплю рулевую машинку на дюралюминиевый уголок. А датчик устанавливаю на ограждение лопастей вентилятора. Жду, когда пройдет калибровка, и наслаждаюсь самонаводящимся вентилятором. Изначально он задумывался как рабочий макет, но вышла вполне законченная конструкция. Кстати, если датчик какое-то время не может обнаружить цель, устройство ориентируется в центральное положение и отключается. А чтобы его запустить - достаточно просто поднести к нему руку. И вентилятор снова найдет объект охлаждения.
Немного огорчает, что движения вентилятора не слишком плавные, но это из-за использования самого примитивного сервопривода с пластиковыми шестеренками в редукторе. С более дорогим и качественным дергания исчезнут. В целом же, считаю, что проект получился очень забавным и интересным именно благодаря своей простоте. Всего один датчик, один привод, а в итоге полноценное самонаведение по карте области и сенсорное управление. Хотя и здесь кое-что можно улучшить. После потери цели система не знает, в какую сторону ушел объект, и продолжает двигаться в последнем активном направлении. Если добавить второй датчик, что, собственно, я и сделал, этот недостаток устраняется. Причем каждый дальномер калибруется отдельно и опрашивается в зависимости от режима. Эту версию оставил пока в виде макета, но когда-нибудь еще до нее доберусь и все-таки сделаю самонаводящуюся мини-турель!
Александр МАЙОРОВ для сайта https://modelist-konstruktor.com/