Ocarina electrónica

Esta ocarina electrónica,desarrollada con arduino, utiliza chinchetas a modo de botones capacitivos, se alimenta con una pila de 9 voltios y se puede conectar a un amplificador.




Utilizando los mismo principios que en el proyecto anterior he decidido hacer una ocarina, esta vez usando Arduino, un proyecto de hardware libre que permite el desarrollo de multitud de proyectos electrónicos y el estudio de las bases de la electrónica.

Material necesario:

  • 1 arduino, en mi caso he utilizado UNO pero pueden servir otros modelos como NANO, FIO, MINI o LYLYPAD.
  • 8 condensadores(capacitor) de 1 nF.
  • 8 chinchetas.
  • 1 cápsula electret.
  • 1 resistencia de  1 KΩ.
  • 1 pequeño altavoz.
  • 1 transistor NPN- El BD135 puede servir.
  • 1 resistencia de  1 KΩ.
  • 1 diodo IN4007 DC
  • 1 pila de 9V y un conector donde enchufarla.
  • 2 diodos led.
  • 2 resistencias de 3,3 KΩ.
  • 1 clavija mini jack con desconexión.
  • Algunos cables.
Esquema electrónico:


Teoría:
1. Las entradas(sensores):
  • Botones: Este proyecto se fundamenta en el uso de las entradas digitales de arduino como sensores capacitivos sin hardware adicional desarrollado en el playground de la web de arduino.
    El código indicado en ese ejemplo utiliza el tiempo de carga de un pin previamente descargado para detectar si se está tocando el pin o no. En caso de que se esté tocando el pin tarda más en cargarse.
    Aunque no es necesario, resulta conveniente insertar un condensador entre cada chincheta y cada pin para filtrar el ruido de 50Hz(hum). 
  • Sensor de soplido:  el uso del micrófono ha sido desechado en el proyecto final por cuestiones prácticas(me resulta más cómodo tocar sin tener que soplar), así que, aunque lo integre en el diseño, el desarrollo os lo dejo a vosotros.
2. Las salidas(altavoz y amplificación):
  • La forma más sencilla de hacer sonido con arduino es utilizar las salidas digitales en su función PWM, esto permite encender y apagar estas salidas a distintas frecuencias generando tonos de onda cuadrada, aunque no permite el control directo del volumen. Esta señal nos da un máximo de 5v que es necesario amplificar.
  • Amplificador: para amplificar la señal y que el altavoz suene más alto he usado un transistor, este componente permite, dados dos voltajes(en mi caso de 5v y 9v) variar uno en función del otro, lo que nos permite amplificar la señal emitida por arduino. Para usar el transistor como amplificador necesitamos una resistencia que estabilice la entrada de 5v y un diodo que evite la entrada de los 9v en el arduino.
  • La salida minijack: aquí he usado la corriente directa del arduino por lo que la clavija está situada antes del transistor, al ser una clavija con desconexión, al insertar el jack abro el circuito que lleva la energía al altavoz y este deja de sonar. La inserté a modo de naríz entre la boca y los ojos.
3. Los leds: 
  • Como el soporte de mi ocarina daba mucho juego(no sabía que los juguetes para perro podían ser tan punkis) decidí insertarle un par de leds rojos en los ojos, para ello usé la alimentación que llegaba al altavoz y una resistencia que evitase picos que podrían fundir los leds.
4. La alimentación:
  • La pila debe ir conectada a la entrada del arduino y además debemos conectar el + a uno de los bornes del altavoz.
DIAGRAMA DE INTERACCIÓN:
CÓDIGO DE PROGRAMACIÓN:


// Ocarina electronica by Jordi Arnal 2012. Chromatophones.blogpost.com                       *

//Código original excepto:                                                                    *

// readCapacitivePin(). Función para leer la capacitancia de los pines  digitales de entrada. *

//Original code by Mario Becker, Fraunhofer IGD, 2007 Updated by: Alan Chatham               *

//**************************************************************************

//  Input: Arduino pin number

//  Output: A number, from 0 to 17 expressing

//  how much capacitance is on the pin

//  When you touch the pin, or whatever you have

//  attached to it, the number will get higher

uint8_t readCapacitivePin(int pinToMeasure){

  // Variables used to translate from Arduino to AVR pin naming

  volatile uint8_t* port;

  volatile uint8_t* ddr;

  volatile uint8_t* pin;

  // Here we translate the input pin number from

    //  Arduino pin number to the AVR PORT, PIN, DDR,

  //  and which bit of those registers we care about.

  byte bitmask;

  if ((pinToMeasure >= 0) && (pinToMeasure <= 7)){

    port = &PORTD;

    ddr = &DDRD;

    bitmask = 1 << pinToMeasure;

    pin = &PIND;

  }

  if ((pinToMeasure > 7) && (pinToMeasure <= 13)){

    port = &PORTB;

    ddr = &DDRB;

    bitmask = 1 << (pinToMeasure - 8);

    pin = &PINB;

  }

  if ((pinToMeasure > 13) && (pinToMeasure <= 19)){

    port = &PORTC;

    ddr = &DDRC;

    bitmask = 1 << (pinToMeasure - 13);

    pin = &PINC;

  }

  // Discharge the pin first by setting it low and output

  *port &= ~(bitmask);

  *ddr  |= bitmask;

  delay(1);

  // Make the pin an input with the internal pull-up on

  *ddr &= ~(bitmask);

  *port |= bitmask;

  // Now see how long the pin to get pulled up

  int cycles = 17;

  for(int i = 0; i < 16; i++){

    if (*pin & bitmask){

      cycles = i;

      break;

    }

  }

  // Discharge the pin again by setting it low and output

  //  It's important to leave the pins low if you want to

  //  be able to touch more than 1 sensor at a time - if

  //  the sensor is left pulled high, when you touch

  //  two sensors, your body will transfer the charge between

  //  sensors.

  *port &= ~(bitmask);

  *ddr  |= bitmask;

  return cycles;

}

//***************************************************************************

//*****Código Ocarina*********************************************************

String patron;//patron actual de pulsación

String patrones[]={//lista de patrones útiles

  "11111111",//DO

  "11111110",//DO#

  "11111011",//RE

  "11101011",//RE#

  "11110011",//MI

  "11100011",//FA

  "10100011",//FA#

  "11000011",//SOL

  "01000011",//SOL#

  "10000011",//LA

  "10000010",//LA#

  "00000011",//SI

  "00000010"//DO};

int notas[]={//lista de notas correspondientes a los patrones

  523, //NOTE_C5

  554, //NOTE_C5#

  587, //NOTE_D5 

  622, //NOTE_D5#

  659, //NOTE_E5 

  698, //NOTE_F5

  740, //NOTE_F5#

  784, //NOTE_G5

  830, //NOTE_G5 #

  880, //NOTE_A5

  932, //NOTE_A5 #

  988, //NOTE_B5

  1046 //NOTE_C6

};

//int flujo=0;//flujo de aire captado por la cápsula electret

float calibre=0;//calibrado del  flujo

void setup(){//inicialización de variables

  //Serial.begin(9600);//Se inicia el puerto serie(pruebas)

  /*for(int i=0;i<100;i++){//este bucle hace 100 mediciones del flujo

    calibre+=analogRead(0);

  }

  calibre/=100;*/ //se saca la media de las mediciones anteriores

}

void loop(){//bucle principal

  patron="";//iniciamos el patron a “”

  flujo=analogRead(0);//leemos el flujo

  //Serial.println(flujo);

 // if(abs(calibre-flujo)>10){//si la diferencia absoluta entre el flujo y el calibre es mayor a 10 suena

    for(int i=0;i<8;i++){//recorre los agujeros y crea el patrón de pulsación

      if(readCapacitivePin(i+2)>1){//si tocamos el pin añade 1 al patrón

        patron+="1";

      }else {//si no tocamos el pin añade 0 al patrón

        patron+="0";

}

      }

    }

    //Serial.println(patron);

    for(int i=0;i<14;i++){//busca en la matriz de patrones…

      if(patrones[i]==patron){//… si el patron existe…

        tone(11, notas[i], 20);//…hace sonar la nota correspondiente…

        //Serial.println("tone");

        break;//…y sale del bucle.

      }

    }

  //}

  delay(10);//retardo de 10 milisegundos para aligerar

}

7 comentarios:

  1. Hola Jordy.
    Lo primero es lo primero y en este caso lo primero es felicitarte por tu trabajo. Es de flipar.
    Ahora toca presentarse. Me llamo Juan Pablo y soy profe de Educación Física en un cole de Gijón. En mis ratos de ocio toco la gaita y el tambor y llevo, desde hace tiempo, buscando un sustitutivo para ensayar en casa. Lo que está en el mercado es poco y muy caro y al ver tu ocarina ¡he visto la luz!
    El caso es que seria perfecto poder construir un puntero que funcionase como tu ocarina. He leído el blog y, aunque manejo algo el soldador, necesitaría un tutorial para conectar el arduinó y poder conseguir una escala desde un si bajo a un FA alto (12 notas). Que suene a gaita o a ocarina o flauta sería secundario. Eso supongo que ya se podría trabajar mas tarde. En fin, ya no me lío más. Gracias por tu tiempo y atención.
    Agradecería cualquier comentario al respecto.

    ResponderEliminar
  2. Hola Juan Pablo, gracias por tu felicitación.

    Para aprovechar mi trabajo tienes dos opciones:

    1.Si quieres que tu gaita suene de forma independiente(sin ordenador) adaptaremos la ocarina, de momento tiene un sonido muy electrónico pero eso podría mejorarse.

    2.Si no te importa tener que enchufarla a un ordenador podemos utilizar el sistema de la flauta electrónica, utiliza dos teclados y un micrófono para funcionar y se podría implementar en MIDI para que puedas usar el sonido que quieras, ajustar el ataque, añadir efectos, etc... en este caso hay que desarrollar los botones pero creo saber cómo hacerlo sin dificultad.

    En ambos casos habría que desarrollar el sensor de soplido(micrófono), no llevaría mucho tiempo y en algún momento lo tendré que hacer. :)

    Elige una opción y nos ponemos manos a la obra.

    Un saludo.





    ResponderEliminar
  3. Hola JOrdiet.

    Muchas gracias por contestar.
    Mirando por la web encontré esta página: openpipe.cc en la tienen un prototipo de gaita electronica basada en arduino.
    Contacté con ellos y me puse manos a la obra. A día de hoy tengo un puntero de PVC, conectado a un arduino y funcionando con la digitación de gaita asturiana (despues de programar un poco y alimentado por una pila de 9v. La verdad es que yo mismo estoy impresionado y "enganchado".
    Si quieres te paso toda la información que tengo. Puedes contactar conmigo en: gaiterujp@gmail.com.

    Lo único que me trae un poco loco es el tema del sonido. La verdad es que el artilugio es para tocar en casa pero suena un poco bajo y quizás podría amplificarse un poco el sonido utilizando la solución que propones en la ocarina.
    La verdad es que me defiendo con el soldador y el estaño, pero estoy pez en electrónica así que te pediría que, por favor, me explicases la solución del transistor, cómo lo conectas, que resistencia y diodos usas, etc.

    Espero no causarte muchas molestias y te agradezco de veras el esfuerzo.

    Recibe un cordial saludo.
    Juan PAblo

    ResponderEliminar
  4. Buenas Juan Pablo.

    La conexión del transistor, según el esquema eléctrico que tienes arriba, es la siguiente:
    Un transistor tiene 3 patas: emisor, base y colector, puedes usar el BD135 y mirar su datasheet para saber qué pata corresponde a cada parte.

    La señal de audio(PWM) se conecta a la base del transistor.
    El negativo del altavoz al colector.
    Y el emisor a masa.

    Cualquier diodo te sirve por ejemplo el 1n4001, este componente lo que hace es evitar posibles subidas de corriente hacia el pin de salida del Arduino, es una protección para el arduino, los diodos sólo dejan pasar la corriente en una dirección así que bloquearía los 9 voltios de la pila.

    La resistencia sirve para estabilizar la señal, una de 1K funcionará bien.

    Ya tienes tu puntero sonando, pero lo que suena es una onda cuadrada que tiene poco que ver con el sonido de la gaita,
    si no te importa usar un ordenador lo que puedes hacer es implementar un sistema MIDI a través del arduino para que el sonido lo genere el ordenador,
    de este modo podrás modular el sonido a tu gusto, grabar tus interpretaciones e incluso tocar la guitarra eléctrica o la batería con tu gaita si te place.

    http://arduino.cc/es/Tutorial/Midi

    Si no quieres implementar el MIDI habría que transformar esa onda cuadrada en otra cosa, lo cual no es muy complicado,
    existen circuitos integrados sintetizadores de audio que pueden ayudarte, si te interesa esta opción coméntamelo y te busco más info.

    Un saludo.


    ResponderEliminar
  5. Muchas gracias por tu explicación Jordiet.

    Intentaré montar el pequeño amplificador, aunque no estoy muy animado. Acabo de armar nos ahora, muy smpe también, con un integrado y no ha funcionado. En cuanto al sonido del arruinó, está basado en unos simples de gaita gallega y bueno, algo se parece.
    El problema del midi es que pierdo la "portabilidad". Tendría que estar siempre enganchado al pc o al MOVIL y, de esta manera puedo llevarlo siempre conmigo.
    En cuanto a lo de los integrados para transformar la onda del arduinó, lo desconocía por completo (soy muy novato en este mundo). Te agadecria cualquier información al respecto.

    Muchas gracias y hasta pronto.
    Juan Pablo

    ResponderEliminar
  6. Otra duda Jordiet.

    En mi caso el altavoz se conecta a los pines 11 y GND, no tiene alimentación directa de 9 voltios. La pila la conecto en la entrada del arduino. Dónde conecto el transistor??? Seria resistencia, diodo y base al pin 11???

    Gracias y disculpa mi ignorancia.

    ResponderEliminar
  7. Sí, según lo que me cuentas la salida es el PIN 11, así que ahí es donde debes conectar la base pasando por la resistencia y el diodo.

    ResponderEliminar

Licencia Creative Commons
Las obras contenidas en este blog, creadas por Jordi Arnal Andrés están bajo licencia:
Creative Commons: Reconocimiento-NoComercial-CompartirIgual 3.0 Unported