Sommario:

Rilevatore di colibrì/fotografo: 12 passaggi (con immagini)
Rilevatore di colibrì/fotografo: 12 passaggi (con immagini)

Video: Rilevatore di colibrì/fotografo: 12 passaggi (con immagini)

Video: Rilevatore di colibrì/fotografo: 12 passaggi (con immagini)
Video: Come dare vita alle foto della Via Lattea - Tutorial principianti 2024, Luglio
Anonim
Rilevatore di colibrì/fotografo
Rilevatore di colibrì/fotografo

Abbiamo una mangiatoia per colibrì sul nostro ponte posteriore e negli ultimi due anni ho scattato loro foto. I colibrì sono piccole creature incredibili, molto territoriali e i loro combattimenti possono essere sia esilaranti che sorprendenti. Ma mi stavo stancando di stare in piedi come una statua contro il retro della mia casa per fotografarli. Avevo bisogno di un modo per catturare immagini senza dover stare dietro casa per lunghi periodi di tempo in attesa. So che avrei potuto usare un otturatore telecomandato, ma volevo che le foto venissero scattate automaticamente senza che dovessi essere presente. Così ho deciso di creare un dispositivo per rilevare i colibrì e scattare una foto automaticamente.

Ho sempre pensato di usare un microcontrollore per farlo. Il microcontrollore sarebbe in grado di pilotare l'otturatore della fotocamera sotto il controllo del software. Ma il sensore per rilevare un minuscolo colibrì era un'altra cosa. Avrei potuto usare un sensore di movimento ma volevo provare qualcosa di unico. Ho deciso di usare il suono come trigger.

Passaggio 1: scelta di un microcontrollore

Scegliere un microcontrollore
Scegliere un microcontrollore

Il microcontrollore che ho scelto era un PJRC Teensy. Il Teensy utilizza un microcontrollore ARM, in particolare un ARM Cortex M4. Il Cortex M4 contiene l'hardware per eseguire una FFT (Fast Fourier Transform) che farebbe il rilevamento. PJRC vende anche una scheda audio che ti consente di utilizzare Teensy per riprodurre musica e registrare audio con un ingresso esterno o un piccolo microfono che puoi aggiungere alla scheda. Il mio piano era di far eseguire a Teensy una FFT sull'audio dal microfono.

Passaggio 2: FFT?

FFT?
FFT?

Una FFT è una formula/algoritmo matematico che trasforma un segnale dal dominio del tempo al dominio della frequenza. Ciò significa che prende l'audio campionato nel tempo dal microfono e lo trasforma in grandezze delle frequenze presenti nell'onda originale. Vedete, qualsiasi onda continua arbitraria può essere costruita da una serie di onde seno o coseno che sono multipli interi di una certa frequenza di base. Una FFT fa l'opposto: prende un'onda arbitraria e la trasforma nelle grandezze delle onde che, se sommate, creerebbero l'onda arbitraria originale. Un modo ancora più semplice per dirlo è che ho pianificato di utilizzare il software e l'hardware FFT nel Teensy per determinare se "sente" il battito delle ali di un colibrì alla frequenza con cui si verifica il battito delle ali. Se "sente" un colibrì, invierò un comando a una fotocamera per scattare una foto.

Ha funzionato! Quindi, come ho fatto, come hai potuto farlo e come potresti renderlo ancora migliore?

Passaggio 3: come suona un colibrì in bilico?

Come suona un colibrì in bilico?
Come suona un colibrì in bilico?

Per prima cosa, avevo bisogno di capire a quale frequenza avrei sentito i battiti delle ali del colibrì. Per determinarlo, ho usato il mio iPhone. Ho attaccato l'iPhone a un treppiede e l'ho fatto registrare video al rallentatore direttamente davanti alla mangiatoia per colibrì sul nostro ponte. Dopo un po' di tempo ho rimosso la fotocamera e ho scaricato il video. Poi ho guardato il video cercando un colibrì davanti alla mangiatoia. Quando ho trovato una buona sequenza, ho contato il numero di singoli fotogrammi necessari al colibrì per sbattere le ali da una posizione fino alla stessa posizione. Il rallentatore su iPhone è di circa 240 fotogrammi al secondo. Ho osservato un colibrì librarsi davanti alla mangiatoia e ho contato 5 fotogrammi per fargli muovere le ali dalla posizione in avanti alla posizione indietro e poi tornare alla posizione in avanti. Questo è 5 fotogrammi su 240. Ricorda, sentiamo un suono ad ogni colpo dei lembi d'ala del colibrì (uno sul colpo in avanti e uno sul colpo indietro). Per 5 fotogrammi per un ciclo o periodo, possiamo calcolare la frequenza come uno diviso per il periodo cioè 1 / (5/240) o 48 Hz. Ciò significa che quando questo colibrì è in bilico, il suono che sentiamo deve essere il doppio di questo o circa 96 Hz. La frequenza è probabilmente più alta quando volano e non si librano. Può anche essere influenzato dalla loro massa, ma penso che possiamo supporre che la maggior parte degli uccelli della stessa specie abbia circa la stessa massa.

Passaggio 4: serie di Fourier e Teensy

Serie di Fourier e Teensy
Serie di Fourier e Teensy

Il Teensy (ho usato un Teensy 3.2) è prodotto da PJRC (www.pjrc.com). La FFT sarà calcolata su un campione di suono. Per acquisire il suono, PJRC vende una scheda adattatore audio per Teensy (TEENSY3_AUDIO - $ 14,25). Vendono anche un piccolo microfono che può essere saldato alla scheda dell'adattatore audio (MICROFONO - $ 1,25). La scheda dell'adattatore audio utilizza un chip (SGTL5000) con cui Teensy può parlare tramite un bus seriale (I2S). Il Teensy utilizza l'SGTL5000 per campionare l'audio dal microfono e digitalizzarlo, ovvero creare una serie di numeri che rappresentano il suono che il microfono sta ascoltando.

Una FFT è solo una versione veloce di quella che viene chiamata Trasformata Discreta di Fourier (DFT). Una DFT può essere eseguita su un numero arbitrario di campioni, tuttavia, una FFT deve avere i campioni memorizzati in set che sono multipli binari. L'hardware di Teensy può eseguire una FFT su un set di 1024 campioni (1024=2^10), quindi è quello che useremo.

Una FFT di solito produce, come output, le grandezze E le relazioni di fase tra le varie onde rappresentate. Per questa applicazione non ci occupiamo delle relazioni di fase, ma ci interessano le grandezze e la loro frequenza.

La scheda audio Teensy campiona l'audio a una frequenza di 44, 100 Hz. Quindi, 1024 campioni a questa frequenza rappresentano un intervallo di tempo di 1024/44100 o circa 23,2 millisecondi. In questo caso, la FFT produrrà come output grandezze che sono multipli interi del periodo di campionamento di 43 Hz (di nuovo, 1/0.0232 equivale a circa 43 Hz). Vorremmo cercare magnitudini che sono circa il doppio di questa frequenza: 86 Hz. Non è esattamente la frequenza dei nostri battiti di ali di colibrì calcolati, ma è abbastanza vicina come vedremo.

Passaggio 5: utilizzo dei dati di Fourier

Utilizzo dei dati di Fourier
Utilizzo dei dati di Fourier

Le librerie fornite da PJRC per Teensy elaboreranno i campioni e restituiranno una serie di valori di grandezza. Faremo riferimento a ciascuna grandezza nell'array restituito come bin. Il primo bin (all'offset zero nell'array di dati che otteniamo indietro) è l'offset DC dell'onda. Possiamo tranquillamente ignorare questo valore. Il secondo bin (all'offset 1) rappresenterà l'ampiezza della componente a 43 Hz. Questo è il nostro periodo base. Il bin successivo (all'offset 2) rappresenterà l'ampiezza della componente a 86 Hz e così via. Ogni bin successivo è un multiplo intero del periodo base (43 Hz).

Ora è qui che diventa un po' strano. Se usassimo una FFT per analizzare un suono perfetto a 43 Hz, la FFT restituirebbe il primo bin a una certa grandezza e tutti gli altri bin sarebbero uguali a zero (di nuovo, in un mondo perfetto). Se il suono che abbiamo catturato e analizzato fosse 86 Hz, allora il bin all'offset uno sarebbe zero e il bin all'offset 2 (la seconda armonica) sarebbe di una certa grandezza e il resto dei bin sarebbe zero, e così via. Ma se catturassimo il suono di un colibrì ed era 96 Hz (come ho misurato sul mio unico uccello), allora l'offset 2 bin @ 86 Hz avrebbe una grandezza di un valore leggermente inferiore (rispetto all'onda perfetta di 86 Hz) e i contenitori attorno ad esso (uno più basso e alcuni più alti) avrebbero ciascuno un valore decrescente diverso da zero.

Se la dimensione del campione per la nostra FFT fosse maggiore di 1024 o se la nostra frequenza di campionamento audio fosse inferiore, potremmo migliorare la risoluzione dei nostri bin (cioè più piccola). Ma anche se cambiassimo queste cose per rendere i nostri bin FFT multipli di 1 Hz del periodo base, dovremmo comunque fare i conti con questa "versamento" di bin. Questo perché non otterremmo mai una frequenza di ala che atterri, sempre ed esattamente, su un singolo bin. Ciò significa che non possiamo semplicemente basare la nostra rilevazione di un colibrì sul valore nel contenitore offset 2 e ignorare il resto. Abbiamo bisogno di un modo per analizzare i dati in alcuni contenitori per cercare di dargli un senso. Più su questo più tardi.

Passaggio 6: iniziare la costruzione

Inizia la costruzione
Inizia la costruzione
Inizia la costruzione
Inizia la costruzione

Per il mio prototipo di rilevatore di colibrì ho usato pin maschio-maschio extra lunghi saldati ai pin del Teensy. L'ho fatto in modo da poter collegare il Teensy a una piccola breadboard senza saldatura. L'ho fatto perché pensavo che avrei apportato molte modifiche al prototipo e con la breadboard, avrei potuto cambiare questo e semplicemente collegare i cavi ovunque avessi bisogno. Ho saldato le strisce femminili sul lato inferiore della scheda audio che consente di collegarlo sopra il Teensy. Il microfono è saldato sul lato superiore della scheda audio (vedi foto). Maggiori dettagli sull'assemblaggio possono essere trovati sul sito PJRC:

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

Passaggio 7: hardware per scattare una foto

Hardware per scattare una foto
Hardware per scattare una foto
Hardware per scattare una foto
Hardware per scattare una foto

Ho (beh, mia moglie ha) una fotocamera digitale Canon Rebel. Sulla fotocamera è presente un jack che consente di collegare un controllo manuale dell'otturatore a distanza. Ho acquistato un telecomando manuale da B&H Photo. Il cavo ha il jack corretto per adattarsi alla telecamera su un'estremità ed è lungo circa 6 piedi. Ho tagliato il cavo all'estremità vicino alla scatola di controllo del pulsante e ho rimosso i fili e li ho saldati a tre pin dell'intestazione che potevo collegare alla breadboard. C'è un filo nudo che è massa e altri due segnali: la punta è trigger (rosa) e l'anello (bianco) è focus (vedi foto). Il cortocircuito della punta e/o dell'anello a terra aziona l'otturatore e la messa a fuoco della fotocamera.

Usando un ponticello ho fatto passare un terreno comune dal Teensy a un'area in cui potevo usarlo sulla breadboard. Ho anche collegato l'anodo di un LED al pin 2 del Teensy e il catodo del LED a una resistenza (100-220 ohm) a massa. Ho anche collegato il pin 2 del Teensy a un resistore da 10K e l'altro lato del resistore l'ho collegato alla base di un transistor NPN (un 2N3904 che si trova ovunque). Ho collegato a massa l'emettitore del transistor e ho collegato il collettore ai fili bianco e rosa del cavo che va alla telecamera. Il filo nudo, di nuovo, era collegato a terra. Ogni volta che il LED viene acceso dal Teensy, si accenderà anche il transistor NPN e attiverà la fotocamera (e la messa a fuoco). Vedi lo schema.

Passaggio 8: progettazione del sistema

Sistema di design
Sistema di design

Poiché le frequenze di battito delle ali del colibrì probabilmente non superano alcune centinaia di Hz, non abbiamo davvero bisogno di registrare frequenze sonore superiori, diciamo, a poche centinaia di Hz. Ciò di cui abbiamo bisogno è un modo per filtrare solo le frequenze che vogliamo. Un filtro passa-banda o addirittura passa-basso sarebbe fantastico. Tradizionalmente implementeremmo un filtro nell'hardware usando OpAmp o filtri a condensatore commutato. Ma grazie all'elaborazione del segnale digitale e alle librerie software di Teensy, possiamo utilizzare un filtro digitale (non è necessaria alcuna saldatura… solo software).

PJRC ha un'ottima GUI disponibile che ti consente di trascinare e rilasciare il tuo sistema audio per Teensy e la scheda audio. Potete trovare qui:

www.pjrc.com/teensy/gui/

Ho deciso di utilizzare uno dei filtri in cascata biquadratici forniti da PJRC per limitare le frequenze sonore dal microfono (filtro). Ho messo in cascata tre di questi filtri e li ho impostati per il funzionamento passa-banda a 100 Hz. Questo filtro consentirà l'ingresso delle frequenze del sistema un po' sopra e un po' sotto la frequenza che ci interessa.

Nello schema a blocchi (vedi immagine) i2s1 è l'ingresso audio alla scheda audio. Ho collegato entrambi i canali audio ad un mixer e poi ai filtri (il microfono è solo un canale ma, li ho mixati entrambi così non ho dovuto capire quale canale fosse…chiamami pigro). Eseguo l'uscita del filtro sull'uscita audio (così posso sentire l'audio se voglio). Ho anche collegato l'audio dai filtri al blocco FFT. Nello schema a blocchi, il blocco etichettato sgtl5000_1 è il chip del controller audio. Non necessita di collegamenti nello schema.

Dopo aver eseguito tutta questa costruzione del blocco, fai clic su Esporta. Questo fa apparire una finestra di dialogo in cui puoi copiare il codice che è stato generato dal diagramma a blocchi e incollarlo nella tua applicazione Teensy. Se guardi il codice puoi vedere che è un'istanza di ciascun controllo insieme alle "connessioni" tra i componenti.

Passaggio 9: codice

Codice
Codice

Ci vorrebbe troppo spazio in questo Instructable per esaminare il software in dettaglio. Quello che cercherò di fare è evidenziare alcuni dei bit chiave del codice. Ma questa non è comunque un'applicazione molto grande. PJRC ha un ottimo video tutorial sull'uso di Teensy e delle librerie/strumenti audio (https://www.youtube.com/embed/wqt55OAabVs).

Ho iniziato con un codice di esempio FFT da PJRC. Ho incollato ciò che ho ottenuto dallo strumento di progettazione del sistema audio nella parte superiore del codice. Se guardi il codice dopo questo vedrai alcune inizializzazioni e quindi il sistema inizia a digitalizzare l'audio dal microfono. Il software entra nel ciclo 'per sempre'() e attende che i dati FFT siano disponibili utilizzando una chiamata alla funzione fft1024_1.available(). Quando i dati FFT sono disponibili, prendo una copia dei dati e la elaboro. Si noti che, prendo i dati solo se la grandezza del contenitore più grande è superiore a un valore impostato. Questo valore è il modo in cui ho impostato la sensibilità del sistema. Se i bin SONO al di sopra del valore impostato, normalizzo l'onda e la trasferisco in un array temporaneo per l'elaborazione, altrimenti la ignoro e continuo ad aspettare un'altra FFT. Devo dire che uso anche la funzione di controllo del guadagno del microfono per regolare la sensibilità del circuito (sgtl5000_1.micGain(50)).

Normalizzare l'onda significa semplicemente regolare tutti i bin in modo che il bin con il valore maggiore sia impostato uguale a uno. Tutti gli altri bin vengono ridimensionati con la stessa proporzione. Questo rende i dati più facili da analizzare.

Ho usato diversi algoritmi per analizzare i dati, ma ho deciso di usarne solo due. Un algoritmo calcola l'area sotto la curva formata dai bin. Questo è un semplice calcolo che aggiunge semplicemente i valori dei bin nella regione di interesse. Confronto quest'area per determinare se è al di sopra di una soglia.

L'altro algoritmo utilizza una matrice costante di valori che rappresentano una FFT normalizzata. Questi dati sono i risultati di una vera (ottimale) firma di colibrì. Questa la chiamo siepe. Confronto i dati di copertura con i dati FFT normalizzati per vedere se i bin corrispondenti si trovano entro il 20% l'uno dall'altro. Ho scelto il 20% ma questo valore potrebbe essere regolato facilmente.

Conto anche quante volte i singoli algoritmi pensano di avere una corrispondenza, cioè pensano di sentire un colibrì. Uso questo conteggio come parte della determinazione del colibrì perché può verificarsi un falso innesco. Ad esempio, quando un suono è forte o contiene la frequenza delle ali degli uccelli, come battere le mani, potresti ottenere un trigger. Ma se il conteggio è superiore a un certo numero (un numero che scelgo) dico che è un colibrì. Quando ciò accade accendo il LED per indicare che abbiamo un successo e questo stesso circuito attiva la fotocamera tramite il transistor NPN. Nel software ho impostato il tempo di attivazione della fotocamera a 2 secondi (il tempo in cui il LED e il transistor sono accesi).

Passaggio 10: montaggio

Montaggio
Montaggio

Potete vedere nella foto come ho montato (senza tante cerimonie) l'elettronica. Ho collegato il Teensy a una breadboard che è stata attaccata a una scheda portante insieme a un'altra (non utilizzata) compatibile con Arduino (credo un Arduino Zero). Ho legato il tutto a un palo metallico della tenda da sole sul mio ponte (ho anche aggiunto un fermacavo al cavo che va alla telecamera). Il palo era proprio accanto alla mangiatoia per colibrì. Ho alimentato l'elettronica con un piccolo power brick LiPo che potresti usare per ricaricare un telefono cellulare guasto. Il power brick aveva un connettore USB che usavo per alimentare il Teensy. Ho fatto passare il cavo del trigger remoto alla fotocamera e l'ho collegato. Ero pronto per l'azione degli uccelli!

Passaggio 11: risultati

Risultati
Risultati

Ho installato la fotocamera su un treppiede vicino all'alimentatore. Ho messo a fuoco la fotocamera sul bordo anteriore dell'alimentatore e l'ho impostata sulla modalità Sport che scatta diverse foto veloci quando viene premuto l'otturatore. Con il tempo di inattività dell'otturatore di 2 secondi ho scattato circa 5 foto per evento di innesco.

Ho passato un paio d'ore a giocherellare con il software la prima volta che l'ho provato. Ho dovuto regolare la sensibilità e il successivo conteggio dei colpi dell'algoritmo. Alla fine l'ho modificato ed ero pronto.

La prima foto che è stata scattata è stata quella di un uccello che è volato nell'inquadratura come se stesse facendo una virata ad alta velocità come un caccia a reazione (vedi sopra). Non posso dirti quanto fossi eccitato. Mi sono seduto in silenzio dall'altra parte del ponte per un po' e ho lasciato che il sistema funzionasse. Sono riuscito a registrare molte immagini, ma ne ho buttate via parecchie. Si scopre che a volte ottieni solo la testa o la coda di un uccello. Inoltre, ho avuto falsi trigger, che possono verificarsi. In totale credo di aver conservato 39 foto. Gli uccelli hanno impiegato alcuni viaggi verso la mangiatoia per abituarsi al suono dell'otturatore della fotocamera, ma alla fine sembravano ignorarlo.

Passaggio 12: Considerazioni finali

Pensieri finali
Pensieri finali

Questo è stato un progetto divertente e funziona. Ma, come la maggior parte delle cose, c'è molto spazio per miglioramenti. Il filtro potrebbe certamente essere diverso (come un filtro passa basso o modifiche alla disposizione e/o ai parametri) e forse questo potrebbe farlo funzionare meglio. Sono anche sicuro che ci siano algoritmi migliori da provare. Ne proverò un po' in estate.

Mi è stato detto che esiste un codice di apprendimento automatico open source là fuori … forse il sistema potrebbe essere "addestrato" per identificare i colibrì! Non sono sicuro che proverò questo ma, forse.

Quali altre cose si potrebbero aggiungere a questo progetto? Se la fotocamera avesse un indicatore di data/ora, potresti aggiungere tali informazioni alle immagini. Un'altra cosa che potresti fare è registrare l'audio e salvarlo su una scheda uSD (la scheda audio PJRC ha uno slot per uno). L'audio salvato potrebbe essere utilizzato per addestrare un algoritmo di apprendimento.

Forse da qualche parte una scuola di ornitologia potrebbe usare un dispositivo come questo? Potrebbero essere in grado di raccogliere informazioni come i tempi di alimentazione, la frequenza di alimentazione e, con le immagini, potresti essere in grado di identificare uccelli specifici che tornano a nutrirsi.

La mia speranza è che qualcun altro estenda questo progetto e condivida ciò che fa con gli altri. Alcune persone mi hanno detto che questo lavoro che ho fatto dovrebbe essere trasformato in un prodotto. Non ne sono così sicuro, ma preferirei vederlo usato come piattaforma di apprendimento e per la scienza.

Grazie per aver letto!

Per utilizzare il codice che ho postato avrai bisogno dell'IDE Arduino (https://www.arduino.cc/en/Main/Software). Avrai anche bisogno del codice Teensyduino da PJRC (https://www.pjrc.com/teensy/td_download.html).

Consigliato: