Haciendo música con Arduino y un buzzer piezoeléctrico

Haciendo música con Arduino y un buzzer piezoeléctrico- Arduino
4.5/5 - (24 votos)

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.Haciendo música con Arduino y un buzzer piezoeléctrico- Arduino

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.

Haciendo música con Arduino y un buzzer piezoeléctrico- Arduino

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);
} 
}

Haciendo música con Arduino y un buzzer piezoeléctrico- ArduinoTambié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);
}

Archivos adjuntos

Deja un comentario