Conectando algunos Piezoeléctricos y una batería, vía MIDI, a nuestro Arduino

Los micrófonos piezoeléctricos son pequeños dispositivos mecánicos que aprovechan la propiedad de ciertos elementos cerámicos de producir electricidad cuando se les aplica una fuerza, o por el contrario, de producir una acción mecánica (movimiento) cuando se les aplica electricidad

Estas dos caras de un mismo efecto (precisamente denominado efecto piezoeléctrico) los hace aptos como transductores en ambos sentidos. Es decir, pueden actuar como micrófonos, transformando las vibraciones en señal eléctrica, o como parlantes, transformando una señal eléctrica en vibraciones sonoras.

Se los puede encontrar en todos los juguetes baratos que producen sonido, en los relojes con alarma o en cualquier casa de electrónica, por muy poco dinero. Su aspecto es similar al de una delgada moneda, conformada por dos chapas separadas por una fina capa cerámica. A cada una de esas chapas debemos soldar un cable, a fin de poder conectar el piezo a nuestro circuito, tal como se muestra en la siguiente imagen:

Su robustez, bajo costo y facilidad de uso los hace especialmente interesantes en infinidad de proyectos, tanto en las funciones mencionadas como en la función de detectores de vibración o golpes. Precisamente como tales los usaremos en este proyecto, formando parte de los parches de nuestra batería, detectando los golpes de palillo (o de los dedos) e ingresando esa detección al Arduino  (www.arduino.cc) en cualquiera de sus versiones, incluyendo la versión de bajo costo vista en clase. También el proyecto es fácilmente adaptable a cualquier otro microcontrolador con conversores A/D y una UART (puerto serial) para la conexión del MIDI.

Proyecto Piezo1 - Encendiendo LEDs

En primer lugar, conectaremos cuatro sensores piezoeléctricos a sendas entradas analógicas (AIN1-AIN4) del Arduino, así como cuatro LEDs a otras tantas salidas digitales (Digital Pins 5 a 8) del mismo. Escribiremos luego un brevísimo programa que encenderá cada LED conforme los sensores respectivos detecten que se los toca o golpea. La sensibilidad será regulada por medio de un potenciómetro conectado  a la entrada analógica 5 (AIN5).

Esta simple disposición nos servirá para verificar el correcto conexionado y funcionamiento de los sensores, aunque no dispongamos de un dispositivo MIDI y nos servirá de base para el paso siguiente y para todo otro proyecto que requiera sensar golpes o vibraciones con cualquier propósito.

Aprovecharemos el montaje hecho en el protoboard para el ejercicio anterior del Motor Paso a Paso Unipolar retirando el ULN2803 y agregando los piezos, según el siguiente esquema:

Nótese que a cada piezoeléctrico se le ha agregado en paralelo una resistencia de alto valor (10 MOhms) y que debe respetarse la polaridad de los transductores, correspondiendo la masa a la chapa de mayor diámetro.

El conjunto del arduino económico armado sobre un protoboard y conectado al programador USBasp vistos en clase, presenta el siguiente aspecto:

El programa a utilizar es muy simple, y se autoexplica:

/*
 Piezo
 Enciende LEDS conectados a los pines digitales 5, 6, 7 y 8 según
 la señal de los piezo conectados a los pines analogicos 1,2,3 y 4.
 La sensibilidad es controlada por un Pote conectado al pin anaógico 5

 Julio 2010 - Miguel Grassi
 Ultima revision: Julio 2010
 www.miguelgrassi.com.ar/arduino
 */

//Guerda el umbral de sensibilidad que disparará la acción
int Umbral;


void setup()
{
    pinMode(5, OUTPUT);     
    pinMode(6, OUTPUT);     
    pinMode(7, OUTPUT);     
    pinMode(8, OUTPUT);     
}

void loop()
{ 
   Umbral=analogRead(5);//Lee el valor del pote para establecer la sensibilidad  
   
  //Lee cada entrada analogica y la compara con el Umbral.
   //Si es mayor, enciende el LED correspondiente. Si no, lo apaga
   analogRead(1)>Umbral?digitalWrite(5,HIGH):digitalWrite(5,LOW);
   analogRead(2)>Umbral?digitalWrite(6,HIGH):digitalWrite(6,LOW);
   analogRead(3)>Umbral?digitalWrite(7,HIGH):digitalWrite(7,LOW);
   analogRead(4)>Umbral?digitalWrite(8,HIGH):digitalWrite(8,LOW);
} 

Una vez bajado el programa al micro, comprobaremos que, si todo está correcto, se encenderá un led determinado cada vez que golpeemos con el dedo el sensor respectivo. Girando el potenciómetro a uno u otro lado aumentaremos o disminuiremos la sensibilidad del conjunto.

 

Conectando un dispositivo MIDI

Una vez que verificamos que los sensores funcionan correctamente, sólo necesitaremos conectar nuestro Arduino a un dispositivo generador de sonido MIDI para poder utilizarlos como controladores de intrumentos de percusión, ya sea golpeándolos directamente o adhiriéndolos a una superficie más grande sobre la que golpear.

Una interfaz MIDI no tiene nada de especial. Es simplemente un comunicación serial, tal como la que utilizamos habitualmente para comunicar a Arduino con la PC, por ejemplo con  un programa de Processing, y un protocolo pre-establecido que los dispositivos pueden interpretar.

El conector estándar de MIDI es una ficha de 5 pines norma DIN, habitualmente denominada simplemente DIN-5. En nuestro caso hemos tomado ficha y cable de un viejo teclado de PC, bastante fácil de encontrar en cualquier rincón, ya que este fue durante mucho tiempo el conector utilizado para esos dispositivos. Se muestra en la foto ambos extremos del cable ya desmontado y con los añadidos necesarios:  

Çomo puede verse, se utilizan sólo tres de las cinco conexiones disponibles. Éstas son las correspondientes a alimentación (+5V y Masa) y al pin Tx (Transmisión Serie) del Arduino o del Micro.

El esquema con el agregado del conector MIDI y una resistencia de 330 Ohms a +V quedará entoces así:

Tal como se ha muestra en la foto anterior, la resistencia de 330 Ohms puede colocarse directamente en el cable y este conjunto nos servirá para conectar tanto al protoboard como al peine de conectores de una placa Diecimila o similar.

Software

Como ya dijimos, lse trata de es una comunicación serial común y corriente. Sólo debemos respetar la velocidad prefijada de antemano para el protocolo, que es de 31250 baudios.

Para convertir el puerto serial  en un MIDI basta entoces con agregar una sola línea en el setup() de nuestro programa que inicialice el puerto serial en esa velocidad:

Serial.begin(31250);

Luego, cada vez que que querramos enviar un comando al MIDI lo haremos con Serial.print(), como en cualquier comunicación serial. Por ejemplo, para establecer el canal de percusión en el teclado que hace las veces de sintetizador en nuestra prueba usaremos:

Serial.print(0x9F, BYTE);

Donde 9F es el comando o información que queremos enviar. Como es un número en formato hexadecimal debe se precedido con 0x. En este caso, establece el canal de percusión de nuestro instrumento.

Para establecer que números enviar en cada caso, obviamente, es necesario conocer más sobre el  protocolo MIDI propiamente dicho. Si bien no vamos a entrar aquí en demasiados detalles sobre el mismo, ya que es un tema extenso, del cual hay mucha y muy completa información en la red, podemos puntualizar algunos elementos para entender mejor el ejemplo:

He aquí una demo del cicuito trabajando:

El programa completo usado para la demo es el siguiente:

/*
 PiezoMIDI
 Enciende LEDS conectados a los pines digitales 5, 6, 7 y 8 según
 la señal de los piezo conectados a los pines analogicos 1,2,3 y 4
 y manda un comando MIDI por el puerto serie para un instrumento de percusion
 
 Julio 2010 - Miguel Grassi
 Ultima revision: Julio 2010
 www.miguelgrassi.com.ar/arduino
 */

//Guerda el umbral de sensibilidad que disparará la acción
int Umbral;
void setup()
{
    pinMode(5, OUTPUT);     
    pinMode(6, OUTPUT);     
    pinMode(7, OUTPUT);     
    pinMode(8, OUTPUT);  
    pinMode(19, INPUT);  
    //  Establece el baud rate del MIDI;
   Serial.begin(31250);
   
}

void loop()
{ 
   Umbral=analogRead(5);//Lee el valor del pote para establecer la sensibilidad  
   
  //Lee cada entrada analogica y la compara con el Umbral.
   //Si es mayor, enciende el LED correspondiente. Si no, lo apaga
   if(analogRead(1)>Umbral){
     digitalWrite(5,HIGH);//Encendemos el LED del pin 5
        // La siguiente línea establece el Canal 16 DRUMS 0x90 + 16 = 0x90+F = 0x9F
        // Podría enviarse una sola vez, si no es necesario otro Byte de Estado en 
        // el resto del programa. Aquí la incluimos en todos los bloques de mensajes
        Serial.print(0x9F, BYTE);  
        Serial.print(43, BYTE); //Key Number para percusion 43 Mid Tom
        Serial.print(127, BYTE); //Velocidad (es el volumen. De 0 a 127)
         delay(100);}
   else{
     digitalWrite(5,LOW);//Apagamos el LED del pin 5
   }   
   if(analogRead(2)>Umbral){
     digitalWrite(6,HIGH);
        Serial.print(0x9F, BYTE); 
        Serial.print(45, BYTE); //Key Number para percusion 45 Hi Tom
        Serial.print(127, BYTE); //Velocidad (es el volumen. De 0 a 127)
         delay(100);}
   else{
     digitalWrite(6,LOW);
   }

   if(analogRead(3)>Umbral){
     digitalWrite(7,HIGH);
        Serial.print(0x9F, BYTE); 
        Serial.print(46, BYTE); //Key Number para percusion 46 Crash
        Serial.print(127, BYTE); //Velocidad (es el volumen. De 0 a 127)
         delay(100);}
   else{
     digitalWrite(7,LOW);
   }

   if(analogRead(4)>Umbral){
     digitalWrite(8,HIGH);
        Serial.print(0x9F, BYTE); 
        Serial.print(50, BYTE); //Key Number para percusion 50 Lo Comga
        Serial.print(127, BYTE); //Velocidad (es el volumen. De 0 a 127)
         delay(100);}
   else{
     digitalWrite(8,LOW);
   }

}