En primer lugar tendríamos que explicar qué es un buzzer, es un dispositivo que transforman una señal eléctrica en una onda de sonido. No tienen electrónica interna, y basan su funcionamiento en el efecto piezoeléctrico, por el que determinados materiales (por ejemplo cuarzo) se deforman bajo la acción de fuerzas internas al ser sometidos a un campo eléctrico. Un buzzer aprovecha este fenómeno para hacer vibrar una membrana al atravesar el material piezoeléctrico con una señal eléctrica.
Podemos usar nuestro buzzer (zumbador de siempre) y conectarlo a nuestro Arduino según el esquema adjunto, usando una resistencia de 100 Ω., importante respetar la polaridad que nos viene indicada en la carcasa, si no se hace no emitirá sonido alguno.
Vamos a usar dos funciones para generar sonidos:
tone (pin, frecuencia, duración);
Esta función activa un tono de frecuencia determinada en el pin indicado. La duración es opcional, por lo que podemos encontrar habitualmente la función con sólo dos parámetros.
noTone(pin);
Detiene el tono en el pin
Una observación importante es que mientras usemos la función tone() no podremos usar las salidas PWM en los pines 3 y 11 en Arduino Uno y los pines 9 y 10 en Arduino Mega.
En el siguiente ejemplo aumentamos la frecuencia del sonido de 100Hz a 2KHz y luego disminuir la frecuencia de 2KHz a 100Hz
int buzzer = 9;
void setup() {
}
void loop() {
for(int i=100 ; i<2000 ; i++){ // bucle que incremente la frecuencia
tone(buzzer, i);
delay(10); //Puedes cambiar el retraso si quieres hacerlo más largo o más corto
}
for(int i=2000 ; i>100 ; i--){
tone(buzzer, i);
delay(10);
}
}
También podemos usar los módulos que venden ya preparados con tres pin, para conectar directamente. Conectamos Vcc a 5V, GND a tierra y el pin central i/o lo conectamos al pin 9 de Arduino.
Si se dispone de conocimientos musicales es posible reproducir algunas melodías, veamos un ejemplo con la melodía de Star Wars, al final del artículo adjunto este y otro sketch reproduciendo la melodía de Piratas del Caribe.
//www.tecnosalva.com
const int c = 261;
const int d = 294;
const int e = 329;
const int f = 349;
const int g = 391;
const int gS = 415;
const int a = 440;
const int aS = 455;
const int b = 466;
const int cH = 523;
const int cSH = 554;
const int dH = 587;
const int dSH = 622;
const int eH = 659;
const int fH = 698;
const int fSH = 740;
const int gH = 784;
const int gSH = 830;
const int aH = 880;
const int buzzerPin = 8;
const int ledPin1 = 12;
const int ledPin2 = 13;
int counter = 0;
void setup()
{
//Setup pin modes
pinMode(buzzerPin, OUTPUT);
pinMode(ledPin1, OUTPUT);
pinMode(ledPin2, OUTPUT);
}
void loop()
{
//Play first section
firstSection();
//Play second section
secondSection();
beep(f, 250);
beep(gS, 500);
beep(f, 350);
beep(a, 125);
beep(cH, 500);
beep(a, 375);
beep(cH, 125);
beep(eH, 650);
delay(500);
//Repeat second section
secondSection();
beep(f, 250);
beep(gS, 500);
beep(f, 375);
beep(cH, 125);
beep(a, 500);
beep(f, 375);
beep(cH, 125);
beep(a, 650);
delay(650);
}
void beep(int note, int duration)
{
//Play tone on buzzerPin
tone(buzzerPin, note, duration);
//Play different LED depending on value of 'counter'
if(counter % 2 == 0)
{
digitalWrite(ledPin1, HIGH);
delay(duration);
digitalWrite(ledPin1, LOW);
}else
{
digitalWrite(ledPin2, HIGH);
delay(duration);
digitalWrite(ledPin2, LOW);
}
//Stop tone on buzzerPin
noTone(buzzerPin);
delay(50);
//Increment counter
counter++;
}
void firstSection()
{
beep(a, 500);
beep(a, 500);
beep(a, 500);
beep(f, 350);
beep(cH, 150);
beep(a, 500);
beep(f, 350);
beep(cH, 150);
beep(a, 650);
delay(500);
beep(eH, 500);
beep(eH, 500);
beep(eH, 500);
beep(fH, 350);
beep(cH, 150);
beep(gS, 500);
beep(f, 350);
beep(cH, 150);
beep(a, 650);
delay(500);
}
void secondSection()
{
beep(aH, 500);
beep(a, 300);
beep(a, 150);
beep(aH, 500);
beep(gSH, 325);
beep(gH, 175);
beep(fSH, 125);
beep(fH, 125);
beep(fSH, 250);
delay(325);
beep(aS, 250);
beep(dSH, 500);
beep(dH, 325);
beep(cSH, 175);
beep(cH, 125);
beep(b, 125);
beep(cH, 250);
delay(350);
}