Innehållsförteckning:

Hummingbird Detector/Picture-Taker: 12 steg (med bilder)
Hummingbird Detector/Picture-Taker: 12 steg (med bilder)

Video: Hummingbird Detector/Picture-Taker: 12 steg (med bilder)

Video: Hummingbird Detector/Picture-Taker: 12 steg (med bilder)
Video: Tracker vs. No Tracker for ASTROPHOTOGRAPHY (Shooting the Pleiades) 2024, November
Anonim
Hummingbird Detector/Picture-Taker
Hummingbird Detector/Picture-Taker

Vi har en kolibrimatare på vårt bakdäck och de senaste åren har jag tagit bilder på dem. Kolibrier är fantastiska små varelser, mycket territoriella och deras slagsmål kan vara både roliga och fantastiska. Men jag blev trött på att stå som en staty mot baksidan av mitt hus för att ta bilder på dem. Jag behövde ett sätt att ta bilder utan att behöva stå bakom huset länge och vänta. Jag vet att jag kunde ha använt en fjärrstyrd slutare men jag ville att bilder skulle tas automatiskt utan att jag behövde vara där. Så jag bestämde mig för att göra en enhet för att upptäcka kolibrier och ta en bild automatiskt.

Jag tänkte alltid använda en mikrokontroller för att göra detta. Mikrokontrollern skulle kunna driva kamerans slutare under programvarukontroll. Men sensorn för att upptäcka en liten kolibri var en annan sak. Jag kunde ha använt en rörelsesensor men jag ville prova något unikt. Jag bestämde mig för att använda ljud som trigger.

Steg 1: Välja en mikrokontroller

Väljer en mikrokontroller
Väljer en mikrokontroller

Mikrocontrollern jag valde var en PJRC Teensy. Teensy använder en ARM -mikrokontroller, särskilt en ARM Cortex M4. Cortex M4 innehåller hårdvaran för att utföra en FFT (Fast Fourier Transform) som skulle göra upptäckten. PJRC säljer också ett ljudkort som låter dig använda Teensy för att spela musik samt spela in ljud med en extern ingång, eller en liten mikrofon som du kan lägga till på kortet. Min plan var att låta Teensy utföra en FFT på ljudet från mikrofonen.

Steg 2: FFT?

FFT?
FFT?

En FFT är en matematisk formel/algoritm som omvandlar en signal från tidsdomänen till frekvensdomänen. Vad detta betyder är att det tar det tidssamplade ljudet från mikrofonen och gör det till storleken på de frekvenser som finns i den ursprungliga vågen. Du ser, vilken godtycklig, kontinuerlig våg som helst kan konstrueras från en serie sinus- eller cosinusvågor som är heltalsmultiplar av någon basfrekvens. En FFT gör det motsatta: den tar en godtycklig våg och förvandlar den till storleken på vågorna som, om de summeras tillsammans, skulle skapa den ursprungliga godtyckliga vågen. Ett ännu enklare sätt att säga detta är att jag planerade att använda programvara och FFT -hårdvaran i tonåren för att avgöra om den 'hör' vingar som klappar av en kolibri vid den frekvens som vingflikarna uppstår. Om den "hör" en kolibri skickar jag ett kommando till en kamera för att ta en bild.

Det fungerade! Så hur gjorde jag det, hur kunde du göra det och hur kan du göra det ännu bättre?

Steg 3: Hur låter en svävande kolibri?

Hur låter en svävande kolibri?
Hur låter en svävande kolibri?

Först och främst, jag behövde ta reda på vilken frekvens jag skulle höra kolibriens vingflikar. För att bestämma detta använde jag min iPhone. Jag kopplade iPhone till ett stativ och fick den att spela in slow motion -video direkt framför kolibrimataren på vårt däck. Efter en tid tog jag bort kameran och jag laddade ner videon. Jag tittade sedan på videon och letade efter en kolibri framför mataren. När jag hittade en bra sekvens räknade jag antalet individuella ramar som det krävde för kolibri att klappa vingarna från en position hela vägen tillbaka till samma position. Slowmotion på iPhone är cirka 240 bilder per sekund. Jag såg en kolibri sväva framför mataren och jag räknade 5 ramar för att den skulle kunna flytta sina vingar från framåtläget till bakläget och sedan återgå till framåtläget. Detta är 5 bilder av 240. Kom ihåg att vi hör ett ljud på varje slag av kolibriens vingflikar (en på framslaget och en på bakåtslaget). För 5 bildrutor för en cykel eller period kan vi beräkna frekvensen som en dividerad med perioden dvs 1 / (5/240) eller 48 Hz. Det betyder att när denna kolibri svävar måste ljudet vi hör vara två gånger så mycket eller cirka 96 Hz. Frekvensen är förmodligen högre när de flyger och inte svävar. Det kan också påverkas av deras massa men jag tror att vi kan anta att de flesta fåglar av samma art har ungefär samma massa.

Steg 4: Fourier -serien och tonåringarna

Fourier -serien och Teensy
Fourier -serien och Teensy

Teensy (jag använde en Teensy 3.2) är gjord av PJRC (www.pjrc.com). FFT beräknas på ett ljudprov. För att få ljudet säljer PJRC ett ljudkort för Teensy (TEENSY3_AUDIO - $ 14,25). De säljer också en liten mikrofon som kan lödas till ljudkortskortet (MIKROFON - $ 1,25). Ljudadapterkortet använder ett chip (SGTL5000) som Teensy kan prata med via en seriell buss (I2S). Teensy använder SGTL5000 för att sampla ljudet från mikrofonen och digitalisera det, det vill säga skapa en uppsättning nummer som representerar det ljud som mikrofonen hör.

En FFT är bara en snabb version av det som kallas en Discrete Fourier Transform (DFT). En DFT kan utföras på ett godtyckligt antal prover, men en FFT måste ha proverna lagrade i uppsättningar som är binära multiplar. Teensy -hårdvaran kan utföra en FFT på en uppsättning av 1024 prover (1024 = 2^10) så det är vad vi kommer att använda.

En FFT producerar vanligtvis, som sin utsignal, storheterna OCH fasförhållandena mellan de olika vågorna som representeras. För den här applikationen berör vi inte fasrelationerna, men vi är intresserade av storheter och deras frekvens.

Teensy -ljudkortet samplar ljud med en frekvens av 44, 100 Hz. Så, 1024 sampel vid denna frekvens representerar ett tidsintervall på 1024/44100 eller cirka 23,2 millisekunder. I detta fall kommer FFT att producera som utgång, storheter som är heltalsmultiplar av samplingsperioden på 43 Hz (igen, 1/0,0232 är ungefär 43 Hz). Vi skulle vilja leta efter magnituden som är ungefär dubbelt så hög som denna frekvens: 86 Hz. Det är inte exakt frekvensen av våra beräknade kolibriervingeflikar men det är tillräckligt nära som vi får se.

Steg 5: Använda Fourier -data

Använda Fourier -data
Använda Fourier -data

De bibliotek som PJRC tillhandahåller för Teensy kommer att bearbeta proverna och returnera en rad storhetsvärden. Vi kommer att hänvisa till varje storlek i den returnerade matrisen som ett fack. Det första facket (vid förskjutning noll i datamängden vi får tillbaka) är vågens DC -förskjutning. Vi kan säkert ignorera detta värde. Det andra facket (vid förskjutning 1) representerar storleken på 43 Hz -komponenten. Detta är vår basperiod. Nästa fack (vid förskjutning 2) representerar storleken på 86 Hz -komponenten osv. Varje efterföljande fack är en heltalsmultipel av basperioden (43 Hz).

Nu är det här lite konstigt. Om vi använde en FFT för att analysera ett perfekt 43 Hz -ljud skulle FFT returnera det första facket i någon stor storlek och alla andra fack skulle vara lika med noll (igen, i en perfekt värld). Om ljudet vi fångade och analyserade var 86 Hz så skulle facket vid förskjutning ett vara noll och facket vid förskjutning 2 (den andra övertonen) skulle ha någon stor storlek och resten av facken skulle vara noll, och så vidare. Men om vi fångade ljudet av en kolibri och det var 96 Hz (som jag mätte på min ena fågel) så skulle offset 2 bin @ 86 Hz ha en storlek av ett något lägre värde (än den perfekta 86 Hz -vågen skulle) och facken runt den (en lägre och några högre) skulle var och en ha ett minskande värde utan noll.

Om samplingsstorleken för vår FFT var större än 1024 eller om vår ljudsamplingsfrekvens var lägre kan vi göra upplösningen av våra fack bättre (dvs mindre). Men även om vi ändrade dessa saker för att göra våra FFT -fack 1 Hz multiplar av basperioden, skulle vi fortfarande behöva hantera det här 'spill'. Detta beror på att vi aldrig skulle få en vingfrekvens som alltid, exakt och exakt, landade på en enda papperskorg. Det betyder att vi inte bara kan basera vår upptäckt av en kolibri på värdet i offset 2 -facket och ignorera resten. Vi behöver ett sätt att analysera data i några fack för att försöka förstå det. Mer om detta senare.

Steg 6: Börja bygga

Börja bygga
Börja bygga
Börja bygga
Börja bygga

För min prototyp kolibri detektor använde jag extra långa han-han-nålar lödda på stiften i Teensy. Jag gjorde detta så att jag kunde ansluta Teensy till en liten lödfri brödbräda. Jag gjorde detta för att jag antog att jag skulle göra många ändringar i prototypen och med brödbrädan, jag kunde ändra detta och bara hoppa trådar var jag behövde. Jag lödde honremsor på undersidan av ljudkortet som gör att det kan anslutas ovanpå Teensy. Mikrofonen är lödd på ovansidan av ljudkortet (se bilder). Mer information om montering finns på PJRC -webbplatsen:

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

Steg 7: Hårdvara för att ta en bild

Hårdvara för att ta en bild
Hårdvara för att ta en bild
Hårdvara för att ta en bild
Hårdvara för att ta en bild

Jag har (ja, min fru har) en Canon Rebel Digital Camera. Det finns ett uttag på kameran som låter dig ansluta en manuell fjärrkontroll. Jag köpte en manuell fjärrkontroll från B&H Photo. Kabeln har rätt uttag för att passa kameran i ena änden och är cirka 6 fot lång. Jag klippte kabeln i slutet nära knappkontrollboxen och jag tog av ledningarna och lödde dem till tre huvudstift som jag kunde ansluta till brödbrädan. Det finns en bar tråd som är slipad och två andra signaler: spetsen är trigger (rosa) och ringen (vit) är fokus (se bilderna). Kortslutning av spetsen och/eller ringen till marken driver slutaren och fokus på kameran.

Med hjälp av en bygeltråd sprang jag en gemensam grund från Teensy över till ett område där jag kunde använda den på brödbrädet. Jag kopplade också anoden på en LED till stift 2 på Teensy och katoden på lysdioden till ett motstånd (100-220 ohm) till jord. Jag kopplade också stift 2 på Teensy till ett 10K -motstånd och den andra sidan av motståndet kopplade jag till basen på en NPN -transistor (en 2N3904 finns överallt). Jag kopplade transistorns sändare till jord och kollektorn kopplade jag till de vita och rosa ledningarna från kabeln som går till kameran. Den nakna tråden var åter ansluten till jord. När LED -lampan slås på av Teensy kommer NPN -transistorn också att tändas och det kommer att utlösa kameran (och fokus). Se schemat.

Steg 8: Systemdesign

Systemdesign
Systemdesign

Eftersom kolibriens vingflappfrekvenser sannolikt inte går över några hundra Hz, behöver vi inte verkligen spela in ljudfrekvenser över, till exempel, några hundra Hz. Det vi behöver är ett sätt att filtrera bort endast de frekvenser vi vill ha. Ett bandpass eller till och med lågpassfilter skulle vara bra. Traditionellt skulle vi implementera ett filter i hårdvara med OpAmps eller switchade kondensatorfilter. Men tack vare digital signalbehandling och Teensys programvarubibliotek kan vi använda ett digitalt filter (ingen lödning behövs … bara programvara).

PJRC har ett bra GUI tillgängligt som låter dig dra och släppa ditt ljudsystem för Teensy och ljudkort. Du hittar den här:

www.pjrc.com/teensy/gui/

Jag bestämde mig för att använda ett av PJRC-tillhandahållna bikadratiska kaskadfilter för att begränsa ljudfrekvenserna från mikrofonen (filter). Jag kaskade tre sådana filter och ställde in dem för bandpass -drift vid 100 Hz. Detta filter kommer att släppa in systemfrekvenserna lite över och lite under den frekvens vi är intresserade av.

I blockdiagrammet (se bild) finns i2s1 ljudingången till ljudkortet. Jag kopplade båda ljudkanalerna till en mixer och sedan till filtren (mikrofonen är bara en kanal men jag blandade båda så jag behövde inte räkna ut vilken kanal det var … kalla mig lat). Jag kör filtret till ljudutgången (så att jag kan höra ljudet om jag vill). Jag kopplade också ljudet från filtren till FFT -blocket. I blockdiagrammet är blocket märkt sgtl5000_1 ljudkontrollchipet. Det behöver inga anslutningar i diagrammet.

När du har gjort all denna blockkonstruktion klickar du på Export. Detta visar en dialogruta där du kan kopiera koden som genererades från blockdiagrammet och klistra in den i din Teensy -applikation. Om du tittar på koden kan du se att det är en instantiering av varje kontroll tillsammans med "anslutningarna" mellan komponenterna.

Steg 9: Kod

Koda
Koda

Det skulle ta för mycket utrymme i den här instruktionsboken att gå igenom programvaran i detalj. Det jag ska försöka göra är att markera några av de viktigaste kodbitarna. Men det här är inte en mycket stor applikation ändå. PJRC har en bra videohandledning om hur du använder Teensy och ljudbiblioteken/verktygen (https://www.youtube.com/embed/wqt55OAabVs).

Jag började med någon FFT -exempelkod från PJRC. Jag klistrade in det jag fick från ljudsystemets designverktyg högst upp i koden. Om du tittar på koden efter detta ser du lite initialisering och sedan börjar systemet digitalisera ljud från mikrofonen. Programvaran går in i "forever" -slingan () och väntar på att FFT -data ska vara tillgängliga med ett samtal till funktionen fft1024_1.available (). När FFT -data är tillgängliga tar jag en kopia av data och bearbetar den. Observera att jag bara tar tag i data om den största fackstorleken är över ett inställt värde. Detta värde är hur jag ställer in systemets känslighet. Om facken ÄR över det inställda värdet normaliserar jag vågen och överför den till en tillfällig matris för bearbetning, annars ignorerar jag den och fortsätter vänta på en annan FFT. Jag bör nämna att jag också använder mikrofon förstärkningsfunktionen för att justera kretsens känslighet (sgtl5000_1.micGain (50)).

Att normalisera vågen betyder bara att jag justerar alla facken så att facket med det största värdet är lika med en. Alla andra fack skalas med samma andel. Detta gör data lättare att analysera.

Jag använde flera algoritmer för att analysera data, men jag bestämde mig för att använda bara två. En algoritm beräknar arean under kurvan som bildas av facken. Detta är en enkel beräkning som bara lägger till värdena för papperskorgarna i hela intresseområdet. Jag jämför detta område för att avgöra om det är över en tröskel.

Den andra algoritmen använder en konstant uppsättning värden som representerar en normaliserad FFT. Denna data är resultatet av en verklig (optimal) kolibri signatur. Jag kallar detta en häck. Jag jämför säkringsdata med normaliserade FFT -data för att se om motsvarande fack ligger inom 20% av varandra. Jag valde 20% men det här värdet kunde enkelt justeras.

Jag räknar också hur många gånger de enskilda algoritmerna tror att de har en matchning, vilket betyder, tror att de hör en kolibri. Jag använder denna räkning som en del av kolibriens bestämning eftersom falsk utlösning kan uppstå. Till exempel, när något ljud är högt eller innehåller fåglarnas vingfrekvens, som att klappa händer, kan du få en trigger. Men om räkningen är över ett visst antal (ett nummer jag väljer) säger jag att det är en kolibri. När detta händer tänder jag lysdioden för att indikera att vi har en träff och samma kretsar utlöser kameran via NPN -transistorn. I programvaran ställer jag in kamerans triggningstid till 2 sekunder (den tid då lysdioden och transistorn är på).

Steg 10: Montering

Montering
Montering

Du kan se på bilden hur jag (oseriöst) monterade elektroniken. Jag hade Teensy ansluten till en brödbräda som fastnade på en bärbräda tillsammans med en annan (oanvänd) Arduino -kompatibel (en Arduino Zero tror jag). Jag trådbunden det hela till en metallmarkisstolpe på mitt däck (jag lade också till dragavlastning till kabeln som gick till kameran). Stången låg alldeles intill kolibrimataren. Jag drev elektroniken med en liten LiPo power brick som du kan använda för att ladda en död mobiltelefon. Power brickan hade en USB -kontakt på den som jag använde för att köra ström över till Teensy. Jag drev fjärrkontrollkabeln över till kameran och kopplade in den. Jag var redo för lite fågelaktion!

Steg 11: Resultat

Resultat
Resultat

Jag satte upp kameran på ett stativ nära mataren. Jag hade kameran fokuserad på matarens främre kant och jag ställde in den på Sportläge som tar flera snabba bilder när slutaren trycks in. Med slutartiden på 2 sekunder tog jag cirka 5 bilder per triggerhändelse.

Jag tillbringade ett par timmar och busade med programvaran första gången jag försökte detta. Jag var tvungen att justera känsligheten och antalet successiva algoritmträffar. Jag fick äntligen tweaked och jag var redo.

Den första bilden den tog var av en fågel som flög in i ramen som om den skulle ta en höghastighetsbank som en jetjakt (se ovan). Jag kan inte berätta hur upphetsad jag var. Jag satt tyst på andra sidan däcket en stund och lät systemet fungera. Jag lyckades spela in många bilder men jag slängde bort en hel del. Det visar sig, ibland får du bara ett fågelhuvud eller en svans. Jag fick också falska triggers, som kan uppstå. Totalt tror jag att jag behöll 39 bilder. Det tog fåglarna några resor till mataren för att vänja sig vid slutarljudet från kameran men de verkade så småningom ignorera det.

Steg 12: Sista tankarna

Slutgiltiga tankar
Slutgiltiga tankar

Det här var ett roligt projekt och det fungerar. Men som med det mesta finns det gott om utrymme för förbättringar. Filtret kan säkert vara annorlunda (som ett lågpassfilter eller ändringar i arrangemanget och/eller parametrarna) och kanske kan det få det att fungera bättre. Jag är också säker på att det finns bättre algoritmer att testa. Jag ska testa lite av det här under sommaren.

Jag har fått höra att det finns öppen källkod för maskininlärning där ute … kanske kan systemet "utbildas" för att identifiera kolibrier! Jag är inte säker på att jag ska prova det här, men kanske.

Vilka andra saker kan läggas till i detta projekt? Om kameran hade en datum/tidstampare kan du lägga till den informationen på bilderna. En annan sak du kan göra är att spela in ljudet och spara det på ett uSD -kort (PJRC -ljudkortet har en plats för ett). Det sparade ljudet kan kanske användas för att träna en inlärningsalgoritm.

Kanske någonstans kan en skola för ornitologi använda en enhet som denna? De kanske kan få information som utfodringstider, matningsfrekvens och med bilderna kanske du kan identifiera specifika fåglar som återvänder till matningen.

Min förhoppning är att någon annan förlänger detta projekt och delar det de gör med andra. Vissa människor har sagt till mig att det här arbetet jag har gjort bör förvandlas till en produkt. Jag är inte så säker, men jag skulle hellre se att den användes som en lärplattform och för vetenskap.

Tack för att du läser!

För att använda koden som jag har postat behöver du Arduino IDE (https://www.arduino.cc/en/Main/Software). Du behöver också Teensyduino -koden från PJRC (https://www.pjrc.com/teensy/td_download.html).

Rekommenderad: