Arduino – Capítulo 9 – Teclado musical

¿Un teclado musical? ¿Como vamos a hacerlo? Pues muy fácil, utilizando una técnica llamada escalera de resistencias. Dicha técnica nos permite leer cierto número de pulsadores utilizando la entrada analógica de nuestro Arduino. Es muy útil cuando nos encontramos con que andamos cortos de entradas digitales. Tendremos varios pulsadores encadenados en paralelo  a la entrada analógica cero, algunos de ellos conectados a la alimentación mediante una resistencia. Cuando pulsemos cada uno de ellos, llegará un nivel diferente de tensión al pin de entrada. Si pulsamos dos al mismo tiempo, obtendremos una entrada única formada por la combinación de las dos resistencias en paralelo. La siguiente figura ilustra el esquema de conexiones correspondiente.

Escalera de resistencias

Escalera de resistencias

Montando el circuito

Para montar el circuito de este proyecto necesitamos los siguientes componentes:

– 4 pulsadores.

– 1 altavoz piezoeléctrico.

– 1 resistencia de 220Ω.

– 2 resistencia de 10KΩ.

– 1 resistencia de 1MΩ.

Una vez tenemos los componentes necesarios, debemos seguir los siguientes pasos:

1 – Conectamos los cables de alimentación a la protoboard.

2 – Una patilla del altavoz la unimos a tierra y la otra al pin 8 del Arduino.

3 – Colocamos los pulsadores a lo largo de la separación central de la protoboard.

4 – Seguidamente, conectaremos la entrada de cada pulsador a la alimentación. El primero estará unido directamente, el segundo mediante una resistencia de 220Ω, el tercero mediante una de 10KΩ y el cuarto con una de 1MΩ.

5 – Por último, conectaremos la salida de cada pulsador con un cable. La salida del primero irá a la salida del segundo, la del segundo al tercero, la del tercero a la salida del cuarto y por último, la salida del cuarto la conectaremos a la entrada analógica cero de nuestro Arduino y a tierra mediante una resistencia de 10KΩ.

Terminado de montar el circuito, deberíamos de tener algo parecido al mostrado en la siguiente figura.

Diseño de protoboard

El esquema eléctrico correspondiente sería:

Esquema electrico

El código

Comencemos por comentar paso a paso el código fuente con el que vamos a programar nuestro Arduino.

Para empezar, necesitaremos una lista de las frecuencias que vamos a reproducir cada vez que activemos un pulsador. Escogeremos por ejemplo las frecuencias de 262Hz, 294Hz, 330Hz y 349Hz. Para conseguir esto, necesitamos un nuevo tipo de variable llamado array.

Un array es una manera de almacenar diferentes valores que están relacionados unos con otros, como las frecuencias de una escala musical, utilizando un solo nombre. Es una herramienta muy útil para acceder de forma rápida y eficiente a la información. Para declarar un array se empieza igual que con cualquier otra variable, pero a continuación del nombre, colocaremos un par de corchetes: []. Si queremos leer o cambiar los elementos de un array, debemos hacer referencia  a cada elemento de forma individual utilizando el nombre del array y la posición (o índice) de dicho elemento dentro del array. El índice hace referencia al orden en el que los elementos aparecen cuando se crea el array. El primer elemento de dicho array es el ítem 0, el segundo el ítem 1 y así sucesivamente.

int buttons[6];
// Creamos un array de 6 integers.

int buttons[0] = 2;
// Le asignamos al primer elemento del array el valor 2.

Lo primero que haremos en nuestro programa es crear un array con las frecuencias que hemos comentado antes. Para lograr que este array sea una variable global y que por consiguiente sea visible desde cualquier parte de nuestro programa, lo declararemos antes de la función setup().

int notes[] = {262,294,330,349};

Seguidamente, dentro de la función setup(), iniciaremos la comunicación serie con nuestro pc.

void setup(){

    Serial.begin(9600);

}// Fin de la función setup.

En la función loop(), declararemos una variable local para almacenar el valor obtenido del pin A0. Como cada pulsador tiene una resistencia diferente conectada a la alimentación, también cada uno de ellos tendrá asociado un valor diferente al del resto. Para poder ver dichos valores, añadiremos la línea Serial.println(keyVal), así nos enviará la información a nuestro pc.

void loop(){

    int keyVal = analogRead(A0);
    Serial.println(keyVal);

A continuación, utilizando la sentencia if()… else, podremos asignar cada valor a un tono diferente. Los valores incluidos en el programa de ejemplo son aproximaciones al valor de las resistencias. Todas las resistencias tienen una tolerancia o margen de error, por lo que posiblemente sus valores reales no coincidan. Para realizar los ajustes necesarios en el programa, observemos la información obtenida a través del monitor serie.

if(keyVal == 1023){
        tone(8, notes[0]);
}

Bien, ahora vamos a empezar a reproducir las notas. Tras cada sentencia if(), llamaremos a la función tone(). El programa hará referencia al array para determinar que frecuencia debe reproducir. Si el valor de A0 coincide con una de las sentencias if(), entonces, le diremos a nuestro Arduino que reproduzca un sonido. Es posible que nuestro circuito posea un poco de ruido y esto haga que los valores fluctúen un poco cuando presionamos el pulsador. Para adaptarnos a dicha variación, es buena idea disponer de un rango de valores con los que contrastar. Si utilizamos el símbolo de comparación “&&“, podemos comprobar múltiples condiciones y ver cual es cierta.

Si activamos el primer pulsador, se reproducirá notes[0]. Si es el segundo, será notes[1] y si presionamos el tercero se reproducirá notes[2]. Es en estos casos cuando los array son realmente útiles.

    else if(keyVal >= 990 && keyVal <= 1010){
        tone(8, notes[1]);
    }
    else if(keyVal >= 505 && keyVal <= 515){
        tone(8, notes[2]);
    }
    else if(keyVal >= 5 && keyVal <= 10){
        tone(8, notes[3]);
    }

Solo podemos reproducir una frecuencia en un pin al mismo tiempo, por lo que si presionamos varios pulsadores a la vez, tan solo oiremos un único sonido.

Para detener la reproducción de las notas cuando no haya ningún pulsador activado, llamaremos a la función noTone(), a la que le diremos el número de pin al que debe indicar que pare de reproducir el sonido.

    else{
        noTone(8);
    }


}// Fin de la función loop.

Puesta en marcha

Si nuestras resistencias son de un valor aproximado a las del programa de ejemplo, deberíamos escuchar algunos sonidos cuando presionemos los pulsadores. Si no es así, tendremos que observar el monitor serie y comprobar que los pulsadores están dentro del rango correspondiente a las notas de las sentencias if()…else. Si por un casual escucháramos un sonido similar a un tartamudeo, tendremos que probar de incrementar un poco el rango establecido.

Probemos a presionar varios pulsadores al mismo tiempo y observemos que tipo de valores obtenemos en el monitor serie. Podremos utilizar dichos valores para obtener nuevos sonidos. Otra opción es experimentar con otras frecuencias para ampliar el abanico de sonidos. Podemos encontrar un listado de notas musicales y sus respectivas frecuencias en este enlace: arduino.cc/frequencies

Un dato que debemos tener en cuenta, es que la función tone() solo puede generar un tren de ondas cuadradas, pero no sinusoidales ni triangulares. Si queremos montar una banda de música, deberíamos tener en cuenta lo siguiente: solo se puede reproducir una nota al mismo tiempo y también que, la función tone() interfiere con la analogWrite() en los pines 3 y 11.

Conclusión

Bien, en este proyecto hemos aprendido que es una escalera de resistencias y como utilizarla para crear nuestro teclado musical. Del mismo modo, hemos aprendido que son y como se utilizan los arrays a la hora de realizar nuestros programas. Pero… ¿como podríamos mejorar y/o ampliar nuestro proyecto? Tal vez añadiendo más pulsadores con sus respectivas resistencias para de este modo crear un teclado mucho más completo y que se parezca a un auténtico teclado electrónico. También podríamos crear un teclado numérico para abrir puertas, de hecho, los teclados numéricos de los teléfonos de sobremesa no son más que una cuadrícula de frecuencias, cuyo funcionamiento es prácticamente el mismo que el teclado desarrollado en este capítulo.

 

Espero que os haya gustado.

Un saludo y muchas gracias por leer este artículo.  ^_^

 

Referencias

– Artículo basado en el capítulo “Project 07 – Keyboard Instrument” del libro “Arduino Projects Book” distribuido por Arduino.cc junto con su “The Arduino Starter Kit“.

– Más información acerca de los arrays aquí.

– Más información acerca de la función noTone() aquí.

 

Anuncios

3 pensamientos en “Arduino – Capítulo 9 – Teclado musical

  1. Pingback: Ardunio – Capítulo 14 – Cerradura de vibración | El gato inquieto

  2. me tira error el código, este lo escribí dos veces, la 1era copiandolo del libro pero no resulto y la segunda copiandolo de tu tutorial e igual me mando este mensaje de error

    Arduino:1.8.1 (Windows 10), Tarjeta:”Arduino/Genuino Uno”

    proyecto_7_piano:4: error: conflicting declaration ‘int buttons [0]’

    int buttons[0] = 2;

    ^

    C:\Users\Carolina Bustamante\Documents\Arduino\proyecto_7_piano\proyecto_7_piano.ino:1:5: note: previous declaration as ‘int buttons [6]’

    int buttons[6];

    ^

    C:\Users\Carolina Bustamante\Documents\Arduino\proyecto_7_piano\proyecto_7_piano.ino: In function ‘void loop()’:

    proyecto_7_piano:20: error: ‘o’ was not declared in this scope

    tone(8, notes[o]);

    ^

    proyecto_7_piano:34: error: expected ‘;’ before ‘}’ token

    }

    ^

    exit status 1
    conflicting declaration ‘int buttons [0]’

    Este reporte podría tener más información con
    “Mostrar salida detallada durante la compilación”
    opción habilitada en Archivo -> Preferencias.

    que puedo hacer?

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s