Está en la página 1de 26

CAJA DE RITMOS CON ECUALIZADOR

SISTEMAS EMPOTRADOS Y DE TIEMPO REAL

PROYECTO FINAL

Carmen Navacerrada lvarez Ignacio Lzaro Solera Alejandro Rubio Barrena

NDICE

Descripcin del proyecto Figura 1. Caja de ritmos Material utilizado y presupuesto Figura 2. Componentes utilizados para el proyecto Diagramas Figura 3. Esquema general de la placa y los nueve botones Figura 4. Esquema detallado con Arduino Dificultades Tiempo dedicado al proyecto Valores aadidos Figura 5. Medidas Opinin personal Bibliografa Anexo Cdigo del proyecto Cdigo del proyecto extra

pg 3 pg 3 pg 4 pg 4 pg 5 pg 5 pg 6 pg 7 pg 7 pg 7 pg 9 pg 10 pg 11 pg 12 pg 12 pg 20

DESCRIPCIN DEL PROYECTO


El proyecto consiste en la creacin de una caja de ritmos y un ecualizador. Se trata de una caja de madera que tiene incrustados nueve botones de diferentes colores. Cada botn estar asociado a un sonido, largo o corto. La meloda se reproducir por unos altavoces conectados al ordenador. La frecuencia generada por la msica dar lugar a las ondas que se movern en el ecualizador de la pantalla.

Figura 1. Caja de ritmos

MATERIAL UTILIZADO Y PRESUPUESTO


Arduino 1. Tres botones rojos. Tres botones azules. Tres botones amarillos. Nueve resistencias de 10K. Placa de insercin. Tres metros de cable. Ordenador porttil. Lmina de contrachapado. Spray de pintura negra. Clemas. Destornillador de clemas. Alicates. Altavoces. Proporcionado por la universidad. 4.5 4.5 4.5 Proporcionado por la universidad. Proporcionado por la universidad. 0.5 4.5 2.5 1.5 6.5 Total: 29

Figura 2. Componentes utilizados para el proyecto

DIAGRAMAS

Figura 3. Esquema general de la placa y los nueve botones

Figura 4. Esquema detallado con Arduino

DIFICULTADES
Inicialmente el proyecto iba a realizarse sin necesidad del ordenador. Para ello compramos un Music Shield que permita la reproduccin de canciones desde una tarjeta SD, y una matriz de leds para realizar el ecualizador. Cuando nos lleg el Music Shield nos dimos cuenta de que usaba todos los pines de Arduino, por lo que decidimos utilizar una interfaz grfica que simulase los botones. Para ello utilizamos Processing en lugar del entorno de programacin de Arduino. Vimos que Processing dispona de una librera que permita la reproduccin de sonidos, por lo que desechamos el Music Shield y preferimos reproducir las canciones desde el ordenador y seguir con la idea de crear fsicamente la caja de ritmos con los botones.

TIEMPO DEDICADO AL PROYECTO


Bsqueda de la idea y pedido de los materiales En horario de clase. Desarrollo de proyecto 5 das. 5 horas/da. Elaboracin de la memoria 3 horas. Creacin del vdeo y subida a Internet 3 horas. Estimacin total del tiempo dedicado al proyecto 40 horas.

VALORES AADIDOS
Processing ofrece un sinfn de posibilidades a la hora de realizar tu proyecto Arduino. Una de ellas es poder controlar Arduino desde el teclado o ratn a travs de un ordenador.

La idea de la caja de ritmos en un principio, fue implementada en Processing a travs de una interfaz grfica conectada al teclado numrico. A continuacin se explica el proceso de desarrollo de dicha aplicacin.

Una vez hayis echado un vistazo al proyecto, podris descargar sin problema la aplicacin y probarla en vuestro ordenador.

La idea era poder controlar el Arduino desde el teclado y a la vez ofrecer una interfaz grfica que mostrar cualquier tipo de interaccin.

Gracias a unos tutoriales de Processing encontrados en Youtube pudimos aprender como dibujar un array grficamente (una ventana con varios cuadrados alineados). Ms tarde echando un poco de imaginacin encontramos la forma de poder dibujar una matriz. Adems buscamos informacin de aadir color a la interfaz. Despus solo tuvimos que buscar procedimientos que usa Processing para controlar cuando se pulsa una tecla y el proyecto estuvo listo. Una de las partes ms importantes de este proyecto, adems de la interfaz, es el tratamiento de los sonidos en Processing. Gracias a la librera Minim, esto fue posible.

Desarrollo Esta parte fue la ms difcil y elaborada. La idea era dibujar una matriz pero Processing al parecer no tena mucha compatibilidad con las matrices. Sin embargo una matriz es un conjunto de arrays, por tanto con 3 arrays de 3 posiciones, o simplemente con un array de 9, se puede dibujar una matriz (realizando los bucles adecuadamente). En Processing para dibujar hay que tener en cuenta el tamao de la ventana y el tamao y posicin de lo que se quiere dibujar dentro. Se trabaja con pixeles. Simplemente se trata de hacer pruebas y realizar los clculos necesarios para que cuando ejecutemos el proyecto, se muestre por pantalla como esperamos.

Figura 4. Medidas

OPININ PERSONAL
Personalmente, el proyecto ha tenido sus pros y sus contras. La valoracin general es positiva. La creacin de un proyecto de estas caractersticas y la posibilidad de manejar hardware nos ha parecido interesante y entretenido. Nos ha resultado complicado elegir componentes, lo cual ha sido un problema significativo ya que era necesario tenerlos para empezar a trabajar en el proyecto. Adems una vez recibidos no hemos encontrado suficiente informacin para su uso. La bsqueda de la alternativa del uso de Processing ha sido muy positiva, era ms sencillo de utilizar ya que haba muchos tutoriales en internet. En definitiva, tras superar los problemas en cuanto a los materiales, y la decisin definitiva del proyecto, el montaje ha sido largo pero fructfero. Ha sido una experiencia divertida y muy creativa.

10

BIBLIOGRAFA
Tutoriales de Processing Arduino en Youtube: http://www.youtube.com/watch?v=8OHs1VqIzVU http://www.youtube.com/watch?v=QjvVPpjGWF8&feature=relmfu Pgina oficial de Processing: http://processing.org/ Librera de audio Minim: http://code.compartmental.net/tools/minim/ Pgina de efectos de sonido: http://free-loops.com/

11

CDIGO DEL PROYECTO


import processing.serial.*; import cc.arduino.*; import ddf.minim.*; import ddf.minim.signals.*; import ddf.minim.analysis.*; import ddf.minim.effects.*;

Serial port; Arduino arduino; AudioInput in; Minim minim; FFT fftLin;

float vector[]=new float[6]; // float magnitud=4; float volumen; int volumenCaptado;

// DECLARACIN DE CANCIONES

AudioPlayer songAmarilloUno; AudioPlayer songAmarilloDos; AudioPlayer songAmarilloTres;

AudioPlayer songAzulUno; AudioPlayer songAzulDos; AudioPlayer songAzulTres;

AudioPlayer songRojoUno; AudioPlayer songRojoDos; AudioPlayer songRojoTres;

// DECLARACIN DE PINES

int amarilloUno=2; int amarilloDos=3;

12

int amarilloTres=4; int azulUno=5; int azulDos=6; int azulTres=7; int rojoUno=8; int rojoDos=9; int rojoTres=10;

int contador1=0; int contador2=0; int contador3=0;

void setup(){

println(Serial.list()); if (port==null) port = new Serial(this, Serial.list()[1], 9600); size(512, 700, P3D); volumen=1;

arduino=new Arduino(this,Arduino.list()[2],57600); minim= new Minim(this); in = minim.getLineIn(Minim.STEREO, 2048); fftLin = new FFT(in.bufferSize(), in.sampleRate()); fftLin.linAverages(240); rectMode(CORNERS);

// INDICAMOS QUE TODOS LOS PINES SON DE ENTRADA

arduino.pinMode(amarilloUno,Arduino.INPUT); arduino.pinMode(amarilloDos,Arduino.INPUT); arduino.pinMode(amarilloTres,Arduino.INPUT);

arduino.pinMode(azulUno,Arduino.INPUT); arduino.pinMode(azulDos,Arduino.INPUT); arduino.pinMode(azulTres,Arduino.INPUT);

arduino.pinMode(rojoUno,Arduino.INPUT);

13

arduino.pinMode(rojoDos,Arduino.INPUT); arduino.pinMode(rojoTres,Arduino.INPUT);

// INICIALIZAMOS LAS CANCIONES

songAmarilloUno = minim.loadFile("1.mp3"); songAmarilloDos = minim.loadFile("2.mp3"); songAmarilloTres = minim.loadFile("3.mp3");

songAzulUno = minim.loadFile("4.mp3"); songAzulDos = minim.loadFile("5.mp3"); songAzulTres = minim.loadFile("6.mp3");

songRojoUno = minim.loadFile("7.mp3"); songRojoDos = minim.loadFile("8.mp3"); songRojoTres = minim.loadFile("9.mp3");

void draw(){

//ECUALIZADOR

background(0); fftLin.forward(in.mix);

noStroke(); int w = int(width/6);

for(int i = 0; i < 120; i++){ if (i<=1){ if (vector[0]<2*fftLin.getAvg(i)) vector[0]=2*fftLin.getAvg(i); fill(255,0,0); // Los multiplicadores cumplen la funcin de ajustar la respuesta visual. En cada barra del ecualizador es diferente }

14

else if (i<=5){ if (vector[1]<1.2*fftLin.getAvg(i)) vector[1]=1.2*fftLin.getAvg(i); fill(255,0,0); } else if (i<=12){ if (vector[2]<1.6*fftLin.getAvg(i)) vector[2]=1.6*fftLin.getAvg(i); fill(0,0,255); } else if (i<=22){ if (vector[3]<1.75*fftLin.getAvg(i)) vector[3]=1.75*fftLin.getAvg(i); fill(0,0,255); } else if (i<=55){ if (vector[4]<2*fftLin.getAvg(i)) vector[4]=2*fftLin.getAvg(i); fill(255,255,0); } if (i<=160){ vector[5]=i*fftLin.getAvg(i)/300+vectormedias[5]; fill(255,255,0); } if (i==119){ for (byte k=0;k<6;k++){ delay(10); // El nmero que hay a continuacin es el nivel real que se recibe como input. if (in.mix.level()>0.001){ volumen=volumen*0.998+in.mix.level()*0.002*10; // Se multiplica por 10 para que sea cercano a 1 volumenCaptado=int(magnitud*vector[k]/volumen); //Manda la cantidad de volumen captado a Arduino y a las barras. if (volumenCaptado>300) volumenCaptado=300; volumenCaptado=volumenCaptado/10; port.write((k<<5)|byte(volumenCaptado)); rect(k*w, height, k*w + w, height - magnitud*vector[k]/volumen);

15

// Dibuja las barras en la ventana de Processing } else{ // Entra por esta rama cuando hay un volumen muy bajo volumen=0.4; port.write((k<<5)); delay(100); }

vector[k]=0; // Igualamos a 0 para la nueva iteracin

} }

//BOTON AMARILLO 1

if ((arduino.digitalRead(amarilloUno)==Arduino.HIGH)){

contador1++; delay(200); if (contador1%2==1){ songAmarilloUno = minim.loadFile("1.mp3"); songAmarilloUno.play(); } else { songAmarilloUno.close(); } }

//BOTON AMARILLO 2

if ((arduino.digitalRead(amarilloDos)==Arduino.HIGH)){ contador2++; delay(200);

16

if (contador2%2==1){ songAmarilloDos = minim.loadFile("2.mp3"); songAmarilloDos.play(); } else { songAmarilloDos.close(); } }

//BOTON AMARILLO 3

if ((arduino.digitalRead(amarilloTres)==Arduino.HIGH)){ contador3++; delay(200); if (contador3%2==1){ songAmarilloTres = minim.loadFile("3.mp3"); songAmarilloTres.play(); } else { songAmarilloTres.close(); } }

// BOTON AZUL 1

if ((arduino.digitalRead(azulUno)==Arduino.HIGH)){ songAzulUno.close(); delay(5); songAzulUno = minim.loadFile("4.mp3"); songAzulUno.play(); }

// BOTON AZUL 2

if ((arduino.digitalRead(azulDos)==Arduino.HIGH)){ songAzulDos.close();

17

delay(10); songAzulDos = minim.loadFile("5.mp3"); songAzulDos.play(); }

// BOTON AZUL 3

if ((arduino.digitalRead(azulTres)==Arduino.HIGH)){ songAzulTres.close(); delay(15); songAzulTres = minim.loadFile("6.mp3"); songAzulTres.play(); }

// BOTON ROJO 1

if ((arduino.digitalRead(rojoUno)==Arduino.HIGH)){ songRojoUno.close(); delay(15); songRojoUno = minim.loadFile("7.mp3"); songRojoUno.play(); }

// BOTON ROJO 2

if ((arduino.digitalRead(rojoDos)==Arduino.HIGH)){ songRojoDos.close(); delay(15); songRojoDos = minim.loadFile("8.mp3"); songRojoDos.play(); }

// BOTON ROJO 3

if ((arduino.digitalRead(rojoTres)==Arduino.HIGH)){ songRojoTres.close(); delay(15); songRojoTres = minim.loadFile("9.mp3");

18

songRojoTres.play(); }

void stop() { // Cerrarmos las libreras minim in.close(); // Y paramos antes de salir minim.stop(); }

19

CDIGO DEL PROYECTO EXTRA


//MATRIZ DE BOTONES (TECLADO_NUMERICO)

import processing.serial.*; import cc.arduino.*; import ddf.minim.*; import ddf.minim.signals.*; import ddf.minim.analysis.*; import ddf.minim.effects.*;

Arduino arduino; Minim minim; AudioPlayer song1; AudioPlayer song2; AudioPlayer song3; AudioPlayer song4; AudioPlayer song5; AudioPlayer song6; AudioPlayer song7; AudioPlayer song8; AudioPlayer song9;

color off=color(0,0,0);

color blanco =color(255,255,255); color rojo=color(255,0,0); color azul=color(0,0,255); color amarillo = color(255,255,0);

int[] values={Arduino.LOW,Arduino.LOW,Arduino.LOW,Arduino.LOW,Arduino.LOW,Arduino.LOW,Arduino.LO W,Arduino.LOW,Arduino.LOW};

20

/*En este apartado se realizan los import necesarios para poder trabajar con Arduino, el puerto serie y la librera minim. Adems se declaran las variables de las canciones y los colores (esos tres campos son los de la escala RGB, se puede mirar en Wikipedia) . Por ltimo se declara el array que va a contener a los cuadrados (en abstracto). */

void setup(){

size(500,500); arduino=new Arduino(this,Arduino.list()[2],57600); minim= new Minim(this);

//INICIALIZAMOS LAS CANCIONES

song1 = minim.loadFile("1.mp3"); song2 = minim.loadFile("2.mp3"); song3 = minim.loadFile("3.mp3"); song4 = minim.loadFile("4.mp3"); song5 = minim.loadFile("5.mp3"); song6 = minim.loadFile("6.mp3"); song7 = minim.loadFile("7.mp3"); song8 = minim.loadFile("8.mp3"); song9 = minim.loadFile("9.mp3");

/* size(500,500); size sirve para dibujar la ventana arduino=new Arduino(this,Arduino.list()[2],57600) Muy importante. Con esto inicializamos nuestra variable arduino y le indicamos en que Puerto y a qu velocidad se va a comunicar processing con arduino. (El nmero que va entre corchetes puede variar en funcin del usb en el que hayais conectado el Arduino).*/

void draw(){

background(off); stroke(blanco); //Sirve para pintar el marco de loscuadrados del mismo color

21

//PINTAMOS LA PRIMERA FILA ( 1,2,3) (abajo segn teclado numrico)

for(int i=0 ; i<=2 ;i++){ if(values[i]==Arduino.HIGH){ fill(amarillo); //Para pintar el cuadrado por dentro (de amarillo) rect((i*150)+51,350,100,100); // rect(x, y, width, height) } else{ fill(off); rect((i*150)+51,350,100,100); } }

//PINTAMOS LA SEGUNDA FILA (4,5,6) for(int i=0 ; i<=2 ;i++){ if(values[i+3]==Arduino.HIGH){ fill(azul); //Para pintar el cuadrado por dentro (de azul) rect((i*150)+51,200,100,100); // rect(x, y, width, height) } else{ fill(off); rect((i*150)+51,200,100,100); } }

//PINTAMOS LA TERCERA FILA (7,8,9) for(int i=0 ; i<=2 ;i++){ if(values[i+6]==Arduino.HIGH){ fill(rojo); //Para pintar el cuadrado por dentro (de rojo) rect((i*150)+51,50,100,100); // rect(x, y, width, height) } else{ fill(off); rect((i*150)+51,50,100,100);

22

} }

/*Aqu se muestran tres bucles que son los que dibuja verdaderamente la matriz y los que controlan en la interfaz cuando se debe colorear un cuadrado(botn pulsado) o cuando se debe dejar en negro(botn sin pulsar). Otro dato es que la matriz est dibujada de abajo a arriba y de izquierda a derecha. Si tenis algn problema con algn bucle simplemente mirar el dibujo en el apartado de desarrollo y lo entenderis. Si el valor de la posicin de array es Arduino.HIGH ,habr que dibujar el cuadrado (fill() ) y dibujarlo con la funcion rect ( x,y, width,height). En el caso del primer bucle a medida que vayamos recibiendo las posiciones v[0],v[1] o v[2], se va a situar en el pixel donde empieza el cuadrado, y por tanto lo dibujar. El 150 es para situarme en el eje correspondiente de las Y , y el 51 para situarme en el de las x (segn multipliquemos).*/

void keyPressed(){

if (key=='1'){ if(values[0]==Arduino.LOW){ values[0]= Arduino.HIGH; song1 = minim.loadFile("1.mp3"); song1.play(); } else{ values[0]= Arduino.LOW; song1.close(); } }

if (key=='2'){ if(values[1]==Arduino.LOW){ values[1] = Arduino.HIGH; song2=minim.loadFile("2.mp3"); song2.play();

23

} else{ values[1] = Arduino.LOW; song2.close(); } }

if (key=='3'){ if(values[2]==Arduino.LOW){ values[2] = Arduino.HIGH; song3=minim.loadFile("3.mp3"); song3.play(); } else{ values[2] = Arduino.LOW; song3.close(); } }

if (key=='4'){ if(values[3]==Arduino.LOW){ values[3] = Arduino.HIGH; song4=minim.loadFile("4.mp3"); song4.play(); } else{ values[3] = Arduino.LOW; song4.close(); } }

if (key=='5'){ if(values[4]==Arduino.LOW){ values[4] = Arduino.HIGH; song5=minim.loadFile("5.mp3");

24

song5.play(); } else{ values[4] = Arduino.LOW; song5.close(); } }

if (key=='6'){ if(values[5]==Arduino.LOW){ values[5] = Arduino.HIGH; song6=minim.loadFile("6.mp3"); song6.play(); } else{ values[5] = Arduino.LOW; song6.close();

} }

if (key=='7'){ if(values[6]==Arduino.LOW){ values[6] = Arduino.HIGH; song7=minim.loadFile("7.mp3"); song7.play();

} else{ values[6] = Arduino.LOW; song7.close(); } }

if (key=='8'){ if(values[7]==Arduino.LOW){ values[7] = Arduino.HIGH;

25

song8=minim.loadFile("8.mp3"); song8.play(); } else{ values[7] = Arduino.LOW; song8.close(); } }

if (key=='9'){ if(values[8]==Arduino.LOW){ values[8] = Arduino.HIGH; song9=minim.loadFile("9.mp3"); song9.play();

} else{ values[8] = Arduino.LOW; song9.close(); } }

/*Esta parece ser la parte ms larga, pero no os asustis pues es la ms sencilla. Se trata de 9 bucles que hacen exactamente los mismo, por tanto explicar solo uno. Esto se ha hecho as porque no es posible hacer un array de canciones. Adems usar una sola variable para cargar en ella todas las canciones hara que hubiera algn tipo de delay. Si pulsamos la tecla 1, si el valor de la posicin 0 del array esta en LOW(apagado) , pasar a estar HIGH, se cargar la cancin y se pondr en funcionamiento. En caso contrario (posicin 0 del array = HIGH), la posicin del array se pondr a LOW y la cancin parar.*/

26