¡Feliz Navidad (con sonido)!

En estas fechas tan entrañables, queremos rescatar un vídeo que preparamos hace unos años, antes incluso de la existencia de la página de nuestro Museo. Se trata de un pequeño circuito con una placa de Arduino Uno para tocar el famoso villancico inglés We Wish You A Merry Christmas.

Para poder montar el circuito, necesitaréis los siguientes componentes:

  • Placa de prototipado
  • Arduino Uno
  • Altavoz de 8 ohmios (o un simple zumbador)
  • Resistencia de 330 ohmios (franjas naranja-naranja-marrón) o de un valor cercano
  • Cables de prototipado

En la siguiente imagen (realizada con el programa Fritzing), podéis ver cómo queda el circuito:

Por otro lado, necesitáis ejecutar el siguiente código en el Arduino:

#define DO 261.626 
#define RE 293.665
#define MI 329.628 
#define FA 349.228
#define SOL 391.995
#define LA 440.000
#define SIB 466.164
#define SI 493.883
#define DO2 523.251
#define SILENCIO 0
#define ALTAVOZ 8   
#define TEMPO 400

// Arrays que definen la cancion
float cancion[] = {DO,FA,FA,SOL,FA,MI,RE,RE,RE,SOL,SOL,LA,SOL,FA,MI,DO,DO,LA,LA,SIB,LA,SOL,FA,RE,DO,DO,RE,SOL,MI,FA,DO,FA,FA,SOL,FA,MI,RE,RE,RE,SOL,SOL,LA,SOL,FA,MI,DO,DO,LA,LA,SIB,LA,SOL,FA,RE,DO,DO,RE,SOL,MI,FA,DO,FA,FA,FA,MI,MI,FA,MI,RE,DO,SOL,LA,SOL,FA,DO2,DO,DO,DO,RE,SOL,MI,FA}; 

float duracion[] = {1,1,0.5,0.5,0.5,0.5,1,1,1,1,0.5,0.5,0.5,0.5,1,1,1,1,0.5,0.5,0.5,0.5,1,1,0.5,0.5,1,1,1,2,1,1,0.5,0.5,0.5,0.5,1,1,1,1,0.5,0.5,0.5,0.5,1,1,1,1,0.5,0.5,0.5,0.5,1,1,0.5,0.5,1,1,1,2,1,1,1,1,2,1,1,1,1,2,1,1,1,1,1,1,0.5,0.5,1,1,1,2};

int numeroNotas = 82;

void setup() {
  pinMode(ALTAVOZ,OUTPUT);

}

void loop() {
  for (int i = 0; i < numeroNotas; i++) {
    if (cancion[i] != SILENCIO) {         
      tone(ALTAVOZ,round(cancion[i])); 
    }
    else {
      noTone(ALTAVOZ); 
    }
    delay(TEMPO * duracion[i]); 
    noTone(ALTAVOZ);
    delay(0.1);
  } 
}

Los defines iniciales establecen equivalencias o alias entre los nombres de las notas y sus frecuencias expresadas en hercios (Hz). Es más fácil trabajar con los nombres de las notas que con las frecuencias y, por eso, se decidió hacerlo así. El array canción no es sino la secuencia de notas que componen la canción. Es un array de coma flotante (float) porque las frecuencias así lo son.

El siguiente array establece el tipo de notas en cuanto a su duración. Así, una negra sería una unidad, una blanca valdría 2, una corchea sería 0,5, etc. Por tanto, el uso combinado de los arrays cancion y duracion permite establecer toda la información necesaria para interpretar la canción.

En la función setup de este código, se establece que el pin 8 del Arduino debe ser de salida y es por ahí por donde se envían cada una de las notas musicales. De ese pin se lleva un cable que pasa por la resistencia y llega hasta el altavoz. Desde el otro borne del altavoz, se conecta un cable hasta la conexión de tierra del Arduino, situada en el pin señalado como GND.

A continuación, la función loop se ejecuta indefinidamente. En él, hay un bucle for que va recorriendo todas las notas musicales. Mediante la función tone, se envía la señal adecuada al pin 8 del Arduino y, por extensión, al altavoz, para que toque determinada nota musical. En principio, la nota se toca indefinidamente, con lo que debemos usar la función delay para determinar cuánto debe durar. La duración de la nota se ajusta con el valor del tempo, también establecido en uno de los defines iniciales, lo que permite que la canción suene más rápido o más lento. Una vez que ha sonado la nota el tiempo que se necesita, la función notone corta el sonido. A continuación, se introduce un pequeño retardo entre notas con la función delay, que permite que se identifiquen mejor las notas individuales de la canción. Esto terminaría una iteración del bucle y volveríamos de nuevo al comienzo del mismo para interpretar la siguiente nota.

Y el resultado es el siguiente:

Scroll al inicio