Este es un proyecto que trata de la creación de un DMX que funciona con un micrófono mediante el microcontrolador Atmega 328P.
INTRODUCCIÓN
La idea del proyecto surgió de este esquema de psicodélico ya hecho:
(Click en la imagen para agrandar)
Este es un esquema de un psicodélico al cual le llega la señal de audio y esa misma señal la divide en graves, medios y agudos de forma analógica, para lo cual se necesitan 3 filtros diferentes. La siguiente etapa del psicodélico es la amplificación, para lo que se necesitan otros 3 amplificadores, uno para cada filtro.
Finalmente, tras la etapa de amplificación está la etapa de salida, que consiste en 3 optotriacs, nuevamente 1 para cada señal.
La idea de este proyecto es, a través del Atmega 328P, librarnos en parte de algunas etapas analógicas y hacerlas digitalmente y hacerlo también más independiente. Para ello utilizaremos un módulo de micrófono para arduino junto con un amplificador u741, para meterle la señal analógica del audio ya amplificada al Atmega. Los filtros los hará digitalmente con un programa que le meteremos al Atmega, basándonos en la FFT (Transformada Rápida de Fourier). A la salida usaremos los optotriacs para alimentar luces de 60V por ejemplo.
Aquí la placa prototipo funcionando con el programa:
Video:
PRIMERA SEMANA
(Lunes 13 - Viernes 17 de Enero)
Lo primero que hice fue encargar los componentes que considero que me van a hacer falta:
-Módulo de micrófono para arduino.
-Fuente reguladora DC-DC.
-Módulo de bluetooth para arduino.
Durante la primera semana de trabajo he ido diseñando el esquemático de una placa de pruebas en ISIS.
(Click en la imagen para agrandar)
Para hacer el esquemático diseñé el encapsulado del módulo de micrófono con 4 pines para que fuera conectar y listo. La patilla DO (digital output) del micrófono la dejamos sin conectar, ya que no la vamos a utilizar.
Como es una placa prototipo sólo tiene lo básico: el micrófono, un amplificador a la salida del micrófono (ya que la señal que sale es muy débil), el Atmega 328P con su cristal oscilador de 16MHz, 3 leds de diferente color a las salidas y RX/TX para probar la comunicación por bluetooth.
Tras diseñar el esquemático en ISIS, lo siguiente era hacer el PCB de la placa, tratando de hacer su tamaño lo más reducido posible.
(Click en la imagen para agrandar)
Una vez impreso el diseño en la placa, comenzamos a soldar, quedando así la placa:
A la par que he ido haciendo esto, he ido buscando información en casa y en clase sobre la Transformada Rápida de Fourier (FFT) y algunos programas ya hechos que me puedan servir de ayuda, para poder empezar a programar en la semana que entra.
SEGUNDA SEMANA
(Lunes 20 - Viernes 24 de Enero)
El primer paso para empezar a programar ha sido descargar la librería FFT, que se puede descargar desde aquí, haciendo click en Archivo/Descargar. Ahí se incluyen los ficheros de la librería necesarios para poder incorporarlo a nuestro programa de arduino, junto con un ejemplo ya hecho.
Una vez descargada la librería, comencé a recopilar información de diversas páginas web y de programas ya hechos.
Con el micrófono de un compañero he podido ir haciendo pruebas y editando el programa.
El programa lo que hace es coger el valor analógico que le llega desde el micrófono (tras amplificarlo) y a través de la fórmula de la FFT separamos esos valores en 3 variables, una contiene los tonos agudos, otra los tonos medios y otra los tonos graves. A cada variable le aplicamos una fórmula para que no sature la salida cuando hay demasiado volumen. Tras esto, sale cada valor por las patillas que habíamos preparado en la placa prototipo.
Este sería un programa prototipo, para el programa final quiero que haya comunicación serie por bluetooth para que se pueda controlar el valor de la salida desde otro dispositivo (como si fuera un potenciómetro digital).
Por otro lado he de hacer una placa nueva para los optotriacs que cogerían el valor de la salida para, en un principio, alimentar luces de 60V.
TERCERA SEMANA
(Lunes 27 - Viernes 31 de Enero)
(Lunes 27 - Viernes 31 de Enero)
Al finalizar la semana pasada, tuve un accidente con la placa cuando medía con el osciloscopio, pero tras intensivas mediciones con el polímetro y alguna soldadura que otra, ya vuelve a estar sana y operativa de nuevo para poder seguir haciendo prácticas con ella.
Se han pedido ya los optotriacs MOC3041 y los triacs para empezar a hacer la etapa de salida.
Mientras llegan los componentes, comenzaré con el diseño de la placa de salida y con el programa de comunicación serie. De momento así está quedando el diseño de la etapa de salida, aún incompleta:
Se me ha ocurrido poner la opción de que al programa le entre el audio a través de un jack y no sólo por el micrófono, para dar al aparato más opciones. Lo mejor para ello es con un conmutador. Por ello, he empezado a prepararme los materiales necesarios para la placa final, como el interruptor de encendido/apagado, el conmutador, etc:
Para la etapa de salida usaremos 3 optotriacs que atacarán a 3 triacs. Este sería el diseño de una placa prototipo ya terminada, continuando con el diseño que quedó incompleto la semana pasada:
Y su versión en PCB:
En el diseño de la PCB hay que tener en cuenta algo muy importante: el grosor de las pistas, ya que hay que tener en cuenta que debe pasar hasta 1 Amperio por el circuito y hasta 3 Amperios en la entrada de la corriente. Aquí hay una pequeña tabla informativa sobre el grosor de las pistas en función de su corriente para que nos hagamos una idea:
La ferrita la he hecho manualmente haciendo que todas midieran de 13uH a 15uH:
Esta placa la voy a hacer con la fotoinsoladora para practicar con ella, ya que es un prototipo.
El DMX estará alimentado con un adator AC-DC a 8V, por ello será necesario hacer un regulador para bajar a 5V, que son los que entrarán en el Atmega. Los 8V también los aprovecharemos para alimentar el amplificador que va después del micrófono.
La fuente reguladora estará hecha con un TL2575-05 el cual regula cualquier voltaje de continua desde 7V hasta 40V, y saca 5V. Desde su mismo datasheet podemos ver un diseño de como utilizarlo. Este sería el diseño resultante en ISIS:
Ya tengo el programa de comunicación, será una aplicación móvil para android desde la cual controlaremos los umbrales graves-medios y medios-agudos, mientras que muestra en pantalla cuál es ese umbral en Herzios.
Visualmente, el programa se verá así:
El programa lo podemos descargar desde aquí para pasarlo a nuestro móvil e instalarlo manualmente.
A su vez, hemos tenido que modificar el programa de arduino ya hecho añadiéndole estas lineas:
"
Dentro del setup:
Serial.begin(9600);
Dentro del loop:
if (Serial.available() > 0)
{
int var = Serial.read();
if (var <= 18){
BAJOS_MEDIOS = var;
}
if (var >= 19){
MEDIOS_AGUDOS = var;
}
}
"
Con esto le decimos al Atmega que inicie la comunicación serie y lo preparamos para que, si esta comunicación está establecida, reciba datos, que son para modificar los umbrales, y que si no hay comunicación, mantenga un valor fijo para los umbrales.
Este es el resultado de la etapa de salida en el papel fotosensible tras el proceso de la fotoinsoladora, pero debido a un error de medición queda inservible, ya que los fusibles ocupan un tamaño considerable que no tuve en cuenta.
Además incorporé componentes en SMD, lo que supone un riesgo añadido por la proximidad en las pistas, ya que debe estar preparada para que aguante hasta 1 Amperio y puede dar problemas.
Por ello, ya que es una placa prototipo la he hecho de nuevo en el ácido, con su nuevo diseño para que haya hueco suficiente para los fusibles y con componentes de tamaño normal.
A su vez, he ido haciendo el regulador a 5V, el cual está ya montado a falta de un diodo 1N5819, el cual llegará el jueves y podré ponerla a prueba.
A estas alturas ya tengo el diseño final en ISIS y ARES. Saldría una placa de 10cm de ancho por 11,6cm de largo, aproximadamente.
Aquí está el diseño del ARES en formato pdf.
Y el esquemático:
Diseño de ISIS en tamaño original.
Tras tener el diseño de la PCB, exportamos los ficheros necesarios para la PhotoPlotter. En el mismo papel hemos puesto las 2 caras de nuestra placa para ahorrar papel.
Así queda nuestro papel fotosensible tras el proceso:
Sabiendo el tamaño que va a ocupar nuestro DMX, es hora de hacerle un encapsulado. Para ello hemos cogido de un ordenador viejo todo aquello que ya no servía pero que sí podemos aprovechar. El encapsulado estará hecho de chapa metálica de lectores de CD, disqueteras, discos duros, etc... modificados según la necesidad de nuestra placa.
Aquí unas fotos de como quedaría más o menos la parte delantera para hacernos una idea, pero está incompleto aún:
En las imágenes podemos ver ya el jack de entrada, el conmutador de entrada jack/micrófono, interruptor y led de ON/OFF y los 3 leds delanteros, que indicarán graves, medios y agudos. Como podemos ver también, en los laterales hay unos agujeros para atornillar la chapa al resto del conjunto.
Tras preparar la placa y aplicarle la máscara de soldadura, empezamos a soldar. Estas son algunas imágenes de la placa ya soldada:
Esta es una prueba en vídeo de que la primera fase de la placa funciona correctamente, es decir, que obtiene el sonido desde 2 fuentes distintas de audio y lo separa en 3 tonos diferentes.
En este vídeo le metemos la señal de audio por cable jack desde el ordenador, por eso no escuchamos el sonido, pero sí vemos a las luces actuar.
Estos no son los leds definitivos, sólo una prueba para comprobar que la placa funciona.
Ya tengo la caja donde irá la placa. Para hacerla he aprovechado las chapas de ordenadores viejos y lectores de CD, las he recortado a mi gusto y les he ido haciendo los agujeros. Una vez comprobado que todo encajaba, la he pintado de color negro mate. La tapa será corredera.
Parte delantera:
Especificaciones sobre la obtención de audio del DMX:
Debido a la FFT, el valor mínimo que podríamos obtener es 117 Hz, y el valor máximo rondaría los 7500 Hz debido al ADC del Atmega, con lo que, para hacernos una idea, estaríamos perdiendo 3 de los valores que aparecen en los ecualizadores.
Como podemos ver en esta imagen de un ecualizador promedio, los supergraves de 30 Hz y 60 Hz los perdemos, lo mismo pasa con los superagudos de 16000 Hz. Como ya he dicho, esto es para hacerse una idea de lo que realmente está "escuchando" el DMX cuando obtiene el audio.
Memorias de una placa:
Prueba de Bombillas:
Con un programa básico hemos ido haciendo la prueba de que funciona la etapa de salida, antes de usarlo con el programa del psicodélico.
Este vídeo sería con el programa que debe llevar el psicodélico:
Diagrama de estados:
En este enlace podemos ver un diagrama de estados del DMX en funcionamiento.
Programa de arduino final:
"
#include <fix_fft.h>
#define MUESTRAFFT 128
char data[MUESTRAFFT];
char im[MUESTRAFFT];
unsigned char salida[MUESTRAFFT/2];
unsigned char valorBajos,valorMedios,valorAgudos;
byte comp,
compBajos,compMedios,compAgudos,
limiteBajos,limiteMedios,limiteAgudos;
void setup() {
Serial.begin(9600);
bitWrite(ADCSRA,ADPS2,1);
bitWrite(ADCSRA,ADPS1,0);
bitWrite(ADCSRA,ADPS0,1);
analogReference(INTERNAL*2);
pinMode(9,OUTPUT);
pinMode(10,OUTPUT);
pinMode(11,OUTPUT);
digitalWrite(9, LOW);
digitalWrite(10, LOW);
digitalWrite(11, LOW);
delay(500);
digitalWrite(9, HIGH);
delay(150);
digitalWrite(9, LOW);
digitalWrite(10, HIGH);
delay(150);
digitalWrite(10, LOW);
digitalWrite(11, HIGH);
delay(150);
digitalWrite(11, LOW);
delay(300);
digitalWrite(9, HIGH);
digitalWrite(10, HIGH);
digitalWrite(11, HIGH);
delay(300);
digitalWrite(9, LOW);
digitalWrite(10, LOW);
digitalWrite(11, LOW);
delay(300);
digitalWrite(9, HIGH);
digitalWrite(10, HIGH);
digitalWrite(11, HIGH);
delay(300);
digitalWrite(9, LOW);
digitalWrite(10, LOW);
digitalWrite(11, LOW);
delay(100);
comp = 0;
compBajos = 0;
compMedios = 0;
compAgudos = 0;
limiteBajos = 50;
limiteMedios = 50;
limiteAgudos = 50;
}
void loop() {
for( int i=0; i < MUESTRAFFT; i++) {
data[i] = analogRead(0)/4 -128;
im[i] = 0;
}
calculosHann (data);
fix_fft(data,im,7,0);
for (int i=0; i < MUESTRAFFT/2; i++){
salida[i] = data[i] * data[i] + im[i] * im[i];
}
if (Serial.available() > 0)
{
var = Serial.read();
if (var >= 2 && var <= 18){
BAJOS_MEDIOS = var;
}
if (var >= 19 && var <= 63){
MEDIOS_AGUDOS = var;
}
if(var == 70){
analogReference(INTERNAL*4);
}
if(var == 71){
analogReference(INTERNAL*3);
}
if(var == 72){
analogReference(INTERNAL*2.5);
}
if(var == 73){
analogReference(INTERNAL*2);
}
if(var == 74){
analogReference(INTERNAL*1);
}
if(var == 75){
analogReference(INTERNAL/2);
}
}
valorBajos = 0;
for (int i=2; i < 7; i++){
valorBajos += salida[i];
}
valorBajos = valorBajos/2;
valorMedios = 0;
for (int i=7 ; i < 35; i++){
valorMedios += salida[i];
}
valorMedios = valorMedios/2;
valorAgudos = 0;
for (int i=35; i < MUESTRAFFT/2; i++){
valorAgudos += salida[i];
}
valorAgudos = valorAgudos/2;
int siBajos = valorBajos > limiteBajos;
int siMedios = valorMedios > limiteMedios;
int siAgudos = valorAgudos > limiteAgudos;
digitalWrite(9,siBajos ? HIGH : LOW);
digitalWrite(10,siMedios? HIGH : LOW);
digitalWrite(11,siAgudos? HIGH : LOW);
compBajos += siBajos;
compMedios += siMedios;
compAgudos += siAgudos;
if ( ++comp > 10 ) {
comp = 0;
limiteBajos = 20 + compBajos*5;
limiteMedios = 20 + compMedios*5;
limiteAgudos = 20 + compAgudos*5;
compBajos = 0;
compMedios = 0;
compAgudos = 0;
}
}
void calculosHann (char *datos) {
double muestra = (double(MUESTRAFFT) - 1.0);
for (uint8_t i = 0; i < MUESTRAFFT/2 ; i++) {
double indice = double(i);
double ratio = (indice / muestra);
double factor = 0.5 * (1.0 - cos(6.28 * ratio));
datos[i] *= factor;
datos[MUESTRAFFT - (i + 1)] *= factor;
}
}
"
Se han pedido ya los optotriacs MOC3041 y los triacs para empezar a hacer la etapa de salida.
Mientras llegan los componentes, comenzaré con el diseño de la placa de salida y con el programa de comunicación serie. De momento así está quedando el diseño de la etapa de salida, aún incompleta:
Diseño ISIS de la etapa de salida sin terminar.
CUARTA SEMANA
(Lunes 03 - Viernes 07 de Febrero)
Se me ha ocurrido poner la opción de que al programa le entre el audio a través de un jack y no sólo por el micrófono, para dar al aparato más opciones. Lo mejor para ello es con un conmutador. Por ello, he empezado a prepararme los materiales necesarios para la placa final, como el interruptor de encendido/apagado, el conmutador, etc:
Fuente de alimentación, que consiste en un adaptador
AC-DC de 8V que irá a un conector el cual alimentará la placa.
Conector de jack para poder meterle el audio directamente a través de un cable jack.
Este será el interruptor On/Off, que irá junto con un led rojo indicador.
Conmutador de 3 patillas y 2 posiciones, para dar al usuario la opción de
cambiar la entrada de audio por micrófono o por cable jack.
Mi intención es dejarlos ya soldados a unos cables para cuando tenga la placa hecha sea sólo cuestión de pinchar y soldar. Por el momento los tendré guardados hasta que me hagan falta.
Para la etapa de salida usaremos 3 optotriacs que atacarán a 3 triacs. Este sería el diseño de una placa prototipo ya terminada, continuando con el diseño que quedó incompleto la semana pasada:
Diseño etapa de salida en ISIS (Click para agrandar)
Diseño etapa de salida PCB (Click para agrandar)
En el diseño de la PCB hay que tener en cuenta algo muy importante: el grosor de las pistas, ya que hay que tener en cuenta que debe pasar hasta 1 Amperio por el circuito y hasta 3 Amperios en la entrada de la corriente. Aquí hay una pequeña tabla informativa sobre el grosor de las pistas en función de su corriente para que nos hagamos una idea:
Tamaño en (pulgadas) | Tamaño (en mm) | Corriente (amperios) |
0.010 inch | 0.254 mm | 0.3A |
0.015 inch | 0.381 mm | 0.4A |
0.020 inch | 0.508 mm | 0.7A |
0.025 inch | 0.635 mm | 1A |
0.050 inch | 1.27 mm | 2A |
0.100 inch | 2.54 mm | 4A |
La ferrita la he hecho manualmente haciendo que todas midieran de 13uH a 15uH:
Estas son unas ferritas sacadas de otras placas viejas.
Les sacamos el hilo:
Y una vez limpias, empezamos a liarlas con hilo de cobre esmaltado hasta que midan todas más o menos lo mismo (una media de 15 vueltas).
Así quedan:
Como bien he dicho antes, miden entre 13 y 15 micro Henrios aproximadamente,
no es muy crítico, pero cuanto más se asemejen los valores, mejor.
Tanto el ARES como el ISIS no tenían un diseño para la ferrita y los fusibles, por ello los he diseñado a mano, midiendo su tamaño en pulgadas. La ferrita tiene un tamaño aproximado de 1x0,5 pulgadas, mientras que los fusibles tienen un tamaño un tamaño aproximado de 0,87x0.3 pulgadas. Teniendo esto en cuenta, hemos diseñado su dibujo en ARES para poder incluirlo en el PCB.
Esta placa la voy a hacer con la fotoinsoladora para practicar con ella, ya que es un prototipo.
QUINTA SEMANA
(Lunes 10 - Viernes 14 de Febrero)
El DMX estará alimentado con un adator AC-DC a 8V, por ello será necesario hacer un regulador para bajar a 5V, que son los que entrarán en el Atmega. Los 8V también los aprovecharemos para alimentar el amplificador que va después del micrófono.
La fuente reguladora estará hecha con un TL2575-05 el cual regula cualquier voltaje de continua desde 7V hasta 40V, y saca 5V. Desde su mismo datasheet podemos ver un diseño de como utilizarlo. Este sería el diseño resultante en ISIS:
Diseño de regulador a 5V en ISIS (Click para agrandar)
Y así queda su diseño en ARES:
Diseño de regulador a 5V en ARES (Click para agrandar)
Visualmente, el programa se verá así:
El programa lo podemos descargar desde aquí para pasarlo a nuestro móvil e instalarlo manualmente.
A su vez, hemos tenido que modificar el programa de arduino ya hecho añadiéndole estas lineas:
"
Dentro del setup:
Serial.begin(9600);
Dentro del loop:
if (Serial.available() > 0)
{
int var = Serial.read();
if (var <= 18){
BAJOS_MEDIOS = var;
}
if (var >= 19){
MEDIOS_AGUDOS = var;
}
}
"
Con esto le decimos al Atmega que inicie la comunicación serie y lo preparamos para que, si esta comunicación está establecida, reciba datos, que son para modificar los umbrales, y que si no hay comunicación, mantenga un valor fijo para los umbrales.
SEXTA SEMANA
(Lunes 17 - Viernes 21 de Febrero)
Este es el resultado de la etapa de salida en el papel fotosensible tras el proceso de la fotoinsoladora, pero debido a un error de medición queda inservible, ya que los fusibles ocupan un tamaño considerable que no tuve en cuenta.
Por ello, ya que es una placa prototipo la he hecho de nuevo en el ácido, con su nuevo diseño para que haya hueco suficiente para los fusibles y con componentes de tamaño normal.
A su vez, he ido haciendo el regulador a 5V, el cual está ya montado a falta de un diodo 1N5819, el cual llegará el jueves y podré ponerla a prueba.
Una vez ha llegado el diodo, terminamos de soldar los componentes
La bobina no está soldada, ya que no es la placa definitiva, pero
hemos comprobado con un polímetro que realmente regula el voltaje a 5V.
A estas alturas ya tengo el diseño final en ISIS y ARES. Saldría una placa de 10cm de ancho por 11,6cm de largo, aproximadamente.
Aquí está el diseño del ARES en formato pdf.
Y el esquemático:
Diseño de ISIS en tamaño original.
Tras tener el diseño de la PCB, exportamos los ficheros necesarios para la PhotoPlotter. En el mismo papel hemos puesto las 2 caras de nuestra placa para ahorrar papel.
Así queda nuestro papel fotosensible tras el proceso:
La parte superior es el cobre de la cara de arriba,
y la parte inferior es el cobre de la cara de abajo.
Sabiendo el tamaño que va a ocupar nuestro DMX, es hora de hacerle un encapsulado. Para ello hemos cogido de un ordenador viejo todo aquello que ya no servía pero que sí podemos aprovechar. El encapsulado estará hecho de chapa metálica de lectores de CD, disqueteras, discos duros, etc... modificados según la necesidad de nuestra placa.
Aquí unas fotos de como quedaría más o menos la parte delantera para hacernos una idea, pero está incompleto aún:
En las imágenes podemos ver ya el jack de entrada, el conmutador de entrada jack/micrófono, interruptor y led de ON/OFF y los 3 leds delanteros, que indicarán graves, medios y agudos. Como podemos ver también, en los laterales hay unos agujeros para atornillar la chapa al resto del conjunto.
SÉPTIMA SEMANA
(Lunes 24 - Viernes 28 de Febrero)
Tras preparar la placa y aplicarle la máscara de soldadura, empezamos a soldar. Estas son algunas imágenes de la placa ya soldada:
Esta es una prueba en vídeo de que la primera fase de la placa funciona correctamente, es decir, que obtiene el sonido desde 2 fuentes distintas de audio y lo separa en 3 tonos diferentes.
En este vídeo le metemos la señal de audio por cable jack desde el ordenador, por eso no escuchamos el sonido, pero sí vemos a las luces actuar.
En este otro vídeo se obtiene el audio desde el micrófono, con lo que podemos escuchar la música a la vez que el micro controlador actúa sobre los leds.
OCTAVA SEMANA
(Martes 04 - Viernes 07 de Marzo)
Ya tengo la caja donde irá la placa. Para hacerla he aprovechado las chapas de ordenadores viejos y lectores de CD, las he recortado a mi gusto y les he ido haciendo los agujeros. Una vez comprobado que todo encajaba, la he pintado de color negro mate. La tapa será corredera.
Parte delantera:
Parte trasera:
Especificaciones sobre la obtención de audio del DMX:
Debido a la FFT, el valor mínimo que podríamos obtener es 117 Hz, y el valor máximo rondaría los 7500 Hz debido al ADC del Atmega, con lo que, para hacernos una idea, estaríamos perdiendo 3 de los valores que aparecen en los ecualizadores.
Como podemos ver en esta imagen de un ecualizador promedio, los supergraves de 30 Hz y 60 Hz los perdemos, lo mismo pasa con los superagudos de 16000 Hz. Como ya he dicho, esto es para hacerse una idea de lo que realmente está "escuchando" el DMX cuando obtiene el audio.
Memorias de una placa:
En este vídeo se puede ver el proceso de realización y el tratamiento que ha recibido la placa del DMX desde que era simplemente una placa de cobre de doble cara hasta ser lo que es hoy en día.
En este enlace se puede ver la memoria escrita en un documento, donde se puede ver el proceso explicado paso a paso.
Prueba de funcionamiento del bluetooth:
Primera prueba del programa de bluetooth, aún sin terminar del todo.
Prueba de Bombillas:
Con un programa básico hemos ido haciendo la prueba de que funciona la etapa de salida, antes de usarlo con el programa del psicodélico.
Este vídeo sería con el programa que debe llevar el psicodélico:
Diagrama de estados:
En este enlace podemos ver un diagrama de estados del DMX en funcionamiento.
Programa de arduino final:
"
#include <fix_fft.h>
#define MUESTRAFFT 128
char data[MUESTRAFFT];
char im[MUESTRAFFT];
unsigned char salida[MUESTRAFFT/2];
unsigned char valorBajos,valorMedios,valorAgudos;
byte comp,
compBajos,compMedios,compAgudos,
limiteBajos,limiteMedios,limiteAgudos;
void setup() {
Serial.begin(9600);
bitWrite(ADCSRA,ADPS2,1);
bitWrite(ADCSRA,ADPS1,0);
bitWrite(ADCSRA,ADPS0,1);
analogReference(INTERNAL*2);
pinMode(9,OUTPUT);
pinMode(10,OUTPUT);
pinMode(11,OUTPUT);
digitalWrite(9, LOW);
digitalWrite(10, LOW);
digitalWrite(11, LOW);
delay(500);
digitalWrite(9, HIGH);
delay(150);
digitalWrite(9, LOW);
digitalWrite(10, HIGH);
delay(150);
digitalWrite(10, LOW);
digitalWrite(11, HIGH);
delay(150);
digitalWrite(11, LOW);
delay(300);
digitalWrite(9, HIGH);
digitalWrite(10, HIGH);
digitalWrite(11, HIGH);
delay(300);
digitalWrite(9, LOW);
digitalWrite(10, LOW);
digitalWrite(11, LOW);
delay(300);
digitalWrite(9, HIGH);
digitalWrite(10, HIGH);
digitalWrite(11, HIGH);
delay(300);
digitalWrite(9, LOW);
digitalWrite(10, LOW);
digitalWrite(11, LOW);
delay(100);
comp = 0;
compBajos = 0;
compMedios = 0;
compAgudos = 0;
limiteBajos = 50;
limiteMedios = 50;
limiteAgudos = 50;
}
void loop() {
for( int i=0; i < MUESTRAFFT; i++) {
data[i] = analogRead(0)/4 -128;
im[i] = 0;
}
calculosHann (data);
fix_fft(data,im,7,0);
for (int i=0; i < MUESTRAFFT/2; i++){
salida[i] = data[i] * data[i] + im[i] * im[i];
}
if (Serial.available() > 0)
{
var = Serial.read();
if (var >= 2 && var <= 18){
BAJOS_MEDIOS = var;
}
if (var >= 19 && var <= 63){
MEDIOS_AGUDOS = var;
}
if(var == 70){
analogReference(INTERNAL*4);
}
if(var == 71){
analogReference(INTERNAL*3);
}
if(var == 72){
analogReference(INTERNAL*2.5);
}
if(var == 73){
analogReference(INTERNAL*2);
}
if(var == 74){
analogReference(INTERNAL*1);
}
if(var == 75){
analogReference(INTERNAL/2);
}
}
valorBajos = 0;
for (int i=2; i < 7; i++){
valorBajos += salida[i];
}
valorBajos = valorBajos/2;
valorMedios = 0;
for (int i=7 ; i < 35; i++){
valorMedios += salida[i];
}
valorMedios = valorMedios/2;
valorAgudos = 0;
for (int i=35; i < MUESTRAFFT/2; i++){
valorAgudos += salida[i];
}
valorAgudos = valorAgudos/2;
int siBajos = valorBajos > limiteBajos;
int siMedios = valorMedios > limiteMedios;
int siAgudos = valorAgudos > limiteAgudos;
digitalWrite(9,siBajos ? HIGH : LOW);
digitalWrite(10,siMedios? HIGH : LOW);
digitalWrite(11,siAgudos? HIGH : LOW);
compBajos += siBajos;
compMedios += siMedios;
compAgudos += siAgudos;
if ( ++comp > 10 ) {
comp = 0;
limiteBajos = 20 + compBajos*5;
limiteMedios = 20 + compMedios*5;
limiteAgudos = 20 + compAgudos*5;
compBajos = 0;
compMedios = 0;
compAgudos = 0;
}
}
void calculosHann (char *datos) {
double muestra = (double(MUESTRAFFT) - 1.0);
for (uint8_t i = 0; i < MUESTRAFFT/2 ; i++) {
double indice = double(i);
double ratio = (indice / muestra);
double factor = 0.5 * (1.0 - cos(6.28 * ratio));
datos[i] *= factor;
datos[MUESTRAFFT - (i + 1)] *= factor;
}
}
"
En este Gantt he estimado el tiempo que me puede llevar realizar todo el proyecto. He puesto tiempo de sobra en cada tarea para poder ir con tiempo o por si fallo en alguna de las tareas y tengo que volver a hacerla, comprobar errores, etc.
Manual de instrucciones:
Este es un documento con instrucciones de uso y precauciones del mismo.
(Click en la imagen para agrandar)