Início
/
Projetos Arduino
/
Projetos Squids
/
Básico
/
Projeto 34 - Como gerar melodias através de um sonorizador piezoelétrico
Projeto 34 - Como gerar melodias através de um sonorizador piezoelétrico
Angelo Luis Ferreira | 26/02/2018
Acessos: 7.435
Básico - Projeto 34
Criar melodia utilizando um buzzer ou um disco piezoelétrico
Objetivo
Neste projeto vamos criar um circuito e um programa no IDE do Arduino para gerar melodias através sonorizador piezoelétrico, que pode ser um disco piezoelétrico ou um buzzer. Neste exemplo vamos fazer com que o seu Arduino toque o refrão da música “Puff, o Dragão Mágico” (no original, “Puff, the Magic Dragon”).
Definições
Disco Piezoelétrico: Um disco piezo funciona quando uma corrente elétrica passa pelo material cerâmico do disco, fazendo com que ele mude de forma e produza um som. O disco também funciona de forma inversa: quando se bate nele ou ele sofre algum tipo de pressão, a força no material provoca a geração de uma corrente elétrica. Para saber mais, leia: https://pt.wikipedia.org/wiki/Piezoeletricidade e Transdutor Piezoelétrico.
Buzzer: Nada mais é do que um transdutor piezoelétrico encapsulado.
Obs.: O buzzer e o disco são sonorizadores piezoelétricos. Quando se aplica um sinal elétrico e um determinada frequência, o dispositivo piezoelétrico produz uma nota musical. As notas variam de acordo com a frequência utilizada. (O ouvido humano pode ouvir sons nas frequências entre 20 e 20.000 Hz).
Aplicação
Para fins didáticos e criação de sons com arduino.
Componentes necessários
Montagem do Circuito
Conecte os componentes no Protoboard como mostra a figura abaixo. Verifique cuidadosamente os cabos de ligação antes de ligar seu Arduino. Lembre-se que o Arduino deve estar totalmente desconectado da força enquanto você monta o circuito. Neste projeto você poderá utilizar um buzzer ou um disco piezoelétrico na montagem do circuito. Se possível, teste com os dois componentes.
Atenção
1. O buzzer tem polaridade. Portando, cuidado para não ligar o buzzer invertido. Se você retirar o adesivo superior do buzzzer poderá ver um sinal de positivo (+). Este sinal mostra onde está o pino positivo do componente que deverá estar conectado à uma porta digital do Arduino e o polo negativo ao GND.
2. Assim como o buzzer, o disco piezoelétrico também tem polaridade. O fio positivo deve estar conectado na camada de cerâmica piezoelétrica e deverá ser conectado à um porta digital do Arduino.
3) A montagem abaixo foi realizada em um protoboard com linhas de alimentação não contínuas, onde acrescentamos jampers para a ligação. Verifique se o seu protoboard possui linhas de alimentação contínuas ou separadas.
Observação: No exemplo acima, utilizamos um disco piezoelétrico. Você poderá substituir o disco piezoelétrico por um buzzer para ter um efeito semelhante. O cabo vermelho (positivo) deverá estar conectado ao pino digital 4 do Arduino e o cabo preto (negativo) conectado ao GND (ground).
Código do Projeto (Sketch)
Faça o dowload e abra o arquivo projeto34.ino no IDE do Arduino: DOWNLOAD - projeto34.ino
Ou se preferir, copie e cole o código abaixo no IDE do Arduino:
/*******************************************************************************
*
* Projeto 34 – Tocar melodia com um disco piezoelétrico
* http://squids.com.br/arduino
*
*******************************************************************************/
#define NOTE_C3 131
#define NOTE_CS3 139
#define NOTE_D3 147
#define NOTE_DS3 156
#define NOTE_E3 165
#define NOTE_F3 175
#define NOTE_FS3 185
#define NOTE_G3 196
#define NOTE_GS3 208
#define NOTE_A3 220
#define NOTE_AS3 233
#define NOTE_B3 247
#define NOTE_C4 262
#define NOTE_CS4 277
#define NOTE_D4 294
#define NOTE_DS4 311
#define NOTE_E4 330
#define NOTE_F4 349
#define NOTE_FS4 370
#define NOTE_G4 392
#define NOTE_GS4 415
#define NOTE_A4 440
#define NOTE_AS4 466
#define NOTE_B4 494
#define WHOLE 1
#define HALF 0.5
#define QUARTER 0.25
#define EIGHTH 0.125
#define SIXTEENTH 0.0625
int tune[] = { NOTE_C4, NOTE_C4, NOTE_C4, NOTE_C4, NOTE_C4, NOTE_B3, NOTE_G3, NOTE_A3,
NOTE_C4, NOTE_C4, NOTE_G3, NOTE_G3, NOTE_F3, NOTE_F3, NOTE_G3, NOTE_F3, NOTE_E3, NOTE_G3,
NOTE_C4, NOTE_C4, NOTE_C4, NOTE_C4, NOTE_A3, NOTE_B3, NOTE_C4, NOTE_D4};
float duration[] = { EIGHTH, QUARTER+EIGHTH, SIXTEENTH, QUARTER, QUARTER, HALF, HALF,
HALF, QUARTER, QUARTER, HALF+QUARTER, QUARTER, QUARTER, QUARTER, QUARTER+EIGHTH, EIGHTH,
QUARTER, QUARTER, QUARTER, EIGHTH, EIGHTH, QUARTER, QUARTER, QUARTER, QUARTER,
HALF+QUARTER};
int comprimento;
void setup() {
pinMode(4, OUTPUT);
comprimento = sizeof(tune) / sizeof(tune[0]);
}
void loop() {
for (int x=0; x<comprimento; x++) {
tone(4, tune[x]);
delay(1500 * duration[x]);
noTone(4);
}
delay(3000);
}
Depois, faça a verificação e o upload para o microcontrolador.
Vídeo
Como o projeto deve funcionar
1. Quando você inicia o programa, o sonorizador piezoelétrico irá tocar notas musicais definidas no sketch.
2. Após finalização da melodia, o programa espera 3s para ser reiniciado.
Gerar sons em um dispositivo piezoelétrico
1. Para gerar sons em um dispositivo piezoelétrico, buzzer ou disco, utilizamos a função tone(pin, frequência, duração), onde:
. É gerada uma onda quadrada de cerca de 50% no pino especificado como pin;
. A frequência é dada em hertz (Hz);
. A duração é dada em milisegundos (ms);
. Apenas um tom pode ser gerado por vez.
1.2. Para interromper o som, ou seja, interromper a geração da onda no pino especificado, podemos utilizar a função noTone(pin).
Explicando o Código do Projeto
1. Primeiro definimos e declaramos as constantes e as variáveis do projeto.
1.1. Observe que utilizamos as constantes e variáveis tipo "int" e "float". Veja na tabela abaixo as diferenças nos tipos de constantes e variáveis:
Tipo |
Valores Válidos para Variáveis e Constantes
|
char |
letras e símbolos: 'a', 'b', 'H', '^', '*','1','0' |
int |
de -32767 até 32767 (apenas números inteiros) |
float |
de -3.4 x 1038 até +3.4 x 10+38com até 6 dígitos de precisão (2 casas depois da vírgula) |
double |
de -1.7 x 10308 até +1.7 x 10+308com até 10 dígitos de precisão |
1.2. Através da diretiva #define, definimos todas as notas musicais que serão utilizadas na melodia. Para conhecer as principais notas musicais que você poderá utilizar nos seus projetos, acesse: Tabela Notas Musicais.
1.2.1. Uma diretiva #define define um valor e seu token correspondente. Por exemplo: #define PI 3.141592653589793238. Isso permitirá que você substitua PI em qualquer cálculo, em vez de ter de digitar pi com várias casas decimais toda vez. (Não utilize ponto e vírgula no final de uma diretiva #define).
1.2.2. Neste projeto criamos um conjunto de várias diretivas #define, em que os tokens são as notas de C3 a B41 e seus valores referentes às frequências necessárias para gerar o som. A primeira nota definida, C3 tem frequência correspondente 131 Hz.
1.2.2.1. Nem todas as notas definidas são utilizadas em sua melodia, mas foram incluídas, caso você queira criar uma nova música - para as principais notas musicais acesse a Tabela Notas Musicais.
Observação: As letras A, B, C, D, E, F e G são utilizadas para as notas lá, si, dó, ré, mi, fá e sol, respectivamente (fonte: Wikipédia). Por exemplo, C4, frequência de 262 Hz, é o C médio na escala musical.
1.3. Definimos também através da derivativa #define os tempos (ou durações das notas). As notas podem ter duração de um compasso inteiro (semínima), meio compasso (colcheia), um quarto de compasso (semicolcheia), um oitavo de compasso (fusa) e um dezesseis avos de compasso (semifusa). Veja a tabela abaixo com todos os tempos:
1.3.1. No projeto usamos WHOLE como semínima, HALF como colcheia, QUARTER como semicolcheia, EIGHTH como fusa e SIXTEENTH como semifusa.
1.4. Definimos o array tipo inteiro tune[] com todas as notas musicais na ordem que deverão ser tocadas.
1.5. Definimos o array tipo float duration[] com todos os tempos (ou duração) das notas musicais definidas anteriormente.
1.4. Declaramos a variável tipo inteira comprimento.
2. Através da estrutura void setup(), definimos:
2.1. Define-se como saída do controlador Arduino (OUTPUT) a porta digital 4, onde deverá estar conectado o terminal positivo do disco piezoelétrioco ou do buzzer.
2.2. Definimos que a variável comprimento = sizeof(tune) / sizeof (tune[0]), ou seja, a variável comprimento será igual ao número de notas musicais do array tune (neste projeto são 26 notas musiciais).
2.2.1. O operador sizeof conta o número total de bytes ocupados no array tune. Dividido pelo número de bytes do primeiro elemento, tune[0], teremos o total de notas musicais dentro do array tune.
Observação: Neste exemplo todas notas musicais tem o mesmo tamanho de bytes (ou de caracteres).
3. Através da estrutura void loop(), obtemos:
3.1. Criamos um loop de incremento 1, variando de x=0 até o xonde no nosso projeto, a variável comprimento é calculada como 26 (número de notas musicais ocupadas no array tune).
3.2. Através da função tone(4, tune[x]) tocamos as notas de acordo com o array tune[].
3.3. Através da função delay(1500 * duração[x]) definimos a duração de cada nota. Observe que utilizamos como compasso o valor de 1500ms. (As notas podem ter duração de um compasso inteiro (semínima), meio compasso (colcheia), um quarto de compasso (semicolcheia), um oitavo de compasso (fusa) e um dezesseis avos de compasso (semifusa)).
Observação 1: Podemos também utilizar a seguinte linha de comando, tone(4, tune[x], 1500 * duration[x]); eliminando a linha delay(1500 * duração[x]).
Observação 2: Alterando o valor do compasso, a melodia será tocada de forma mais rápida ou mais devagar.
3.4. Interrompe o som do sonorizador piezoelétrico.
3.5. Através da função delay(3000), o programa espera 3 segundos para reiniciar a música.
O anúncio abaixo ajuda a manter o Squids Arduino funcionando
Comentários