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 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.
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.):
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).
El importe calculado arriba se corresponde con una simulación realizada en la tienda Banggood.
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:
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.
Puedes seguir el siguiente esquema de montaje que hemos generado con Fritzing para que te resulte mucho más sencillo:
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.
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);
}
}
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!
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