<< Organo de luces (I) - Introducción Organo de luces (III) - Etapa de potencia >>

Obtención de la señal

Como comentaba en el post anterior, en mi caso voy a  a utilizar un micrófono como fuente de señal, esto evita tener que conectar la fuente directamente y proporciona más libertad de movimiento.
Yo he utilizado un módulo de Dealextreme (como no), el SKU: 135533, que es un módulo detector de sonido con una salida digital y una analógica. Aquí utilizaremos esta última.
Como el nivel de la señal que entrega es muy pequeño, he utilizado un vetusto u741 (pero funcional) que había por un cajón, para adecuar la señal a la entrada del Arduino.
También es posible utilizar directamente un micrófono electret , pero habrá que amplificarlo adecuadamente (podéis encontrar infinidad de esquemas en internet), o bien utilizar un módulo ya amplificado como este 

El esquema de montaje es este (clik en las imágenes para ampliar):

Esquema del organo de luces con Arduino
Y el montaje este:

Montaje del organo de luces con Arduino



Algunos detalles:

  • La resistencia de 1k para alimentar el módulo reduce en gran manera el ruido en la alimentación producido por el Arduino, que se traslada luego a la salida. 
  • El u714 está en una configuración básica de amplificador, a su salida se obtiene una señal de aproximadamente 1Vpp con un offset de 5V/2  ~ 2.5V.
  • Como la entradas analógicas de Arduino necesitan señales de 0 a 5V,  el divisor de tensión formado por R1/R2 crean un offset de aprox 0.5V para que la señal tenga un rango del 0 a 1 V aprox.
  • Para poder medir con mayor precisión, programaremos la referencia del conversor analógico del Arduino como INTERNAL, que tiene un valor de 1,1V en vez de los 5V de defecto.
Necesitaréis la librería fix_fft que podéis descargar de aquí :  fix_fft

El código

El código está comentado para poderlo seguir fácilmente, pero veamos básicamente su funcionamiento.
Esta parte contiene una dosis de matemática que puede ser algo aburrida para algunos, si no te interesa simplemente pasa de ella :-). 

Inicialización
Se configura como antes hemos dicho la referencia analógica como INTERNAL, para medir tensiones del orden de 1V. También se configura el prescaler a 32 (el prescaler divide la frecuencia de reloj del micro para realizar las conversiones A/D entre otras cosas), para conseguir un a frecuencia de muestreo de unos 38 KHz, lo cual es más que suficiente para este proyecto. Luego se configuran los pines de salida.

Bucle
Se realiza un muestreo de 128 muestras, se pasa pon una función de ventana (Hann), para minimizar los efectos de las discontinuidades al principio y al final del muestreo y luego se aplica la transformada rápida de Fourier con la llamada a fix_fft.
Después de esto en data tenemos los valores de las 64 bandas (Nmuestras/2) .
Como nos interesan en valor absoluto y no las partes reales e imaginarias por separado, calculamos el módulo, y puesto que el valor es algo pequeño lo dejamos al cuadrado.

A continuación sólo queda agrupar los valores en tres bandas (graves, medios y agudos) y en función de si superan un límite activar las salidas.
El límite varía en función de la cantidad de veces que cada canal se enciende, lo que proporciona una cierta realimentación y evita que con los cambios de volumen un canal se sature o no se encienda.
La agrupación de las bandas y los límites los he obtenido probando, podéis realizar vuestras pruebas para obtener otros resultados.

Si te ha gustado no te pierdas el próximo post para ver como conectarlo a bombillas de verdad :




Si te ha gustado, recuerda compartirlo en tu red social favorita. Gracias

26 comments

16 de diciembre de 2012, 1:04

hola mucho gusto muy bueno tu proyecto estoy buscando ayuda con el codigo de el paso por cero lo necesito muy urg lo intentado varias veces y no me funciona porfavor si me puedes ayudar mi correo es davidleonardo91@gmail.com para que expliques como se programa el paso por cero gracias de antemano

6 de marzo de 2013, 21:51

ggracias por el proyecto espero ponerlo en practica

13 de marzo de 2013, 21:05

Muchas gracias por subir tu proyecto. no me quedo muy claro,¿como variaste la frecuencia de muestreo en el IDE ? ¿hay algún modo exacto de calcular la frecuencia de muestreo?, digo como para detectar componentes en una banda de frecuencias en especifico. muchas gracias denuevo, saludos!

26 de marzo de 2013, 13:22

he intentado hacer tu proyecto, pero se necesita el archivo "fix_fft" el enlace no deja descargarse

26 de marzo de 2013, 13:37

Vale. He averiguado que del enlace en ingles funciona.

13 de abril de 2013, 3:33

@Santiago Navarro
Perdón ya está arreglado el enlace.
Gracias.

13 de abril de 2013, 3:51

@Ignacio Daniel Tomasov Silva
Está comentado en el código.
No se cambia desde el IDE, lo que se hace es modificar el valor del prescaler (que se encarga de dividir la frecuencia del reloj para atacar al timer).
Puedes encontrar mucha información en esta página www.arduinoos.com busca lo referente a FFT.

23 de junio de 2013, 15:22

hola queria consultarte si funciona con un microfono de dos patas ( + y - ) y como lo conecto ?

25 de junio de 2013, 1:20

@alexander pastene
Supongo que te refieres a un micrófono 'electret'.
Se puede utilizar con un preamplificador , como este: Preamplificador electret
La salida "out" puedes conectarla directamente a la patilla A0 del arduino manteniendo el divisor de tension con las resistencias R1/R2.
Lo que no se es que sensibilidad tendrá ... cuestión de probar.

3 de julio de 2013, 4:28

ciao, ho dei problemi con il progetto, ho caricato il codice sull'arduino, ma non funziona. Aiuto grazie.

3 de julio de 2013, 4:29

hola, tengo problemas con el proyecto, que he subido del sull'arduino código, pero no funciona. Ayuda gracias.

26 de noviembre de 2013, 9:12

¿Qué se tiene en cuenta para seleccionar los valores de C1, C2 yR3 ?

john
27 de diciembre de 2013, 23:48

Awesome dude, I wish my Spanish were better.

29 de diciembre de 2013, 5:18

@johnThank you. There is an English version here

28 de junio de 2014, 15:35

hola, tengo problemas con el proyecto, me dice que "ADCSRA was not declared in this scope" ¿Podría dar una mano. Gracias.
bitWrite(ADCSRA,ADPS2,1);
bitWrite(ADCSRA,ADPS1,0);
bitWrite(ADCSRA,ADPS0,1);

30 de junio de 2014, 5:45

@Iulio Naida
¿Qué arduino estás utilizando: Uno, Due, Leonardo, Mega ...?
¿Qué versión del entorno 1.0.5 o anterior?

2 de julio de 2014, 6:14

Arduino Due! 1.5.6 - r2

inside.game.labs@gmail.com
3 de julio de 2014, 13:45

Hola! Primeramente felicitarte por la web! es estupenda y muy interesante... Tengo un problemilla, intento entender el código pero todavia estoy muy pez!! Yo estoy intentando que, a partir de un microfono, poder sacar las frecuencias... y de ellas solamente utilizar 3 (que serian proximas a 20000Hz , por ejemplo 19800, 20300 y 20500 , por ejemplo) de tal manera que cuando aparezcan esas frecuencias, se ejecute un código... es posible hacerlo a traves de tu ejemplo?

7 de julio de 2014, 4:12

@Iulio Naida
Upss!
El Arduino DUE utiliza un micro distintinto, y no es compatible a nivel de registros con el ATMega.
La buena noticia es que es mucho más rápido y no es necesario cambiar el preescaler, simplemente elimina esas tres lineas.

7 de julio de 2014, 5:29

@inside.game.labs@gmail.com
Gracias por tu comentario!
En realidad tienes que calcular a que banda tienes que prestar atención, en teoría la frecuencia de muestreo es de aprox 38.4Khz y hay 64 bandas, así que 38400/2/64 = 300Hz, es decir que las bandas van 0-300Hz, 301-600Hz, ..., xx-19.200Hz
Para llegar a las frecuencias que necesitas ... tendrías que bajar aún mas el preescaler (a 16 por ejemplo) para llegar a 38400Hz, a costa de perder precisión ...
Te recomiendo esta página Arduinoos que habla ampliamente del tema.

15 de octubre de 2014, 15:47

es necesario el arduino uno?? o se puede hacer sin el, de otra forma?

16 de octubre de 2014, 14:12

@kevin johann
Siempre lo puedes hacer con electrónica analógica ...
Busca light organ" en google y encontrarás muchos esquemas.

16 de octubre de 2014, 15:15

voy a tratar de hacerlo de tu forma, con el arduino.. pero tengo algunas dudas ya que soy nuevo en esto:
--cual es el voltaje de los condensadores?
--cual es el modelo de arduino uno que me sirve para hacer esto?? porque he visto en internet que hay muchos modelos, el r8, etc...
--una vez que se le puso el código en el arduino uno es necesario mantenerlo enchufado a la computadora para su funcionamiento? ya que preferiría una vez que le ponga los códigos poder usarlo sin que este enchufado.
--por ultimo, en la etapa "3", donde se le sube el Voltaje para lamparas de 220V, las resistencias (220; 360; 330) son en "K" o en "OHMS" porque no dice y no me doy cuenta.
desde ya muchas gracias y disculpa las molestias

17 de octubre de 2014, 9:09

@kevin johann
Ok, te respondo
1) Ten en cuenta que el circuito trabaja con 5v, así que con que sean a partir de 10V te valen.
2) Te sirve cualquier modelo de los que usan un AVR atmega: Arduino uno, Arduino leonardo, Arduino Mega, Arduino Nano, Arduino Micro, Arduino pro mini, Arduino Mini. Los más sencillos para empezar: Arduino Uno o el Leonardo, si los quieres mas pequeños el Micro o el Nano.
3) No, una vez que programas el Arduino no necesita el ordenador, sólo una fuente de alimentación.
4) Los valores de las resistencias están en omhs es decir son de 220, 330 y 360 oms.
Saludos.

Publicar un comentario en la entrada

Buscar en el blog

Cargando...

¡Lo más visto!

English Version

English Version
Arduino is Cool!!

También en Facebook