Sonido con Arduino

En esta sesión vamos a trabajar con un sencillo sistema de sonido que podemos incorporar a nuestros montajes en placa. Para utilizaremos un componente denominado buzzer o zumbador, el cual es un componente activo (output digital) que estará a la espera de recibir los códigos necesarios para convertirlos en melodías digitales.

En primer lugar es interesante conocer que un zumbador es un transductor electroacústico capaz de crear un sonido o zumbido, continuo o intermitente, de un mismo tono.  En su interior está formado por un electroimán y una lámina metálica de acero. Al ser accionado, la corriente atravesará la bobina del electroimán y producirá un campo magnético variable que hará vibrar la lámina de acero sobre la armadura.

Para qué vayamos a utilizarlos ya dependerá de nuestra imaginación, pero bien podríamos usarlo en montajes para realizar avisos sonoros, reproducir melodías ante algún evento, etc…

El montaje es bien sencillo. Por un lado haremos una conexión desde la pata de la izquierda del zumbador hasta GND; y por otro lado haremos una conexión desde la pata de la derecha, a la salida digital nº 8 por ejemplo.  

El montaje sobre nuestra placa debería seguir un montaje como el que podemos ver en la figura de abajo.

 

 

RETO Nº 1

Una vez realizado el montaje deberemos cargar en nuestro IDE Arduino el código fuente procedente de EJEMPLOS-DIGITAL-TONEMELODY.

Vamos a analizar el código fuente de forma secuencial. Veamos la primera parte del código:

#include "pitches.h"

// notes in the melody:
int melody[] = {
NOTE_C4, NOTE_G3, NOTE_G3, NOTE_A3, NOTE_G3, 0, NOTE_B3, NOTE_C4
};

// note durations: 4 = quarter note, 8 = eighth note, etc.:
int noteDurations[] = {
4, 8, 8, 4, 4, 4, 4, 4
};

Que se reproduzcan las notas que ponemos en nuestro programa (NOTE_B0, NOTE_C1…) y que podemos encontrar en el array de tipo entero melody[] no es ninguna magia, ya que las estamos cargando desde el fichero pitches.h, que es un librería (programa) que ya tiene Arduino incluida, al igual que el resto de ejemplos, y cuyo contenido son todas las posibles variantes de notas. El contenido sería el siguiente:

/*************************************************
* Public Constants
*************************************************/

#define NOTE_B0  31
#define NOTE_C1  33
#define NOTE_CS1 35
#define NOTE_D1  37
#define NOTE_DS1 39
#define NOTE_E1  41
#define NOTE_F1  44
#define NOTE_FS1 46
#define NOTE_G1  49
#define NOTE_GS1 52
#define NOTE_A1  55
#define NOTE_AS1 58
#define NOTE_B1  62
#define NOTE_C2  65
#define NOTE_CS2 69
#define NOTE_D2  73
#define NOTE_DS2 78
#define NOTE_E2  82
#define NOTE_F2  87
#define NOTE_FS2 93
#define NOTE_G2  98
#define NOTE_GS2 104
#define NOTE_A2  110
…..

Por otra parte, en el array melody[] vamos a poder decidir la duración de cada una de estas notas, donde un 4 será un cuarto de tono, un 8 un octavo de tono, y así sucesivamente..

A continuación nos encontramos con el contenido de la función setup():

void setup() {
 // iterate over the notes of the melody:
 for (int thisNote = 0; thisNote < 8; thisNote++) {

 // to calculate the note duration, take one second
 // divided by the note type.
 //e.g. quarter note = 1000 / 4, eighth note = 1000/8, etc.
 int noteDuration = 1000 / noteDurations[thisNote];
 tone(8, melody[thisNote], noteDuration);

 // to distinguish the notes, set a minimum time between them.
 // the note's duration + 30% seems to work well:
 int pauseBetweenNotes = noteDuration * 1.30;
 delay(pauseBetweenNotes);
 // stop the tone playing:
 noTone(8);
 }
}

Aspectos a comentar:

  • el bucle FOR está programado para repetirse 8 veces, tantas como notas tenemos en nuestra melodía
  • la función tone() tiene tres argumentos:
    • la salida digital donde hemos conectado el buzzer
    • la nota correspondiente según el paso del bucle
    • duración de la nota que la hemos calculado en la instrucción anterior
  • hacemos una pausa tras reproducir la nota
  • detiene la reproducción de notas con la función notone()

RETO Nº 2

 

Una vez que conocemos el funcionamiento del speaker, vamos a probar con otro ejemplo, donde cambiaremos la melodía. Podéis obtener el código necesario del siguiente enlace:

http://www.princetronics.com/supermariothemesong/#Using_an_Arduino_Uno

 

RETO Nº 3

 

Os retamos a localizar nuevos códigos a través de Google para hacer nuevas melodías. Consejos de búsqueda: el truco de este reto está en utilizar las palabras claves oportunas a utilizar. Os damos una primera pista: piezo buzzer arduino song.

RETO Nº 4

Aquí el reto sería añadir a nuestro montaje dos botones, de tal manera que al pulsar uno suene una melodía, y al pulsar el otro, otra melodía distinta. Para complicarlo un poco más, podéis añadir dos leds a vuestro montaje de tal manera que cada uno de ellos se encienda cuando empiece a sonar su respectiva melodía, y se apaguen al acabar.

Si tenéis bien claro la estructura de los códigos que hayáis utilizado en el reto anterior, podéis utilizarlos para resolver este reto. Si os resulta complejo, os ponemos a continuación un pequeño código que reproduce la escala musical con sus siete notas:

#define BUZZER 8
int notes[] = { 524, 588, 660, 699, 785, 881, 989 };

void setup()

{

pinMode(BUZZER, OUTPUT);

}

void loop()

{

for (int i = 0; i < 7; i++)

{

tone(BUZZER, notes[i], 1000); delay(1000);

}

delay(1000);

}

Y si tienes conocimientos musicales, y te atreves a crear una nueva melodía, no dudes compartirlas con todos nosotros en twitter con el hashtag #melodiasconArduino.

Para finalizar, en esta ocasión será Marcos Borobia, alumno de 3º ESO quien nos contará cómo hacer el montaje de nuestro buzzer con el Arduino.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *