Olá pessoal, como estão? Criando muitas coisas fantásticas com algum microcontrolador?
Nesse tutorial vamos abordar novamente a implementação de arduino com som, como já fizemos no nosso outro tutorial Aprenda a utilizar o módulo ISD1820, se não viu ainda dá uma passadinha lá. Agora iremos criar as nossas próprias músicas e melodias, e as aplicações disso são infinitas, basta você compor a sua música e colocar para o arduino reproduzir!
Iremos criar músicas de duas formas, uma que apelidei carinhosamente se forma manual, na qual iremos definir qual o nível da nota a ser reproduzida pelo buzzer e a outra forma será através da biblioteca Tone, que contém diversas notas já prontinhas e basta você definir qual irá reproduzir.
Então agora que já sabemos um pouco mais sobre o projeto vamos lá conhecer esse tão falado buzzer!
Conhecendo o módulo buzzer
Nesse tutorial utilizar o Módulo Buzzer Passivo 5V , mostrado na Figura 01, que é um excelente módulo, geralmente precisamos de um circuito externo ao buzzer e fazer algumas adaptações na nossa programação para utilizar somente o buzzer, mas esse módulo contém todos os componentes de forma que a programação e a criação do projeto tornam-se muito mais simplificadas.
Figura 01: Módulo Buzzer Passivo
Fonte: Autocore Robótica
Agora que já vimos o sensor vamos lá a montagem do circuito!
Material Montando o Circuito
Materiais Utilizados:
Montagem:
O circuito para utilizar o nosso Módulo Muzzer é bastante simples, basta conectar os seguintes fios:
Módulo Arduino
VCC -> 5V ou 3.3V
GND -> GND
I/O -> D9
O circuito montado deve ficar assim :
Figura 01: Circuito Arduino UNo e Módulo Buzzer
Fonte: Autocore Robótica
Agora que já montamos o circuito vamos para a melhor parte, a programação ;D
Código comentado:
Através das portas PWM do Arduino podemos criar diferentes tonalidades com o nosso Módulo Buzzer, fizemos um exemplo abaixo da música tema do Super Mario World sendo tocada pelo nosso projetinho.
int buzzer = 9; //porta ligada ao buzzer //melodia do Super Mario World int melodia[] = {660,660,660,510,660,770,380,510,380,320,440,480,450,430,380,660,760,860,700,760,660,520,580,480,510,380,320,440,480,450,430,380,660,760,860,700,760,660,520,580,480,500,760,720,680,620,650,380,430,500,430,500,570,500,760,720,680,620,650,1020,1020,1020,380,500,760,720,680,620,650,380,430,500,430,500,570,585,550,500,380,500,500,500,500,760,720,680,620,650,380,430,500,430,500,570,500,760,720,680,620,650,1020,1020,1020,380,500,760,720,680,620,650,380,430,500,430,500,570,585,550,500,380,500,500,500,500,500,500,500,580,660,500,430,380,500,500,500,500,580,660,870,760,500,500,500,500,580,660,500,430,380,660,660,660,510,660,770,380}; //duraçao de cada nota em Milisegundos int duracaodasnotas[] = {100,100,100,100,100,100,100,100,100,100,100,80,100,100,100,80,50,100,80,50,80,80,80,80,100,100,100,100,80,100,100,100,80,50,100,80,50,80,80,80,80,100,100,100,100,150,150,100,100,100,100,100,100,100,100,100,100,150,200,80,80,80,100,100,100,100,100,150,150,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,150,150,100,100,100,100,100,100,100,100,100,100,150,200,80,80,80,100,100,100,100,100,150,150,100,100,100,100,100,100,100,100,100,100,100,100,100,60,80,60,80,80,80,80,80,80,60,80,60,80,80,80,80,80,60,80,60,80,80,80,80,80,80,100,100,100,100,100,100,100}; void setup() { //for para tocar as 156 notas começando no 0 ate 156 ++ incrementado for (int nota = 0; nota < 156; nota++) { int duracaodanota = duracaodasnotas[nota]; tone(buzzer, melodia[nota],duracaodanota); //pausa depois das notas int pausadepoisdasnotas[] ={150,300,300,100,300,550,575,450,400,500,300,330,150,300,200,200,150,300,150,350,300,150,150,500,450,400,500,300,330,150,300,200,200,150,300,150,350,300,150,150,500,300,100,150,150,300,300,150,150,300,150,100,220,300,100,150,150,300,300,300,150,300,300,300,100,150,150,300,300,150,150,300,150,100,420,450,420,360,300,300,150,300,300,100,150,150,300,300,150,150,300,150,100,220,300,100,150,150,300,300,300,150,300,300,300,100,150,150,300,300,150,150,300,150,100,420,450,420,360,300,300,150,300,150,300,350,150,350,150,300,150,600,150,300,350,150,150,550,325,600,150,300,350,150,350,150,300,150,600,150,300,300,100,300,550,575}; delay(pausadepoisdasnotas[nota]);} noTone(buzzer); } void loop() { }
Entende de música? Então, veja esse exemplo bem mais musicalmente definido, que nós adaptamos do Bhagman
Nele há várias músicas já pré compostas, basta apenas você tirar a que você quer reproduzir dos comentários e comentar a anterior.
#include <Tone.h> Tone tonalidade; #define OITAVA_OFFSET 0 int notas[] = { 0, NOTE_C4, NOTE_CS4, NOTE_D4, NOTE_DS4, NOTE_E4, NOTE_F4, NOTE_FS4, NOTE_G4, NOTE_GS4, NOTE_A4, NOTE_AS4, NOTE_B4, NOTE_C5, NOTE_CS5, NOTE_D5, NOTE_DS5, NOTE_E5, NOTE_F5, NOTE_FS5, NOTE_G5, NOTE_GS5, NOTE_A5, NOTE_AS5, NOTE_B5, NOTE_C6, NOTE_CS6, NOTE_D6, NOTE_DS6, NOTE_E6, NOTE_F6, NOTE_FS6, NOTE_G6, NOTE_GS6, NOTE_A6, NOTE_AS6, NOTE_B6, NOTE_C7, NOTE_CS7, NOTE_D7, NOTE_DS7, NOTE_E7, NOTE_F7, NOTE_FS7, NOTE_G7, NOTE_GS7, NOTE_A7, NOTE_AS7, NOTE_B7 }; char *musicas[10]; //*song = "The Simpsons:d=4,o=5,b=160:c.6,e6,f#6,8a6,g.6,e6,c6,8a,8f#,8f#,8f#,2g,8p,8p,8f#,8f#,8f#,8g,a#.,8c6,8c6,8c6,c6"; char *song = "Indiana:d=4,o=5,b=250:e,8p,8f,8g,8p,1c6,8p.,d,8p,8e,1f,p.,g,8p,8a,8b,8p,1f6,p,a,8p,8b,2c6,2d6,2e6,e,8p,8f,8g,8p,1c6,p,d6,8p,8e6,1f.6,g,8p,8g,e.6,8p,d6,8p,8g,e.6,8p,d6,8p,8g,f.6,8p,e6,8p,8d6,2c6"; //**char *song = "TakeOnMe:d=4,o=4,b=160:8f#5,8f#5,8f#5,8d5,8p,8b,8p,8e5,8p,8e5,8p,8e5,8g#5,8g#5,8a5,8b5,8a5,8a5,8a5,8e5,8p,8d5,8p,8f#5,8p,8f#5,8p,8f#5,8e5,8e5,8f#5,8e5,8f#5,8f#5,8f#5,8d5,8p,8b,8p,8e5,8p,8e5,8p,8e5,8g#5,8g#5,8a5,8b5,8a5,8a5,8a5,8e5,8p,8d5,8p,8f#5,8p,8f#5,8p,8f#5,8e5,8e5"; //char *song = "Entertainer:d=4,o=5,b=140:8d,8d#,8e,c6,8e,c6,8e,2c.6,8c6,8d6,8d#6,8e6,8c6,8d6,e6,8b,d6,2c6,p,8d,8d#,8e,c6,8e,c6,8e,2c.6,8p,8a,8g,8f#,8a,8c6,e6,8d6,8c6,8a,2d6"; //*char *song = "Muppets:d=4,o=5,b=250:c6,c6,a,b,8a,b,g,p,c6,c6,a,8b,8a,8p,g.,p,e,e,g,f,8e,f,8c6,8c,8d,e,8e,8e,8p,8e,g,2p,c6,c6,a,b,8a,b,g,p,c6,c6,a,8b,a,g.,p,e,e,g,f,8e,f,8c6,8c,8d,e,8e,d,8d,c"; //char *song = "Xfiles:d=4,o=5,b=125:e,b,a,b,d6,2b.,1p,e,b,a,b,e6,2b.,1p,g6,f#6,e6,d6,e6,2b.,1p,g6,f#6,e6,d6,f#6,2b.,1p,e,b,a,b,d6,2b.,1p,e,b,a,b,e6,2b.,1p,e6,2b."; //char *song = "Looney:d=4,o=5,b=140:32p,c6,8f6,8e6,8d6,8c6,a.,8c6,8f6,8e6,8d6,8d#6,e.6,8e6,8e6,8c6,8d6,8c6,8e6,8c6,8d6,8a,8c6,8g,8a#,8a,8f"; //char *song = "20thCenFox:d=16,o=5,b=140:b,8p,b,b,2b,p,c6,32p,b,32p,c6,32p,b,32p,c6,32p,b,8p,b,b,b,32p,b,32p,b,32p,b,32p,b,32p,b,32p,b,32p,g#,32p,a,32p,b,8p,b,b,2b,4p,8e,8g#,8b,1c#6,8f#,8a,8c#6,1e6,8a,8c#6,8e6,1e6,8b,8g#,8a,2b"; //char *song = "Bond:d=4,o=5,b=80:32p,16c#6,32d#6,32d#6,16d#6,8d#6,16c#6,16c#6,16c#6,16c#6,32e6,32e6,16e6,8e6,16d#6,16d#6,16d#6,16c#6,32d#6,32d#6,16d#6,8d#6,16c#6,16c#6,16c#6,16c#6,32e6,32e6,16e6,8e6,16d#6,16d6,16c#6,16c#7,c.7,16g#6,16f#6,g#.6"; //char *song = "MASH:d=8,o=5,b=140:4a,4g,f#,g,p,f#,p,g,p,f#,p,2e.,p,f#,e,4f#,e,f#,p,e,p,4d.,p,f#,4e,d,e,p,d,p,e,p,d,p,2c#.,p,d,c#,4d,c#,d,p,e,p,4f#,p,a,p,4b,a,b,p,a,p,b,p,2a.,4p,a,b,a,4b,a,b,p,2a.,a,4f#,a,b,p,d6,p,4e.6,d6,b,p,a,p,2b"; //char *song = "StarWars:d=4,o=5,b=45:32p,32f#,32f#,32f#,8b.,8f#.6,32e6,32d#6,32c#6,8b.6,16f#.6,32e6,32d#6,32c#6,8b.6,16f#.6,32e6,32d#6,32e6,8c#.6,32f#,32f#,32f#,8b.,8f#.6,32e6,32d#6,32c#6,8b.6,16f#.6,32e6,32d#6,32c#6,8b.6,16f#.6,32e6,32d#6,32e6,8c#6"; //*char *song = "GoodBad:d=4,o=5,b=56:32p,32a#,32d#6,32a#,32d#6,8a#.,16f#.,16g#.,d#,32a#,32d#6,32a#,32d#6,8a#.,16f#.,16g#.,c#6,32a#,32d#6,32a#,32d#6,8a#.,16f#.,32f.,32d#.,c#,32a#,32d#6,32a#,32d#6,8a#.,16g#.,d#"; //*char *song = "TopGun:d=4,o=4,b=31:32p,16c#,16g#,16g#,32f#,32f,32f#,32f,16d#,16d#,32c#,32d#,16f,32d#,32f,16f#,32f,32c#,16f,d#,16c#,16g#,16g#,32f#,32f,32f#,32f,16d#,16d#,32c#,32d#,16f,32d#,32f,16f#,32f,32c#,g#"; //char *song = "A-Team:d=8,o=5,b=125:4d#6,a#,2d#6,16p,g#,4a#,4d#.,p,16g,16a#,d#6,a#,f6,2d#6,16p,c#.6,16c6,16a#,g#.,2a#"; //*char *song = "Flinstones:d=4,o=5,b=40:32p,16f6,16a#,16a#6,32g6,16f6,16a#.,16f6,32d#6,32d6,32d6,32d#6,32f6,16a#,16c6,d6,16f6,16a#.,16a#6,32g6,16f6,16a#.,32f6,32f6,32d#6,32d6,32d6,32d#6,32f6,16a#,16c6,a#,16a6,16d.6,16a#6,32a6,32a6,32g6,32f#6,32a6,8g6,16g6,16c.6,32a6,32a6,32g6,32g6,32f6,32e6,32g6,8f6,16f6,16a#.,16a#6,32g6,16f6,16a#.,16f6,32d#6,32d6,32d6,32d#6,32f6,16a#,16c.6,32d6,32d#6,32f6,16a#,16c.6,32d6,32d#6,32f6,16a#6,16c7,8a#.6"; //char *song = "Jeopardy:d=4,o=6,b=125:c,f,c,f5,c,f,2c,c,f,c,f,a.,8g,8f,8e,8d,8c#,c,f,c,f5,c,f,2c,f.,8d,c,a#5,a5,g5,f5,p,d#,g#,d#,g#5,d#,g#,2d#,d#,g#,d#,g#,c.7,8a#,8g#,8g,8f,8e,d#,g#,d#,g#5,d#,g#,2d#,g#.,8f,d#,c#,c,p,a#5,p,g#.5,d#,g#"; //*char *song = "Gadget:d=16,o=5,b=50:32d#,32f,32f#,32g#,a#,f#,a,f,g#,f#,32d#,32f,32f#,32g#,a#,d#6,4d6,32d#,32f,32f#,32g#,a#,f#,a,f,g#,f#,8d#"; //*char *song = "Smurfs:d=32,o=5,b=200:4c#6,16p,4f#6,p,16c#6,p,8d#6,p,8b,p,4g#,16p,4c#6,p,16a#,p,8f#,p,8a#,p,4g#,4p,g#,p,a#,p,b,p,c6,p,4c#6,16p,4f#6,p,16c#6,p,8d#6,p,8b,p,4g#,16p,4c#6,p,16a#,p,8b,p,8f,p,4f#"; //**char *song = "MahnaMahna:d=16,o=6,b=125:c#,c.,b5,8a#.5,8f.,4g#,a#,g.,4d#,8p,c#,c.,b5,8a#.5,8f.,g#.,8a#.,4g,8p,c#,c.,b5,8a#.5,8f.,4g#,f,g.,8d#.,f,g.,8d#.,f,8g,8d#.,f,8g,d#,8c,a#5,8d#.,8d#.,4d#,8d#."; //char *song = "LeisureSuit:d=16,o=6,b=56:f.5,f#.5,g.5,g#5,32a#5,f5,g#.5,a#.5,32f5,g#5,32a#5,g#5,8c#.,a#5,32c#,a5,a#.5,c#.,32a5,a#5,32c#,d#,8e,c#.,f.,f.,f.,f.,f,32e,d#,8d,a#.5,e,32f,e,32f,c#,d#.,c#"; //*char *song = "MissionImp:d=16,o=6,b=95:32d,32d#,32d,32d#,32d,32d#,32d,32d#,32d,32d,32d#,32e,32f,32f#,32g,g,8p,g,8p,a#,p,c7,p,g,8p,g,8p,f,p,f#,p,g,8p,g,8p,a#,p,c7,p,g,8p,g,8p,f,p,f#,p,a#,g,2d,32p,a#,g,2c#,32p,a#,g,2c,a#5,8c,2p,32p,a#5,g5,2f#,32p,a#5,g5,2f,32p,a#5,g5,2e,d#,8d"; //*char *song = "goldenaxe:d=4,o=5,b=112:8a4,32p,16b4,16p,2c,16p,8a4,32p,16b4,16p,2c,16p,8b4,32p,16c,16p,d,32p,8g.4,16c,16b4,2a4"; //char *song = "missathing:d=4,o=5,b=125:2p,16a,16p,16a,16p,8a.,16p,a,16g,16p,2g,16p,p,8p,16g,16p,16g,16p,16g,8g.,16p,c6,16a#,16p,a,8g,f,g,8d,8f.,16p,16f,16p,16c,8c,16p,a,8g,16f,16p,8f,16p,16c,16p,g,f"; //char *song = "batman:d=8,o=5,b=180:b,b,a#,a#,a,a,a#,a#,b,b,a#,a#,a,a,a#,a#,4b,p,4b"; //char *song = "Beethoven:d=4,o=5,b=160:c,e,c,g,c,c6,8b,8a,8g,8a,8g,8f,8e,8f,8e,8d,c,e,g,e,c6,g"; //char *song = "Coca-cola:d=4,o=5,b=125:8f#6,8f#6,8f#6,8f#6,g6,8f#6,e6,8e6,8a6,f#6,d6,2p"; //char *song = "Abba - Mamma Mia :d=4,o=5,b=40:32f6,32d#6,32f6,8d#6,32d#6,32d#6,32f6,32g6,32f6,16d#.6,32p,16f6,8d#6,16g#6,32g#6,32g#6,32g#6,16g6,16d#.6,32p,8a#6,32a#6,32a#6,16a#6,16f6,16g6,8g#6,16g6,16g6,32g6,16g6,16d6,16d#6,8f6,16f6,8d#6,16g#6,32g#6,32g#6,32g#6,32g6,32d#6,32f6,16d#6"; //char *song = "Alice Deejay - Better Off Alone : d=4,o=5,b=125:a,8a,f#,a,a,g#,8e,8e.6,8e.6,8c#6,a,8a,f#,a,a,g#,8e,8d.6,8d.6,8c#6,a,8a,f#,a,a,g#,8e,8e.6,8e.6,8c#6,a,8a,f#,a,a,g#,8d,8d.6,8d.6,8c#6"; //char *song = "Eiffel 65 - Blue : d=4,o=5,b=125:a,8a#,8d,8g,8a#,8c6,8f,8a,a#,8g,8a#,8d6,8d#6,8g,8d6,8c6,8a#,8d,8g,8a#,8c6,8f,8a,a#,8g,8a#,8d6,8d#6,8g,8d6,8c6,8a#,8d,8g,8a#,8a,8c,8f,g.,"; //*char *song = "PinkPanther:d=4,o=5,b=160:8d#,8e,2p,8f#,8g,2p,8d#,8e,16p,8f#,8g,16p,8c6,8b,16p,8d#,8e,16p,8b,2a#,2p,16a,16g,16e,16d,2e"; //*char *song = "ScoobyDoo:d=4,o=5,b=160:8e6,8e6,8d6,8d6,2c6,8d6,e6,2a,8a,b,g,e6,8d6,c6,8d6,2e6,p,8e6,8e6,8d6,8d6,2c6,8d6,f6,2a,8a,b,g,e6,8d6,2c6"; //char *song = "StarWars:d=4,o=5,b=180:8f,8f,8f,2a#.,2f.6,8d#6,8d6,8c6,2a#.6,f.6,8d#6,8d6,8c6,2a#.6,f.6,8d#6,8d6,8d#6,2c6,p,8f,8f,8f,2a#.,2f.6,8d#6,8d6,8c6,2a#.6,f.6,8d#6,8d6,8c6,2a#.6,f.6,8d#6,8d6,8d#6,2c6"; //*char *song = "SuperMan:d=4,o=5,b=180:8g,8g,8g,c6,8c6,2g6,8p,8g6,8a.6,16g6,8f6,1g6,8p,8g,8g,8g,c6,8c6,2g6,8p,8g6,8a.6,16g6,8f6,8a6,2g.6,p,8c6,8c6,8c6,2b.6,g.6,8c6,8c6,8c6,2b.6,g.6,8c6,8c6,8c6,8b6,8a6,8b6,2c7,8c6,8c6,8c6,8c6,8c6,2c.6"; //char *song = "we-rock:d=4,o=6,b=40:32f#.5,32g.5,32a.5,32d6,32a.5,32d6,32a5,32d6,32a.5,16e.6,32a.5,16a5,8d.6,32g.5,32a.5,32b.5,32d6,32b.5,32d6,32b5,32d6,32b.5,16e.6,32a.5,16a5,8d.6,32f#.5,32g.5,32a.5,32d6,32a.5,32d6,32a5,32d6,32a.5,16e.6,32a.5,16a5,8d.6,32g.5,32a.5,32b.5,32d6,32b.5,32d6,32b5,32d6,32b.5,16e.6,32a.5,16a5,16d.6,"; //*char *song = "mslug:d=4,o=5,b=63:32f,32c,32a#,32d#,8d#.6,32d6,32d#6,32d6,32c6,32a#,32d6,16c.6,32f,f.,32g#,32d#,32c#6,32f#,8f#.6,32f7,32f#6,32f6,32d#6,32c#6,32f6,16d#6,16d6,16d#6,g#6,16g#,16g#,16a#,8b.,32a#,32g#,8a#,8d#,8a.,32g#,32f#,8g#,8c#,8g#.,32f#,32e,8c#,8d#,8e,2d#"; void setup(void) { Serial.begin(9600); tonalidade.begin(9); } #define ehDigito(n) (n >= '0' && n <= '9') void play_rtttl(char *p) { // Absolutamente nenhum erro ao verificar aqui byte vazia_dur = 4; byte vazia_oct = 6; int bpm = 63; int num; long notaInteira; long duracao; byte note; byte escala; while(*p != ':') p++; p++; // get default duracao if(*p == 'd') { p++; p++; // pula "d=" num = 0; while(ehDigito(*p)) { num = (num * 10) + (*p++ - '0'); } if(num > 0) vazia_dur = num; p++; } Serial.print("dur: "); Serial.println(vazia_dur, 10); // obtive uma oitava padrão if(*p == 'o') { p++; p++; // pula "o=" num = *p++ - '0'; if(num >= 3 && num <=7) vazia_oct = num; p++; } Serial.print("doct: "); Serial.println(vazia_oct, 10); // obtem o BPM if(*p == 'b') { p++; p++; // pula "b=" num = 0; while(ehDigito(*p)) { num = (num * 10) + (*p++ - '0'); } bpm = num; p++; // skip colon } Serial.print("bpm: "); Serial.println(bpm, 10); // O BPM geralmente expressa o número de quartas notas por minuto notaInteira = (60 * 1000L / bpm) * 4; // este é o momento da nota inteira (em milissegundos) Serial.print("wn: "); Serial.println(notaInteira, 10); // agora começa o loop de notas while(*p) { // primeiro, obtem a nota duracao, se possível num = 0; while(ehDigito(*p)) { num = (num * 10) + (*p++ - '0'); } if(num) duracao = notaInteira / num; else duracao = notaInteira / vazia_dur; // precisamos verificar se somos uma nota pontilhada após // now get the note note = 0; switch(*p) { case 'c': note = 1; break; case 'd': note = 3; break; case 'e': note = 5; break; case 'f': note = 6; break; case 'g': note = 8; break; case 'a': note = 10; break; case 'b': note = 12; break; case 'p': default: note = 0; } p++; // obtem o sustenido if(*p == '#') { note++; p++; } // obtenha opcional '.' nota pontilhada if(*p == '.') { duracao += duracao/2; p++; } // obtenha escalar if(ehDigito(*p)) { escala = *p - '0'; p++; } else { escala = vazia_oct; } escala += OITAVA_OFFSET; if(*p == ',') p++; // skip comma for next note (or we may be at the end) // now play the note if(note) { Serial.print("Tocando: "); Serial.print(escala, 10); Serial.print(' '); Serial.print(note, 10); Serial.print(" ("); Serial.print(notas[(escala - 4) * 12 + note], 10); Serial.print(") "); Serial.println(duracao, 10); tonalidade.play(notas[(escala - 4) * 12 + note]); delay(duracao); tonalidade.stop(); } else { Serial.print("Pausando: "); Serial.println(duracao, 10); delay(duracao); } } } void loop(void) { play_rtttl(song); Serial.println("Done."); while(1); }
Conclusão:
Fizemos uma pequena demonstração da reprodução da trilha sonora do filme Indiana Jones, através do módulo Buzzer, olhem só como ficou.
Viu como é bem simples compor melodias com o módulo Buzzer?
Agora como dever de casa desafiamos você a compor a sua própria musica, depois coloque nos comentários suas experiências. ;D