Tabla de contenido:

Detector de colibríes / tomador de fotografías: 12 pasos (con imágenes)
Detector de colibríes / tomador de fotografías: 12 pasos (con imágenes)

Video: Detector de colibríes / tomador de fotografías: 12 pasos (con imágenes)

Video: Detector de colibríes / tomador de fotografías: 12 pasos (con imágenes)
Video: FOTOGRAFÍA BÁSICA - Curso para principiantes! 2024, Mes de julio
Anonim
Detector de colibríes / tomador de fotografías
Detector de colibríes / tomador de fotografías

Tenemos un comedero para colibríes en nuestra terraza trasera y durante los últimos años les he estado tomando fotografías. Los colibríes son pequeñas criaturas asombrosas, muy territoriales y sus peleas pueden ser divertidas y sorprendentes. Pero me estaba cansando de estar parado como una estatua contra la parte trasera de mi casa para tomarles fotos. Necesitaba una forma de capturar imágenes sin tener que estar detrás de la casa durante largos períodos de tiempo esperando. Sé que podría haber usado un obturador con control remoto, pero quería que las fotos se tomaran automáticamente sin que yo tuviera que estar allí. Entonces decidí hacer un dispositivo para detectar los colibríes y tomar una foto automáticamente.

Siempre tuve la intención de usar un microcontrolador para hacer esto. El microcontrolador podría controlar el obturador de la cámara bajo el control del software. Pero el sensor para detectar un diminuto colibrí era otra cosa. Podría haber usado un sensor de movimiento, pero quería probar algo único. Decidí usar el sonido como disparador.

Paso 1: elegir un microcontrolador

Elegir un microcontrolador
Elegir un microcontrolador

El microcontrolador que elegí fue un PJRC Teensy. El Teensy usa un microcontrolador ARM, específicamente, un ARM Cortex M4. El Cortex M4 contiene el hardware para realizar una FFT (Transformada rápida de Fourier) que haría la detección. PJRC también vende una placa de audio que le permite usar Teensy para reproducir música y grabar audio con una entrada externa, o un pequeño micrófono que puede agregar a la placa. Mi plan era que Teensy realizara una FFT en el audio del micrófono.

Paso 2: ¿FFT?

FFT?
FFT?

Una FFT es una fórmula / algoritmo matemático que transforma una señal del dominio del tiempo al dominio de la frecuencia. Lo que esto significa es que toma el audio muestreado en el tiempo del micrófono y lo convierte en magnitudes de las frecuencias que están presentes en la onda original. Verá, cualquier onda continua arbitraria se puede construir a partir de una serie de ondas seno o coseno que son múltiplos enteros de alguna frecuencia base. Una FFT hace lo contrario: toma una onda arbitraria y la convierte en las magnitudes de las ondas que, si se suman, crearían la onda arbitraria original. Una forma aún más simple de decir esto es que planeé usar software y el hardware FFT en el Teensy para determinar si "escucha" el aleteo de un colibrí a la frecuencia con la que se produce el aleteo. Si 'escucha' a un colibrí, enviaré un comando a una cámara para que tome una foto.

¡Funcionó! Entonces, ¿cómo lo hice, cómo pudiste hacerlo y cómo podrías hacerlo aún mejor?

Paso 3: ¿Cómo suena un colibrí flotando?

¿Cómo suena un colibrí flotando?
¿Cómo suena un colibrí flotando?

Lo primero es lo primero, necesitaba averiguar qué frecuencia escucharía el aleteo del colibrí. Para determinar esto, usé mi iPhone. Conecté el iPhone a un trípode y lo hice grabar video en cámara lenta directamente frente al alimentador de colibrí en nuestra plataforma. Después de un tiempo quité la cámara y descargué el video. Luego miré el video buscando un colibrí frente al comedero. Cuando encontré una buena secuencia, conté el número de fotogramas individuales que le tomó al colibrí batir sus alas desde una posición hasta la misma posición. La cámara lenta en el iPhone es de aproximadamente 240 cuadros por segundo. Observé un colibrí flotando frente al comedero y conté 5 cuadros para que moviera sus alas desde la posición hacia adelante a la posición hacia atrás y luego regresara a la posición hacia adelante. Se trata de 5 fotogramas de 240. Recuerde, escuchamos un sonido en cada golpe de las aletas del colibrí (uno en el movimiento hacia adelante y otro en el movimiento hacia atrás). Para 5 fotogramas por ciclo o período, podemos calcular la frecuencia dividida por el período, es decir, 1 / (5/240) o 48 Hz. Esto significa que cuando este colibrí está flotando, el sonido que escuchamos debe ser el doble de esto o aproximadamente 96 Hz. La frecuencia es probablemente mayor cuando están volando y no suspendidos. También puede verse afectado por su masa, pero creo que podemos suponer que la mayoría de las aves de la misma especie tienen aproximadamente la misma masa.

Paso 4: Fourier Series y Teensy

Fourier Series y el Teensy
Fourier Series y el Teensy

El Teensy (usé un Teensy 3.2) está hecho por PJRC (www.pjrc.com). La FFT se calculará sobre una muestra de sonido. Para adquirir el sonido, PJRC vende una placa adaptadora de audio para Teensy (TEENSY3_AUDIO - $ 14.25). También venden un pequeño micrófono que se puede soldar a la placa adaptadora de audio (MICRÓFONO - $ 1.25). La placa adaptadora de audio utiliza un chip (SGTL5000) con el que Teensy puede hablar a través de un bus serie (I2S). El Teensy usa el SGTL5000 para muestrear el audio del micrófono y digitalizarlo, es decir, crear un conjunto de números que representen el sonido que está escuchando el micrófono.

Una FFT es solo una versión rápida de lo que se llama Transformada de Fourier Discreta (DFT). Se puede realizar una DFT en un número arbitrario de muestras; sin embargo, una FFT debe tener las muestras almacenadas en conjuntos que sean múltiplos binarios. El hardware de Teensy puede realizar una FFT en un conjunto de 1024 muestras (1024 = 2 ^ 10), así que eso es lo que usaremos.

Una FFT generalmente produce, como salida, las magnitudes Y las relaciones de fase entre las diversas ondas representadas. Para esta aplicación, no nos interesan las relaciones de fase, pero nos interesan las magnitudes y su frecuencia.

La placa de audio Teensy muestrea audio a una frecuencia de 44, 100 Hz. Entonces, 1024 muestras a esta frecuencia representan un intervalo de tiempo de 1024/44100 o aproximadamente 23,2 milisegundos. En este caso, la FFT producirá como salida, magnitudes que son múltiplos enteros del período de muestra de 43 Hz (nuevamente, 1 / 0.0232 equivale aproximadamente a 43 Hz). Querríamos buscar magnitudes que sean aproximadamente el doble de esta frecuencia: 86 Hz. No es exactamente la frecuencia de nuestras aletas de colibrí calculadas, pero está lo suficientemente cerca como veremos.

Paso 5: uso de datos de Fourier

Usando datos de Fourier
Usando datos de Fourier

Las bibliotecas que PJRC proporciona para Teensy procesarán las muestras y devolverán una serie de valores de magnitud. Nos referiremos a cada magnitud en la matriz devuelta como un bin. El primer bin (en el desplazamiento cero en el conjunto de datos que obtenemos) es el desplazamiento de CC de la onda. Podemos ignorar este valor con seguridad. El segundo contenedor (en el desplazamiento 1) representará la magnitud del componente de 43 Hz. Este es nuestro período base. El siguiente intervalo (en el desplazamiento 2) representará la magnitud del componente de 86 Hz, y así sucesivamente. Cada bin posterior es un múltiplo entero del período base (43 Hz).

Ahora aquí es donde se pone un poco extraño. Si usáramos una FFT para analizar un sonido perfecto de 43 Hz, la FFT devolvería el primer contenedor en una magnitud grande y el resto de los contenedores sería igual a cero (nuevamente, en un mundo perfecto). Si el sonido que capturamos y analizamos fue de 86 Hz, entonces el intervalo en el desplazamiento uno sería cero y el intervalo en el desplazamiento 2 (el segundo armónico) sería de una magnitud grande y el resto de los intervalos sería cero, y así sucesivamente. Pero si capturáramos el sonido de un colibrí y fuera de 96 Hz (como medí en mi única ave), entonces la compensación 2 bin @ 86 Hz tendría una magnitud de un valor ligeramente más bajo (que la onda perfecta de 86 Hz) y los contenedores a su alrededor (uno más bajo y algunos más alto) tendrían cada uno un valor decreciente distinto de cero.

Si el tamaño de muestra para nuestra FFT fuera mayor que 1024 o si nuestra frecuencia de muestreo de audio fuera menor, podríamos mejorar la resolución de nuestros contenedores (es decir, más pequeños). Pero incluso si cambiamos estas cosas para hacer que nuestros contenedores FFT sean múltiplos de 1 Hz del período base, todavía tendríamos que lidiar con este 'derrame' del contenedor. Esto se debe a que nunca obtendríamos una frecuencia de ala que aterrizara, siempre y exactamente, en un solo contenedor. Esto significa que no podemos basar nuestra detección de un colibrí en el valor del intervalo de compensación 2 e ignorar el resto. Necesitamos una forma de analizar los datos en unos pocos contenedores para intentar darle sentido. Más sobre esto más adelante.

Paso 6: Comience la construcción

Comenzar construcción
Comenzar construcción
Comenzar construcción
Comenzar construcción

Para mi prototipo de detector de colibrí, utilicé pines macho-macho extra largos soldados a los pines del Teensy. Hice esto para poder conectar el Teensy a una pequeña placa de pruebas sin soldadura. Hice esto porque asumí que haría muchos cambios en el prototipo y con la placa de pruebas, podría cambiar esto y simplemente puentear cables donde sea que lo necesite. Soldé tiras hembra en la parte inferior de la placa de audio, lo que permite enchufarla en la parte superior del Teensy. El micrófono está soldado a la parte superior de la placa de audio (ver imágenes). Se pueden encontrar más detalles sobre el montaje en el sitio de PJRC:

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

Paso 7: hardware para tomar una foto

Hardware para tomar una foto
Hardware para tomar una foto
Hardware para tomar una foto
Hardware para tomar una foto

Tengo (bueno, mi esposa tiene) una cámara digital Canon Rebel. Hay un conector en la cámara que le permite conectar un control de obturador remoto manual. Compré un control remoto manual de B&H Photo. El cable tiene el conector correcto para colocar la cámara en un extremo y mide aproximadamente 6 pies de largo. Corté el cable en el extremo cerca de la caja de control del botón, quité los cables y los soldé a tres clavijas de cabezal que podía conectar a la placa de pruebas. Hay un cable desnudo que está conectado a tierra y otras dos señales: la punta es el disparador (rosa) y el anillo (blanco) está enfocado (vea las imágenes). Al poner en cortocircuito la punta y / o el anillo al suelo, se activa el obturador y el enfoque de la cámara.

Usando un cable de puente, pasé un terreno común desde el Teensy hasta un área donde podría usarlo en la placa de pruebas. También conecté el ánodo de un LED al pin 2 en el Teensy y el cátodo del LED a una resistencia (100-220 ohmios) a tierra. También conecté el pin 2 del Teensy a una resistencia de 10K y el otro lado de la resistencia lo conecté a la base de un transistor NPN (un 2N3904 que se encuentra en todas partes). Conecté el emisor del transistor a tierra y el colector lo conecté a los cables blanco y rosa del cable que va a la cámara. El cable desnudo, de nuevo, estaba conectado a tierra. Siempre que Teensy encienda el LED, el transistor NPN también se encenderá y activará la cámara (y el enfoque). Vea el esquema.

Paso 8: Diseño del sistema

Diseño de sistemas
Diseño de sistemas

Debido a que las frecuencias de aleteo del colibrí probablemente no superen unos pocos cientos de Hz, entonces realmente no necesitamos registrar frecuencias de sonido por encima de, digamos, unos pocos cientos de Hz. Lo que necesitamos es una forma de filtrar solo las frecuencias que queremos. Un filtro de paso de banda o incluso de paso bajo sería genial. Tradicionalmente, implementaríamos un filtro en hardware usando OpAmps o filtros de capacitores conmutados. Pero gracias al procesamiento de señales digitales y las bibliotecas de software de Teensy, podemos usar un filtro digital (no se necesita soldadura … solo software).

PJRC tiene una excelente GUI disponible que le permite arrastrar y soltar su sistema de audio para Teensy y la placa de audio. Lo puedes encontrar aquí:

www.pjrc.com/teensy/gui/

Decidí utilizar uno de los filtros en cascada bicuadráticos proporcionados por PJRC para restringir las frecuencias de sonido del micrófono (filtro). Conecté en cascada tres filtros de este tipo y los configuré para la operación de paso de banda a 100 Hz. Este filtro permitirá ingresar al sistema frecuencias un poco por encima y un poco por debajo de la frecuencia que nos interesa.

En el diagrama de bloques (ver imagen) i2s1 es la entrada de audio a la placa de audio. Conecté ambos canales de audio a un mezclador y luego a los filtros (el micrófono es solo un canal, pero mezclé ambos para no tener que averiguar qué canal era … llámame vago). Ejecuto la salida del filtro a la salida de audio (para poder escuchar el audio si quiero). También conecté el audio de los filtros al bloque FFT. En el diagrama de bloques, el bloque etiquetado como sgtl5000_1 es el chip controlador de audio. No necesita ninguna conexión en el diagrama.

Después de hacer toda esta construcción de bloques, haga clic en Exportar. Esto abre un cuadro de diálogo donde puede copiar el código que se generó a partir del diagrama de bloques y pegarlo en su aplicación Teensy. Si observa el código, puede ver que es una instanciación de cada control junto con las 'conexiones' entre los componentes.

Paso 9: Código

Código
Código

Se necesitaría demasiado espacio en este Instructable para repasar el software en detalle. Lo que intentaré hacer es resaltar algunos de los bits clave del código. Pero esta no es una aplicación muy grande de todos modos. PJRC tiene un excelente video tutorial sobre el uso de Teensy y las bibliotecas / herramientas de audio (https://www.youtube.com/embed/wqt55OAabVs).

Comencé con un código de ejemplo FFT de PJRC. Pegué lo que obtuve de la herramienta de diseño del sistema de audio en la parte superior del código. Si observa el código después de esto, verá una inicialización y luego el sistema comienza a digitalizar el audio del micrófono. El software ingresa al bucle 'forever' () y espera que los datos FFT estén disponibles mediante una llamada a la función fft1024_1.available (). Cuando los datos de FFT están disponibles, tomo una copia de los datos y la proceso. Tenga en cuenta que, solo obtengo datos si la magnitud del contenedor más grande está por encima de un valor establecido. Este valor es cómo configuro la sensibilidad del sistema. Si los contenedores ESTÁN por encima del valor establecido, normalizo la onda y la transfiero a una matriz temporal para su procesamiento; de lo contrario, la ignoro y sigo esperando otra FFT. Debo mencionar que también utilizo la función de control de ganancia del micrófono para ajustar la sensibilidad del circuito (sgtl5000_1.micGain (50)).

Normalizar la onda solo significa que ajusto todos los contenedores para que el contenedor con el valor más grande sea igual a uno. Todos los demás contenedores se escalan en la misma proporción. Esto hace que los datos sean más fáciles de analizar.

Usé varios algoritmos para analizar los datos, pero me decidí por usar solo dos. Un algoritmo calcula el área bajo la curva formada por los contenedores. Este es un cálculo simple que simplemente suma los valores de los contenedores en la región de interés. Comparo esta área para determinar si está por encima de un umbral.

El otro algoritmo utiliza una matriz constante de valores que representan una FFT normalizada. Estos datos son el resultado de una firma de colibrí real (óptima). Yo llamo a esto un seto. Comparo los datos de cobertura con los datos FFT normalizados para ver si los contenedores correspondientes están dentro del 20% entre sí. Elegí el 20%, pero este valor podría ajustarse fácilmente.

También cuento cuántas veces los algoritmos individuales piensan que tienen una coincidencia, es decir, piensan que escuchan un colibrí. Utilizo este recuento como parte de la determinación del colibrí porque puede ocurrir una activación falsa. Por ejemplo, cuando cualquier sonido es fuerte o contiene la frecuencia de las alas de un pájaro, como aplaudir, es posible que se active. Pero si el recuento está por encima de un cierto número (un número que elijo), digo que es un colibrí. Cuando esto sucede, enciendo el LED para indicar que tenemos un golpe y este mismo circuito activa la cámara a través del transistor NPN. En el software configuré el tiempo de activación de la cámara en 2 segundos (el tiempo que el LED y el transistor están encendidos).

Paso 10: Montaje

Montaje
Montaje

Puedes ver en la imagen cómo monté (sin ceremonias) la electrónica. Hice conectar el Teensy a una placa que estaba pegada a una placa portadora junto con otra (sin usar) compatible con Arduino (creo que una Arduino Zero). Até todo con alambre a un poste de toldo de metal en mi terraza (también agregué alivio de tensión al cable que va a la cámara). El poste estaba justo al lado del comedero para colibríes. Encendí los componentes electrónicos con un pequeño bloque de alimentación LiPo que podrías usar para recargar un teléfono celular muerto. El bloque de alimentación tenía un conector USB que usé para alimentar el Teensy. Pasé el cable del disparador remoto a la cámara y lo enchufé. ¡Estaba listo para la acción de los pájaros!

Paso 11: Resultados

Resultados
Resultados

Configuré la cámara en un trípode cerca del alimentador. Tenía la cámara enfocada en el borde frontal del alimentador y la configuré en el modo deportivo, que toma varias fotos rápidas cuando se presiona el obturador. Con el tiempo de desconexión de 2 segundos, capturé alrededor de 5 fotos por evento de activación.

Pasé un par de horas jugando con el software la primera vez que probé esto. Tuve que ajustar la sensibilidad y el recuento de aciertos del algoritmo sucesivo. Finalmente lo modifiqué y estaba listo.

La primera fotografía que tomó fue de un pájaro que voló hacia el encuadre como si diera un giro lateral a alta velocidad como un caza a reacción (ver arriba). No puedo decirte lo emocionado que estaba. Me senté en silencio al otro lado de la plataforma durante un rato y dejé que el sistema funcionara. Me las arreglé para grabar muchas fotos, pero tiré bastantes. Resulta que a veces solo obtienes una cabeza o una cola de pájaro. Además, obtuve desencadenantes falsos, que pueden ocurrir. En total creo que guardé 39 fotografías. A los pájaros les tomó algunos viajes al comedero para acostumbrarse al sonido del obturador de la cámara, pero finalmente parecieron ignorarlo.

Paso 12: Pensamientos finales

Pensamientos finales
Pensamientos finales

Este fue un proyecto divertido y funciona. Pero, como la mayoría de las cosas, hay mucho margen de mejora. El filtro ciertamente podría ser diferente (como un filtro de paso bajo o cambios en la disposición y / o parámetros) y tal vez eso podría hacer que funcione mejor. También estoy seguro de que hay mejores algoritmos para probar. Intentaré algo de esto en el verano.

Me han dicho que existe un código de aprendizaje automático de código abierto … ¡tal vez el sistema podría estar 'entrenado' para identificar colibríes! No estoy seguro de intentar esto, pero tal vez.

¿Qué otras cosas se podrían agregar a este proyecto? Si la cámara tuviera un sello de fecha / hora, podría agregar esa información a las imágenes. Otra cosa que puede hacer es grabar el audio y guardarlo en una tarjeta uSD (la placa de audio PJRC tiene una ranura para uno). El audio guardado podría usarse para entrenar un algoritmo de aprendizaje.

¿Quizás en algún lugar una escuela de ornitología podría usar un dispositivo como este? Es posible que puedan recopilar información como los horarios de alimentación, la frecuencia de alimentación y, con las imágenes, es posible que pueda identificar aves específicas que regresan para alimentarse.

Mi esperanza es que alguien más extienda este proyecto y comparta lo que hace con otros. Algunas personas me han dicho que este trabajo que he realizado debería convertirse en un producto. No estoy tan seguro, pero preferiría verlo utilizado como una plataforma de aprendizaje y para la ciencia.

¡Gracias por leer!

Para usar el código que he publicado, necesitará el IDE de Arduino (https://www.arduino.cc/en/Main/Software). También necesitará el código de Teensyduino de PJRC (https://www.pjrc.com/teensy/td_download.html).

Recomendado: