-
Buzzer
Músicas monofonicas1 são aquelas que só possuem uma única nota tocada por vez, como indicado na partitura a seguir:
ref: wikipidia
A música monofonica tem o som como a seguir:
Esse tipo de música foi muito utilizada nos primeiros videogames, quando a sintetização de músicas ainda estava no começo. Veja como era feito nos Nintendo, aqui já era possível gerar mais de um tom por vez:
Buzzer
Para gerarmos o som é necessário termos algum dispositivo capaz de gerar movimentação no ar, o buzzer é um dispositivo simples que a partir de uma bobina (controlada por um terminal) conseguimos movimentar um disco que por sua vez movimentar o ar. Os buzzers podem ser de duas categorias (piezoelétricos):
- Ativo: basta energizar o terminal que o dispositivo vibra automaticamente em uma determinada frequência, muito usado para alarmes.
- Passivo: Um circuito externo (ou microcontrolador) deve gerar a frequência de vibração, usado para gerar som.
Buzzers são diferentes de altofalantes2 em vários aspectos (mecânico, eletromecânico): não necessitam de tensão negativa; possuem um espectro de operação menor; baixa resistência; baixa potência ... .
A conexão do buzzer com um microcontrolador se da por dois pinos: Um conectado no terra (gnd) e outro conectado em um pino que o microcontrolador possui controle, conforme ilustração a seguir:
Gerando som
Podemos fazer com que o buzzer oscile em uma determinada frequência, para isso basta gerarmos um sinal de onda quadrada no terminal positivo do dispositivo, isso irá fazer com que o piezo movimente na mesma frequência, gerando o tom desejado.
Notas
As notas musicais são definidas pela frequência principal que elas emitem, um Dó-4 é definido por 262 Hz, um Lá-4 por 440Hz e assim por diante (o 4 se refere ao meio do piano). Além da frequência principal, cada instrumento musical emite outras frequências que compõem o som, gerando um som único para cada instrumento.
Iremos usar a notacao americana para as notas:
Dó | Ré | Mi | Fá | Sol | Lá | Sí |
---|---|---|---|---|---|---|
C | D | E | F | G | A | B |
Ref: https://upload.wikimedia.org/wikipedia/commons/thumb/6/65/Frequency_vs_name.svg/350px-Frequency_vs_name.svg.png Wikipidia
Frequências
Lembre que uma onda quadrada pode ser decomposta em infinitas senoides pela transformada de Fourier.
Sendo a componente principal (de maior energia) centrada na frequência da onda quadrada (no nosso caso):
Portanto o som que iremos escutar será composto da frequência principal mais as harmónicas.
ref: https://mathworld.wolfram.com/images/eps-gif/FourierSeriesSquareWave_800.gif
Existem diversas maneiras de gerarmos uma onda quadrada em um pino do microcontrolador, a que estamos sugerindo aqui não envolve nenhum periférico específico do microcontrolador, logo iremos fazer tudo por código.
Gerando a frequência
Para gerar uma onda quadrada da nota Dó (261.63 Hz) precisamos calcular seu período e definir o tempo em que a mesma ficará em nível lógico alto e baixo (0 e 1):
T = 1 ÷ 261,63
T = 0,0038s
Na Pico W, programando em C, geralmente utilizamos a função sleep_ms para gerar atraso no código, precisamos então converter esse valor para milissegundos ( dividir por 1000) e também dividr por 2 e gerar os respectivos atrasos nos níveis lógico:
delay = (0,0038 x 1000 ) ÷ 2
delay ≃ 1,9 ms
sleep_us
Como podemos observar, utilizando sleep_ms temos um limite de frequência das notas músicais que podemos alcançar, por 2 motivos:
- Essa função é do tipo int, ou seja, dependendo do valor do delay a parte fracionária será perdida, mantendo somente a parte inteira;
- Para frequências acima de 506Hz, o delay utilizado no sleep_ms começa a receber valores abaixo de 1, fazendo com que seja necessário a utilização da função da sleep_us no lugar da sleep_ms.
Tip
OBS: Não esquecer de alterar a escala de ms para us:
0,000001 s = 0,001 ms = 1 us
Para o mesmo exemplo com a nota Dó (261.63 Hz), utlizando sleep_us, ficaria:
Controlando a duração
Agora que sabemos como gerar a frequência, precisamos entender como controlamos a duração da mesma.
Por exemplo, para tocar a nota Dó (261.63 Hz) por 2 segundos (2.000.000us), sabendo que o período total é de 3800us, precisamos definir quantas vezes é preciso repetir esse ciclo, basta dividir o tempo desejado pela duração de cada ciclo:
2.000.000 ÷ 3800 ≃ 526 vezes
Ou seja, precisamos repetir esse periodo 526 vezes, logo:
for(int i = 0; i < 526 ; i++){
gpio_put(PIN_BUZZER, 1);
sleep_us(1900);
gpio_put(PIN_BUZZER, 0);
sleep_us(1900);
}
Música
Eu fiz por anos aula de sax alto e meu professor falava que para começar a tocar uma música bastava: tocar a nota certa no momento certo e não tocar quando não for para tocar
, para quem tem prática é fácil, mas para mim não era. Trouxe este assunto para explicar um pouco como iremos reproduzir uma música. Cada música será formada por notas (frequências), pela duração da nota e por um silêncio entre notas (que também tem duração ). Toda essa informação está presente na partitura:
ref: https://www.musicnotes.com/now/tips/how-to-read-sheet-music/
Portanto para reproduzirmos uma música teremos que para cada intervalo de tempo:
- Reproduzir uma nota (gerar a frequência da nota no pino do buzzer) ou não tocar nada (pausa)
- Manter a nota/pausa pelo tempo determinado
- Ir para o próximo intervalo de tempo