Ребенок у меня поклонник "очень странных дел" и под выход нового сезона решил сделать небольшую инсталляцию для лучшего погружения в атмосферу изнанки.
Заказал удобные модули на чипе ws2811, но через месяц доставки, понял, что привоз от 24 ноября до 14 декабря, это точно до 14 декабря.
Пришлось нарезать ленту, которая валялась дома с такими же модулями и припаять к ним витую пару (нужно три провода с каждой стороны модуля). Паял и чувствовал себя как в анекдоте курить паять пиздец люблю.
26 букв. 156 раз залудить😅
Уже после сборки решил подключить простенький пульт инфракрасный и прописать немного команд, чтобы с Уиллом можно было пообщаться. Типа «да», «нет», «беги» и тд. И обычный режим, когда фразы через рандомойзер.
Run
Колхозной гирлянде, колхозный блок управления) На плате ESP
Нет, это не айти, это режим просмотра «оно».
По факту такое рукоделие оценил больше всех я сам😅
Подключаю ардуино нано следующим образом (показано на картинках). Проблема в том что ардуино не видит модуль. Разные скетчи для тестов выводят что ардуино его не видит. Очень прошу помочь.
Между ними стоит стабилизатор AMS1117, преобразует 5v в 3.3v, а так же 2 конденсатора на 220мкф (так посоветовала нейросеть). Самое главное что тестировал пошагово, сначала напрямую ардуино к модулю, после чего добавил стабилизатор, после чего уже добавил конденсаторы. Ни в одном из случаем модуль не определялся.
Идея проекта возникла этой весной, когда в наши края приезжал вице-президент Союза охраны птиц России Алексей Леонович Эбель, для учёта гуменника, мигрирующего через Алтайский край. Проблема в том, что численность этой группировки только оценочная, так как, в отличии от многих других водоплавающих, он не образует сколь-нибудь значимых скоплений ни во время миграции, ни на зимовках. Поэтому разброс мнений экспертов огромен: от 7-10 тысяч в Wetlands до нескольких сотен тысяч у некоторых отечественных.
Проблема в том, что гусь летит 5-6 недель и неравномерно (насколько неравномерно — это базовый вопрос). И ещё нерешённая задача: гусь может лететь ночами.
Алексей Леонович вычислил место, где гуменника во время весенней миграции учитывать оптимальнее всего. Эта точка оказалась недалеко от меня. За два полных плюс один неполный световых дня в коридоре 7-8 км он насчитал почти 15 000 пролётных особей, а мы с друзьями ему в этом немного помогали.
Понятно, что посчитать это вручную более-менее точно не получится, поэтому я сразу подумал о том, чтобы автоматизировать задачу.
Идея довольно простая. Клин гуменника (да и в принципе любой птицы) летит не очень быстро. Можно просто при помощи длиннофокусной камеры сканировать небо и пытаться найти птицу в кадре при помощи нейросети. Камеру можно закрепить на механизме наподобие турели, управлять моторами будет Arduino, а искать птиц и посылать команды на контроллер будет одноплатник (или подобная более мощная железка).
3D модель железки
Проект не очень сложный, я его отдал своему ученику. Большую часть он по-честному сам выполнил, я же просто немного помог со скриптами и 3D моделями. А также нашел нужные комплектующие.
❯ Подбор комплектующих
Первым делом надо было найти подходящую длиннофокусную камеру с интерфейсом USB и нормальным сенсором. Естественно, готовой камеры не нашлось. Но обнаружился обычный модуль USB камеры. И объектив под него на 50мм.
Сенсор 1/2.9", 4мп
50мм без ик фильтра
Как оказалось, я немного просчитался: на камере ИК-фильтр был установлен прямо на объективе. А новый объектив оказался совсем без него. Если будем пытаться использовать эту систему ночью — это плюс. Но вот днем совсем не то, чего бы я хотел)
Решение оказалось довольно простым и удачным — кронштейн объектива со встроенным переключаемым фильтром. Это позволит в дальнейшем переходить в ночной режим.
Ещё выяснилось, что 50мм многовато. Такое фокусное расстояние я рассчитывал под сенсор 1/2 дюйма (а такую камеру за недорого я не нашел). Под 1/2.9 идеально было бы 35мм, но и так вполне можно работать.
❯ Сборка
Дальше начался процесс сборки прототипа. Камера должна крутится почти на 360° по горизонтали и хотя бы 90° по вертикали. Для поворота по вертикали использовали сервопривод mg996, а по горизонтали — стандартный шаговый мотор из комплектов ардуино 28byj-48.
Первый прототип
Все это подключили к плате от контроллера zero (про него писал в статье Как я скрещивал Arduino и Lego), просто к ней было удобнее.
Тут возникла новая проблема. Эта «турель» начала накручивать на себя все провода :). Так как у шагового мотора нет нулевой точки (и вообще обратной связи), при любом переподключении турель начинала работать с текущей точки.
Решение этой проблемы я подсмотрел на своей камере видеонаблюдения.
При запуске Arduino она просто едет в одну точку на 360°, упирается в пластиковый штифт, пропускает какое-то неизвестное количество шагов (пока по мнению Arduino не доедет в точку 360°) и едет обратно на 180°.
Дальше упаковали всю электронику в пластиковый корпус.
❯ Прошивка
Прошивки получается две. Точнее одна прошивка для Arduino и один скрипт на python.
Алгоритм работы следующий. Камера движется по горизонтали от начального угла до конечного угла, с шагом примерно равным углу обзора камеры. На каждом шаге делается кадр (точнее 3 кадра, для надежности). И на этом кадре, при помощи библиотеки YOLO 8 ищутся птицы. Если птицы найдены, считается их количество и кадр сохраняется. Чтобы поиск птицы происходил побыстрее, использована модель yolov8s. Когда камера доходит до конечного угла по горизонтали, она делает один шаг по вертикали и все начинается сначала. Моторами шевелит Arduino nano, общение происходит по Serial порту.
То есть, если поставить камеру в чистом поле, она тупо будет крутиться и постепенно подниматься, сохраняя фотографии, если увидит птицу. Алгоритм ещё не доработанный, потому что пока не понятно, как камера будет ловить пролетающие стаи. Дальше надо будет придумать, как отличать одни стаи от других, чтобы не считать одних и тех же птиц несколько раз (Буду благодарен если подкинете пару идей). Прошивку, если кому-то будет интересно, загружу на github.
❯ Испытания
В качестве первых испытаний запустили эту установку просто на окне. Ограничили углы работы, чтобы лишнее не захватывалось. И даже несмотря на то, что эта система на это не рассчитана, она ловит обитающих по близости голубей :)
Голубей ловит хорошо
На готовом снимке нашел не всех, но это просто вопрос способа обнаружения. Можно просто темные силуэты искать
План был следующий: полноценно испытать эту систему во время осенней миграции. Нужно было поездить по тем же местам, что и весной. Но в конце августа я сначала неудачно заболел, а потом попал в больницу, и испытания не состоялись :(
Полноценные испытания видимо откладываются до весны, а пока будем дорабатывать прошивку и придумывать, на чем это запустить. Одноплатника для YOLO 8 категорически не хватает, а полноценный мини-ПК для такого проекта использовать дорого. Скорее всего, придется перейти на обнаружение птиц более простыми методами, и последующую обработку полученных данных на более производительном ПК.
Интереснейшая штука эта ваша Ардуино, всё можно сделать. Дело было вечером, делать было нечего и в голове всплыл проект парктроника в гараж, уж и не помню, где я его видел.
Смысл парктроника в том, чтобы в зависимости от приближения менялся цвет ленты. В данном случае, т.к. это "мини" парктроник, то я задумал, что 20 см - зелёный, 10 см - жёлтый и менее 5 см - должен моргать красный.
Для проекта нужно.
Кусок светодиодной ленты. У меня был на кусочек 12 диодов.
Ардуино UNО.
Ультразвуковой датчик для измерения расстояния и движения HC-SR04.
Пакет молока
HC-SR04 - это популярный и недорогой ультразвуковой датчик для измерения расстояния. Он использует принцип эхолокации - посылает ультразвуковой сигнал и измеряет время, за которое он возвращается после отражения от объекта.
Эффективная дистанция:2 см - 400 см (реально 2 см - 200 см стабильно)
Точность: ~3 мм
Если в проекте несколько составляющих, то я всегда по возможности их отдельно проверяю, чтоб потом не ломать голову, из-за чего всё не работает.
Поэтому вначале проверяем датчик HC-SR04. Для этого загружаем скетч проверки и в мониторе порта смотрим, как датчик реагирует, например, на руку.
Раньше смотрел его ролики, очень интересные и доходчиво объясняет. Но к сожалению потерял его канал. снимает он про Ардуино в основном , а так же всякие модули для Ардуино. если не ошибаюсь зовут его Дмитрий , но это не точно , живёт вроде в Москве в общежитии главная особенность похож на Жана Рено
pulsewidth = ticksToUs(servos[this->servoIndex].ticks) + TRIM_DURATION ; // 12 aug 2009
else
pulsewidth = 0;
return pulsewidth;
}
чтобы при инициализации пина сервопривод вставал не в дефолтное значение, а в считанное с текущего положения?
я просто не особо разбираюсь в программировании, и читаю только мануалы по командам в библиотеках, ну и по примерам из интернета.
находил какие-то древние вопросы на форумах, там советовали подключать транзистор на питание сервопривода, типа после прохождения всех attach в Setup, открывать транзистор. но без питания с сервопривода невозможно считать положение. сервопривод китайский, на 3 провода: плюс минус и управление.
если я не ошибаюсь, то можно создать переменную в начале Servo.cpp которая будет содержать данные о положении, но чё то не пойму пока как))