Tutoriales

Piano con Arduino y un teclado matricial

Si te gusta la electrónica o sientes curiosidad por ella, en TIC Las Palmas también mostramos algunas cosas que puedes hacer en casa sin demasiadas complicaciones. Los ejemplos que verás aquí (utilizando la famosa placa Arduino) son perfectos para aprender. Conocer el funcionamiento de Arduino es una buena manera de iniciarse en el mundo de la electrónica ya que nos permite crear proyectos muy interesantes por muy poco dinero.

En este tutorial explicaremos cómo crear un pequeño piano con las notas básicas para tocar algunas canciones.

Arduino

Arduino es una diminuta placa de desarrollo originada en Italia para ser empleada en proyectos multidisciplinares. Al tratarse de hardware libre existen muchísimas versiones en la red (aparte de la oficial). También podríamos construir una con estos esquemas si fuésemos unos manitas.

Dispone de su propio lenguaje de programación basado en Processing y en los últimos 6-7 años se ha convertido en la placa de desarrollo por excelencia. Esta situación se debe principalmente a su módico precio y a su facilidad de programación vía USB.

ardupiano_06.jpg

Materiales

Para poder llevar a cabo nuestro modesto proyecto vamos a necesitar los siguientes elementos (siempre podemos introducir alguna modificación en el modelo de placa, número de teclas en el teclado, etc.):

  • 1 Placa Arduino (UNO)
  • 1 Protoboard
  • 1 Cable USB
  • 1 Teclado matricial 4x4
  • 1 Resistencia de 100Ω
  • 10 Jumpers
  • 1 Buzzer
  • IDE Arduino (Software)

Si no dispones de estos elementos, puedes comprarlos por poco dinero en alguna web china con envío gratuito. La suma del coste de todos los materiales (incluida la placa) podría rondar los 15-16 euros (20 dólares).

ardupiano_03.jpg

El importe calculado arriba se corresponde con una simulación realizada en la tienda Banggood.

El teclado matricial

Este componente merece su propio apartado dentro del tutorial ya que es importante aclarar algunos de sus aspectos más básicos.

Los teclados matriciales son una forma de ahorrar recursos a la hora de capturar las pulsaciones. En un ordenador tenemos muchísimas teclas y quizás pienses que cada tecla actúa como un interruptor individual que es controlado por varios pines (uno de entrada y otro de salida). El funcionamiento real de un teclado es algo distinto, las conexiones están dispuestas como si de una matriz matemática se tratase: en filas y columnas. Es decir, si tuviésemos un teclado de 100 teclas no necesitaríamos 100 entradas para ver que tecla se ha pulsado, sino que bastaría con 20 (10 entradas y 10 salidas).

¿Pero entonces como detecta cuál ha sido la tecla pulsada?

Bien, digamos que el microcontrolador utiliza las 10 salidas para enviar una señal alta por ellas de forma intermitente: cuando la primera salida está en nivel alto las 9 restantes estarán en nivel bajo. Luego, el nivel alto pasará a la segunda salida y las restantes estarán a nivel bajo. Y así hasta completar el bucle.

Todo sucede a una velocidad muy rápida, por eso no notamos ningún funcionamiento errático cuando hacemos uso de este tipo de dispositivos. Veamos un ejemplo más esclarecedor:

ardupiano_05.gif

Si te fijas, existe una señal que se envía de manera cíclica por un único pin. Gracias a esto podemos llegar a comprender por qué la tecla es identificada correctamente. Si conocemos cuáles son las salidas y entradas activas seremos capaces de mapear la tecla pulsada.

Montar el circuito

Puedes seguir el siguiente esquema de montaje que hemos generado con Fritzing para que te resulte mucho más sencillo:

ardupiano_04.png

Nota: Si ya estás familiarizado con los teclados matriciales, es posible que te parezca extraño que no hayamos colocado ninguna resistencia (o diodo) conectada a los pulsadores. La librería de manejo de teclados que vamos a utilizar se encuentra configurada para usar las resistencias pullup de sus pines (20KΩ), con lo cual estos elementos no son necesarios.

Código

Una vez que ya tenemos todo montado es hora de programar el microcontrolador. Abrimos el IDE de Arduino y nos ponemos manos a la obra.

Lo primero será importar la librería del teclado. Hay que bajarla de la siguiente web y seguir los pasos para añadirla a nuestro proyecto:

------------------------------
Traducción por TIC Las Palmas:
------------------------------
- Descargar: keypad.zip "http://playground.arduino.cc/uploads/Code/keypad.zip"
- Poner la carpeta Keypad en "arduino/libraries/"
- En el IDE de Arduino, crear un nuevo sketch (o abrir uno) y seleccionar en 
la barra de menú "Sketch -> Importar Librería... -> Keypad".
- Una vez hayamos importado la librería, una línea "#include <Keypad.h>" 
aparecerá en el comienzo de tu Sketch.

Lo siguiente es configurar el teclado:

// Configuramos el teclado
const byte filas = 4;
const byte columnas = 4;
char teclas[filas][columnas] = {
  {'C', 'D', 'E', 'F'},
  {'G', 'A', 'B', 'H'},
  {'I', 'J', 'K', 'L'},
  {'M', 'N', 'O', 'P'}
};

// Conexiones a los pines de las filas
byte pinesFila[filas] = {2, 3, 4, 5};
// Conexiones a los pines de las columnas
byte pinesColumna[columnas] = {6, 7, 8, 9};
// Inicializa el mapeo de teclas
Keypad teclado = Keypad(makeKeymap(teclas), pinesFila, pinesColumna, filas, columnas);

Configuramos el pin de salida para el buzzer:

// Configuramos los pines de la placa
void setup() {
    // Inicializamos el pin 13 como salida digital aprovechando la resistencia
    // de 1KΩ que trae incorporada
    pinMode(13, OUTPUT);
}

Creamos el algoritmo principal:

// Función principal que se ejecutará infinitamente
void loop() {

  // Siempre guardamos una tecla (aunque no haya sido pulsada) 
  char tecla = teclado.getKey();

  // Si hemos pulsado una tecla
  if (tecla != NO_KEY){
    // Si el teclado está siendo pulsado
    if (teclado.getState() == PRESSED) {
      // Reproducimos el sonido según la tecla pulsada
      switch (tecla) {
        case 'C':
        tone(13, notas_musicales[0]);
          break;
        case 'D':
          tone(13, notas_musicales[1]);
          break;
        case 'E':
         tone(13, notas_musicales[2]); 
         break;
        case 'F':
         tone(13, notas_musicales[3]);
         break;
        case 'G':
         tone(13, notas_musicales[4]);
         break;
        case 'A':
         tone(13, notas_musicales[5]);
         break;
        case 'B':
         tone(13, notas_musicales[6]);
         break;
        case 'H':
         tone(13, notas_musicales[7]);
         break;
        default:
         tone(13, notas_musicales[0]);
      }
    }
  }

  // Comprobamos si se ha dejado de pulsar la tecla
  if (teclado.getState() == RELEASED) {
      // Paramos el sonido
      noTone(13);
  }
}
  • Función tone: Es la función encargada de reproducir el tono correspondiente a la nota musical. Tenemos que especificarle como primer parámetro el pin al que queremos enviar la señal y en el segundo parámetro le diremos la frecuencia que debe tener la misma.
  • Funcion noTone: Esta función sirve para detener la señal enviada por la función tone.

Ahora sólo falta crear unas macros y variables globales que almacenen las frecuencias predeterminadas para cada nota:

// Definimos las notas
const int DO  = 262;
const int RE  = 294;
const int MI  = 330;
const int FA  = 349;
const int SOL = 392;
const int LA  = 440;
const int SI  = 494;
const int DO2  = 523;
int notas_musicales[] = {DO, RE, MI, FA, SOL, LA, SI, DO2};

Puedes descargar una versión completa del sketch aquí.

¡Veamos cómo funciona!

Demo

Nota: Como en TIC Las Palmas no somos prodigios de la música, creamos dos pequeñas demos técnicas que se pueden ver en el vídeo para demostrar que el invento realmente funciona.

Si tienes alguna duda... ¡Usa los comentarios! :D

Comentarios

buenas tardes, necesito me colaboren con un proyecto similar al del piano, simplemente deseo que cada tecla del teclado matrcial genere la frecuencia de numero al que corresponde, es decir orpimo el 1 y se genera su sonido, el 2 y su sonido exactamente igual al de los telefenos celulares. agradeceria su ayuda urgente
#1 por francisco leonardo patarroyo el 2nd Feb, 2016Hace 2 años
Francisco, realizar lo que comentas es muy sencillo. Solo tienes que sustituir el segundo parámetro de la función tone() por la frecuencia que desees para cada tecla. Un saludo.
#2 por TICLasPalmas el 12th Feb, 2016Hace 2 años
Buenas noches, Quisiera saber si me podrías enviar la biblioteca del teclado... Merci.
#3 por Edgar el 21st Nov, 2015Hace 2 años
Buenas que tal? Estoy haciendo un controlador midicon un teclado matricial y tengo un problema. Es posible dejar pulsada la nota mientras este presionado el pulsador y que deje de sonar al soltarla? Osea enviar mensaje de nota midi on al pulsar, manteniendo la nota mientras este pulsado el boton y enviar mensaje de nota midi off al soltar? Muchas gracias y un saludo
#4 por victor el 9th Sep, 2017Hace 3 months

Hola, soy el webmaster de TIC Las Palmas. ¿Quieres contactar conmigo? ¡Te ayudaré en lo que pueda!

Publicidad las 24 horas:
Si buscas promoción, una web es vital para obtener una mayor visibilidad.

Amplio alcance:
No existen barreras, accede al mercado internacional.

Fidelización:
Sus visitantes obtendrán feedback directo de usted o de su empresa.

Clientes potenciales:
Atraiga clientes que de otra manera no hubiesen encontrado sus servicios.

Valor añadido:
Agregue servicios adicionales a su negocio.

Ahorro:
Acabe con los gastos de promoción externa.

Formulario de consulta