Оглавление:

Детектор колибри / фотограф: 12 шагов (с изображениями)
Детектор колибри / фотограф: 12 шагов (с изображениями)

Видео: Детектор колибри / фотограф: 12 шагов (с изображениями)

Видео: Детектор колибри / фотограф: 12 шагов (с изображениями)
Видео: Очень тайная функция iPhone 13😱 2024, Ноябрь
Anonim
Детектор колибри / фотограф
Детектор колибри / фотограф

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

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

Шаг 1: выбор микроконтроллера

Выбор микроконтроллера
Выбор микроконтроллера

Я выбрал микроконтроллер PJRC Teensy. Teensy использует микроконтроллер ARM, в частности ARM Cortex M4. Cortex M4 содержит оборудование для выполнения БПФ (быстрого преобразования Фурье), которое будет выполнять обнаружение. PJRC также продает аудиоплату, которая позволяет использовать Teensy для воспроизведения музыки, а также для записи звука с внешнего входа или небольшого микрофона, который вы можете добавить к плате. Я планировал заставить Teensy выполнить БПФ для звука с микрофона.

Шаг 2: БПФ?

БПФ?
БПФ?

БПФ - это математическая формула / алгоритм, преобразующий сигнал из временной области в частотную. Это означает, что он берет дискретизированный по времени звук с микрофона и преобразует его в величины частот, присутствующих в исходной волне. Видите ли, любую произвольную непрерывную волну можно построить из серии синусоидальных или косинусоидальных волн, кратных некоторой базовой частоте. БПФ делает противоположное: он берет произвольную волну и преобразует ее в величины волн, которые, если их сложить вместе, создадут исходную произвольную волну. Еще более простой способ сказать это: я планировал использовать программное обеспечение и аппаратное обеспечение БПФ в Teensy, чтобы определить, «слышит» ли он взмах крыльев колибри с частотой, с которой происходят взмахи крыльев. Если он «слышит» колибри, я пошлю на камеру команду сделать снимок.

Это сработало! Итак, как мне это удалось, как вы могли это сделать и как вы могли бы сделать это еще лучше?

Шаг 3. Как звучит парящая колибри?

Как звучит парящая колибри?
Как звучит парящая колибри?

Перво-наперво мне нужно было выяснить, на какой частоте я буду слышать взмахи крыльев колибри. Чтобы определить это, я использовал свой iPhone. Я прикрепил iPhone к штативу и заставил его записывать замедленное видео прямо перед кормушкой для колибри на нашей палубе. Через некоторое время я снял камеру и загрузил видео. Затем я посмотрел видео, ища колибри перед кормушкой. Когда я нашел хорошую последовательность, я подсчитал количество отдельных кадров, которые потребовались колибри, чтобы взмахнуть крыльями из одного положения полностью обратно в это же положение. Замедленная съемка на айфоне составляет около 240 кадров в секунду. Я наблюдал, как колибри парит перед кормушкой, и насчитал 5 кадров, чтобы он переместил свои крылья из переднего положения в заднее, а затем вернулся в переднее положение. Это 5 кадров из 240. Помните, мы слышим звук при каждом взмахе закрылков колибри (один при движении вперед и один при движении назад). Для 5 кадров за цикл или период мы можем вычислить частоту как деление на период, то есть 1 / (5/240) или 48 Гц. Это означает, что когда эта колибри парит, звук, который мы слышим, должен быть вдвое больше, или около 96 Гц. Вероятно, частота выше, когда они летают, а не парят. На это также может повлиять их масса, но я думаю, мы можем предположить, что большинство птиц одного вида имеют примерно одинаковую массу.

Шаг 4: ряды Фурье и крохотность

Ряд Фурье и крошечный
Ряд Фурье и крошечный

Teensy (я использовал Teensy 3.2) производится PJRC (www.pjrc.com). БПФ будет рассчитываться на выборке звука. Чтобы получить звук, PJRC продает плату аудиоадаптера для Teensy (TEENSY3_AUDIO - 14,25 доллара США). Также продается небольшой микрофон, который можно припаять к плате аудиоадаптера (МИКРОФОН - 1,25 доллара США). На плате аудиоадаптера используется микросхема (SGTL5000), с которой Teensy может общаться по последовательной шине (I2S). Teensy использует SGTL5000 для сэмплирования звука с микрофона и его оцифровки, то есть для создания набора чисел, которые представляют звук, который слышит микрофон.

БПФ - это просто быстрая версия того, что называется дискретным преобразованием Фурье (ДПФ). ДПФ может выполняться на произвольном количестве отсчетов, однако при БПФ необходимо, чтобы отсчеты сохранялись в наборах, кратных двоичному разряду. Аппаратное обеспечение Teensy может выполнять БПФ для набора из 1024 отсчетов (1024 = 2 ^ 10), так что мы будем использовать именно его.

БПФ обычно производит на выходе величины И фазовые соотношения между различными представленными волнами. В этом приложении нас не интересуют фазовые соотношения, но нас интересуют величины и их частота.

Аудиоплата Teensy воспроизводит звук с частотой 44, 100 Гц. Таким образом, 1024 выборки на этой частоте представляют собой временной интервал 1024/44100 или около 23,2 миллисекунды. В этом случае БПФ выдаст на выходе величины, которые являются целыми числами, кратными периоду выборки 43 Гц (опять же, 1 / 0,0232 равняется примерно 43 Гц). Мы хотели бы найти величины, которые примерно вдвое превышают частоту: 86 Гц. Это не совсем та частота, с которой мы рассчитали взмахи крыльев колибри, но, как мы увидим, она достаточно близка.

Шаг 5: Использование данных Фурье

Использование данных Фурье
Использование данных Фурье

Библиотеки, предоставляемые PJRC для Teensy, будут обрабатывать образцы и возвращать массив значений величин. Мы будем называть каждую величину в возвращаемом массиве ячейкой. Первая ячейка (при нулевом смещении в массиве возвращаемых данных) - это смещение волны по постоянному току. Мы можем спокойно игнорировать это значение. Вторая ячейка (со смещением 1) будет представлять величину компонента 43 Гц. Это наш базовый период. Следующий интервал (со смещением 2) будет представлять величину составляющей 86 Гц и так далее. Каждый последующий интервал является целым числом, кратным базовому периоду (43 Гц).

Вот тут-то и становится немного странно. Если бы мы использовали БПФ для анализа идеального звука 43 Гц, то БПФ вернуло бы первый интервал с некоторой большой величиной, а все остальные интервалы были бы равны нулю (опять же, в идеальном мире). Если бы звук, который мы захватили и проанализировали, был 86 Гц, то интервал со смещением один был бы равен нулю, а интервал со смещением 2 (вторая гармоника) имел бы некоторую большую величину, а остальные интервалы были бы нулевыми, и так далее. Но если бы мы зафиксировали звук колибри, и он был 96 Гц (как я измерил на своей одной птице), то смещение 2 бункера при 86 Гц будет иметь величину немного меньшую (чем идеальная волна 86 Гц) и каждая ячейка вокруг него (одна ниже и несколько выше) будет иметь убывающее ненулевое значение.

Если размер выборки для нашего БПФ был больше 1024 или если наша частота дискретизации звука была ниже, мы могли бы улучшить разрешение наших бинов (то есть меньше). Но даже если мы изменим эти вещи, чтобы сделать наши элементы дискретизации БПФ на 1 Гц кратными базовому периоду, нам все равно придется иметь дело с этим «разливом» этого ящика. Это потому, что мы никогда не получим частоту крыла, которая всегда и точно приземлялась бы на одном интервале. Это означает, что мы не можем просто основывать наше обнаружение колибри на значении в ячейке смещения 2 и игнорировать остальное. Нам нужен способ проанализировать данные в нескольких ячейках, чтобы попытаться разобраться в них. Подробнее об этом позже.

Шаг 6: начать строительство

Начать строительство
Начать строительство
Начать строительство
Начать строительство

Для своего прототипа детектора колибри я использовал удлиненные штыри, припаянные к контактам в Teensy. Я сделал это, чтобы подключить Teensy к небольшой макетной плате без пайки. Я сделал это, потому что предполагал, что внесу много изменений в прототип, а с макетной платой я мог бы это изменить и просто перемыть провода там, где мне нужно. Я припаял женские полоски к нижней стороне аудиоплаты, что позволяет подключать ее к верхней части Teensy. Микрофон припаян к верхней части аудиоплаты (см. Рисунки). Более подробную информацию о сборке можно найти на сайте PJRC:

(https://www.pjrc.com/store/teensy3_audio.html).

Шаг 7. Аппаратное обеспечение для создания снимка

Оборудование для создания снимков
Оборудование для создания снимков
Оборудование для создания снимков
Оборудование для создания снимков

У меня есть (ну, у моей жены) цифровая камера Canon Rebel. На камере есть разъем для подключения ручного дистанционного управления затвором. Я купил ручной пульт дистанционного управления от B&H Photo. Кабель имеет разъем, подходящий для камеры на одном конце, и его длина составляет около 6 футов. Я перерезал кабель на конце рядом с блоком управления кнопками, зачистил провода и припаял их к трем контактам разъема, которые можно было подключить к макетной плате. Есть оголенный провод, который является заземлением, и два других сигнала: кончик триггера (розовый) и кольцо (белое) - фокус (см. Рисунки). Замыкание наконечника и / или кольца на землю приводит в действие затвор и фокусировку камеры.

С помощью перемычки я провел общую землю от Teensy до области, где я мог бы использовать ее на макетной плате. Я также подключил анод светодиода к контакту 2 на Teensy, а катод светодиода - к резистору (100–220 Ом) на землю. Я также подключил контакт 2 Teensy к резистору 10 кОм, а другую сторону резистора я подключил к базе транзистора NPN (2N3904 можно найти повсюду). Я соединил эмиттер транзистора с землей, а коллектор подключил к белому и розовому проводам от кабеля, идущего к камере. Оголенный провод снова был подключен к земле. Всякий раз, когда светодиод включается Teensy, транзистор NPN также включается и запускает камеру (и фокус). См. Схему.

Шаг 8: проектирование системы

Системный дизайн
Системный дизайн

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

PJRC имеет отличный графический интерфейс, который позволяет перетаскивать аудиосистему для Teensy и аудиоплаты. Вы можете найти это здесь:

www.pjrc.com/teensy/gui/

Я решил использовать один из биквадратных каскадных фильтров, предоставленных PJRC, чтобы ограничить звуковые частоты от микрофона (фильтра). Я подключил три таких фильтра каскадом и настроил их на полосу пропускания при 100 Гц. Этот фильтр будет пропускать системные частоты немного выше и немного ниже интересующей нас частоты.

На блок-схеме (см. Рисунок) i2s1 - это аудиовход к аудиоплате. Я подключил оба аудиоканала к микшеру, а затем к фильтрам (микрофон - это только один канал, но я смешал оба, поэтому мне не нужно было выяснять, какой это канал … называйте меня ленивым). Я подключаю выход фильтра к аудиовыходу (чтобы я мог слышать звук, если хочу). Я также подключил звук от фильтров к блоку БПФ. На блок-схеме блок, помеченный как sgtl5000_1, является микросхемой аудиоконтроллера. Никаких соединений на схеме не требуется.

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

Шаг 9: Код

Код
Код

В этом Руководстве потребовалось бы слишком много места, чтобы подробно изучить программное обеспечение. Я постараюсь выделить некоторые ключевые моменты кода. Но в любом случае это не очень большое приложение. У PJRC есть отличный видеоурок по использованию Teensy и аудио-библиотек / инструментов (https://www.youtube.com/embed/wqt55OAabVs).

Я начал с примера кода БПФ от PJRC. Я вставил то, что получил от инструмента проектирования аудиосистемы, в верхнюю часть кода. Если вы посмотрите на код после этого, вы увидите некоторую инициализацию, а затем система начнет оцифровку звука с микрофона. Программа входит в «навсегда» цикл () и ожидает, пока данные БПФ станут доступны, используя вызов функции fft1024_1.available (). Когда доступны данные БПФ, я беру копию данных и обрабатываю ее. Обратите внимание, что я беру данные только в том случае, если величина наибольшего интервала выше установленного значения. Это значение, как я устанавливаю чувствительность системы. Если интервалы превышают установленное значение, я нормализую волну и передаю ее во временный массив для обработки, в противном случае я игнорирую ее и продолжаю ждать следующего БПФ. Следует упомянуть, что я также использую функцию регулировки усиления микрофона для регулировки чувствительности схемы (sgtl5000_1.micGain (50)).

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

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

Другой алгоритм использует постоянный массив значений, которые представляют нормализованное БПФ. Эти данные - результат реальной (оптимальной) сигнатуры колибри. Я называю это живой изгородью. Я сравниваю данные хеджирования с нормализованными данными БПФ, чтобы увидеть, находятся ли соответствующие интервалы в пределах 20% друг от друга. Я выбрал 20%, но это значение можно легко изменить.

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

Шаг 10: Монтаж

Монтаж
Монтаж

На картинке видно, как я (бесцеремонно) монтировал электронику. Я подключил Teensy к макетной плате, которая была прикреплена к несущей плате вместе с другой (неиспользованной) совместимой с Arduino (я думаю, Arduino Zero). Я привязал все это проволокой к металлической стойке от навеса на своей палубе (я также добавил разгрузку от натяжения кабеля, идущего к камере). Столб был рядом с кормушкой для колибри. Я запитал электронику небольшим блоком питания LiPo, который можно использовать для подзарядки мертвого сотового телефона. На блоке питания был USB-разъем, который я использовал для подачи питания на Teensy. Я протянул кабель дистанционного триггера к камере и подключил его. Я был готов к действиям с птицами!

Шаг 11: результаты

Полученные результаты
Полученные результаты

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

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

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

Шаг 12: Заключительные мысли

Последние мысли
Последние мысли

Это был забавный проект, и он работает. Но, как и в большинстве случаев, есть еще много возможностей для улучшения. Фильтр, безусловно, может быть другим (например, фильтр нижних частот или изменения в расположении и / или параметрах), и, возможно, это может улучшить его работу. Я также уверен, что есть алгоритмы получше. Я попробую кое-что из этого летом.

Мне сказали, что существует программный код машинного обучения с открытым исходным кодом… возможно, систему можно «обучить» распознавать колибри! Я не уверен, что попробую это, но, может быть.

Что еще можно было бы добавить в этот проект? Если бы у камеры была отметка даты / времени, вы могли бы добавить эту информацию к изображениям. Еще вы можете записать звук и сохранить его на карту памяти USB (на аудиоплате PJRC есть слот для него). Сохраненный звук можно использовать для обучения алгоритму обучения.

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

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

Спасибо за прочтение!

Чтобы использовать опубликованный мной код, вам понадобится IDE Arduino (https://www.arduino.cc/en/Main/Software). Вам также понадобится код Teensyduino от PJRC (https://www.pjrc.com/teensy/td_download.html).

Рекомендуемые: