Spisu treści:

Wykrywacz kolibrów / aparat do robienia zdjęć: 12 kroków (ze zdjęciami)
Wykrywacz kolibrów / aparat do robienia zdjęć: 12 kroków (ze zdjęciami)

Wideo: Wykrywacz kolibrów / aparat do robienia zdjęć: 12 kroków (ze zdjęciami)

Wideo: Wykrywacz kolibrów / aparat do robienia zdjęć: 12 kroków (ze zdjęciami)
Wideo: Hania GENZIE 2024, Listopad
Anonim
Wykrywacz kolibrów / aparat do robienia zdjęć
Wykrywacz kolibrów / aparat do robienia zdjęć

Na tylnym pokładzie mamy karmnik dla kolibrów i od kilku lat robię im zdjęcia. Kolibry to niesamowite małe stworzenia, bardzo terytorialne, a ich walki mogą być zarówno zabawne, jak i niesamowite. Ale męczyło mnie stanie jak posąg na tyłach mojego domu, aby zrobić im zdjęcia. Potrzebowałem sposobu na robienie zdjęć bez konieczności stania za domem przez długi czas. Wiem, że mogłem użyć zdalnie sterowanej migawki, ale chciałem, aby zdjęcia były robione automatycznie, bez mojej obecności. Postanowiłem więc zrobić urządzenie do wykrywania kolibrów i automatycznego robienia zdjęć.

Zawsze chciałem użyć do tego mikrokontrolera. Mikrokontroler mógłby sterować migawką aparatu pod kontrolą oprogramowania. Ale czujnik wykrywający maleńkiego kolibra to co innego. Mogłem użyć czujnika ruchu, ale chciałem spróbować czegoś wyjątkowego. Postanowiłem użyć dźwięku jako wyzwalacza.

Krok 1: Wybór mikrokontrolera

Wybór mikrokontrolera
Wybór mikrokontrolera

Wybrałem mikrokontroler PJRC Teensy. Teensy używa mikrokontrolera ARM, a konkretnie ARM Cortex M4. Cortex M4 zawiera sprzęt do wykonania FFT (szybkiej transformacji Fouriera), który wykonałby detekcję. PJRC sprzedaje również kartę audio, która pozwala używać Teensy do odtwarzania muzyki, a także nagrywania dźwięku za pomocą zewnętrznego wejścia lub małego mikrofonu, który można dodać do płytki. Moim planem było, aby Teensy wykonał FFT z dźwiękiem z mikrofonu.

Krok 2: FFT?

FFT?
FFT?

FFT to matematyczny wzór/algorytm, który przekształca sygnał z domeny czasu do domeny częstotliwości. Oznacza to, że pobiera próbkowany czasowo dźwięk z mikrofonu i zamienia go na wielkości częstotliwości, które są obecne w oryginalnej fali. Widzisz, każda arbitralna, ciągła fala może być skonstruowana z szeregu fal sinusoidalnych lub cosinusoidalnych, które są całkowitymi wielokrotnościami pewnej częstotliwości podstawowej. FFT działa odwrotnie: bierze dowolną falę i zamienia ją na wielkości fal, które po zsumowaniu utworzyłyby oryginalną dowolną falę. Jeszcze prostszym sposobem powiedzenia tego jest to, że planowałem użyć oprogramowania i sprzętu FFT w Teensy, aby ustalić, czy „słyszy” trzepotanie skrzydeł kolibra z częstotliwością, z jaką machają skrzydłami. Jeśli „usłyszy” kolibra, wyślę do aparatu polecenie zrobienia zdjęcia.

Zadziałało! Jak więc to zrobiłem, jak mogłeś to zrobić i jak mogłeś to zrobić jeszcze lepiej?

Krok 3: Jak brzmi unoszący się w powietrzu koliber?

Jak brzmi unoszący się w powietrzu koliber?
Jak brzmi unoszący się w powietrzu koliber?

Po pierwsze, musiałem dowiedzieć się, na jakiej częstotliwości będę słyszeć trzepotanie skrzydeł kolibra. Aby to ustalić, użyłem mojego iPhone'a. Podłączyłem iPhone'a do statywu i kazałem nagrywać wideo w zwolnionym tempie bezpośrednio przed podajnikiem kolibra na naszym pokładzie. Po pewnym czasie usunąłem kamerę i pobrałem wideo. Następnie obejrzałem film, w którym szukałem kolibra przed podajnikiem. Kiedy znalazłem dobrą sekwencję, policzyłem liczbę pojedynczych klatek potrzebnych kolibrowi, aby zatrzepotał skrzydłami z jednej pozycji z powrotem do tej samej pozycji. Slow motion na iPhonie to około 240 klatek na sekundę. Zaobserwowałem kolibra unoszącego się przed podajnikiem i naliczyłem 5 klatek, aby przesunął skrzydła z pozycji do przodu do pozycji tylnej, a następnie wrócił do pozycji do przodu. To jest 5 klatek z 240. Pamiętaj, że słyszymy dźwięk przy każdym pociągnięciu skrzydełek kolibra (jeden przy ruchu do przodu i jeden przy ruchu do tyłu). Dla 5 klatek na cykl lub okres, możemy obliczyć częstotliwość jako podzieloną przez okres, tj. 1 / (5/240) lub 48 Hz. Oznacza to, że gdy ten koliber unosi się w powietrzu, dźwięk, który słyszymy, musi być dwa razy większy, czyli około 96 Hz. Częstotliwość jest prawdopodobnie wyższa, gdy lecą i nie unoszą się w powietrzu. Może mieć na to również wpływ ich masa, ale myślę, że możemy założyć, że większość ptaków tego samego gatunku ma mniej więcej taką samą masę.

Krok 4: Seria Fouriera i Teensy

Seria Fouriera i Teensy
Seria Fouriera i Teensy

Teensy (ja używałem Teensy 3.2) jest produkowany przez PJRC (www.pjrc.com). FFT zostanie obliczone na próbce dźwięku. Aby uzyskać dźwięk, PJRC sprzedaje płytkę adaptera audio dla Teensy (TEENSY3_AUDIO - 14,25 USD). Sprzedają również mały mikrofon, który można przylutować do płytki adaptera audio (MIKROFON - 1,25 USD). Płyta adaptera audio wykorzystuje chip (SGTL5000), z którym Teensy może komunikować się przez magistralę szeregową (I2S). Teensy używa SGTL5000 do próbkowania dźwięku z mikrofonu i digitalizacji go, czyli tworzenia zestawu liczb reprezentujących dźwięk, który słyszy mikrofon.

FFT to tylko szybka wersja tak zwanej dyskretnej transformacji Fouriera (DFT). DFT można wykonać na dowolnej liczbie próbek, jednak FFT musi mieć próbki przechowywane w zestawach, które są wielokrotnościami binarnymi. Sprzęt Teensy może wykonać FFT na zestawie 1024 próbek (1024=2^10), więc tego właśnie użyjemy.

FFT zwykle wytwarza, jako swoje wyjście, wielkości ORAZ zależności fazowe między różnymi reprezentowanymi falami. W przypadku tej aplikacji nie zajmujemy się zależnościami fazowymi, ale interesują nas wielkości i ich częstotliwość.

Płyta audio Teensy próbkuje dźwięk z częstotliwością 44, 100 Hz. Tak więc 1024 próbek o tej częstotliwości reprezentuje przedział czasu 1024/44100 lub około 23,2 milisekundy. W tym przypadku FFT wygeneruje na wyjściu wielkości będące całkowitymi wielokrotnościami okresu próbkowania 43 Hz (ponownie 1/0,0232 równa się około 43 Hz). Chcielibyśmy poszukać wielkości o około dwukrotnie większej częstotliwości: 86 Hz. Nie jest to dokładnie częstotliwość trzepotania skrzydeł kolibra, ale jest wystarczająco blisko, jak zobaczymy.

Krok 5: Korzystanie z danych Fouriera

Korzystanie z danych Fouriera
Korzystanie z danych Fouriera

Biblioteki, które PJRC zapewnia dla Teensy, będą przetwarzać próbki i zwracać tablicę wartości wielkości. Będziemy odnosić się do każdej wielkości w zwróconej tablicy jako bin. Pierwszy bin (przy przesunięciu zero w tablicy danych, które otrzymujemy) to przesunięcie DC fali. Możemy spokojnie zignorować tę wartość. Drugi przedział (przy przesunięciu 1) będzie reprezentował wielkość składowej 43 Hz. To jest nasz okres bazowy. Następny bin (przy przesunięciu 2) będzie reprezentował wielkość składowej 86 Hz i tak dalej. Każdy kolejny bin jest całkowitą wielokrotnością okresu podstawowego (43 Hz).

Teraz robi się trochę dziwnie. Gdybyśmy użyli FFT do analizy idealnego dźwięku 43 Hz, wtedy FFT zwróciłaby pierwszy bin o pewnej dużej wartości, a wszystkie pozostałe biny byłyby równe zeru (ponownie, w idealnym świecie). Jeśli dźwięk, który przechwyciliśmy i przeanalizowaliśmy, wynosiłby 86 Hz, to przedział przy przesunięciu jeden byłby zero, a przedział przy przesunięciu 2 (druga harmoniczna) miałby dużą wielkość, a reszta przedziałów byłaby zerowa i tak dalej. Ale gdybyśmy uchwycili dźwięk kolibra i wynosił on 96 Hz (jak zmierzyłem na moim jednym ptaku), to przesunięcie 2 bin @ 86 Hz miałoby wielkość nieco niższą (niż miałaby idealna fala 86 Hz) i każdy z pojemników wokół niego (jeden niższy i kilka wyższych) miałby zmniejszającą się wartość niezerową.

Jeśli rozmiar próbki dla naszej FFT był większy niż 1024 lub jeśli nasza częstotliwość próbkowania dźwięku była niższa, moglibyśmy poprawić rozdzielczość naszych pojemników (tj. Mniej). Ale nawet gdybyśmy zmienili te rzeczy, aby nasze biny FFT były wielokrotnościami okresu bazowego o częstotliwości 1 Hz, nadal musielibyśmy radzić sobie z tym „rozlaniem” bin. Dzieje się tak dlatego, że nigdy nie otrzymalibyśmy częstotliwości skrzydeł, która wylądowałaby zawsze i dokładnie na jednym koszu. Oznacza to, że nie możemy po prostu oprzeć naszego wykrywania kolibra na wartości w przedziale przesunięcia 2 i zignorować resztę. Potrzebujemy sposobu na analizę danych w kilku pojemnikach, aby spróbować je zrozumieć. Więcej o tym później.

Krok 6: Rozpocznij budowę

Rozpocznij budowę
Rozpocznij budowę
Rozpocznij budowę
Rozpocznij budowę

W moim prototypowym wykrywaczu kolibrów użyłem bardzo długich męskich szpilek przylutowanych do szpilek w Teensy. Zrobiłem to, aby móc podłączyć Teensy do małej płytki stykowej bez lutowania. Zrobiłem to, ponieważ zakładałem, że będę dokonywał wielu zmian w prototypie, a dzięki płytce prototypowej mogłem to zmienić i po prostu zwierać przewody, gdziekolwiek potrzebowałem. Przylutowałem żeńskie paski na spodniej stronie płyty audio, co pozwala na podłączenie jej na górze Teensy. Mikrofon jest przylutowany do górnej części płytki audio (patrz zdjęcia). Więcej szczegółów na temat montażu można znaleźć na stronie PJRC:

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

Krok 7: Sprzęt do robienia zdjęć

Sprzęt do robienia zdjęć
Sprzęt do robienia zdjęć
Sprzęt do robienia zdjęć
Sprzęt do robienia zdjęć

Mam (cóż, moja żona) aparat cyfrowy Canon Rebel. W aparacie znajduje się gniazdo, które umożliwia podłączenie ręcznego zdalnego sterowania migawką. Kupiłem pilota ręcznego od B&H Photo. Kabel ma odpowiednie gniazdo, aby zmieścić kamerę na jednym końcu i ma około 6 stóp długości. Przeciąłem kabel na końcu w pobliżu skrzynki kontrolnej z przyciskami i zdjąłem przewody i przylutowałem je do trzech pinów nagłówka, które mogłem podłączyć do płytki stykowej. Jest goły przewód, który jest uziemiony i dwa inne sygnały: końcówka to spust (różowy), a pierścień (biały) to ogniskowanie (patrz zdjęcia). Zwarcie końcówki i/lub pierścienia do podłoża uruchamia migawkę i ustawia ostrość w aparacie.

Za pomocą przewodu połączeniowego poprowadziłem wspólny grunt z Teensy do miejsca, w którym mogłem go użyć na płytce stykowej. Podłączyłem również anodę LED do pinu 2 na Teensy, a katodę LED do rezystora (100-220 omów) do masy. Podłączyłem również pin 2 Teensy do rezystora 10K, a drugą stronę rezystora podłączyłem do podstawy tranzystora NPN (znajduje się wszędzie 2N3904). Podłączyłem emiter tranzystora do masy a kolektor podłączyłem do przewodów biało-różowych z kabla idącego do aparatu. Nieizolowany przewód ponownie był podłączony do uziemienia. Za każdym razem, gdy dioda LED zostanie włączona przez Teensy, włączy się również tranzystor NPN i uruchomi aparat (i ostrość). Zobacz schemat.

Krok 8: Projekt systemu

Projekt systemu
Projekt systemu

Ponieważ częstotliwości trzepotania skrzydeł kolibra prawdopodobnie nie przekraczają kilkuset Hz, tak naprawdę nie musimy nagrywać częstotliwości dźwięku powyżej, powiedzmy, kilkuset Hz. Potrzebujemy sposobu na odfiltrowanie tylko żądanych częstotliwości. Świetnie sprawdziłby się filtr pasmowy, a nawet dolnoprzepustowy. Tradycyjnie implementowalibyśmy filtr sprzętowo za pomocą wzmacniaczy operacyjnych lub filtrów z przełączanymi kondensatorami. Ale dzięki cyfrowemu przetwarzaniu sygnału i bibliotekom oprogramowania Teensy możemy użyć filtra cyfrowego (bez potrzeby lutowania… tylko oprogramowanie).

PJRC ma świetny GUI, który umożliwia przeciąganie i upuszczanie systemu audio dla Teensy i płyty audio. Znajdziesz go tutaj:

www.pjrc.com/teensy/gui/

Zdecydowałem się użyć jednego z dwukwadratowych filtrów kaskadowych dostarczonych przez PJRC, aby ograniczyć częstotliwości dźwięku z mikrofonu (filtra). Kaskadowałem trzy takie filtry i ustawiłem je na działanie pasmowoprzepustowe na 100 Hz. Filtr ten wpuści do systemu częstotliwości nieco wyższe i nieco niższe od interesującej nas częstotliwości.

Na schemacie blokowym (patrz rysunek) i2s1 to wejście audio do karty audio. Podłączyłem oba kanały audio do miksera, a następnie do filtrów (mikrofon to tylko jeden kanał, ale zmiksowałem oba, więc nie musiałem się zastanawiać, który to kanał… nazwij mnie leniwym). Uruchamiam wyjście filtra do wyjścia audio (aby móc słyszeć dźwięk, jeśli chcę). Podłączyłem też audio z filtrów do bloku FFT. Na schemacie blokowym blok oznaczony jako sgtl5000_1 to układ kontrolera dźwięku. Nie wymaga żadnych połączeń na schemacie.

Po wykonaniu całej tej konstrukcji bloku kliknij Eksportuj. Spowoduje to wyświetlenie okna dialogowego, w którym możesz skopiować kod wygenerowany ze schematu blokowego i wkleić go do aplikacji Teensy. Jeśli spojrzysz na kod, zobaczysz, że jest to instancja każdej kontrolki wraz z „połączeniami” między komponentami.

Krok 9: Kod

Kod
Kod

Szczegółowe omówienie oprogramowania zajęłoby zbyt dużo miejsca w tej instrukcji. To, co spróbuję zrobić, to wyróżnić niektóre kluczowe fragmenty kodu. Ale i tak nie jest to bardzo duża aplikacja. PJRC ma świetny samouczek wideo na temat korzystania z Teensy i bibliotek/narzędzi audio (https://www.youtube.com/embed/wqt55OAabVs).

Zacząłem od przykładowego kodu FFT z PJRC. Wkleiłem to, co otrzymałem z narzędzia do projektowania systemu audio na początku kodu. Jeśli spojrzysz na kod po tym, zobaczysz inicjalizację, a następnie system rozpocznie digitalizację dźwięku z mikrofonu. Oprogramowanie wchodzi w pętlę „na zawsze” i czeka na udostępnienie danych FFT za pomocą wywołania funkcji fft1024_1.available(). Gdy dane FFT są dostępne, pobieram kopię danych i przetwarzam je. Zauważ, że pobieram dane tylko wtedy, gdy największa wielkość bin przekracza ustaloną wartość. Tak ustawiam czułość systemu. Jeśli biny SĄ powyżej ustawionej wartości, normalizuję falę i przenoszę ją do tymczasowej tablicy w celu przetworzenia, w przeciwnym razie ignoruję ją i czekam na kolejną FFT. Powinienem wspomnieć, że używam również funkcji regulacji wzmocnienia mikrofonu, aby dostosować czułość obwodu (sgtl5000_1.micGain(50)).

Normalizacja fali oznacza po prostu, że dostosowuję wszystkie pojemniki tak, aby pojemnik z największą wartością był równy jeden. Wszystkie inne pojemniki są skalowane w tej samej proporcji. Ułatwia to analizę danych.

Do analizy danych użyłem kilku algorytmów, ale zdecydowałem się na użycie tylko dwóch. Jeden algorytm oblicza powierzchnię pod krzywą utworzoną przez kosze. Jest to proste obliczenie, które po prostu dodaje wartości pojemników w obszarze zainteresowania. Porównuję ten obszar, aby ustalić, czy jest powyżej progu.

Drugi algorytm wykorzystuje stałą tablicę wartości reprezentujących znormalizowaną FFT. Te dane są wynikiem prawdziwej (optymalnej) sygnatury kolibra. Nazywam to żywopłotem. Porównuję dane hedgingowe ze znormalizowanymi danymi FFT, aby sprawdzić, czy odpowiednie przedziały znajdują się w zakresie 20% od siebie. Wybrałem 20%, ale tę wartość można było łatwo dostosować.

Liczę też, ile razy poszczególne algorytmy myślą, że pasują, czyli myślą, że słyszą kolibra. Używam tej liczby jako części określania kolibra, ponieważ może wystąpić fałszywe wyzwalanie. Na przykład, gdy jakikolwiek dźwięk jest głośny lub zawiera częstotliwość skrzydeł ptaków, jak klaskanie w dłonie, możesz otrzymać spust. Ale jeśli liczba jest wyższa od pewnej liczby (wybieram liczbę), mówię, że to koliber. Kiedy tak się dzieje, włączam diodę LED, aby wskazać, że mamy trafienie i ten sam obwód uruchamia aparat przez tranzystor NPN. W oprogramowaniu ustawiłem czas wyzwalania kamery na 2 sekundy (czas świecenia diody i tranzystora).

Krok 10: Montaż

Montowanie
Montowanie

Na zdjęciu widać jak (bezceremonialnie) zamontowałem elektronikę. Podłączyłem Teensy do płytki stykowej, która była przyklejona do płyty nośnej wraz z innym (nieużywanym) kompatybilnym z Arduino (myślę, że Arduino Zero). Całość przywiązałem drutem do metalowego masztu markizy na moim pokładzie (dodałem też odciążenie kabla prowadzącego do kamery). Słup znajdował się tuż obok karmnika dla kolibrów. Zasilałem elektronikę małą kostką LiPo, której można użyć do naładowania martwego telefonu komórkowego. Klocek zasilający miał złącze USB, którego użyłem do podłączenia zasilania do Teensy. Poprowadziłem kabel zdalnego wyzwalacza do kamery i podłączyłem go. Byłem gotowy na ptasią akcję!

Krok 11: Wyniki

Wyniki
Wyniki

Ustawiłem aparat na statywie w pobliżu podajnika. Ustawiłem aparat na samym przednim brzegu podajnika i ustawiłem go w trybie Sport, który robi kilka szybkich zdjęć po naciśnięciu spustu migawki. Przy czasie wyłączenia migawki wynoszącym 2 sekundy zrobiłem około 5 zdjęć na zdarzenie wyzwalające.

Spędziłem kilka godzin, bawiąc się oprogramowaniem, gdy pierwszy raz próbowałem tego. Musiałem dostosować czułość i liczbę trafień kolejnych algorytmów. W końcu to poprawiłem i byłem gotowy.

Pierwsze zdjęcie, jakie zrobiono, przedstawiało ptaka, który wleciał w kadr, jakby skręcał z dużą prędkością jak myśliwiec (patrz wyżej). Nie mogę powiedzieć, jak byłem podekscytowany. Przez chwilę siedziałem cicho po drugiej stronie decku i pozwalałem systemowi działać. Udało mi się nagrać dużo zdjęć, ale sporo wyrzuciłem. Okazuje się, że czasami dostajesz po prostu głowę lub ogon ptaka. Ponadto mam fałszywe wyzwalacze, które mogą wystąpić. W sumie zachowałem chyba 39 zdjęć. Zajęło ptakom kilka wycieczek do karmnika, aby przyzwyczaić się do dźwięku migawki z aparatu, ale w końcu wydawało się, że go zignorowali.

Krok 12: Końcowe myśli

Końcowe przemyślenia
Końcowe przemyślenia

To był fajny projekt i działa. Ale, jak większość rzeczy, jest wiele do zrobienia. Filtr z pewnością mógłby być inny (jak filtr dolnoprzepustowy lub zmiany w aranżacji i/lub parametrach) i być może dzięki temu będzie działał lepiej. Jestem też pewien, że są lepsze algorytmy do wypróbowania. Spróbuję trochę tego w lecie.

Powiedziano mi, że istnieje kod uczenia maszynowego typu open source… może system można „wytrenować” w identyfikowaniu kolibrów! Nie jestem pewien, czy spróbuję, ale może.

Jakie inne rzeczy można by dodać do tego projektu? Gdyby aparat miał datownik/datownik, można by dodać tę informację do zdjęć. Inną rzeczą, którą możesz zrobić, to nagrać dźwięk i zapisać go na karcie uSD (płyta audio PJRC ma jedno gniazdo). Zapisany dźwięk może być wykorzystany do uczenia algorytmu uczenia.

Może gdzieś szkoła ornitologiczna przydałaby się takiemu urządzeniu? Mogą być w stanie zebrać informacje, takie jak godziny karmienia, częstotliwość karmienia, a dzięki zdjęciom możesz być w stanie zidentyfikować konkretne ptaki, które wracają do karmienia.

Mam nadzieję, że ktoś inny rozszerzy ten projekt i podzieli się z innymi tym, co zrobili. Niektórzy ludzie powiedzieli mi, że ta praca, którą wykonałem, powinna zostać przekształcona w produkt. Nie jestem tego taki pewien, ale wolałbym, aby był używany jako platforma do nauki i do nauki.

Dziękuje za przeczytanie!

Aby użyć kodu, który opublikowałem, potrzebujesz Arduino IDE (https://www.arduino.cc/en/Main/Software). Potrzebny będzie również kod Teensyduino z PJRC (https://www.pjrc.com/teensy/td_download.html).

Zalecana: