Taula de continguts:

Detector de colibrís / capturador d'imatges: 12 passos (amb imatges)
Detector de colibrís / capturador d'imatges: 12 passos (amb imatges)

Vídeo: Detector de colibrís / capturador d'imatges: 12 passos (amb imatges)

Vídeo: Detector de colibrís / capturador d'imatges: 12 passos (amb imatges)
Vídeo: Колибри Т32 - маленький турбореактивный двигатель 2024, Juliol
Anonim
Detector de colibrís / Picture-Taker
Detector de colibrís / Picture-Taker

Tenim un alimentador de colibrís a la coberta posterior i, des de fa uns anys, els faig fotos. Els colibrís són petites criatures sorprenents, molt territorials i les seves lluites poden ser divertides i sorprenents. Però em cansava de posar-me com una estàtua a la part de darrere de casa per fer-los fotos. Necessitava una manera de capturar fotografies sense haver de quedar-me darrere de la casa esperant llargs períodes de temps. Sé que podria haver utilitzat un obturador controlat a distància, però volia que es fessin fotos automàticament sense que jo hagués d’estar allà. Així que vaig decidir fer un dispositiu per detectar els colibrís i fer una foto automàticament.

Sempre tenia intenció d’utilitzar un microcontrolador per fer-ho. El microcontrolador seria capaç de conduir l'obturador de la càmera sota control de programari. Però el sensor per detectar un diminut colibrí era una altra cosa. Podria haver utilitzat un sensor de moviment, però volia provar quelcom únic. Vaig decidir utilitzar el so com a disparador.

Pas 1: triar un microcontrolador

Triar un microcontrolador
Triar un microcontrolador

El microcontrolador que vaig triar era un PJRC Teensy. El Teensy utilitza un microcontrolador ARM, específicament, un ARM Cortex M4. El Cortex M4 conté el maquinari per realitzar una FFT (Fast Fourier Transform) que faria la detecció. PJRC també ven una placa d'àudio que us permet utilitzar el Teensy per reproduir música i gravar àudio amb una entrada externa o un petit micròfon que podeu afegir a la placa. El meu pla era fer que el Teensy realitzés un FFT a l’àudio del micròfon.

Pas 2: FFT?

FFT?
FFT?

Un FFT és una fórmula / algorisme matemàtic que transforma un senyal del domini del temps al domini de la freqüència. El que vol dir això és que pren l'àudio mostrat pel temps del micròfon i el converteix en magnituds de les freqüències presents a l'ona original. Veureu, qualsevol ona contínua arbitrària es pot construir a partir d’una sèrie d’ones sinusoïdals o cosinus que són múltiples enters d’una freqüència base. Un FFT fa el contrari: pren una ona arbitrària i la converteix en les magnituds de les ones que, si es sumen, crearien l’ona arbitrària original. Una manera encara més senzilla de dir-ho és que vaig planejar fer servir programari i maquinari FFT a Teensy per determinar si «sent» el batec de l’ala d’un colibrí a la freqüència que es produeixen. Si «sent» un colibrí, enviaré una ordre a una càmera per fer una foto.

Ha funcionat! Llavors, com ho vaig fer, com ho podríeu fer i com ho podríeu fer encara millor?

Pas 3: com sona un colibrí planer?

Com sona un colibrí planer?
Com sona un colibrí planer?

Primer de tot, calia esbrinar quina freqüència escoltaria les aletes del colibrí. Per determinar-ho, he utilitzat el meu iPhone. Vaig connectar l'iPhone a un trípode i el vaig fer gravar un vídeo a càmera lenta directament davant de l'alimentador del colibrí a la nostra coberta. Al cap d’un temps, vaig treure la càmera i vaig descarregar el vídeo. Llavors vaig veure el vídeo buscant un colibrí davant l’alimentador. Quan vaig trobar una bona seqüència, vaig comptar el nombre de fotogrames individuals que va trigar el colibrí a batre les ales des d’una posició fins a la mateixa posició. La càmera lenta a l'iPhone és d'aproximadament 240 fotogrames per segon. Vaig observar un colibrí planant davant de l’alimentador i vaig comptar 5 fotogrames perquè mogués les ales de la posició cap endavant a la posició posterior i després tornés a la posició cap endavant. Es tracta de 5 fotogrames de 240. Recordeu que escoltem un so a cada cop de solapes de les ales del colibrí (un al traç cap endavant i un al traç cap enrere). Per a 5 fotogrames per a un cicle o període, podem calcular la freqüència dividida pel període és a dir 1 / (5/240) o 48 Hz. Això vol dir que quan aquest colibrí planeja, el so que sentim ha de ser el doble d’aquest o aproximadament 96 Hz. La freqüència és probablement més alta quan volen i no planen. També pot veure's afectada per la seva massa, però crec que podem suposar que la majoria de les aus de la mateixa espècie tenen aproximadament la mateixa massa.

Pas 4: Sèries de Fourier i Teensy

Sèries de Fourier i Teensy
Sèries de Fourier i Teensy

El Teensy (he utilitzat un Teensy 3.2) el fabrica PJRC (www.pjrc.com). El FFT es calcularà sobre una mostra de so. Per adquirir el so, PJRC ven una placa adaptadora d’àudio per a Teensy (TEENSY3_AUDIO - 14,25 $). També venen un petit micròfon que es pot soldar a la placa adaptadora d’àudio (MICROPHONE - 1,25 $). La placa adaptadora d'àudio utilitza un xip (SGTL5000) amb el qual el Teensy pot parlar a través d'un bus sèrie (I2S). El Teensy utilitza el SGTL5000 per provar l’àudio del micròfon i digitalitzar-lo, és a dir, per crear un conjunt de números que representin el so que sent el micròfon.

Un FFT és només una versió ràpida del que s’anomena Transformada de Fourier Discreta (DFT). Es pot realitzar un DFT en un nombre arbitrari de mostres, però, un FFT ha de tenir les mostres emmagatzemades en conjunts que són múltiples binaris. El maquinari Teensy pot realitzar un FFT en un conjunt de 1024 mostres (1024 = 2 ^ 10), de manera que això és el que farem servir.

Un FFT sol produir, com a sortida, les magnituds I les relacions de fase entre les diverses ones representades. Per a aquesta aplicació no ens preocupen les relacions de fase, però ens interessen les magnituds i la seva freqüència.

La placa d’àudio Teensy mostra àudio a una freqüència de 44, 100 Hz. Per tant, 1024 mostres a aquesta freqüència representen un interval de temps de 1024/44100 o uns 23,2 mil·lisegons. En aquest cas, el FFT produirà com a sortida magnituds que són múltiples enters del període de mostra de 43 Hz (de nou, 1 / 0,0232 equival a aproximadament 43 Hz). Voldríem buscar magnituds que siguin aproximadament el doble d’aquesta freqüència: 86 Hz. No és exactament la freqüència de les solapes calculades de les ales dels colibrís, però és prou a prop com veurem.

Pas 5: utilitzar dades de Fourier

Utilitzant dades de Fourier
Utilitzant dades de Fourier

Les biblioteques que PJRC proporciona per a que Teensy processin les mostres i retornin una sèrie de valors de magnitud. Ens referirem a cada magnitud de la matriu retornada com a bin. Podem ignorar amb seguretat aquest valor. El segon contenidor (a l’ofset 1) representarà la magnitud del component de 43 Hz. Aquest és el nostre període base. La següent safata (al desplaçament 2) representarà la magnitud del component de 86 Hz, etc. Cada safata següent és un múltiple enter del període base (43 Hz).

Ara és aquí on es fa una mica estrany. Si utilitzéssim un FFT per analitzar un so perfecte de 43 Hz, el FFT retornaria el primer contenidor a una gran magnitud i la resta de contenidors seria igual a zero (de nou, en un món perfecte). Si el so que vam capturar i analitzar fos de 86 Hz, llavors el contenidor a l’un offset seria zero i el binari a l’offset 2 (el segon harmònic) seria d’una gran magnitud i la resta de contenidors seria zero, etc. Però si capturéssim el so d’un colibrí i fos de 96 Hz (com vaig mesurar en el meu únic ocell), llavors el desplaçament de 2 bin @ 86 Hz tindria una magnitud d’un valor lleugerament inferior (que l’ona perfecta de 86 Hz) i els contenidors al seu voltant (un inferior i uns quants més alts) tindrien cadascun un valor diferent de zero.

Si la mida de la mostra del nostre FFT fos superior a 1024 o si la nostra freqüència de mostreig d’àudio fos inferior, podríem millorar la resolució dels contenidors (és a dir, més petita). Però, fins i tot si canviéssim aquestes coses per convertir els nostres contenidors FFT en 1 Hz múltiples del període base, hauríem de tractar aquest vessament. Això es deu al fet que mai no obtindríem una freqüència d'ala que aterrés, sempre i exactament, en un sol contenidor. Això vol dir que no podem basar la nostra detecció d’un colibrí en el valor de la safata de desplaçament 2 i ignorar la resta. Necessitem una manera d’analitzar les dades en uns pocs contenidors per intentar donar-hi sentit. Més informació sobre això més endavant.

Pas 6: Comenceu la construcció

Comenceu la construcció
Comenceu la construcció
Comenceu la construcció
Comenceu la construcció

Per al meu prototip de detector de colibrís, he utilitzat pins llargs mascle-mascle soldats als passadors del Teensy. Ho vaig fer per poder connectar el Teensy a una petita placa de soldadura sense soldar. Ho vaig fer perquè vaig suposar que estaria fent molts canvis en el prototip i, amb la taula de treball, podia canviar-ho i només passar els cables on fos necessari. He soldat tires femenines a la part inferior de la placa d’àudio, cosa que permet connectar-la a la part superior del Teensy. El micròfon es solda a la part superior de la placa d’àudio (vegeu les imatges). Podeu trobar més detalls sobre el muntatge al lloc del PJRC:

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

Pas 7: maquinari per fer una fotografia

Maquinari per fer una imatge
Maquinari per fer una imatge
Maquinari per fer una imatge
Maquinari per fer una imatge

Tinc (bé, la meva dona té) una càmera digital Canon Rebel. Hi ha un endoll a la càmera que us permet connectar un control d'obturació remot manual. Vaig comprar un comandament a distància manual de B&H Photo. El cable té la presa adequada per adaptar-se a la càmera en un extrem i fa uns 6 peus de llarg. Vaig tallar el cable a l'extrem a prop de la caixa de control del botó i vaig retirar els cables i els vaig soldar a tres passadors de capçalera que podia connectar a la placa de control. Hi ha un fil nu que es troba a terra i dos senyals més: la punta és el gallet (rosa) i l’anell (blanc) el focus (vegeu les imatges). Un curtcircuit de la punta i / o l’anell al terra fa funcionar l’obturador i el focus de la càmera.

Amb un cable de pont, vaig córrer un terreny comú des del Teensy fins a una zona on podia utilitzar-lo a la taula. També vaig connectar l’ànode d’un LED al pin 2 del Teensy i el càtode del LED a una resistència (100-220 ohms) a terra. També vaig connectar el pin 2 del Teensy a una resistència de 10K i l'altre costat de la resistència el vaig connectar a la base d'un transistor NPN (un 2N3904 que es troba a tot arreu). Vaig connectar l’emissor del transistor a terra i el col·lector el vaig connectar als cables blancs i rosats del cable que va a la càmera. El cable nu, de nou, estava connectat a terra. Sempre que el Teensy encén el LED, el transistor NPN també s'encén i activarà la càmera (i el focus). Vegeu l’esquema.

Pas 8: disseny del sistema

Disseny de sistemes
Disseny de sistemes

Com que les freqüències d’aleteig de les ales del Colibrí probablement no superin els centenars d’Hz, no cal que realment gravem les freqüències de so superiors, per exemple, a uns centenars d’Hz. El que necessitem és una manera de filtrar només les freqüències que volem. Un filtre de pas de banda o fins i tot de pas baix seria fantàstic. Tradicionalment implementàvem un filtre en maquinari mitjançant OpAmps o filtres de condensador commutat. Però gràcies al processament de senyals digitals i a les biblioteques de programari de Teensy, podem utilitzar un filtre digital (no cal soldar … només programari).

PJRC té una gran interfície gràfica disponible que us permet arrossegar i deixar anar el vostre sistema d’àudio per a la placa d’àudio i Teensy. El podeu trobar aquí:

www.pjrc.com/teensy/gui/

Vaig decidir utilitzar un dels filtres en cascada biquadràtics subministrats per PJRC per restringir les freqüències de so del micròfon (filtre). Vaig posar en cascada tres filtres d’aquest tipus i els vaig configurar per a un funcionament de banda a 100 Hz. Aquest filtre permetrà accedir a les freqüències del sistema una mica per sobre i una mica per sota de la freqüència que ens interessa.

Al diagrama de blocs (veure imatge) i2s1 és l'entrada d'àudio a la placa d'àudio. Vaig connectar els dos canals d'àudio a un mesclador i després als filtres (el micròfon només és un canal, però, vaig barrejar tots dos, de manera que no vaig haver d'esbrinar quin canal era … digueu-me mandrós). Executeu la sortida del filtre cap a la sortida d'àudio (per poder escoltar l'àudio si vull). També he connectat l'àudio dels filtres al bloc FFT. Al diagrama de blocs, el bloc etiquetat sgtl5000_1 és el xip del controlador d’àudio. No necessita cap connexió al diagrama.

Després de fer tota aquesta construcció de blocs, feu clic a Exporta. S'obrirà un quadre de diàleg on podeu copiar el codi que es va generar a partir del diagrama de blocs i enganxar-lo a l'aplicació Teensy. Si mireu el codi, podeu veure que és una instància de cada control juntament amb les "connexions" entre els components.

Pas 9: Codi

Codi
Codi

Es necessitaria massa espai en aquest instructiu per revisar amb detall el programari. El que intentaré fer és ressaltar alguns dels bits clau de codi. Però no és una aplicació molt gran de totes maneres. PJRC té un fantàstic tutorial de vídeo sobre l’ús de Teensy i les biblioteques / eines d’àudio (https://www.youtube.com/embed/wqt55OAabVs).

Vaig començar amb alguns exemples de codi FFT de PJRC. He enganxat el que he obtingut de l'eina de disseny de sistemes d'àudio a la part superior del codi. Si mireu el codi després d'això, veureu alguna inicialització i el sistema començarà a digitalitzar l'àudio des del micròfon. El programari entra al bucle "forever" () i espera que les dades FFT estiguin disponibles mitjançant una trucada a la funció fft1024_1.available (). Quan hi ha dades FFT disponibles, agafo una còpia de les dades i les processo. Tingueu en compte que, només agafo dades si la magnitud més gran del contenidor està per sobre d’un valor establert. Aquest valor és la manera com estableixo la sensibilitat del sistema. Si els contenidors ESTAN per sobre del valor establert, normalitzo l'ona i la transfereixo a una matriu temporal per processar-la, en cas contrari, la ignoro i segueixo esperant un altre FFT. He d’esmentar que també faig servir la funció de control de guany de micròfon per ajustar la sensibilitat del circuit (sgtl5000_1.micGain (50)).

Normalitzar l’ona només significa que ajusteu totes les papereres de manera que la paperera amb el valor més gran sigui igual a una. La resta de contenidors s’escalen en la mateixa proporció. Això facilita l’anàlisi de les dades.

Vaig utilitzar diversos algoritmes per analitzar les dades, però em vaig decidir a utilitzar només dos. Un algorisme calcula l'àrea sota la corba formada pels contenidors. Es tracta d’un càlcul senzill que només afegeix els valors dels contenidors a tota la regió d’interès. Comparo aquesta àrea per determinar si està per sobre d’un llindar.

L’altre algorisme utilitza una matriu constant de valors que representen un FFT normalitzat. Aquestes dades són el resultat d’una signatura real (òptima) del colibrí. Jo en dic una cobertura. Comparo les dades de cobertura amb les dades FFT normalitzades per veure si els contenidors corresponents es troben dins del 20% l’un de l’altre. He escollit el 20%, però aquest valor es pot ajustar fàcilment.

També compto quantes vegades els algoritmes individuals creuen que tenen una coincidència, és a dir, creuen que senten un colibrí. Faig servir aquest recompte com a part de la determinació del colibrí perquè es pot produir un desencadenament fals. Per exemple, quan qualsevol so és fort o conté la freqüència de les ales dels ocells, com aplaudir de mans, és possible que obtingueu un disparador. Però si el recompte és superior a un nombre determinat (un número que trio) dic que és un colibrí. Quan això passa, encenc el LED per indicar que tenim un èxit i aquest mateix circuit activa la càmera a través del transistor NPN. Al programari he establert el temps d’activació de la càmera a 2 segons (el temps que s’encén el LED i el transistor).

Pas 10: muntatge

Muntatge
Muntatge

Podeu veure a la imatge com vaig muntar l'electrònica (sense cerimònies). Tenia el Teensy endollat a una placa de suport que estava enganxada a una placa de transport juntament amb un altre Arduino (no utilitzat) compatible (crec que un Arduino Zero). Vaig lligar-ho tot per cable amb un pal de tendal metàl·lic a la meva coberta (també vaig afegir tensió al cable que anava cap a la càmera). El pal estava just al costat de l’alimentador del colibrí. Vaig alimentar l'electrònica amb un petit maó d'alimentació LiPo que podríeu utilitzar per recarregar un telèfon mòbil mort. El power brick tenia un connector USB que utilitzava per alimentar el Teensy. Vaig passar el cable d’activació remot cap a la càmera i el vaig endollar. Estava preparat per a l’acció dels ocells.

Pas 11: Resultats

Resultats
Resultats

Vaig configurar la càmera en un trípode prop de l’alimentador. Tenia la càmera enfocada a la vora frontal de l’alimentador i la vaig configurar en mode esportiu, que fa diverses fotografies ràpides quan es prem l’obturador. Amb el temps d'obturació de 2 segons, vaig capturar unes 5 fotos per esdeveniment d'activació.

Vaig passar un parell d’hores jugant amb el programari la primera vegada que vaig provar-ho. Vaig haver d’ajustar la sensibilitat i el recompte successiu d’algoritmes. Finalment ho vaig ajustar i vaig estar a punt.

La primera imatge que va fer va ser d'un ocell que va volar al marc com si prengués un gir de banc d'alta velocitat com un jet de combat (vegeu més amunt). No puc dir-vos quina il·lusió estava. Vaig estar una estona tranquil·lament a l’altra banda de la coberta i vaig deixar funcionar el sistema. Vaig aconseguir enregistrar moltes imatges, però, vaig llençar força. Resulta que de vegades només s’aconsegueix un cap o una cua d’ocell. A més, tinc falsos desencadenants, que es poden produir. En total, crec que vaig conservar 39 imatges. Els ocells van trigar uns quants viatges a l'alimentador per acostumar-se al so de l'obturador de la càmera, però finalment van semblar ignorar-lo.

Pas 12: Pensaments finals

Pensaments finals
Pensaments finals

Aquest va ser un projecte divertit i, funciona. Però, com la majoria de coses, hi ha molt marge de millora. El filtre sens dubte pot ser diferent (com ara un filtre de pas baix o canvis en la disposició i / o paràmetres) i potser això pot fer que funcioni millor. També estic segur que hi ha millors algorismes per provar. Ho provaré a l’estiu.

M’han dit que hi ha un codi d’aprenentatge automàtic de codi obert … potser el sistema es podria "entrenar" per identificar els colibrís. No estic segur de provar-ho, però potser sí.

Quines altres coses es podrien afegir a aquest projecte? Si la càmera tingués un marcador de data / hora, podeu afegir aquesta informació a les imatges. Una altra cosa que podeu fer és enregistrar l’àudio i desar-lo en una targeta uSD (la placa d’àudio PJRC té una ranura per a una). És possible que l'àudio desat es pugui utilitzar per entrenar un algorisme d'aprenentatge.

Potser en algun lloc d’una escola d’ornitologia podria utilitzar un dispositiu com aquest? Podrien obtenir informació com els temps d’alimentació, la freqüència d’alimentació i, amb les imatges, podríeu identificar ocells específics que tornen a alimentar-se.

La meva esperança és que algú altre estengui aquest projecte i comparteixi el que fa amb els altres. Algunes persones m’han dit que aquesta feina que he fet s’hauria de convertir en un producte. No estic tan segur, però prefereixo veure-la utilitzada com a plataforma d'aprenentatge i per a la ciència.

Gràcies per llegir!

Per utilitzar el codi que he publicat necessitareu l’IDE Arduino (https://www.arduino.cc/en/Main/Software). També necessitareu el codi Teensyduino de PJRC (https://www.pjrc.com/teensy/td_download.html).

Recomanat: