Innholdsfortegnelse:

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

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

Video: Hummingbird Detector/Picture-Taker: 12 trinn (med bilder)
Video: ЗАПРЕЩЁННЫЕ ТОВАРЫ с ALIEXPRESS 2023 ШТРАФ и ТЮРЬМА ЛЕГКО! 2024, Juli
Anonim
Hummingbird Detector/Picture-Taker
Hummingbird Detector/Picture-Taker

Vi har en kolibri mater på bakdekket, og de siste par årene har jeg tatt bilder av dem. Kolibrier er fantastiske små skapninger, veldig territorielle og kampene deres kan være både morsomme og fantastiske. Men jeg ble lei av å stå som en statue mot baksiden av huset mitt for å ta bilder av dem. Jeg trengte en måte å ta bilder på uten å måtte stå bak huset i lange perioder. Jeg vet at jeg kunne ha brukt en fjernstyrt lukker, men jeg ville at bildene skulle tas automatisk uten at jeg måtte være der. Så jeg bestemte meg for å lage en enhet for å oppdage kolibrier og ta et bilde automatisk.

Jeg har alltid tenkt å bruke en mikrokontroller for å gjøre dette. Mikrokontrolleren kan kjøre kameralukker under programvarekontroll. Men sensoren for å oppdage en liten kolibri var en annen ting. Jeg kunne ha brukt en bevegelsessensor, men jeg ville prøve noe unikt. Jeg bestemte meg for å bruke lyd som trigger.

Trinn 1: Velge en mikrokontroller

Velge en mikrokontroller
Velge en mikrokontroller

Mikrokontrolleren jeg valgte var en PJRC Teensy. Teensy bruker en ARM -mikrokontroller, spesielt en ARM Cortex M4. Cortex M4 inneholder maskinvaren for å utføre en FFT (Fast Fourier Transform) som ville gjøre deteksjonen. PJRC selger også et lydkort som lar deg bruke Teensy til å spille musikk, samt ta opp lyd med en ekstern inngang, eller en liten mikrofon du kan legge til på tavlen. Planen min var å få Teensy til å utføre en FFT på lyden fra mikrofonen.

Trinn 2: FFT?

FFT?
FFT?

En FFT er en matematisk formel/algoritme som transformerer et signal fra tidsdomenet til frekvensdomenet. Hva dette betyr er at det tar lydsamplet lyd fra mikrofonen og gjør det til størrelser på frekvensene som er tilstede i den opprinnelige bølgen. Du ser, enhver vilkårlig, kontinuerlig bølge kan konstrueres fra en serie sinus- eller cosinusbølger som er heltallsmultipler av en eller annen basisfrekvens. En FFT gjør det motsatte: den tar en vilkårlig bølge og gjør den til størrelsen på bølgene som, hvis de summeres sammen, ville skape den opprinnelige vilkårlige bølgen. En enda enklere måte å si dette på er at jeg planla å bruke programvare og FFT -maskinvare i tenåringen for å avgjøre om den 'hører' vingeklapp av en kolibri ved frekvensen som vingeklaffene oppstår. Hvis den 'hører' en kolibri, sender jeg en kommando til et kamera for å ta et bilde.

Det funket! Så, hvordan gjorde jeg det, hvordan kunne du gjøre det og hvordan kunne du gjøre det enda bedre?

Trinn 3: Hvordan høres en svevende kolibri ut?

Hvordan høres en svevende kolibri ut?
Hvordan høres en svevende kolibri ut?

Først av alt, jeg trengte å finne ut hvilken frekvens jeg ville høre kolibriens vingeklaffer. For å bestemme dette brukte jeg iPhone. Jeg festet iPhone til et stativ og lot den ta opp slowmotion -video rett foran kolibri -materen på dekket vårt. Etter en tid fjernet jeg kameraet og jeg lastet ned videoen. Jeg så på videoen på jakt etter en kolibri foran materen. Da jeg fant en god sekvens, regnet jeg antall individuelle rammer som det tok for kolibrien å klappe vingene fra en posisjon helt tilbake til den samme posisjonen. Slow motion på iPhone er omtrent 240 bilder i sekundet. Jeg observerte en kolibri som svevde foran materen og jeg telte 5 bilder for at den skulle bevege vingene fra fremoverposisjonen til bakposisjonen og deretter gå tilbake til posisjonen fremover. Dette er 5 bilder av 240. Husk at vi hører en lyd på hvert slag av kolibriens vingeklaffer (en på fremre slag og en på bakoverslag). For 5 bilder for en syklus eller periode kan vi beregne frekvensen som én dividert med perioden dvs. 1 / (5/240) eller 48 Hz. Dette betyr at når denne kolibrien svever, må lyden vi hører være to ganger dette eller omtrent 96 Hz. Frekvensen er sannsynligvis høyere når de flyr og ikke svever. Det kan også påvirkes av massen, men jeg tror vi kan anta at de fleste fuglene av samme art har omtrent samme masse.

Trinn 4: Fourier -serien og tenåringen

Fourier -serien og Teensy
Fourier -serien og Teensy

Teensy (jeg brukte en Teensy 3.2) er laget av PJRC (www.pjrc.com). FFT vil bli beregnet på et eksempel på lyd. For å skaffe lyden, selger PJRC et lydadapterkort for Teensy (TEENSY3_AUDIO - $ 14,25). De selger også en liten mikrofon som kan loddes til lydkortet (MICROPHONE - $ 1,25). Lydkortkortet bruker en chip (SGTL5000) som Teensy kan snakke med via en seriell buss (I2S). Teensy bruker SGTL5000 til å prøve lyden fra mikrofonen og digitalisere den, det vil si lage et sett med tall som representerer lyden mikrofonen hører.

En FFT er bare en rask versjon av det som kalles en Discrete Fourier Transform (DFT). En DFT kan utføres på et vilkårlig antall prøver, men en FFT må ha prøvene lagret i sett som er binære multipler. Teensy -maskinvaren kan utføre en FFT på et sett med 1024 prøver (1024 = 2^10), så det er det vi skal bruke.

En FFT produserer vanligvis størrelsene OG faseforholdet mellom de forskjellige bølgene som representeres, som utgang. For denne applikasjonen er vi ikke opptatt av faseforholdet, men vi er interessert i størrelser og deres frekvens.

Teensy -lydkortet prøver lyd med en frekvens på 44, 100 Hz. Så, 1024 prøver med denne frekvensen representerer et tidsintervall på 1024/44100 eller omtrent 23,2 millisekunder. I dette tilfellet vil FFT produsere som utgang størrelser som er heltallsmultipler av prøveperioden på 43 Hz (igjen, 1/0,0232 er omtrent 43 Hz). Vi ønsker å lete etter størrelser som er omtrent to ganger denne frekvensen: 86 Hz. Det er ikke akkurat frekvensen av våre beregnede kolibrier vingeklaffer, men det er nært nok som vi får se.

Trinn 5: Bruke Fourier -data

Bruke Fourier -data
Bruke Fourier -data

Bibliotekene PJRC sørger for at Teensy vil behandle prøvene og returnere en rekke størrelsesverdier. Vi vil referere til hver størrelse i den returnerte matrisen som en binge. Den første bingen (ved forskyvning null i rekken med data vi får tilbake) er bølgens DC -forskyvning. Vi kan trygt ignorere denne verdien. Den andre skuffen (ved forskyvning 1) vil representere størrelsen på 43 Hz -komponenten. Dette er vår basisperiode. Den neste skuffen (ved forskyvning 2) vil representere størrelsen på 86 Hz -komponenten, og så videre. Hver påfølgende skuff er et heltall multiplum av basisperioden (43 Hz).

Nå er det her det blir litt rart. Hvis vi brukte en FFT til å analysere en perfekt 43 Hz lyd, ville FFT returnere den første skuffen i en stor størrelse, og alle resten av søppelkassene ville være lik null (igjen, i en perfekt verden). Hvis lyden vi fanget og analyserte var 86 Hz, ville skuffen ved forskyvning en være null og skuffen ved forskyvning 2 (den andre harmoniske) ville ha en stor størrelse og resten av hyllene ville være null, og så videre. Men hvis vi fanget lyden av en kolibri og den var 96 Hz (som jeg målte på min ene fugl), ville forskyvningen 2 bin @ 86 Hz ha en størrelse på en litt lavere verdi (enn den perfekte 86 Hz -bølgen ville) og hyllene rundt den (en lavere og noen få høyere) ville hver ha en avtagende verdi som ikke er null.

Hvis prøvestørrelsen for vår FFT var større enn 1024 eller hvis lydsamplingsfrekvensen vår var lavere, kunne vi gjøre oppløsningen på søppelbøttene våre bedre (dvs. mindre). Men selv om vi endret disse tingene for å gjøre FFT -hyllene våre til 1 Hz multipler av basisperioden, ville vi fortsatt måtte forholde oss til dette søppelet. Dette er fordi vi aldri ville få en vingefrekvens som alltid og nøyaktig landet på en enkelt søppelbøtte. Dette betyr at vi ikke bare kan basere vår påvisning av en kolibri på verdien i offset 2 -skuffen og ignorere resten. Vi trenger en måte å analysere dataene på i noen binger for å prøve å forstå det. Mer om dette senere.

Trinn 6: Start byggingen

Begynn med byggingen
Begynn med byggingen
Start byggingen
Start byggingen

For min prototype kolibri-detektor brukte jeg ekstra lange hann-hann-pinner loddet til pinnene i tenåringen. Jeg gjorde dette, slik at jeg kunne koble Teensy til et lite loddfritt brødbrett. Jeg gjorde dette fordi jeg antok at jeg ville gjøre mange endringer i prototypen og med brødbrettet, jeg kunne endre dette og bare hoppe ledninger hvor jeg måtte trenge. Jeg loddet hunnstrimler på undersiden av lydkortet som gjør at det kan plugges på toppen av Teensy. Mikrofonen er loddet på oversiden av lydkortet (se bilder). Flere detaljer om montering finner du på PJRC -siden:

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

Trinn 7: Maskinvare for å feste et bilde

Maskinvare for å ta et bilde
Maskinvare for å ta et bilde
Maskinvare for å ta et bilde
Maskinvare for å ta et bilde

Jeg har (vel, min kone har) et Canon Rebel Digital Camera. Det er en kontakt på kameraet som lar deg koble til en manuell fjernkontroll. Jeg kjøpte en manuell fjernkontroll fra B&H Photo. Kabelen har riktig kontakt for å passe til kameraet i den ene enden og er omtrent 6 fot lang. Jeg kuttet kabelen på enden nær knappens kontrollboks, og jeg fjernet ledningene og loddet dem til tre toppnål som jeg kunne koble til brødbrettet. Det er en ledning som er malt og to andre signaler: spissen er utløser (rosa) og ringen (hvit) er fokus (se bildene). Kortslutning av spissen og/eller ringen til bakken driver lukkeren og fokuset på kameraet.

Ved hjelp av en jumper wire løp jeg en felles vei fra Teensy over til et område hvor jeg kunne bruke den på brødbrettet. Jeg koblet også anoden til en LED til pinne 2 på Teensy og katoden til LED-en til en motstand (100-220 ohm) til jord. Jeg koblet også pin 2 på Teensy til en 10K motstand og den andre siden av motstanden koblet jeg til bunnen av en NPN -transistor (en 2N3904 funnet overalt). Jeg koblet transistorens sender til jord og kollektoren koblet jeg til de hvite og rosa ledningene fra kabelen som går til kameraet. Bare ledningen var igjen koblet til jord. Når LED -en slås på av Teensy, vil NPN -transistoren også slås på og den vil utløse kameraet (og fokuset). Se skjematisk.

Trinn 8: Systemdesign

System design
System design

Fordi Hummingbirds vingeflappfrekvenser sannsynligvis ikke går over noen få hundre Hz, trenger vi egentlig ikke å spille inn lydfrekvenser over noen hundre Hz. Det vi trenger er en måte å filtrere ut bare frekvensene vi ønsker. Et båndpass eller til og med lavpassfilter ville være flott. Tradisjonelt ville vi implementere et filter i maskinvare ved hjelp av OpAmps eller koblede kondensatorfiltre. Men takket være digital signalbehandling og Teensys programvarebibliotek kan vi bruke et digitalt filter (ingen lodding nødvendig … bare programvare).

PJRC har en flott GUI tilgjengelig som lar deg dra og slippe lydsystemet ditt for Teensy og lydkort. Du finner den her:

www.pjrc.com/teensy/gui/

Jeg bestemte meg for å bruke et av de PJRC-levert biquadratiske kaskadefiltrene for å begrense lydfrekvensene fra mikrofonen (filter). Jeg kaskaderte tre slike filtre og satte dem for båndpass -drift på 100 Hz. Dette filteret vil tillate systemfrekvensene litt over og litt under frekvensen vi er interessert i.

I blokkdiagrammet (se bildet) er i2s1 lydinngangen til lydkortet. Jeg koblet begge lydkanalene til en mikser og deretter til filtrene (mikrofonen er bare en kanal, men jeg blandet begge, så jeg slapp å finne ut hvilken kanal det var … kall meg lat). Jeg kjører filterets utgang til lydutgangen (så jeg kan høre lyden hvis jeg vil). Jeg koblet også lyden fra filtrene til FFT -blokken. I blokkdiagrammet er blokken merket sgtl5000_1 lydkontrollbrikken. Det trenger ingen tilkoblinger i diagrammet.

Etter at du har gjort hele denne blokkkonstruksjonen klikker du på Eksporter. Dette viser en dialogboks der du kan kopiere koden som ble generert fra blokkdiagrammet og lime den inn i Teensy -applikasjonen. Hvis du ser på koden, kan du se at det er en instantiering av hver kontroll sammen med "forbindelsene" mellom komponentene.

Trinn 9: Kode

Kode
Kode

Det ville ta for mye plass i denne instruksjonsboken å gå gjennom programvaren i detalj. Det jeg skal prøve å gjøre er å markere noen av de viktigste kodene. Men dette er uansett ikke en veldig stor applikasjon. PJRC har en flott videoopplæring om bruk av Teensy og lydbibliotekene/verktøyene (https://www.youtube.com/embed/wqt55OAabVs).

Jeg begynte med en FFT -eksempelkode fra PJRC. Jeg limte inn det jeg fikk fra lydsystemdesignverktøyet øverst i koden. Hvis du ser på koden etter dette, ser du litt initialisering, og deretter begynner systemet å digitalisere lyd fra mikrofonen. Programvaren går inn i "forever" -sløyfen () og venter på at FFT -data skal være tilgjengelige ved å ringe funksjonen fft1024_1.available (). Når FFT -data er tilgjengelige, tar jeg en kopi av dataene og behandler dem. Vær oppmerksom på at jeg bare henter data hvis den største bin -størrelsen er over en angitt verdi. Denne verdien er hvordan jeg angir systemets følsomhet. Hvis hyllene ER over den innstilte verdien, normaliserer jeg bølgen og overfører den til en midlertidig matrise for behandling, ellers ignorerer jeg den og venter på en annen FFT. Jeg skal nevne at jeg også bruker mikrofonforsterkningsfunksjonen til å justere følsomheten til kretsen (sgtl5000_1.micGain (50)).

Normalisering av bølgen betyr bare at jeg justerer alle søppelkassene slik at beholderen med den største verdien settes lik en. Alle andre søppelbøtter skaleres med samme andel. Dette gjør dataene lettere å analysere.

Jeg brukte flere algoritmer for å analysere dataene, men jeg bestemte meg for å bruke bare to. En algoritme beregner arealet under kurven dannet av hyllene. Dette er en enkel beregning som bare legger til verdiene til søppelbøttene i hele området. Jeg sammenligner dette området for å avgjøre om det er over en terskel.

Den andre algoritmen bruker en konstant rekke verdier som representerer en normalisert FFT. Disse dataene er resultatene av en ekte (optimal) kolibri signatur. Jeg kaller dette en hekk. Jeg sammenligner sikringsdataene med de normaliserte FFT -dataene for å se om de tilhørende hyllene er innenfor 20% av hverandre. Jeg valgte 20%, men denne verdien kan enkelt justeres.

Jeg teller også hvor mange ganger de enkelte algoritmene tror de har en treff, noe som betyr at de tror de hører en kolibri. Jeg bruker denne tellingen som en del av kolibriens bestemmelse fordi det kan oppstå falsk utløsning. For eksempel, når en lyd er høy eller inneholder fuglenes vingefrekvens, som å klappe i hendene, kan du få en trigger. Men hvis tellingen er over et bestemt tall (et tall jeg velger) sier jeg at det er en kolibri. Når dette skjer, slår jeg på LED -en for å indikere at vi har et treff, og den samme kretsen utløser kameraet via NPN -transistoren. I programvaren satte jeg kameratriggertiden til 2 sekunder (tiden LED -en og transistoren er på).

Trinn 10: Montering

Montering
Montering

Du kan se på bildet hvordan jeg (uten tvil) monterte elektronikken. Jeg hadde Teensy koblet til et brødbrett som satt fast på et bærebrett sammen med en annen (ubrukt) Arduino -kompatibel (en Arduino Zero tror jeg). Jeg trådbundet det hele til en metallmarkise på stolpen min (jeg har også lagt strekkavlastning på kabelen som løper til kameraet). Stangen var rett ved siden av kolibrier. Jeg drev elektronikken med en liten LiPo -murstein som du kan bruke til å lade opp en død mobiltelefon. Power brick hadde en USB -kontakt på den som jeg brukte til å kjøre strøm til Teensy. Jeg løp fjernkontrollkabelen over til kameraet og plugget den inn. Jeg var klar for litt fuglehandling!

Trinn 11: Resultater

Resultater
Resultater

Jeg satte opp kameraet på et stativ i nærheten av materen. Jeg hadde kameraet fokusert på fremkanten av materen, og jeg satte det til Sport Mode som tar flere raske bilder når lukkeren trykkes. Med lukkertid på 2 sekunder tok jeg omtrent 5 bilder per triggerhendelse.

Jeg brukte et par timer på å fikle med programvaren første gangen jeg prøvde dette. Jeg måtte justere følsomheten og det påfølgende algoritmetreffet. Jeg fikk endelig finjustert det og jeg var klar.

Det første bildet det tok var av en fugl som fløy inn i rammen som om han tok en høyhastighetsbank som en jetjager (se ovenfor). Jeg kan ikke fortelle deg hvor spent jeg var. Jeg satt stille på den andre siden av dekket en stund og lot systemet fungere. Jeg klarte å ta mange bilder, men jeg kastet ganske mange. Det viser seg at noen ganger får du bare et fuglehode eller en hale. Jeg fikk også falske utløsere, som kan oppstå. Totalt tror jeg jeg beholdt 39 bilder. Det tok fuglene noen turer til materen for å venne seg til lukkerlyden fra kameraet, men de så til slutt ut til å ignorere det.

Trinn 12: Avsluttende tanker

Siste tanker
Siste tanker

Dette var et morsomt prosjekt, og det fungerer. Men, som de fleste ting, er det god plass til forbedringer. Filteret kan sikkert være annerledes (som et lavpassfilter eller endringer i arrangementet og/eller parametrene), og det kan kanskje få det til å fungere bedre. Jeg er også sikker på at det er bedre algoritmer å prøve. Jeg skal prøve noe av dette til sommeren.

Jeg har blitt fortalt at det er åpen kildekode for maskinlæring der ute … kanskje systemet kan bli "opplært" i å identifisere kolibrier! Jeg er ikke sikker på om jeg skal prøve dette, men kanskje.

Hvilke andre ting kan legges til i dette prosjektet? Hvis kameraet hadde en dato/klokkeslettstemper, kan du legge til informasjonen i bildene. En annen ting du kan gjøre er å ta opp lyden og lagre den på et uSD -kort (PJRC -lydkortet har et spor for en). Den lagrede lyden kan kanskje brukes til å trene en læringsalgoritme.

Kanskje et sted på en ornitologisk skole kan bruke en enhet som denne? De kan kanskje hente informasjon som fôringstider, fôringsfrekvens, og med bildene kan du kanskje identifisere bestemte fugler som kommer tilbake til fôret.

Mitt håp er at noen andre utvider dette prosjektet og deler det de lager med andre. Noen mennesker har fortalt meg at dette arbeidet jeg har gjort bør gjøres om til et produkt. Jeg er ikke så sikker, men jeg vil heller se det brukt som en læringsplattform og for vitenskap.

Takk for at du leste!

For å bruke koden jeg har postet trenger du Arduino IDE (https://www.arduino.cc/en/Main/Software). Du trenger også Teensyduino -koden fra PJRC (https://www.pjrc.com/teensy/td_download.html).

Anbefalt: