Inhoudsopgave:

Hummingbird Detector/Picture-Taker - Ajarnpa
Hummingbird Detector/Picture-Taker - Ajarnpa

Video: Hummingbird Detector/Picture-Taker - Ajarnpa

Video: Hummingbird Detector/Picture-Taker - Ajarnpa
Video: FREEZE birds in flight | SHARP hummingbird photos | Pro tips for continuous shooting - Nikon Z9 2024, Juli-
Anonim
Kolibrie Detector/Picture-Taker
Kolibrie Detector/Picture-Taker

We hebben een kolibrievoeder op ons achterdek en de laatste paar jaar maak ik er foto's van. Kolibries zijn geweldige kleine wezens, erg territoriaal en hun gevechten kunnen zowel hilarisch als geweldig zijn. Maar ik werd het zat om als een standbeeld tegen de achterkant van mijn huis te staan om foto's van ze te maken. Ik had een manier nodig om foto's te maken zonder lang achter het huis te hoeven wachten. Ik weet dat ik een sluiter met afstandsbediening had kunnen gebruiken, maar ik wilde dat er automatisch foto's werden gemaakt zonder dat ik erbij hoefde te zijn. Dus besloot ik een apparaat te maken om de kolibries te detecteren en automatisch een foto te maken.

Ik was altijd van plan om hiervoor een microcontroller te gebruiken. De microcontroller zou de camerasluiter kunnen aansturen onder softwarebesturing. Maar de sensor om een kleine kolibrie te detecteren was iets anders. Ik had een bewegingssensor kunnen gebruiken, maar ik wilde iets unieks proberen. Ik besloot om geluid als trigger te gebruiken.

Stap 1: Een microcontroller kiezen

Een microcontroller kiezen
Een microcontroller kiezen

De microcontroller die ik koos was een PJRC Teensy. De Teensy gebruikt een ARM-microcontroller, in het bijzonder een ARM Cortex M4. De Cortex M4 bevat de hardware om een FFT (Fast Fourier Transform) uit te voeren die de detectie zou doen. PJRC verkoopt ook een audiobord waarmee je de Teensy kunt gebruiken om muziek af te spelen en audio op te nemen met een externe ingang, of een kleine microfoon die je aan het bord kunt toevoegen. Mijn plan was om de Teensy een FFT te laten uitvoeren op de audio van de microfoon.

Stap 2: FFT?

FFT?
FFT?

Een FFT is een wiskundige formule/algoritme die een signaal transformeert van het tijdsdomein naar het frequentiedomein. Wat dit betekent is dat het de in de tijd gesamplede audio van de microfoon neemt en deze omzet in magnitudes van de frequenties die aanwezig zijn in de originele golf. Zie je, elke willekeurige, continue golf kan worden geconstrueerd uit een reeks sinus- of cosinusgolven die gehele veelvouden zijn van een bepaalde basisfrequentie. Een FFT doet het tegenovergestelde: het neemt een willekeurige golf en verandert deze in de grootte van de golven die, indien bij elkaar opgeteld, de oorspronkelijke willekeurige golf zouden creëren. Een nog eenvoudigere manier om dit te zeggen, is dat ik van plan was om software en de FFT-hardware in de Teensy te gebruiken om te bepalen of het het klapperen van de vleugel van een kolibrie 'hoort' met de frequentie dat de vleugelkleppen voorkomen. Als hij een kolibrie 'hoort', stuur ik een commando naar een camera om een foto te maken.

Het werkte! Dus, hoe heb ik het gedaan, hoe zou je het kunnen doen en hoe zou je het nog beter kunnen maken?

Stap 3: Hoe klinkt een zwevende kolibrie?

Hoe klinkt een zwevende kolibrie?
Hoe klinkt een zwevende kolibrie?

Allereerst moest ik uitzoeken op welke frequentie ik de vleugelkleppen van de kolibrie zou horen. Om dit te bepalen heb ik mijn iPhone gebruikt. Ik bevestigde de iPhone op een statief en liet hem slow motion-video opnemen direct voor de kolibrievoeder op ons dek. Na een tijdje heb ik de camera verwijderd en de video gedownload. Ik keek toen naar de video op zoek naar een kolibrie voor de feeder. Toen ik een goede reeks vond, telde ik het aantal afzonderlijke frames dat de kolibrie nodig had om met zijn vleugels van de ene positie helemaal terug naar diezelfde positie te klappen. Slow motion op de iPhone is ongeveer 240 frames per seconde. Ik zag een kolibrie voor de feeder zweven en ik telde 5 frames om zijn vleugels van de voorste positie naar de achterste positie te bewegen en vervolgens terug te keren naar de voorste positie. Dit zijn 5 frames van de 240. Vergeet niet dat we een geluid horen bij elke slag van de vleugelkleppen van de kolibrie (één bij de voorwaartse slag en één bij de achterwaartse slag). Voor 5 frames voor een cyclus of periode kunnen we de frequentie berekenen als één gedeeld door de periode, d.w.z. 1 / (5/240) of 48 Hz. Dit betekent dat wanneer deze kolibrie zweeft, het geluid dat we horen twee keer dit of ongeveer 96 Hz moet zijn. De frequentie is waarschijnlijk hoger wanneer ze vliegen en niet zweven. Het kan ook worden beïnvloed door hun massa, maar ik denk dat we kunnen aannemen dat de meeste vogels van dezelfde soort ongeveer dezelfde massa hebben.

Stap 4: Fourier-serie en de Teensy

Fourier-serie en de Teensy
Fourier-serie en de Teensy

De Teensy (ik gebruikte een Teensy 3.2) is gemaakt door PJRC (www.pjrc.com). De FFT wordt berekend op basis van een geluidssample. Om het geluid te verkrijgen, verkoopt PJRC een audio-adapterkaart voor Teensy (TEENSY3_AUDIO - $ 14,25). Ze verkopen ook een kleine microfoon die op de audio-adapterkaart kan worden gesoldeerd (MICROFOON - $ 1,25). Het audio-adapterbord maakt gebruik van een chip (SGTL5000) waarmee de Teensy kan praten via een seriële bus (I2S). De Teensy gebruikt de SGTL5000 om de audio van de microfoon te samplen en te digitaliseren, dat wil zeggen, een reeks nummers te creëren die het geluid vertegenwoordigen dat de microfoon hoort.

Een FFT is slechts een snelle versie van wat een Discrete Fourier Transform (DFT) wordt genoemd. Een DFT kan worden uitgevoerd op een willekeurig aantal monsters, maar een FFT moet de monsters hebben opgeslagen in sets die binaire veelvouden zijn. De Teensy-hardware kan een FFT uitvoeren op een set van 1024 samples (1024=2^10), dus dat gaan we gebruiken.

Een FFT produceert gewoonlijk als output de magnitudes EN de faserelaties tussen de verschillende weergegeven golven. Voor deze toepassing houden we ons niet bezig met de faserelaties, maar zijn we geïnteresseerd in grootheden en hun frequentie.

Het Teensy-audiobord samplet audio met een frequentie van 44, 100 Hz. Dus 1024 samples met deze frequentie vertegenwoordigen een tijdsinterval van 1024/44100 of ongeveer 23,2 milliseconden. In dit geval zal de FFT als uitvoer magnitudes produceren die gehele veelvouden zijn van de bemonsteringsperiode van 43 Hz (opnieuw, 1/0,0232 is gelijk aan ongeveer 43 Hz). We zouden willen zoeken naar magnitudes die ongeveer twee keer deze frequentie zijn: 86 Hz. Het is niet precies de frequentie van onze berekende kolibrievleugelkleppen, maar het is dichtbij genoeg, zoals we zullen zien.

Stap 5: Fourier-gegevens gebruiken

Fourier-gegevens gebruiken
Fourier-gegevens gebruiken

De bibliotheken die PJRC voor de Teensy levert, verwerken de monsters en retourneren een reeks magnitudewaarden. We zullen naar elke grootte in de geretourneerde array verwijzen als een bin. De eerste bin (bij offset nul in de array met gegevens die we terugkrijgen) is de DC-offset van de golf. We kunnen deze waarde gerust negeren. De tweede bak (bij offset 1) vertegenwoordigt de grootte van de 43 Hz-component. Dit is onze basisperiode. De volgende bin (bij offset 2) vertegenwoordigt de grootte van de 86 Hz-component, enzovoort. Elke volgende bin is een geheel veelvoud van de basisperiode (43 Hz).

Dit is waar het een beetje raar wordt. Als we een FFT zouden gebruiken om een perfect 43 Hz-geluid te analyseren, zou de FFT de eerste bak met een grote omvang retourneren en zouden alle andere bakken gelijk zijn aan nul (opnieuw, in een perfecte wereld). Als het geluid dat we hebben vastgelegd en geanalyseerd 86 Hz was, dan zou de bin bij offset één nul zijn en de bin bij offset 2 (de tweede harmonische) een grote magnitude hebben en de rest van de bins nul, enzovoort. Maar als we het geluid van een kolibrie zouden vastleggen en het was 96 Hz (zoals ik bij mijn ene vogel heb gemeten), dan zou de offset 2 bin @ 86 Hz een magnitude hebben van een iets lagere waarde (dan de perfecte 86 Hz-golf) en de bakken eromheen (een lager en een paar hoger) zouden elk een afnemende waarde hebben die niet nul is.

Als de steekproefomvang voor onze FFT groter was dan 1024 of als onze audiobemonsteringsfrequentie lager was, zouden we de resolutie van onze bakken beter (dat wil zeggen kleiner) kunnen maken. Maar zelfs als we deze dingen zouden veranderen om onze FFT-bakken een veelvoud van 1 Hz van de basisperiode te maken, zouden we nog steeds te maken krijgen met deze 'verspilling' van deze bak. Dit komt omdat we nooit een vleugelfrequentie zouden krijgen die altijd en precies op een enkele bak landde. Dit betekent dat we onze detectie van een kolibrie niet zomaar kunnen baseren op de waarde in de offset 2-bak en de rest negeren. We hebben een manier nodig om de gegevens in een paar bakken te analyseren om te proberen het te begrijpen. Hierover later meer.

Stap 6: Begin met de bouw

Begin met de bouw
Begin met de bouw
Begin met de bouw
Begin met de bouw

Voor mijn prototype kolibriedetector heb ik extra lange mannelijk-mannelijke pinnen gebruikt die aan de pinnen in de Teensy zijn gesoldeerd. Ik deed dit zodat ik de Teensy kon aansluiten op een klein soldeerloos breadboard. Ik deed dit omdat ik ervan uitging dat ik veel veranderingen zou aanbrengen in het prototype en met het breadboard kon ik dit veranderen en gewoon doorverbinden waar ik maar wilde. Ik heb vrouwelijke strips aan de onderkant van het audiobord gesoldeerd, waardoor het bovenop de Teensy kan worden aangesloten. De microfoon is aan de bovenzijde van het audioboard gesoldeerd (zie foto's). Meer details over de montage zijn te vinden op de PJRC-site:

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

Stap 7: Hardware om een foto te maken

Hardware om een foto te maken
Hardware om een foto te maken
Hardware om een foto te maken
Hardware om een foto te maken

Ik heb (nou ja, mijn vrouw heeft) een Canon Rebel digitale camera. Er is een aansluiting op de camera waarmee u een handmatige sluiterbediening op afstand kunt aansluiten. Ik heb een handmatige afstandsbediening gekocht bij B&H Photo. De kabel heeft aan het ene uiteinde de juiste aansluiting om op de camera te passen en is ongeveer 1,80 meter lang. Ik sneed de kabel aan het uiteinde bij de knopbedieningskast door en ik stripte de draden terug en soldeerde ze aan drie koppennen die ik in het breadboard kon steken. Er is een blanke draad die is geaard en twee andere signalen: de punt is trigger (roze) en de ring (wit) is focus (zie de foto's). Het kortsluiten van de punt en/of ring naar de grond bedient de sluiter en de focus op de camera.

Met behulp van een jumperdraad bracht ik een gemeenschappelijke grond van de Teensy naar een gebied waar ik het op het breadboard kon gebruiken. Ik heb ook de anode van een LED aangesloten op pin 2 op de Teensy en de kathode van de LED op een weerstand (100-220 ohm) naar aarde. Ik heb ook pin 2 van de Teensy aangesloten op een 10K-weerstand en de andere kant van de weerstand heb ik aangesloten op de basis van een NPN-transistor (een 2N3904 die overal te vinden is). Ik verbond de emitter van de transistor met aarde en de collector verbond ik met de witte en roze draden van de kabel die naar de camera gaat. De blote draad was opnieuw verbonden met aarde. Telkens wanneer de LED wordt ingeschakeld door de Teensy, wordt ook de NPN-transistor ingeschakeld en wordt de camera (en de focus) geactiveerd. Zie het schema.

Stap 8: Systeemontwerp

Systeem ontwerp
Systeem ontwerp

Omdat de vleugelfrequenties van de kolibrie waarschijnlijk niet boven een paar honderd Hz uitkomen, hoeven we geen geluidsfrequenties boven, laten we zeggen, een paar honderd Hz op te nemen. Wat we nodig hebben is een manier om alleen de frequenties uit te filteren die we willen. Een banddoorlaat- of zelfs een laagdoorlaatfilter zou geweldig zijn. Traditioneel implementeerden we een filter in hardware met behulp van OpAmps of filters met geschakelde condensatoren. Maar dankzij digitale signaalverwerking en de softwarebibliotheken van Teensy, kunnen we een digitaal filter gebruiken (geen solderen nodig … alleen software).

PJRC heeft een geweldige GUI beschikbaar waarmee je je audiosysteem voor de Teensy en het audiobord kunt slepen en neerzetten. Je kunt het hier vinden:

www.pjrc.com/teensy/gui/

Ik besloot een van de door PJRC geleverde bikwadraat cascadefilters te gebruiken om de geluidsfrequenties van de microfoon (filter) te beperken. Ik heb drie van dergelijke filters gecascadeerd en ingesteld voor bandpass-werking op 100 Hz. Dit filter laat de systeemfrequenties iets boven en iets onder de frequentie waarin we geïnteresseerd zijn door.

In het blokschema (zie afbeelding) is i2s1 de audio-ingang naar het audiobord. Ik heb beide audiokanalen aangesloten op een mixer en vervolgens op de filters (de microfoon is maar één kanaal, maar ik heb beide gemixt, dus ik hoefde niet uit te zoeken welk kanaal het was … noem me maar lui). Ik voer de uitvoer van het filter naar de audio-uitgang (zodat ik de audio kan horen als ik dat wil). Ik heb ook de audio van de filters aangesloten op het FFT-blok. In het blokschema is het blok met het label sgtl5000_1 de audiocontrollerchip. Het heeft geen aansluitingen nodig in het diagram.

Nadat je al deze blokconstructies hebt gedaan, klik je op Exporteren. Dit opent een dialoogvenster waarin u de code die is gegenereerd uit het blokdiagram kunt kopiëren en in uw Teensy-toepassing kunt plakken. Als je naar de code kijkt, kun je zien dat het een instantie is van elke besturing, samen met de 'verbindingen' tussen de componenten.

Stap 9: Coderen

Code
Code

Het zou te veel ruimte in deze Instructable vergen om de software in detail te bespreken. Wat ik zal proberen te doen, is enkele van de belangrijkste stukjes code uitlichten. Maar dit is sowieso geen erg grote applicatie. PJRC heeft een geweldige video-tutorial over het gebruik van Teensy en de audiobibliotheken/tools (https://www.youtube.com/embed/wqt55OAabVs).

Ik begon met een FFT-voorbeeldcode van PJRC. Ik plakte wat ik kreeg van de ontwerptool voor het audiosysteem bovenaan de code. Als je hierna naar de code kijkt, zie je wat initialisatie en dan begint het systeem met het digitaliseren van audio uit de microfoon. De software gaat de 'forever' loop() binnen en wacht tot FFT-gegevens beschikbaar zijn met een aanroep van de functie fft1024_1.available(). Wanneer FFT-gegevens beschikbaar zijn, pak ik een kopie van de gegevens en verwerk deze. Merk op dat ik alleen gegevens pak als de grootste bin-magnitude boven een ingestelde waarde ligt. Met deze waarde stel ik de gevoeligheid van het systeem in. Als de bins boven de ingestelde waarde zijn, normaliseer ik de golf en breng ik deze over naar een tijdelijke array voor verwerking, anders negeer ik hem en blijf ik wachten op een nieuwe FFT. Ik moet vermelden dat ik ook de microfoonversterkingsfunctie gebruik om de gevoeligheid van het circuit aan te passen (sgtl5000_1.micGain(50)).

Het normaliseren van de golf betekent alleen dat ik alle bakken aanpas zodat de bak met de grootste waarde gelijk is aan één. Alle andere bakken worden in dezelfde verhouding geschaald. Dit maakt de data makkelijker te analyseren.

Ik heb verschillende algoritmen gebruikt om de gegevens te analyseren, maar ik besloot er slechts twee te gebruiken. Eén algoritme berekent het gebied onder de curve gevormd door de bakken. Dit is een eenvoudige berekening die alleen de waarden van de bakken in het interessegebied optelt. Ik vergelijk dit gebied om te bepalen of het boven een drempel ligt.

Het andere algoritme gebruikt een constante reeks waarden die een genormaliseerde FFT vertegenwoordigen. Deze gegevens zijn het resultaat van een echte (optimale) kolibriehandtekening. Ik noem dit een haag. Ik vergelijk de hedgegegevens met de genormaliseerde FFT-gegevens om te zien of de overeenkomstige bakken binnen 20% van elkaar liggen. Ik koos voor 20%, maar deze waarde kan gemakkelijk worden aangepast.

Ik tel ook hoe vaak de individuele algoritmen denken dat ze een match hebben, dat wil zeggen, denken dat ze een kolibrie horen. Ik gebruik deze telling als onderdeel van de bepaling van de kolibrie omdat er valse triggering kan optreden. Als een geluid bijvoorbeeld hard is of de vleugelfrequentie van de vogel bevat, zoals klappende handen, kunt u een trigger krijgen. Maar als het aantal boven een bepaald getal ligt (een getal dat ik kies), zeg ik dat het een kolibrie is. Als dit gebeurt, zet ik de LED aan om aan te geven dat we een hit hebben en ditzelfde circuit activeert de camera via de NPN-transistor. In de software heb ik de triggertijd van de camera ingesteld op 2 seconden (de tijd dat de LED en de transistor aan zijn).

Stap 10: Montage

Montage
Montage

Op de foto kun je zien hoe ik (zonder pardon) de elektronica heb gemonteerd. Ik had de Teensy aangesloten op een breadboard die op een draagbord zat, samen met een andere (ongebruikte) Arduino-compatibel (een Arduino Zero denk ik). Ik heb het geheel met draad vastgemaakt aan een metalen luifelpaal op mijn terras (ik heb ook trekontlasting toegevoegd aan de kabel die naar de camera loopt). De paal stond vlak naast de kolibrievoeder. Ik heb de elektronica van stroom voorzien met een kleine LiPo-steen die je zou kunnen gebruiken om een lege mobiele telefoon op te laden. De power brick had een USB-connector die ik gebruikte om de Teensy van stroom te voorzien. Ik heb de kabel van de afstandsbediening naar de camera geleid en aangesloten. Ik was klaar voor wat vogelactie!

Stap 11: Resultaten

Resultaten
Resultaten

Ik zette de camera op een statief in de buurt van de feeder. Ik had de camera scherpgesteld op de voorkant van de feeder en ik zette hem in de sportmodus, die verschillende snelle foto's maakt wanneer de sluiter wordt ingedrukt. Met de sluitertijd van 2 seconden heb ik ongeveer 5 foto's per triggergebeurtenis gemaakt.

De eerste keer dat ik dit probeerde, bracht ik een paar uur door met spelen met de software. Ik moest de gevoeligheid en het aantal opeenvolgende algoritme-hits aanpassen. Ik heb het eindelijk aangepast en ik was er klaar voor.

De eerste foto die werd gemaakt, was van een vogel die in het frame vloog alsof hij een snelle oeverbocht nam als een straaljager (zie hierboven). Ik kan je niet vertellen hoe opgewonden ik was. Ik zat een tijdje stil aan de andere kant van het dek en liet het systeem werken. Ik heb veel foto's kunnen maken, maar ik heb er nogal wat weggegooid. Het blijkt dat je soms gewoon een vogelkop of -staart krijgt. Ook kreeg ik valse triggers, die kunnen voorkomen. In totaal heb ik denk ik 39 foto's bewaard. Het kostte de vogels een paar keer naar de voerbak om te wennen aan het sluitergeluid van de camera, maar ze leken het uiteindelijk te negeren.

Stap 12: Laatste gedachten

Laatste gedachten
Laatste gedachten

Dit was een leuk project en het werkt. Maar, zoals de meeste dingen, is er genoeg ruimte voor verbetering. Het filter kan zeker anders zijn (zoals een laagdoorlaatfilter of wijzigingen in de opstelling en/of parameters) en misschien werkt het daardoor beter. Ik ben er ook zeker van dat er betere algoritmen zijn om te proberen. Ik ga er van de zomer wat van proberen.

Er is mij verteld dat er open-source machine learning-code is … misschien kan het systeem worden 'getraind' om kolibries te identificeren! Ik weet niet zeker of ik dit ga proberen, maar misschien.

Welke zaken kunnen er nog meer aan dit project worden toegevoegd? Als de camera een datum/tijd-stempel had, zou je die informatie aan de foto's kunnen toevoegen. Een ander ding dat u kunt doen, is de audio opnemen en opslaan op een uSD-kaart (de PJRC-audiokaart heeft een sleuf voor één). De opgeslagen audio kan mogelijk worden gebruikt voor het trainen van een leeralgoritme.

Misschien kan een school voor ornithologie ergens zo'n apparaat gebruiken? Ze kunnen mogelijk informatie verzamelen zoals voedertijden, voederfrequentie en, met de foto's, kunt u mogelijk specifieke vogels identificeren die terugkeren om te eten.

Ik hoop dat iemand anders dit project uitbreidt en deelt wat ze maken met anderen. Sommige mensen hebben me verteld dat dit werk dat ik heb gedaan moet worden omgezet in een product. Ik weet het niet zo zeker, maar ik zou het liever zien als een leerplatform en voor de wetenschap.

Bedankt voor het lezen!

Om de code te gebruiken die ik heb gepost, heb je de Arduino IDE nodig (https://www.arduino.cc/en/Main/Software). Je hebt ook de Teensyduino-code van PJRC nodig (https://www.pjrc.com/teensy/td_download.html).

Aanbevolen: