Indholdsfortegnelse:
- Trin 1: Valg af en mikrokontroller
- Trin 2: FFT?
- Trin 3: Hvordan lyder en svævende kolibri?
- Trin 4: Fourier -serien og teenageren
- Trin 5: Brug af Fourier -data
- Trin 6: Start konstruktionen
- Trin 7: Hardware til at tage et billede
- Trin 8: Systemdesign
- Trin 9: Kode
- Trin 10: Montering
- Trin 11: Resultater
- Trin 12: Endelige tanker
Video: Hummingbird Detector/Picture-Taker: 12 trin (med billeder)
2024 Forfatter: John Day | [email protected]. Sidst ændret: 2024-01-30 08:29
Vi har en kolibriføder på bagdækket, og i de sidste par år har jeg taget billeder af dem. Kolibrier er fantastiske små skabninger, meget territoriale og deres kampe kan være både sjove og fantastiske. Men jeg var ved at være træt af at stå som en statue mod bagsiden af mit hus for at tage billeder af dem. Jeg havde brug for en måde at tage billeder på uden at skulle stå bag huset i lange perioder og vente. Jeg ved, at jeg kunne have brugt en fjernstyret lukker, men jeg ville have, at billeder blev taget automatisk uden at jeg skulle være der. Så jeg besluttede at lave en enhed til at opdage kolibrier og tage et billede automatisk.
Jeg har altid tænkt mig at bruge en mikrokontroller til at gøre dette. Mikrocontrolleren ville være i stand til at køre kameralukker under softwarekontrol. Men sensoren til at opdage en lille kolibri var en anden ting. Jeg kunne have brugt en bevægelsessensor, men jeg ville prøve noget unikt. Jeg besluttede at bruge lyd som trigger.
Trin 1: Valg af en mikrokontroller
Den mikrokontroller, jeg valgte, var en PJRC Teensy. Teensy bruger en ARM -mikrokontroller, specifikt en ARM Cortex M4. Cortex M4 indeholder hardware til at udføre en FFT (Fast Fourier Transform), der ville gøre detektionen. PJRC sælger også et lydkort, der giver dig mulighed for at bruge Teensy til at afspille musik samt optage lyd med en ekstern indgang eller en lille mikrofon, du kan tilføje til kortet. Min plan var at få Teensy til at udføre en FFT på lyden fra mikrofonen.
Trin 2: FFT?
En FFT er en matematisk formel/algoritme, der transformerer et signal fra tidsdomænet til frekvensdomænet. Hvad dette betyder er, at det tager den tidssamplede lyd fra mikrofonen og forvandler den til størrelser af de frekvenser, der er til stede i den originale bølge. Du kan se, at enhver vilkårlig, kontinuerlig bølge kan konstrueres ud fra en række sinus- eller cosinusbølger, der er heltalsmultipler af en eller anden basisfrekvens. En FFT gør det modsatte: den tager en vilkårlig bølge og forvandler den til størrelsen af de bølger, der, hvis de summeres sammen, ville skabe den originale vilkårlige bølge. En endnu enklere måde at sige dette på er, at jeg planlagde at bruge software og FFT -hardware i Teensy for at afgøre, om det 'hører' vingens flap af en kolibri ved den frekvens, at vingeklapperne opstår. Hvis den 'hører' en kolibri, sender jeg en kommando til et kamera for at tage et billede.
Det virkede! Så hvordan gjorde jeg det, hvordan kunne du gøre det, og hvordan kunne du gøre det endnu bedre?
Trin 3: Hvordan lyder en svævende kolibri?
Først og fremmest var jeg nødt til at finde ud af, hvilken frekvens jeg ville høre kolibriens vingeflapper. For at bestemme dette brugte jeg min iPhone. Jeg tilsluttede iPhone til et stativ og lod den optage slowmotion -video direkte foran kolibrierføderen på vores dæk. Efter en periode fjernede jeg kameraet, og jeg downloadede videoen. Jeg så derefter videoen på udkig efter en kolibri foran feederen. Da jeg fandt en god sekvens, tællede jeg antallet af individuelle rammer, det tog for kolibrien at klappe vingerne fra en position helt tilbage til den samme position. Slowmotion på iPhone er cirka 240 billeder i sekundet. Jeg observerede en kolibri svæve foran føderen, og jeg tællede 5 billeder for at den kunne flytte sine vinger fra fremadposition til bagposition og derefter vende tilbage til fremadposition. Dette er 5 billeder ud af 240. Husk, at vi hører en lyd på hvert slag af kolibriens vingeklapper (et på det fremadgående slag og et på det bagudgående slag). For 5 billeder for en cyklus eller periode kan vi beregne frekvensen som en divideret med perioden dvs. 1 / (5/240) eller 48 Hz. Det betyder, at når denne kolibri svæver, skal lyden, vi hører, være to gange denne eller omkring 96 Hz. Hyppigheden er sandsynligvis højere, når de flyver og ikke svæver. Det kan også blive påvirket af deres masse, men jeg tror, vi kan antage, at de fleste fugle af samme art har omtrent den samme masse.
Trin 4: Fourier -serien og teenageren
Teensy (jeg brugte en Teensy 3.2) er lavet af PJRC (www.pjrc.com). FFT beregnes på en lydprøve. For at erhverve lyden sælger PJRC et lydadapterkort til Teensy (TEENSY3_AUDIO - $ 14,25). De sælger også en lille mikrofon, der kan loddes til lydkortet (MICROPHONE - $ 1,25). Lydkortkortet bruger en chip (SGTL5000), som Teensy kan tale med via en seriel bus (I2S). Teensy bruger SGTL5000 til at prøve lyden fra mikrofonen og digitalisere den, det vil sige oprette et sæt tal, der repræsenterer den lyd, mikrofonen hører.
En FFT er bare en hurtig version af det, der kaldes en Discrete Fourier Transform (DFT). En DFT kan udføres på et vilkårligt antal prøver, men en FFT skal have prøverne gemt i sæt, der er binære multipler. Teensy -hardware kan udføre en FFT på et sæt 1024 prøver (1024 = 2^10), så det er det, vi vil bruge.
En FFT producerer normalt, som sin output, størrelserne OG faseforholdet mellem de forskellige repræsenterede bølger. Til denne applikation er vi ikke optaget af faseforholdet, men vi er interesseret i størrelser og deres frekvens.
Teensy -lydkortet prøver lyd med en frekvens på 44, 100 Hz. Så 1024 prøver ved denne frekvens repræsenterer et tidsinterval på 1024/44100 eller cirka 23,2 millisekunder. I dette tilfælde vil FFT som output producere størrelser, der er heltalsmultipler af prøveperioden på 43 Hz (igen, 1/0,0232 er lig med ca. 43 Hz). Vi vil gerne lede efter størrelser, der er cirka to gange denne frekvens: 86 Hz. Det er ikke ligefrem hyppigheden af vores beregnede kolibri vingeflapper, men det er tæt nok, som vi vil se.
Trin 5: Brug af Fourier -data
Bibliotekerne, som PJRC sørger for, at Teensy vil behandle prøverne og returnere en række størrelsesværdier. Vi vil referere til hver størrelse i det returnerede array som en bin. Den første bin (ved forskydning nul i arrayet af data, vi får tilbage) er bølgeens DC -forskydning. Vi kan roligt ignorere denne værdi. Den anden bakke (ved forskydning 1) repræsenterer størrelsen på 43 Hz -komponenten. Dette er vores basisperiode. Den næste bakke (ved forskydning 2) repræsenterer størrelsen på 86 Hz -komponenten og så videre. Hver efterfølgende bin er et heltalsmultiple af basisperioden (43 Hz).
Nu er det her, det bliver lidt underligt. Hvis vi brugte en FFT til at analysere en perfekt 43 Hz lyd, ville FFT returnere den første bakke i en stor størrelse, og alle resten af skraldespandene ville være lig med nul (igen i en perfekt verden). Hvis lyden, vi fangede og analyserede, var 86 Hz, ville bin ved offset en være nul, og bin ved offset 2 (den anden harmoniske) ville have en stor størrelse, og resten af skraldespandene ville være nul osv. Men hvis vi fangede lyden af en kolibri, og den var 96 Hz (som jeg målte på min ene fugl), så ville offset 2 bin @ 86 Hz have en størrelse på en lidt lavere værdi (end den perfekte 86 Hz -bølge ville) og skraldespandene omkring det (en lavere og et par højere) ville hver have en faldende værdi uden nul.
Hvis prøvestørrelsen for vores FFT var større end 1024, eller hvis vores lydsamplingsfrekvens var lavere, kunne vi gøre opløsningen af vores skraldespande bedre (dvs. mindre). Men selvom vi ændrede disse ting for at gøre vores FFT -bakker til 1 Hz -multipla af basisperioden, ville vi stadig skulle håndtere dette affaldsspild. Dette skyldes, at vi aldrig ville få en vingefrekvens, der altid og præcist landede på en enkelt kasse. Det betyder, at vi ikke bare kan basere vores påvisning af en kolibri på værdien i offset 2 bin og ignorere resten. Vi har brug for en måde at analysere dataene på i nogle få skraldespande for at kunne give mening om det. Mere om dette senere.
Trin 6: Start konstruktionen
Til min prototype kolibri detektor brugte jeg ekstra lange han-han stifter loddet til stifterne i Teensy. Jeg gjorde dette, så jeg kunne tilslutte Teensy til et lille loddefrit brødbræt. Jeg gjorde dette, fordi jeg antog, at jeg ville foretage mange ændringer i prototypen og med brødbrættet, jeg kunne ændre dette og bare hoppe ledninger, hvor jeg havde brug for det. Jeg loddet hunstrimler på undersiden af lydkortet, som gør det muligt at tilslutte det oven på Teensy. Mikrofonen er loddet til oversiden af lydkortet (se billeder). Flere detaljer om montering findes på PJRC -webstedet:
(https://www.pjrc.com/store/teensy3_audio.html).
Trin 7: Hardware til at tage et billede
Jeg har (ja, min kone har) et Canon Rebel Digital Camera. Der er et stik på kameraet, der lader dig tilslutte en manuel fjernbetjening til lukker. Jeg købte en manuel fjernbetjening fra B&H Photo. Kablet har det korrekte stik til kameraet i den ene ende og er cirka 6 fod langt. Jeg klippede kablet for enden nær knappekontrolboksen, og jeg fjernede ledningerne og lodde dem til tre hovedstifter, som jeg kunne tilslutte til brødbrættet. Der er en bar ledning, der er slebet og to andre signaler: spidsen er trigger (lyserød) og ringen (hvid) er i fokus (se billederne). Kortslutning af spidsen og/eller ringen til jorden driver lukkeren og fokus på kameraet.
Ved hjælp af en jumper wire løb jeg en fælles grund fra Teensy over til et område, hvor jeg kunne bruge det på brødbrættet. Jeg tilsluttede også anoden af en LED til pin 2 på Teensy og katoden på LED'en til en modstand (100-220 ohm) til jorden. Jeg sluttede også pin 2 af Teensy til en 10K modstand og den anden side af modstanden sluttede jeg til bunden af en NPN transistor (en 2N3904 findes overalt). Jeg tilsluttede transistorens emitter til jorden og samleren tilsluttede jeg de hvide og lyserøde ledninger fra kablet, der går til kameraet. Den blotte ledning var igen forbundet med jorden. Når LED'en tændes af Teensy, tændes NPN -transistoren også, og den udløser kameraet (og fokus). Se skematisk.
Trin 8: Systemdesign
Fordi kolibriens vingeflappende frekvenser sandsynligvis ikke går over et par hundrede Hz, så behøver vi ikke rigtig at optage lydfrekvenser over for eksempel et par hundrede Hz. Det, vi har brug for, er en måde at filtrere ud kun de frekvenser, vi ønsker. Et båndpas eller endda lavpasfilter ville være fantastisk. Traditionelt ville vi implementere et filter i hardware ved hjælp af OpAmps eller switchede kondensatorfiltre. Men takket være digital signalbehandling og Teensys softwarebiblioteker kan vi bruge et digitalt filter (ingen lodning nødvendig … bare software).
PJRC har en fantastisk GUI til rådighed, der lader dig trække og slippe dit lydsystem til Teensy og lydkortet. Du kan finde den her:
www.pjrc.com/teensy/gui/
Jeg besluttede at bruge et af de PJRC-leverede biquadratiske kaskadefiltre til at begrænse lydfrekvenserne fra mikrofonen (filter). Jeg kaskaderede tre sådanne filtre og satte dem til båndpass -drift ved 100 Hz. Dette filter tillader systemfrekvenser lidt over og lidt under den frekvens, vi er interesseret i.
I blokdiagrammet (se billede) er i2s1 lydindgangen til lydkortet. Jeg sluttede begge lydkanaler til en mixer og derefter til filtrene (mikrofonen er kun en kanal, men jeg blandede begge, så jeg ikke behøvede at finde ud af, hvilken kanal det var … kald mig doven). Jeg kører filterets output til lydoutput (så jeg kan høre lyden, hvis jeg vil). Jeg tilsluttede også lyden fra filtrene til FFT -blokken. I blokdiagrammet er blokken mærket sgtl5000_1 lydcontrollerchippen. Det behøver ikke nogen forbindelser i diagrammet.
Når du har udført al denne blokkonstruktion, klikker du på Eksporter. Dette viser en dialogboks, hvor du kan kopiere den kode, der blev genereret fra blokdiagrammet og indsætte den i din Teensy -applikation. Hvis du ser på koden, kan du se, at det er en instantiering af hver kontrol sammen med 'forbindelserne' mellem komponenterne.
Trin 9: Kode
Det ville tage for meget plads i denne Instructable at gå i detaljer over softwaren. Det, jeg vil prøve at gøre, er at fremhæve nogle af de vigtigste kodestykker. Men dette er alligevel ikke en særlig stor applikation. PJRC har en fantastisk videoundervisning om brug af Teensy og lydbibliotekerne/værktøjerne (https://www.youtube.com/embed/wqt55OAabVs).
Jeg startede med noget FFT -eksempelkode fra PJRC. Jeg indsatte, hvad jeg fik fra lydsystemdesignværktøjet i toppen af koden. Hvis du ser på koden efter dette, vil du se en vis initialisering, og derefter begynder systemet at digitalisere lyd fra mikrofonen. Softwaren går ind i 'forever' loop () og venter på, at FFT -data er tilgængelige ved hjælp af et opkald til funktionen fft1024_1.available (). Når FFT -data er tilgængelige, tager jeg en kopi af dataene og behandler dem. Bemærk, at jeg kun tager fat i data, hvis den største bin -størrelse er over en indstillet værdi. Denne værdi er, hvordan jeg indstiller systemets følsomhed. Hvis skraldespandene ER over den indstillede værdi, normaliserer jeg bølgen og overfører den til et midlertidigt array til behandling, ellers ignorerer jeg den og venter på en anden FFT. Jeg skal nævne, at jeg også bruger mikrofonforstærkningsfunktionen til at justere kredsløbets følsomhed (sgtl5000_1.micGain (50)).
Normalisering af bølgen betyder bare, at jeg justerer alle skraldespandene, så skraldespanden med den største værdi er sat til en. Alle andre skraldespande skaleres med samme andel. Dette gør dataene lettere at analysere.
Jeg brugte flere algoritmer til at analysere dataene, men jeg besluttede mig for at bruge kun to. En algoritme beregner arealet under kurven dannet af skraldespandene. Dette er en simpel beregning, der bare tilføjer værdierne for skraldespandene på tværs af interesseområdet. Jeg sammenligner dette område for at afgøre, om det er over en tærskel.
Den anden algoritme bruger en konstant vifte af værdier, der repræsenterer en normaliseret FFT. Disse data er resultaterne af en reel (optimal) kolibri signatur. Jeg kalder dette en hæk. Jeg sammenligner hedgedataene med de normaliserede FFT -data for at se, om de tilsvarende skraldespande er inden for 20% af hinanden. Jeg valgte 20%, men denne værdi kunne let justeres.
Jeg tæller også, hvor mange gange de enkelte algoritmer tror, de har et match, hvilket betyder, tror, de hører en kolibri. Jeg bruger denne optælling som en del af kolibriens bestemmelse, fordi der kan forekomme falsk udløsning. For eksempel, når enhver lyd er høj eller indeholder fuglenes vingefrekvens, som at klappe hænder, kan du få en trigger. Men hvis tællingen er over et bestemt tal (et nummer, jeg vælger), siger jeg, at det er en kolibri. Når dette sker, tænder jeg LED'en for at angive, at vi har et hit, og det samme kredsløb udløser kameraet via NPN -transistoren. I softwaren indstillede jeg kameraets trigger -tid til 2 sekunder (den tid, lysdioden og transistoren er tændt).
Trin 10: Montering
Du kan se på billedet, hvordan jeg (uden henseende) monterede elektronikken. Jeg havde Teensy tilsluttet et brødbræt, der var fastgjort til et transportbræt sammen med en anden (ubrugt) Arduino -kompatibel (en Arduino Zero tror jeg). Jeg trådbundet det hele til en metalteltstang på mit dæk (jeg tilføjede også aflastning til kablet, der løber til kameraet). Stangen var lige ved siden af kolibrierføderen. Jeg drev elektronikken med en lille LiPo power brick, som du kan bruge til at genoplade en død mobiltelefon. Strømstenen havde et USB -stik på det, som jeg brugte til at køre strøm til Teensy. Jeg kørte fjernbetjeningskablet over til kameraet og tilsluttede det. Jeg var klar til nogle fuglehandlinger!
Trin 11: Resultater
Jeg satte kameraet op på et stativ nær fremføreren. Jeg havde kameraet fokuseret på fremkanten af fremføreren, og jeg indstillede det til Sportstilstand, der tager flere hurtige billeder, når der trykkes på lukkeren. Med lukkertiden på 2 sekunder tog jeg cirka 5 billeder pr. Triggerhændelse.
Jeg brugte et par timer på at rode med softwaren, første gang jeg prøvede dette. Jeg var nødt til at justere følsomheden og det successive algoritme -hitantal. Jeg fik endelig finjusteret det, og jeg var klar.
Det første billede, det tog, var af en fugl, der fløj ind i rammen, som om han tog en højhastighedsbankdrejning som en jetjager (se ovenfor). Jeg kan ikke fortælle dig, hvor begejstret jeg var. Jeg sad stille på den anden side af dækket et stykke tid og lod systemet fungere. Det lykkedes mig at optage mange billeder, men jeg smed en del. Det viser sig, nogle gange får du bare et fuglehoved eller en hale. Jeg fik også falske udløsere, som kan forekomme. I alt tror jeg, at jeg beholdt 39 billeder. Det tog fuglene et par ture til føderen for at vænne sig til lukkerlyden fra kameraet, men de syntes til sidst at ignorere det.
Trin 12: Endelige tanker
Dette var et sjovt projekt, og det virker. Men ligesom de fleste ting er der masser af plads til forbedringer. Filteret kan helt sikkert være anderledes (som et lavpasfilter eller ændringer i arrangementet og/eller parametrene), og det kan måske få det til at fungere bedre. Jeg er også sikker på, at der er bedre algoritmer at prøve. Jeg vil prøve noget af dette til sommer.
Jeg har fået at vide, at der findes open source-maskinlæringskode derude … måske kunne systemet 'trænes' til at identificere kolibrier! Jeg er ikke sikker på, at jeg vil prøve dette, men måske.
Hvilke andre ting kan tilføjes til dette projekt? Hvis kameraet havde en dato/klokkeslætstemper, kunne du tilføje disse oplysninger til billederne. En anden ting, du kan gøre, er at optage lyden og gemme den på et uSD -kort (PJRC -lydkortet har en plads til en). Den gemte lyd kan muligvis bruges til træning af en læringsalgoritme.
Måske et sted i en ornitologisk skole kunne bruge en enhed som denne? De kan muligvis indsamle oplysninger som fodringstider, fodringsfrekvens og med billederne kan du muligvis identificere bestemte fugle, der vender tilbage til foder.
Mit håb er, at en anden forlænger dette projekt og deler, hvad de laver med andre. Nogle mennesker har fortalt mig, at dette arbejde, jeg har udført, skal gøres til et produkt. Jeg er ikke så sikker, men jeg vil hellere se det brugt som en læringsplatform og til videnskab.
Tak fordi du læste!
For at bruge den kode, jeg har postet, skal du bruge Arduino IDE (https://www.arduino.cc/en/Main/Software). Du skal også bruge Teensyduino -koden fra PJRC (https://www.pjrc.com/teensy/td_download.html).
Anbefalede:
YADPF (YET Another Digital Picture Frame): 7 trin (med billeder)
YADPF (YET Another Digital Picture Frame): Jeg ved, at dette ikke er nye ting, jeg ved, jeg har set nogle af disse projekter her, men jeg har altid ønsket at bygge min egen digitale billedramme. Alle billedrammer, jeg har set, er flotte, men jeg ledte efter noget andet, jeg leder efter en rigtig flot fr
Micro: bit Med Hummingbird: 6 trin
Micro: bit Med Hummingbird: Hummingbird boardet (fra Birdbrain Technologies) kan styre lysdioder, en række sensorer (herunder lys, urskive, afstand og lyd); servomotorer og andre udvidelser. Denne instruktør viser dig, hvordan du bruger en micro: bit i et Hummingbird board
Hummingbird Shooter: 14 trin (med billeder)
Hummingbird Shooter: Sidst på sommeren begyndte kolibrier endelig at besøge den feeder, vi havde sat på vores baghave. Jeg ville prøve at få taget nogle digitale billeder af dem, men kunne ikke stå der med et kamera "inden for rækkevidde"-de ville aldrig komme. Jeg havde brug for en fjernbetjening til kabel
Digital 3D Picture Viewer - "The DigiStereopticon": 6 trin (med billeder)
Digital 3D Picture Viewer - "The DigiStereopticon": Stereoskopisk fotografering er faldet i unåde. Dette skyldes sandsynligvis, at folk ikke kan lide at skulle have særlige briller for at se familie -snapshots. Her er et sjovt lille projekt, du kan lave på mindre end en dag for at lave dit 3D -billede
Solar Powered Digital Picture Frame: 11 trin (med billeder)
Solar Powered Digital Picture Frame: Her er en pæn lille gave, jeg lavede til min kone sidste jul. Det ville dog generelt være en fantastisk gave - fødselsdage, jubilæer, Valentinsdag eller andre særlige begivenheder! I kernen er et standard digitalt billede på hylden på hylden til