O buzzer é um componente muito simples e barato, e chega a ser um auto falante alternativo, porém limitado. Por funcionar semelhante a um alto falante, ele pode ser usado para aplicações bem interessantes.

Se você deseja entender a base de funcionamento do buzzer, recomendo que leia o post sobre o efeito piezoelétrico.


Som emitido

A forma comum de usar o buzzer (usando ondas quadradas) faz com que ele possua seu próprio timbre e espectro, assim como qualquer instrumento musical. Portanto, o som que sai dele não é capaz de reproduzir o som de uma guitarra, por exemplo. Então o buzzer é como se fosse um instrumento musical, e, quando tocamos alguma música com ele, é como se fosse uma versão de uma música tocada, por exemplo, pela “flauta”.

Agora, se utilizarmos um módulo ou uma shield que reproduza arquivos de áudio, o som que sairá do buzzer conseguirá reproduzir com fidelidade o som real.


Circuito

Basta ligar o negativo do buzzer no GND e o positivo em um resistor que pode ser de 100Ω (não tem valor exato). A outra ponta do resistor liga em um pino digital do Arduino. A imagem abaixo ilustra a ligação.

circuito buzzer arduino


Como usar

Nós não vamos usar nenhuma shield, portanto será como o primeiro caso descrito acima. Bem, cada nota musical possui uma certa frequência, então, para tocar uma nota, nós vamos mandar um sinal de onda quadrada pro buzzer em uma determinada frequência. As frequências das notas são aproximadamente:

  • Dó – 262 Hz
  • Ré – 294 Hz
  • Mi – 330 Hz
  • Fá – 349 Hz
  • Sol – 392 Hz
  • Lá – 440 Hz
  • Si – 494 Hz
  • #Dó – 528 Hz

Usando a função do Arduino

Existe um comando que facilita muito nossa vida, que é o tone(). Esse comando gera, automaticamente, um sinal de onda quadrada no pino e na frequência que a gente quiser. E ele possui a seguinte configuração:

tone(pino, frequência em Hz, duração em ms)

O parâmetro da duração pode ser ignorado, mas ele basicamente define a duração do sinal. Como o circuito mostrado lá em cima mostra, eu vou usar o pino 10 para controlar o buzzer. Para começar a programar, precisamos escolher uma música para tocar e pegar as notas musicais dela. Resolvi pegar as notas da música de abertura de Game of Thrones e reproduzi isso no código, mas fiz só o comecinho dela. A última observação importante a ser dita é que o tempo de espera entre cada nota deve ser colocado de acordo com o ritmo da música, então, para encontrar um valor bom, eu criei uma variável chamada tempo para controlar o tempo dos delays e o tempo que cada nota dura, assim basta mudar o valor dessa variável até que a música esteja em um bom ritmo.

Código completo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
/*  
  Feito pelo site MundoProjetado
  Código que toca um pedaço da música
  de abertura de Game of Thrones
*/

void setup(){
  pinMode(10,OUTPUT);
}

void loop(){
  /*
  Frequência das notas:
  Dó - 262 Hz
  Ré - 294 Hz
  Mi - 330 Hz
  Fá - 349 Hz
  Sol - 392 Hz
  Lá - 440 Hz
  Si - 494 Hz
  #Dó - 528 Hz
  */

  delay(1000);
  int tempo = 400;
  tone(10,440,tempo); //LA
  delay(tempo);
  tone(10,294,tempo); //RE
  delay(tempo);
  tone(10,349,tempo/2); //FA - O tempo/2 faz com que demore metade do valor estipulado anteriormente, pois essa parte é mais rápida
  delay(tempo/2);
  tone(10,392,tempo/2); //SOL
  delay(tempo/2);
  tone(10,440,tempo); //LA
  delay(tempo);
  tone(10,294,tempo); //RE
  delay(tempo);
  tone(10,349,tempo/2); //FA
  delay(tempo/2);
  tone(10,392,tempo/2); //SOL
  delay(tempo/2);
  tone(10,330,tempo); //MI
  delay(tempo);
}

Criando a função

Caso você não deseja usar a função tone(), basta criar uma. Para isso nós precisamos dos mesmos parâmetros da função tone, o pino que deve ser acionado, a frequência e a duração. Basicamente a função identifica o período da frequência que você deseja e deixa o pino em alta durante metade do período e em baixa durante a outra metade. E ele repete até dar o tempo que foi definido no parâmetro “duracao”.

Código completo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
/*Feito pelo site MundoProjetado
Código que toca um pedaço da música
de abertura de Game of Thrones
*/

void tom(char pino, int frequencia, int duracao);

void setup(){
  pinMode(10,OUTPUT);
}
void loop(){
  /*
  Frequência das notas:
  Dó - 262 Hz
  Ré - 294 Hz
  Mi - 330 Hz
  Fá - 349 Hz
  Sol - 392 Hz
  Lá - 440 Hz
  Si - 494 Hz
  #Dó - 528 Hz
  */

  delay(1000);
  int tempo = 400;
  tom(10,440,tempo); //LA
  delay(tempo);
  tom(10,294,tempo); //RE
  delay(tempo);
  tom(10,349,tempo/2); //FA
  delay(tempo/2);
  tom(10,392,tempo/2); //SOL
  delay(tempo/2);
  tom(10,440,tempo); //LA
  delay(tempo);
  tom(10,294,tempo); //RE
  delay(tempo);
  tom(10,349,tempo/2); //FA
  delay(tempo/2);
  tom(10,392,tempo/2); //SOL
  delay(tempo/2);
  tom(10,330,tempo); //MI
  delay(tempo);
}

void tom(char pino, int frequencia, int duracao){
  float periodo = 1000.0/frequencia; //Periodo em ms
  for (int i = 0; i< duracao/(periodo);i++){ //Executa a rotina de dentro o tanta de vezes que a frequencia desejada cabe dentro da duracao
    digitalWrite(pino,HIGH);
    delayMicroseconds(periodo*500); //Metade do periodo em ms
    digitalWrite(pino, LOW);
    delayMicroseconds(periodo*500);
  }
}

Desse último jeito é possível até implementar no PIC, basta trocar os comandos de digitalWrite para o PORT e alterar os delays.

Tocando música com o Arduino – Buzzer