İçindekiler:

Sinek Kuşu Dedektörü/Resim Çekici: 12 Adım (Resimlerle)
Sinek Kuşu Dedektörü/Resim Çekici: 12 Adım (Resimlerle)

Video: Sinek Kuşu Dedektörü/Resim Çekici: 12 Adım (Resimlerle)

Video: Sinek Kuşu Dedektörü/Resim Çekici: 12 Adım (Resimlerle)
Video: sineğin kurt atma anı #animal06 #kurtsineği #kurtatma #sinek06 #sinek34 #hayvanlar06 #hayvan35 #hayv 2024, Kasım
Anonim
Sinek Kuşu Dedektörü/Resim Çekici
Sinek Kuşu Dedektörü/Resim Çekici

Arka güvertemizde bir sinek kuşu besleyicimiz var ve son birkaç yıldır onların fotoğraflarını çekiyorum. Sinek kuşları inanılmaz küçük yaratıklardır, çok bölgeseldir ve kavgaları hem komik hem de şaşırtıcı olabilir. Ama fotoğraflarını çekmek için evimin arka tarafında heykel gibi durmaktan yorulmaya başlamıştım. Evin arkasında uzun süre beklemek zorunda kalmadan fotoğraf çekmenin bir yoluna ihtiyacım vardı. Uzaktan kumandalı bir deklanşör kullanabileceğimi biliyorum ama ben orada bulunmadan fotoğrafların otomatik olarak çekilmesini istedim. Bu yüzden sinek kuşlarını tespit edip otomatik olarak fotoğraf çekecek bir cihaz yapmaya karar verdim.

Bunu yapmak için her zaman bir mikrodenetleyici kullanmayı amaçladım. Mikrodenetleyici, yazılım kontrolü altında kamera deklanşörünü çalıştırabilecektir. Ancak küçük bir sinek kuşunu algılayan sensör başka bir şeydi. Bir hareket sensörü kullanabilirdim ama benzersiz bir şey denemek istedim. Tetikleyici olarak sesi kullanmaya karar verdim.

Adım 1: Bir Mikrodenetleyici Seçme

Mikrodenetleyici Seçimi
Mikrodenetleyici Seçimi

Seçtiğim mikrodenetleyici bir PJRC Teensy idi. Teensy, bir ARM mikro denetleyicisi, özellikle bir ARM Cortex M4 kullanır. Cortex M4, algılamayı yapacak bir FFT (Hızlı Fourier Dönüşümü) gerçekleştirecek donanımı içerir. PJRC ayrıca, Teensy'yi müzik çalmak için kullanmanıza ve harici bir girişle ses kaydetmenize veya panoya ekleyebileceğiniz küçük bir mikrofona izin veren bir ses kartı satar. Planım, Teensy'nin mikrofondan gelen ses üzerinde bir FFT yapmasını sağlamaktı.

Adım 2: FFT?

FFT?
FFT?

Bir FFT, bir sinyali zaman alanından frekans alanına dönüştüren matematiksel bir formül/algoritmadır. Bunun anlamı, mikrofondan zaman örnekli sesi alıp orijinal dalgada bulunan frekansların büyüklüklerine dönüştürmesidir. Görüyorsunuz, herhangi bir keyfi, sürekli dalga, bazı temel frekansın tam sayı katları olan bir dizi sinüs veya kosinüs dalgasından oluşturulabilir. Bir FFT bunun tersini yapar: keyfi bir dalgayı alır ve onu, birlikte toplandığında orijinal keyfi dalgayı yaratacak olan dalgaların büyüklüklerine dönüştürür. Bunu söylemenin daha da basit bir yolu, bir sinek kuşunun kanat çırpışını kanat çırpma sıklığında 'duyup' duyup duymadığını belirlemek için Teensy'deki yazılımı ve FFT donanımını kullanmayı planladım. Bir sinek kuşunu 'duyarsa', fotoğraf çekmesi için kameraya bir komut göndereceğim.

İşe yaradı! Peki, bunu nasıl yaptım, nasıl yapabilirsin ve nasıl daha da iyi hale getirebilirsin?

3. Adım: Uçan Sinek Kuşu Sesi Neye benziyor?

Uçan Sinek Kuşu Sesi Neye benziyor?
Uçan Sinek Kuşu Sesi Neye benziyor?

Her şeyden önce, sinek kuşunun kanat çırpışlarını hangi frekansta duyacağımı bulmam gerekiyordu. Bunu belirlemek için iPhone'umu kullandım. iPhone'u bir tripoda bağladım ve güvertedeki sinek kuşu besleyicisinin hemen önünde ağır çekim video kaydetmesini sağladım. Bir süre sonra kamerayı çıkardım ve videoyu indirdim. Daha sonra besleyicinin önünde bir sinekkuşu arayan videoyu izledim. İyi bir sekans bulduğumda, sinek kuşunun kanatlarını bir konumdan aynı konuma geri döndürmesi için gereken karelerin sayısını tek tek saydım. İPhone'daki ağır çekim, saniyede yaklaşık 240 karedir. Besleyicinin önünde uçan bir sinekkuşu gördüm ve kanatlarını ileri pozisyondan arka pozisyona hareket ettirip sonra ileri pozisyona geri dönmesi için 5 kare saydım. Bu, 240 kareden 5 karedir. Unutmayın, sinek kuşunun kanat çırpışlarının her vuruşunda bir ses duyarız (biri ileri vuruşta, diğeri geri vuruşta). Bir döngü veya periyot için 5 çerçeve için frekansı periyoda bölünerek yani 1 / (5/240) veya 48 Hz olarak hesaplayabiliriz. Bu, bu sinekkuşu havada uçarken duyduğumuz sesin bunun iki katı veya yaklaşık 96 Hz olması gerektiği anlamına gelir. Frekans muhtemelen uçarken ve havada asılı değilken daha yüksektir. Kütlelerinden de etkilenebilir ama sanırım aynı türden kuşların çoğunun yaklaşık olarak aynı kütleye sahip olduğunu varsayabiliriz.

Adım 4: Fourier Serisi ve Teensy

Fourier Serisi ve Teensy
Fourier Serisi ve Teensy

Teensy (Teensy 3.2 kullandım) PJRC (www.pjrc.com) tarafından yapılmıştır. FFT, bir ses örneğinde hesaplanacaktır. Sesi elde etmek için PJRC, Teensy için bir ses adaptör kartı satıyor (TEENSY3_AUDIO - 14,25 $). Ayrıca ses adaptör kartına lehimlenebilen küçük bir mikrofon da satıyorlar (MICROPHONE - 1,25 $). Ses adaptör kartı, Teensy'nin bir seri veri yolu (I2S) üzerinden konuşabileceği bir çip (SGTL5000) kullanır. Teensy, mikrofondan gelen sesi örneklemek ve dijitalleştirmek, yani mikrofonun duyduğu sesi temsil eden bir dizi sayı oluşturmak için SGTL5000'i kullanır.

Bir FFT, Ayrık Fourier Dönüşümü (DFT) olarak adlandırılan şeyin sadece hızlı bir versiyonudur. İsteğe bağlı sayıda numune üzerinde bir DFT gerçekleştirilebilir, ancak bir FFT'nin numunelerin ikili katlar olan kümelerde saklanması gerekir. Teensy donanımı, 1024 örnekten oluşan bir sette (1024=2^10) bir FFT gerçekleştirebilir, bu yüzden kullanacağımız şey bu.

Bir FFT genellikle çıktısı olarak, temsil edilen çeşitli dalgalar arasındaki büyüklükleri VE faz ilişkilerini üretir. Bu uygulama için faz ilişkileri ile ilgilenmiyoruz, ancak büyüklükler ve frekansları ile ilgileniyoruz.

Teensy ses kartı, sesi 44, 100 Hz frekansında örnekler. Dolayısıyla, bu frekanstaki 1024 örnek, 1024/44100 veya yaklaşık 23.2 milisaniyelik bir zaman aralığını temsil eder. Bu durumda, FFT çıktı olarak, 43 Hz'lik örnekleme periyodunun tamsayı katları olan büyüklükler üretecektir (yine, 1/0.0232 yaklaşık 43 Hz'e eşittir). Bu frekansın yaklaşık iki katı olan büyüklükleri aramak isteriz: 86 Hz. Bu bizim hesapladığımız sinekkuşu kanat kanatçıklarının tam sıklığı değil ama göreceğimiz gibi yeterince yakın.

Adım 5: Fourier Verilerini Kullanma

Fourier Verilerini Kullanma
Fourier Verilerini Kullanma

PJRC'nin Teensy için sağladığı kitaplıklar, örnekleri işleyecek ve bir dizi büyüklük değeri döndürecektir. Döndürülen dizideki her büyüklüğe bir bin olarak atıfta bulunacağız. İlk kutu (geri aldığımız veri dizisindeki sıfır ofsetinde) dalganın DC ofsetidir. Bu değeri güvenle yok sayabiliriz. İkinci bölme (ofset 1'de) 43 Hz bileşenin büyüklüğünü temsil edecektir. Bu bizim temel dönemimizdir. Sonraki bölme (ofset 2'de) 86 Hz bileşenin büyüklüğünü temsil edecektir ve bu böyle devam edecektir. Sonraki her bir bölme, taban periyodunun (43 Hz) bir tam sayı katıdır.

Şimdi burası biraz garipleşiyor. 43 Hz'lik mükemmel bir sesi analiz etmek için bir FFT kullansaydık, FFT ilk bölmeyi büyük bir büyüklükle döndürürdü ve geri kalan bölmelerin tümü sıfıra eşit olurdu (yine mükemmel bir dünyada). Yakaladığımız ve analiz ettiğimiz ses 86 Hz olsaydı, o zaman ofset 1'deki bölme sıfır olur ve ofset 2'deki bölme (ikinci harmonik) büyük bir büyüklük olur ve bölmelerin geri kalanı sıfır olur ve bu böyle devam eder. Ancak bir sinek kuşunun sesini yakalarsak ve 96 Hz ise (bir kuşumda ölçtüğüm gibi), o zaman ofset 2 bin @ 86 Hz biraz daha düşük bir değere sahip olacaktır (mükemmel 86 Hz dalganın alacağından) ve etrafındaki çöp kutuları (bir alt ve birkaç daha yüksek) her biri azalan sıfır olmayan bir değere sahip olacaktır.

FFT'mizin örnek boyutu 1024'ten büyükse veya ses örnekleme frekansımız daha düşükse, kutularımızın çözünürlüğünü daha iyi (yani daha küçük) yapabiliriz. Ancak bunları FFT kutularımızı taban periyodunun 1 Hz katları yapacak şekilde değiştirsek bile, yine de bu kutu 'dökülmesi' ile uğraşmak zorunda kalırdık. Bunun nedeni, her zaman ve tam olarak tek bir çöp kutusuna inen bir kanat frekansını asla elde edemememizdir. Bu, bir sinekkuşu tespitimizi sadece ofset 2 bölmesindeki değere dayandırıp gerisini görmezden gelemeyeceğimiz anlamına gelir. Denemek ve anlamlandırmak için birkaç kutudaki verileri analiz etmenin bir yoluna ihtiyacımız var. Bu konuda daha sonra.

Adım 6: İnşaata Başlayın

İnşaata Başlayın
İnşaata Başlayın
İnşaata Başlayın
İnşaata Başlayın

Prototip sinek kuşu dedektörüm için Teensy'deki pimlere lehimlenmiş ekstra uzun erkek-erkek pimler kullandım. Bunu Teensy'yi lehimsiz küçük bir devre tahtasına takabilmek için yaptım. Bunu yaptım çünkü prototipte ve devre tahtasında çok fazla değişiklik yapacağımı varsaydım, bunu değiştirebilir ve ihtiyacım olan her yerde kabloları atlayabilirdim. Ses kartının alt tarafına, Teensy'nin üzerine takılmasını sağlayan dişi şeritler lehimledim. Mikrofon, ses kartının üst tarafına lehimlenmiştir (resimlere bakın). Montajla ilgili daha fazla ayrıntı PJRC sitesinde bulunabilir:

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

Adım 7: Resim Çekmek İçin Donanım

Resim Çekmek için Donanım
Resim Çekmek için Donanım
Resim Çekmek için Donanım
Resim Çekmek için Donanım

Bir Canon Rebel Dijital Kameram var (evet, eşim var). Kamerada manuel bir uzaktan deklanşör kontrolü bağlamanıza izin veren bir jak vardır. B&H Photo'dan manuel bir uzaktan kumanda satın aldım. Kablonun bir ucuna kamerayı takmak için doğru jak vardır ve yaklaşık 6 fit uzunluğundadır. Kabloyu düğme kontrol kutusunun yanından kestim ve kabloları soydum ve bunları devre tahtasına takabileceğim üç başlık pimine lehimledim. Topraklanmış bir çıplak tel ve diğer iki sinyal vardır: uç tetik (pembe) ve halka (beyaz) odaktır (resimlere bakın). Ucu ve/veya halkayı yere kısa devre yapmak, deklanşörü ve kameradaki odağı çalıştırır.

Bir atlama teli kullanarak Teensy'den ortak bir zemini devre tahtasında kullanabileceğim bir alana koştum. Ayrıca bir LED'in anotunu Teensy'deki pim 2'ye ve LED'in katodunu bir rezistöre (100-220 ohm) toprağa bağladım. Ayrıca Teensy'nin 2. pinini bir 10K dirence ve direncin diğer tarafını bir NPN transistörünün tabanına bağladım (her yerde bir 2N3904 bulunur). Transistörün emiterini toprağa ve bağladığım kollektörü kameraya giden kablodan beyaz ve pembe tellere bağladım. Çıplak tel yine toprağa bağlandı. LED, Teensy tarafından her açıldığında, NPN transistörü de açılacak ve kamerayı (ve odağı) tetikleyecektir. Şemaya bakın.

Adım 8: Sistem Tasarımı

Sistem tasarımı
Sistem tasarımı

Sinekkuşu'nun kanat çırpma frekansları muhtemelen birkaç yüz Hz'in üzerine çıkmadığından, ses frekanslarını örneğin birkaç yüz Hz'in üzerine kaydetmemize gerçekten gerek yoktur. İhtiyacımız olan, yalnızca istediğimiz frekansları filtrelemenin bir yolu. Bir bant geçişi veya hatta düşük geçiş filtresi harika olurdu. Geleneksel olarak, OpAmp'leri veya anahtarlamalı kapasitör filtrelerini kullanarak donanımda bir filtre uygulardık. Ancak dijital sinyal işleme ve Teensy'nin yazılım kitaplıkları sayesinde dijital bir filtre kullanabiliriz (lehimleme gerekmez… sadece yazılım).

PJRC, Teensy ve ses kartı için ses sisteminizi sürükleyip bırakmanıza izin veren harika bir GUI'ye sahiptir. Burada bulabilirsiniz:

www.pjrc.com/teensy/gui/

Mikrofondan (filtre) gelen ses frekanslarını kısıtlamak için PJRC tarafından sağlanan biquadratic kademeli filtrelerden birini kullanmaya karar verdim. Bu tür üç filtreyi basamaklandırdım ve bunları 100 Hz'de bant geçiş işlemi için ayarladım. Bu filtre, ilgilendiğimiz frekansın biraz üstünde ve biraz altında sistem frekanslarına izin verecektir.

Blok şemada (resme bakın) i2s1, ses kartına ses girişidir. Her iki ses kanalını da bir miksere ve ardından filtrelere bağladım (mikrofon sadece bir kanal ama ikisini de karıştırdım, bu yüzden hangi kanal olduğunu bulmak zorunda kalmadım… beni tembel ara). Filtrenin çıkışını ses çıkışına çalıştırıyorum (böylece istersem sesi duyabiliyorum). Ayrıca filtrelerden gelen sesi FFT bloğuna bağladım. Blok şemasında, sgtl5000_1 etiketli blok, ses denetleyici yongasıdır. Diyagramda herhangi bir bağlantıya ihtiyaç duymaz.

Tüm bu blok yapımını yaptıktan sonra Dışa Aktar'a tıklıyorsunuz. Bu, blok diyagramdan oluşturulan kodu kopyalayabileceğiniz ve Teensy uygulamanıza yapıştırabileceğiniz bir iletişim kutusu açar. Koda bakarsanız, bunun bileşenler arasındaki 'bağlantılar' ile birlikte her kontrolün bir örneği olduğunu görebilirsiniz.

9. Adım: Kod

kod
kod

Yazılımı ayrıntılı olarak gözden geçirmek bu Eğitilebilir Kitapta çok fazla yer kaplar. Yapmaya çalışacağım şey, bazı önemli kod parçalarını vurgulamak. Ancak bu zaten çok büyük bir uygulama değil. PJRC, Teensy ve ses kitaplıklarını/araçlarını (https://www.youtube.com/embed/wqt55OAabVs) kullanma hakkında harika bir video eğitimine sahiptir.

PJRC'den bazı FFT örnek kodlarıyla başladım. Ses sistemi tasarım aracından aldığımı kodun en üstüne yapıştırdım. Bundan sonraki koda bakarsanız, bir miktar başlatma göreceksiniz ve ardından sistem mikrofondan sesi sayısallaştırmaya başlar. Yazılım 'forever' döngüsüne() girer ve fft1024_1.available() işlevine yapılan bir çağrıyı kullanarak FFT verilerinin kullanılabilir olmasını bekler. FFT verileri mevcut olduğunda, verilerin bir kopyasını alıp işliyorum. Yalnızca en büyük çöp kutusu büyüklüğü ayarlanan bir değerin üzerindeyse verileri aldığımı unutmayın. Bu değer, sistemin hassasiyetini nasıl ayarladığımdır. Eğer kutular ayarlanan değerin üzerindeyse, o zaman dalgayı normalleştiririm ve işlenmek üzere geçici bir diziye aktarırım, aksi takdirde onu görmezden gelir ve başka bir FFT'yi beklemeye devam ederim. Devrenin hassasiyetini ayarlamak için mikrofon kazanç kontrol fonksiyonunu da kullandığımı belirtmeliyim (sgtl5000_1.micGain(50)).

Dalgayı normalleştirmek, tüm bölmeleri, en büyük değere sahip bölmenin bire eşit olması için ayarladığım anlamına gelir. Diğer tüm kutular aynı oranda ölçeklenir. Bu, verilerin analiz edilmesini kolaylaştırır.

Verileri analiz etmek için birkaç algoritma kullandım ama sadece ikisini kullanmaya karar verdim. Bir algoritma, kutular tarafından oluşturulan eğrinin altındaki alanı hesaplar. Bu, yalnızca ilgili bölge genelindeki kutuların değerlerini ekleyen basit bir hesaplamadır. Bir eşiğin üzerinde olup olmadığını belirlemek için bu alanı karşılaştırırım.

Diğer algoritma, normalleştirilmiş bir FFT'yi temsil eden sabit bir değerler dizisi kullanır. Bu veriler, gerçek (optimal) bir sinek kuşu imzasının sonuçlarıdır. Ben buna çit diyorum. Karşılık gelen bölmelerin birbirinin %20'si dahilinde olup olmadığını görmek için koruma verilerini normalleştirilmiş FFT verileriyle karşılaştırırım. Ben %20'yi seçtim ama bu değer kolayca ayarlanabiliyordu.

Ayrıca bireysel algoritmaların kaç kez bir eşleşme olduğunu düşündüklerini, yani bir sinekkuşu duyduklarını düşündüklerini saydım. Bu sayımı sinekkuşu tespitinin bir parçası olarak kullanıyorum çünkü yanlış tetikleme meydana gelebilir. Örneğin, herhangi bir ses yüksek olduğunda veya el çırpma gibi kuşların kanat frekansını içerdiğinde, bir tetik alabilirsiniz. Ama sayım belirli bir sayının üzerindeyse (seçtiğim bir sayı) sinek kuşu diyorum. Bu olduğunda, bir vuruşumuz olduğunu belirtmek için LED'i açıyorum ve aynı devre NPN transistörü aracılığıyla kamerayı tetikliyor. Yazılımda kamera tetikleme süresini 2 saniyeye ayarladım (LED ve transistörün açık olduğu süre).

Adım 10: Montaj

Montaj
Montaj

Resimde elektroniği (belirsizce) nasıl monte ettiğimi görebilirsiniz. Teensy'yi, başka bir (kullanılmayan) Arduino uyumlu (sanırım bir Arduino Zero) ile birlikte bir taşıyıcı panoya yapıştırılmış bir devre tahtasına taktım. Her şeyi güvertemdeki metal bir tente direğine bağladım (kameraya giden kabloya gerilim azaltıcı da ekledim). Direk, sinek kuşu besleyicisinin hemen yanındaydı. Elektroniği, ölü bir cep telefonunu şarj etmek için kullanabileceğiniz küçük bir LiPo güç tuğlasıyla çalıştırdım. Güç tuğlasının üzerinde, Teensy'ye güç vermek için kullandığım bir USB konektörü vardı. Uzaktan tetikleme kablosunu Kameraya geçirdim ve prize taktım. Biraz kuş hareketine hazırdım!

11. Adım: Sonuçlar

Sonuçlar
Sonuçlar

Kamerayı besleyicinin yanındaki bir tripod üzerine kurdum. Kamerayı besleyicinin en ön kenarına odakladım ve deklanşöre basıldığında birkaç hızlı fotoğraf çeken Spor Moduna ayarladım. 2 saniyelik deklanşör süresi ile tetikleme olayı başına yaklaşık 5 fotoğraf çektim.

Bunu ilk denediğimde yazılımla uğraşmak için birkaç saat harcadım. Duyarlılığı ve ardışık algoritma isabet sayısını ayarlamak zorunda kaldım. Sonunda düzelttim ve hazırdım.

Çektiği ilk resim, bir jet avcı uçağı gibi yüksek hızlı bir banka dönüşü yapıyormuş gibi çerçeveye uçan bir kuştu (yukarıya bakın). Ne kadar heyecanlandım anlatamam. Bir süre güvertenin diğer tarafında sessizce oturdum ve sistemin çalışmasına izin verdim. Bir sürü fotoğraf çekmeyi başardım ama bir çoğunu çöpe attım. Görünen o ki, bazen sadece bir kuş başı veya kuyruğu alırsınız. Ayrıca, meydana gelebilecek yanlış tetikleyicilerim var. Toplamda 39 fotoğraf sakladığımı düşünüyorum. Kuşların kameradan gelen deklanşör sesine alışmaları için birkaç kez yemliğe gitmesi gerekti, ancak sonunda bunu görmezden geldiler.

Adım 12: Son Düşünceler

Son düşünceler
Son düşünceler

Bu eğlenceli bir projeydi ve işe yarıyor. Ancak, çoğu şeyde olduğu gibi, iyileştirme için bolca yer var. Filtre kesinlikle farklı olabilir (düşük geçişli bir filtre veya düzenleme ve/veya parametrelerdeki değişiklikler gibi) ve belki bu daha iyi çalışmasını sağlayabilir. Ayrıca denenecek daha iyi algoritmalar olduğundan da eminim. Yaz aylarında bunun bir kısmını deneyeceğim.

Bana orada açık kaynaklı makine öğrenimi kodu olduğu söylendi… belki sistem sinek kuşlarını tanımlamak için 'eğitilmiş' olabilir! Bunu deneyeceğimden emin değilim ama, belki.

Bu projeye başka neler eklenebilir? Fotoğraf makinesinde tarih/saat damgası varsa, bu bilgileri resimlere ekleyebilirsiniz. Yapabileceğiniz başka bir şey de sesi kaydetmek ve bir uSD kartına kaydetmektir (PJRC ses kartında bir yuva vardır). Kaydedilen ses, bir öğrenme algoritmasını eğitmek için kullanılabilir.

Belki bir yerde bir Ornitoloji okulu böyle bir cihazı kullanabilir mi? Yemleme süreleri, yemleme sıklığı gibi bilgileri toplayabilirler ve resimlerle birlikte yemlemeye dönen belirli kuşları tanımlayabilirsiniz.

Umudum, bir başkasının bu projeyi genişletmesi ve yaptıklarını başkalarıyla paylaşmasıdır. Bazı insanlar bana yaptığım bu işin bir ürüne dönüştürülmesi gerektiğini söylediler. Pek emin değilim ama bunun bir öğrenme platformu ve bilim için kullanılmasını tercih ederim.

Okuduğunuz için teşekkürler!

Gönderdiğim kodu kullanmak için Arduino IDE'ye ihtiyacınız olacak (https://www.arduino.cc/en/Main/Software). Ayrıca PJRC'den alınan Teensyduino koduna da ihtiyacınız olacak (https://www.pjrc.com/teensy/td_download.html).

Önerilen: