Início
/
Projetos Arduino
/
Projetos Squids
/
Básico
/
Projeto 35 - Sketch padrão para criar melodias (exemplos : hinos do palmeiras e do Corinthians)
Projeto 35 - Sketch padrão para criar melodias (exemplos : hinos do palmeiras e do Corinthians)
Angelo Luis Ferreira | 14/03/2018
Acessos: 15.306
Básico - Projeto 35
Padrão para criar melodias com buzzer (compilação)
Objetivo
Neste projeto vamos apresentar um sketch padrão para criar melodias através de um buzzer, um disco piezoelétrico ou um speaker (auto falante). Neste exemplo vamos utilizar o conceito de compilação de arquivos tipo header file, que são arquivos com extensão .h que permitem maior organização, otimização na estrutura e reutilização do programa em outros projetos. Para perceber isso, faça uma comparação entre este projeto e o projeto 34, que apresenta a execução de uma melodia também.
Definições
Header file: Em programação de computadores, um arquivo cabeçalho (em inglês: header file) é um arquivo que permite que os programadores separem certos elementos de um código fonte de um programa em arquivos reutilizáveis.
Compilação: A compilação transformará o conjunto de arquivos-fonte em um arquivo executável, também conhecido como binário.
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
Referência
|
Componente
|
Quantidade
|
Imagem
|
Observação
|
Protoboard |
Protoboard 830 pontos |
1 |
|
No mínimo utilizar protoboard com 830 pontos
|
Jumpers |
Kit cabos ligação macho / macho |
1 |
|
|
Buzzer |
Buzzer ativo 5V 12mm
|
1 |
|
Utilize um buzzer ou um disco piezoelétrico |
Potenciômetro |
Potenciômetro 10K
|
1 |
|
O valor do potenciômetro aumenta quando giramos o eixo do componente na direção do polo negativo para o polo positivo.
|
Arduino UNO R3 |
Arduino UNO |
1 |
|
Você poderá utilizar uma placa Arduino UNO original ou similar |
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 ao potenciômetro (neste projeto) ou a uma porta digital do Arduino e o polo negativo ao GND.
2. Observe que nesse projeto o potenciômetro foi montado como um reostato, onde utilizamos apenas 2 terminais do componente:
2.1. Veja a montagem do nosso projeto abaixo:
Desta forma o potenciômetro funciona como um resistor variável e não pode ser controlado pela IDE do Arduino. Girando o eixo no sentido horário (da saída do arduino para a entrada do buzzer) aumentaremos o volume do som, e ao contrário, diminuímos o volume do som. Isto acontece pois girando o eixo do reostato aumentaremos ou diminuímos a tensão no buzzer, variando de 0 a 5V. Para saber mais sobre a diferença entre potenciômetro e reostato leia o tutorial: Potenciômetro ou reostato: qual a diferença?
3. A montagem do nosso projeto 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 buzzer. Você poderá substituir o buzzer por um disco piezoelétrico para ter um efeito semelhante. O cabo vermelho (positivo) deverá estar conectado ao terminal "b" do potenciômetro e o cabo preto (negativo) conectado ao GND (ground).
Código do Projeto (Sketch)
Observe que no sketch do projeto vamos apresentar um programa padrão com apenas 7 notas musicais em uma escala intermediária (C4, D4, E4, F4, G4, A4, B4). Leia Noções básicas de teoria musical.
A partir deste sketch padrão, você poderá criar qualquer música no seu Arduino. Neste projeto vamos deixar como exemplo os hinos do Palmeiras e do Corinthians.
1. Faça o dowload e abra o arquivo projeto35.ino no IDE do Arduino: DOWNLOAD - projeto35.ino
Ou se preferir, copie e cole o código abaixo no IDE do Arduino:
/*******************************************************************************
*
* Projeto 35 - Padrão para tocar qualquer melodia com buzzer ou auto-falante
* http://squids.com.br/arduino
*
*******************************************************************************/
#include "notas.h" //arquivo com definição de todas as notas anexadas
#define NO_SOUND 0
// Notas que devem ser tocadas disponibilizadas ordenadamente;
int melodia[] ={
NOTE_C4,NOTE_D4,NOTE_E4,NOTE_F4,NOTE_G4,NOTE_A4,NOTE_B4
};
// Duração das Notas: Semicolcheia:16; Colcheia:8; Semínima: 4; Mínima:2; Semibreve:1
int tempoNotas[] ={
4,4,4,4,4,4,4
};
const int compasso = 1500; // Altera o compasso da música
const int comprimento = 7; // Número de notas musicais indicado no vetor melodia
const int pinBuzzer = 8; // Indica a porta digital ligada ao buzzer
void setup(){
pinMode(pinBuzzer, OUTPUT);
}
void loop(){
for (int Nota = 0; Nota <comprimento; Nota++){//comprimento indica quantas notas tem o nosso vetor.
int tempo = compasso/tempoNotas[Nota]; //Tempo = compasso dividido pela indicação do vetor tempoNotas.
tone(pinBuzzer, melodia[Nota],tempo); //Toca a nota indicada pelo vetor melodia durante o tempo.
// Para distinguir as notas adicionamos um tempo entre elas (tempo da nota + 20%).
delay(tempo*1.2);
}
delay(3000);
}
2. Obtenha o header file notas.h e coloque na mesma pasta do sketch no IDE do Arduino: DOWNLOAD - notas.h
Atenção: o arquivo notas.h deverá estar na mesma pasta onde está o sketch principal:
3. No IDE do Arduino, faça a verificação e o upload para o microcontrolador.
Atenção: Observe que deverá aparecer uma aba com o header file notas.h, como mostra a figura acima. Para visualizar ou alterar o código no IDE basta clicar sobre a aba notas.h.
4. Exemplos:
Como exemplo de criação de músicas, deixaremos abaixo os códigos dos hinos do Palmeiras e Corinthians: (Os códigos abaixo foram obtidos do tutorial do site Laboratório de Garagem: Como Fazer Hinos dos Times de Futebol de São Paulo com Arduino)
Hino do Palmeiras: DOWNLOAD -Hino do Palmeiras
Hino do Corinthians: DOWNLOAD -Hino do Corinthians
Vídeo
Vamos utilizar como exemplo do projeto o hino do Palmeiras. Veja o vídeo abaixo:
Como o projeto deve funcionar
1. Quando você inicia o programa, o sonorizador piezoelétrico irá tocar notas musicais nos tempos definidos no sketch.
2. Se desejar aumentar ou diminuir o volume, basta girar o eixo do potenciômetro para a direita (aumentar) ou para a esquerda (diminuir).
3. 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". 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 #include incluímos o "header file" notas.h para ser compilado junto ao sketch (não utilize ponte e vírgula no final de uma diretiva #include).
1.2.1. A diretiva #include é utilizada para incluir bibliotecas externas em um sketch. Isso dá ao programador acesso a um grande grupo de bibliotecas C padrão (grupos de funções pré definidas) e também bibliotecas específicas para o Arduino. Como exemplo, o nosso header file que criamos denominado notas.h.
1.2.2. O header file notas.h, que você poderá encontrar em Tabela Notas Musicais, irá definir todas as notas musicais em várias escalas. No arquivo encontraremos um conjunto de várias diretivas #define cujo os tokens são as notas musicais com seus valores de frequência correspondentes necessários para gerar o som.
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, C2, frequência de 65 Hz, é o Dó na escala musical 2, e GS1 por exemplo, tem frequência de 52Hz e significa Sol sustenido (S) na escala musical 1.
1.3. Através da diretiva #define, definimos a constante NO_SOUND como 0 (zero). Esta constante poderá ser utilizada em qualquer música com uma pausa entre as notas musicais no tempo pré-definido. Veja no exemplos dos hinos do Palmeiras e do Corinthians onde esta constante é utilizada.
1.4. Definimos o array tipo inteiro melodia[] com todas as notas musicais na ordem que deverão ser tocadas. Neste exemplo utilizamos apenas 7 notas musicais na escala intermediária: (NOTE_C4, NOTE_D4, NOTE_E4, NOTE_F4, NOTE_G4, NOTE_A4, NOTE_B4). É importante salientar que as frequências desta notas serão obtidas no arquivo notas.h.
1.5. Definimos o array tipo int tempoNotas[] com os valores relativos aos tempos (ou duração) das notas musicais, definidas como:
Observação importante: O número de elementos do array tempoNotas[] deve ser o mesmo do array melodia[]. Portanto, neste exemplo, os dois arryays devem ter 7 elementos na mesma ordem, ou seja, uma nota musical com um valor relativo à duração da nota musical correspondente. É importante salientar que quando você utilizar a constante NO_SOUND, a mesma deverá se comportar como uma nota musical, devendo ter um valor relativo à duração que irá indicar uma pausa entre as notas musicais com um tempo definido.
1.6. Declaramos a constante tipo inteira compasso como 1500. Este valor poderá ser alterado, fazendo com que a melodia seja tocada de forma mais rápida (<1500) ou mais lenta (>1500).
1.7. Declaramos a constante tipo inteira comprimento como o valor total das notas musicais e tempos definidos nos arrays melodia[] e tempoNotas[]. Neste exemplo o valor da constante comprimento será 7.
1.8. Declaramos a constante tipo inteira pinBuzzer como 8, referindo-se à porta digital 8 do Arduino.
2. Através da estrutura void setup(), definimos:
2.1. Define-se como saída do controlador Arduino (OUTPUT) a porta digital 8 (pinBuzzer), onde deverá estar conectado o potenciômetro ligado terminal positivo do sonorizador piezoelétrico (buzzer).
3. Através da estrutura void loop(), obtemos:
3.1. Criamos um loop de incremento 1, variando de Nota=0 até o Notaonde no nosso projeto, a variável comprimento é 7 (número de notas musicais ocupadas no array melodia).
3.2. Através da expressão int tempo = compasso/tempoNoteas[Nota], definimos a variável local tempo (duração da nota musical) como a constante compasso dividida pelo valor relativo indicado pelo array tempoNotas. Portanto, quanto maior o compasso maior será a duração de cada nota, ou seja, a melodia será executada de forma mais lenta.
3.3. Através da função tone(pinBuzzer, melodia[Nota],tempo) tocamos as notas de acordo com o array melodia[] e a duração da nota musical definida pela variável tempo.
3.4. Através da função delay(temp*1,2) adicionamos mais 20% na duração para distinguir melhor cada nota musical.
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