Skip to main content

Reto del piano

El objetivo de este reto es contruir un teclado, que se asemeje a un piano, con por lo menos siete notas, utilizando sensores capacitivos y un buzzer. Estos sensores nos permiten detectar el contacto de nuestros dedos con el grafito que contiene el lápiz común. Y variando las frecuencias con las que alimentamos el buzzer desde nuestro arduino, podemos generar las notas correspondientes a cada una de las teclas que dibujamos.

Materiales y circuito

Para este reto utilizaremos los siguientes materiales:

  • Papel y lápiz 📝
  • Cables con clips 🖇️
  • Protoboard
  • Cable jumpers
  • Arduino UNO
  • Buzzer
  • Resistencias de 1 Mohm (una por tecla)
  • Resistencia de 100 ohms

Aqui puedes ver una propuesta de circuito que integra siete teclas (Do, Re, Mi, Fa, Sol, La, Si), si quieres hacer música en serio, tal vez necesites más.

pines reservados

Como verás más abajo los pines 9 y 10 los deberás reservar para el buzzer, no lo uses para otras teclas!

Las teclas capacitivas

In electrical engineering, capacitive sensing (sometimes capacitance sensing) is a technology, based on capacitive coupling, that can detect and measure anything that is conductive or has a dielectric different from air.

📖 wikipedia

Para detectar cuando alguien está tocando las teclas utilizaremos sensores capacitivos como los que hemos utilizado en clase. Cuando algún material conductivo (como nosotros) toca estos sensores, desvía una parte de los electrones acumulados en un condensador, al detectar este cambio con nuestro microcontrolador, sabemos que es hora de beep.

Existen diferentes técnicas para construir este tipo de sensores, los más sencillos utilizan el ADC y la circuitería interna del Arduino. Los podemos hacer funcionar utilizando la librería ADCTouch y un sólo cable, sin embargo, tienen la desventaja de que sólo se pueden conectar a los pines analógicos (A0 → A5) y por lo tanto sólo podemos tener 6 sensores por Arduino, no nos alcanzan para las notas de nuestro piano!!

Hay otra técnica, que podemos construir utilizando cualquier pin del Arduino, un cable y una resistencia muy grande (1 Mohm). Para esto utilizaremos la librería Capacitive Sensor para Arduino, que podemos instalar directamente desde el manejador de librerías del Arduino IDE.

pista: array de sensores

Una vez que pruebes un sensor y veas que todo funciona, necesitarás lo mismo pero muchas veces, tal vez la mejor opción es utilizar un array??

CapacitiveSensor* sensores[NUM_NOTAS];

for (int i = 0; i < NUM_NOTAS; i++) {
sensores[i] = new CapacitiveSensor(PIN_EMISOR, pines[i]);
}

Esto es un array de punteros, recuerda que cuando llames un método del puntero al objeto debes utilizar ->

int value = sensores[i]->capacitiveSensor(30);

Grafito

El grafito es de color negro y gris con brillo metálico, refractario y se exfolia con mucha facilidad. En la dirección perpendicular a las capas presenta una conductividad de la electricidad baja, que aumenta con la temperatura, comportándose pues como un semiconductor.

📖 wikipedia

Los cables no son la mejor tecla, por esta razón utilizaremos un papel para dibujar una teclas más cómodas y prácticas para hacer música. El lápiz contiene grafito, que gracias a su conductividad nos puede servir como extensión de nuestro sensor capacitivo. Para conectar nuestro teclado dibujado al Arduino podemos utilizar clips comunes con un cable soldado.

remarcadísimo

Para que pueda pasar suficiente corriente por nuestro dibujo, los trazos tienen que tener un ancho razonable y debemos pasar el lápiz muuuchas veces apretando fuerte.

Calibrado

Los valores que obtenemos de un sensor capacitivo varían mucho dependiendo de variables como el largo de los cables, el ancho de los trazos en el papel, etc. Por esta razón, una vez que tengamos los sensores conectados tal y como van a quedar al final, con el dibujo conectado y los cables que correspondan, tenemos que calibrarlos.

Para esto podemos utilizar un código muy sencillo que simplemente lea el sensor y lo envíe por el puerto serial a nuestro ordenador. Observando como cambian los valores el tocar los sensores podremos decidir en que valor declarar que la tecla está siendo tocada y utilizarlo en nuestro código para emitir los sonidos correspondientes.

calibrado

Si tus sensores se comportan de manera herrática, asegúrate de que tu ordenador está conectado al enchufe de la pared y pruébalos de nuevo.

recursos generales de sensores capacitivos

Capacitive Sensor Arduino Library
ADCTouch Arduino Library
Capacitive Sensing for Dummies
Video de dibujos a lapiz como sensores capacitivos en youtube.com

Sonidos

Una vez que podemos detectar cuando se han tocado las teclas, es hora de hacer ruido!. Para poder hacer ruido, perdón... música, utilizaremos un buzzer y lo alimentaremos con una onda cuadrada con diferente frecuencia dependiendo de la nota. El voltaje que utilicemos para generar esta onda controlará el volumen.

En las librerías standard de Arduino, se incluye una función que nos permite generar pulsos a una determinada frecuencia para que la vibración de nuestro buzzer genere un sonido específico: la función tone().

Por varias razones, para este ejercicio se recomienda utilizar la librería toneAC que sustituye la función por defecto con una que ofrece algunas ventajas, la más importante para nuestro caso es la posibilidad de controlar el volumen!

Esta librería se puede instalar desde dentro de el Arduino IDE y se puede utilizar simplemente substituyendo tone() por toneAC().

Connection is very similar to a piezo or standard speaker. Except, instead of connecting one speaker wire to ground you connect both speaker wires to Arduino pins. The pins you connect to are specific, as toneAC lets the ATmega microcontroller do all the pin timing and switching.

Pins 9 & 10 - ATmega328, ATmega128, ATmega640, ATmega8, Uno, Leonardo, etc.

📖 wiki.toneAC

Como se puede ver en esta imagen de ejemplo la conexión del buzzer para su uso con esta librería, además de ser en unos pines específicos (9 y 10), requiere de una resistencia de 100 Ohms en una de sus conexiones.

Notas

Para tocar las notas que corresponden a cada una de nuestras teclas, necesitamos conocer sus diferentes frecuencias, en esta tabla puedes ver las frecuencias de las notas y las diferentes octavas. Para este reto se deberían poder tocar con nuestro teclado por lo menos siete notas, claro que si quieres poner más no hay ningún problema, sólo asegúrate de que te va a dar tiempo!

array de notas

Para hacerte la vida más fácil puedes guardar los valores de las frecuencias en un array:

int frecuencias[] = { 262, 294, 330, 349, 392, 440, 494 };

Teclas realistas

Cuando tocas una tecla en un piano de verdad, no se queda sonando indefinidamente. Después del impacto inicial, el sonido va disminuyendo hasta que desaparece por completo.
Para lograr esto tenemos que poder controlar el voltaje que alimentamos al buzzer, que se traduce en volumen y no sólo la frecuencia de los pulsos que se traduce en tono. Esta es la razon principal por la cuál se recomendó el uso de la librería toneAC.

Como se indica en la documentación de esta librería, podemos pasar el volumen (además de la frecuencia) del sonido que queremos generar como parámetro a la función toneAC()

toneAC( frequency [, volume [, length [, background ]]] ) - Play a note.

  • frequency - Play the specified frequency indefinitely, turn off with toneAC().
  • volume - [optional] Set a volume level. (default: 10, range: 0 to 10 [0 = off])
  • length - [optional] Set the length to play in milliseconds. (default: 0 [forever], range: 0 to 2^32-1)
  • background - [optional] Play note in background or pause till finished? (default: false, values: true/false)

📖 wiki.toneAC

Si guardamos nuestro nivel de volumen en una variable, y le vamos restando un porcentaje de su tamaño en cada ciclo de nuestro loop(), el sonido irá desapareciendo de forma gradual, como se hace en este ejemplo:

volumen = volumen - (volumen * 0.1);
toneAC(frecuencia, volumen);
súbele

Recuerda que cuando detectes que se tocó una tecla tendrás que subir de nuevo el volumen al máximo para que tu piano haga ruido!

recomendaciones generales
  • Divide y vencerás: Siempre prueba las cosas una por una, mientras más sencillo sea el circuito a probar, mejor!
  • Mucho códigos: Escribe tu código por partes, empieza probando cada paso por separado y una vez que todo funcione, intégralo en un sólo archivo.
  • No adivines: Cuando algo no funcione, piensa una estrategia metódica para ir probando sus partes. El Serial.print() es un buen amigo en estos casos.
  • Administra el tiempo: Organiza las tareas y ejecútalas según su importancia. No te quedes todo el reto resolviendo algo que no era indispensable!!