Atualização (2019) – Post novo com essa e muitas músicas, clique aqui.
Neste tutorial você vai aprender como montar um pequeno dispositivo capaz de reproduzir a marcha imperial de Star Wars com poucos componentes. Você poderá gravar também outros sons a sua escolha. Para a gravação no ATmega você vai precisar de uma placa Arduino, mas caso não possua o Microcontrolador, pode gravar o código no seu Arduino mesmo. Ao final do post está um bônus, aumentando as possibilidades de música usando o mesmo hardware.
Lista de Material:
1 Microcontrolador ATmega 8/168/328 (o ATmega 8 pode ser encontrado no eBay baratinho)
1 Mini protoboard.(Uma protoboard comum também serve)
1 Cristal de 16MHz
2 Capacitores de 22pF.
1 Regulador de tensão em 5V( 7805/78m05/78l05 )
1 Buzzer Piezo
Outros:
Fios
Jumpers
Antes de começarmos
O objetivo do artigo é propor uma hardware para se tocar a marcha imperial em 8 bits, incentivando a prototipagem do circuito e mostrando como se usar uma placa Arduino para se criar novos Arduinos, mas caso não queira ou não possa montar o hardware especificado, e queira usar o próprio Arduino para tocar a marcha, faça a ligação abaixo e pule o Passo 1.
Não esquecer que pino a que o buzzer deve estar ligado é o pino que for especificado no código e que este deve ser uma dos pinos de PWM(os que possuem um ‘~’), por exemplo, no Arduino UNO esses pinos são 3, 4, 6, 9, 10 e 11.
Passo 1 – Montagem
Monte o ATmega como na imagem 2, depois use um fios rígidos para a alimentação do micro, que vão de VCC e GND na primeira imagem para o regulador de tensão. Depois faça outro jumper do GND para onde ficará o negativo do buzzer. Deve ficar como na figura abaixo:
Depois disso coloque o cristal nos pinos XTAL1 e XTAL2 que podem ser vistos na imagem 1.
Depois coloque os capacitores de 22pF, Um é ligado em XTAL1 e GND e o outro em XTAL2 e GND como na figura 5.
Ligue o pino + do buzzer no pino 9 do micro e o outro pino no GND.
Agora o seu micro está pronto pra ser gravado, o regulador de tensão só será colocado na protoboard depois que o código for gravado no ATmega.
Passo 2 – Código.
*Atenção* O seguinte código não foi escrito por mim nem pela equipe do Dragão Sem Chama, uma rápida pesquisa na web e você encontrará este código e outros similares, incluindo códigos que tocam outros sons.
Note que há um espaço no código para um LED que dá um efeito visual pras notas que estão sendo tocadas, não é necessário, apenas coloque esse LED se desejar.
int ledPin = 13; //led for visualization (use 13 for built-in led) //Conectar o buzzer no pino 9 do Arduino int speakerPin = 9; #define c 261 #define d 294 #define e 329 #define f 349 #define g 391 #define gS 415 #define a 440 #define aS 455 #define b 466 #define cH 523 #define cSH 554 #define dH 587 #define dSH 622 #define eH 659 #define fH 698 #define fSH 740 #define gH 784 #define gSH 830 #define aH 880 //frequencies for the tones we're going to use //used http://home.mit.bme.hu/~bako/tonecalc/tonecalc.htm to get these void setup() { pinMode(ledPin, OUTPUT); // sets the ledPin to be an output pinMode(speakerPin, OUTPUT); //sets the speakerPin to be an output } void loop() // run over and over again { march(); } void beep (unsigned char speakerPin, int frequencyInHertz, long timeInMilliseconds) { digitalWrite(ledPin, HIGH); //use led to visualize the notes being played int x; long delayAmount = (long)(1000000/frequencyInHertz); long loopTime = (long)((timeInMilliseconds*1000)/(delayAmount*2)); for (x=0;x<loopTime;x++) { digitalWrite(speakerPin,HIGH); delayMicroseconds(delayAmount); digitalWrite(speakerPin,LOW); delayMicroseconds(delayAmount); } digitalWrite(ledPin, LOW); //set led back to low delay(20); //a little delay to make all notes sound separate } void march() { //for the sheet music see: //http://www.musicnotes.com/sheetmusic/mtd.asp?ppn=MN0016254 //this is just a translation of said sheet music to frequencies / time in ms //used 500 ms for a quart note beep(speakerPin, a, 500); beep(speakerPin, a, 500); beep(speakerPin, a, 500); beep(speakerPin, f, 350); beep(speakerPin, cH, 150); beep(speakerPin, a, 500); beep(speakerPin, f, 350); beep(speakerPin, cH, 150); beep(speakerPin, a, 1000); //first bit beep(speakerPin, eH, 500); beep(speakerPin, eH, 500); beep(speakerPin, eH, 500); beep(speakerPin, fH, 350); beep(speakerPin, cH, 150); beep(speakerPin, gS, 500); beep(speakerPin, f, 350); beep(speakerPin, cH, 150); beep(speakerPin, a, 1000); //second bit... beep(speakerPin, aH, 500); beep(speakerPin, a, 350); beep(speakerPin, a, 150); beep(speakerPin, aH, 500); beep(speakerPin, gSH, 250); beep(speakerPin, gH, 250); beep(speakerPin, fSH, 125); beep(speakerPin, fH, 125); beep(speakerPin, fSH, 250); delay(250); beep(speakerPin, aS, 250); beep(speakerPin, dSH, 500); beep(speakerPin, dH, 250); beep(speakerPin, cSH, 250); //start of the interesting bit beep(speakerPin, cH, 125); beep(speakerPin, b, 125); beep(speakerPin, cH, 250); delay(250); beep(speakerPin, f, 125); beep(speakerPin, gS, 500); beep(speakerPin, f, 375); beep(speakerPin, a, 125); beep(speakerPin, cH, 500); beep(speakerPin, a, 375); beep(speakerPin, cH, 125); beep(speakerPin, eH, 1000); //more interesting stuff (this doesn't quite get it right somehow) beep(speakerPin, aH, 500); beep(speakerPin, a, 350); beep(speakerPin, a, 150); beep(speakerPin, aH, 500); beep(speakerPin, gSH, 250); beep(speakerPin, gH, 250); beep(speakerPin, fSH, 125); beep(speakerPin, fH, 125); beep(speakerPin, fSH, 250); delay(250); beep(speakerPin, aS, 250); beep(speakerPin, dSH, 500); beep(speakerPin, dH, 250); beep(speakerPin, cSH, 250); //repeat... repeat beep(speakerPin, cH, 125); beep(speakerPin, b, 125); beep(speakerPin, cH, 250); delay(250); beep(speakerPin, f, 250); beep(speakerPin, gS, 500); beep(speakerPin, f, 375); beep(speakerPin, cH, 125); beep(speakerPin, a, 500); beep(speakerPin, f, 375); beep(speakerPin, c, 125); beep(speakerPin, a, 1000); //and we're done \ó/ }
Passo 3- Gravação do Firmware
Para gravar o firmware, você precisará de uma placa Arduino. Carregue o Exemplo ISP na IDE do Arduino em Exemplos>>ArduinoISP, grave esse código no seu Arduino, desligue-o e faça as seguintes ligações com o ATmega.
Arduino Uno |
Arduino Mega |
ATmega a ser programado |
|
Slave reset: |
10 |
53 |
RESET |
MOSI: |
11 |
51 |
11 |
MISO: |
12 |
50 |
12 |
SCK: |
13 |
52 |
13 |
Com o ATmega a ser programado devidamente ligado ao Arduino, Abra novamente a IDE do Arduino e abra o código a ser gravado. Selecione como gravador “Arduino as ISP” e depois clique em “Upload using Programmer”.
Passo 4 – Bônus (RTTTL)
Há uma biblioteca para o Arduino, chamada ‘Tone’ que possui as notas e frequências para serem tocadas no PWM do Arduino. Nessa biblioteca há um exemplo que permite que sons RTTL sejam tocados no Arduino.
Mas que diabos é RTTTL? A sigla RTTTL, segundo a Wikipédia, vem de Ring Tone Text Transfer Language, que pode ser traduzido como : linguagem de transferência de ringtones por texto. Essa linguagem foi criada pela Nokia para que ringtones fossem transferidos para seus celulares.
O formato RTTTL é dividido em três partes: nome, configurações e notas, sendo que estas partes são divididas por ‘:’ dois pontos
Por exemplo o código RTTL de Lost Woods de Zelda-Ocarine of Time :
zelda_woods:d=4,o=5,b=140:8f6,8a6,b6,8f6,8a6,b6,8f6,8a6,8b6,8e7…..(versão completa musica dia dos namorados)
Nome: zelda_woods
Configuração: d=4,o=5,b=140
Notas: 8f6,8a6,b6,8f6,8a6,b6,8f6,8a6,8b6,8e7,d7….
O legal é que você pode encontrar uma infinidade desses códigos na internet, o site namorado mata namorada por ciumes, tem vários desses códigos com sons de vídeo-games.
Primeiro baixe a biblioteca aqui https://dragaosemchama.com/carta-romantica-para-namorado/
Extraia o arquivo da biblioteca e copie a pasta ‘Tone’ extraída na pasta ‘libraries’ que está na pasta onde está o executável do Arduino.
Abra o exemplo “RTTTL”
Escolha uma das músicas no exemplo, ou copie e cole uma música da internet na forma: char *song=”(código RTTTL aqui)”;
Quando for usar uma nova música, não esqueça de comentar a música que não for usar mais, colocando ‘//’ na frente da linha.
A gravação é da mesma forma que o código da Marcha Imperial.
*Atenção* Lágrimas de nostalgia podem cair no seu Arduino, o Dragão sem Chama não se responsabiliza por possíveis danos, faça por sua conta e risco.
Alguns que testamos:
Cutman, de Megaman
Super Mario Bros Theme
The Legend of Zelda Theme
É isso pessoal, não deixem de comentar caso tenham dúvidas e caso também não tenham. Também comentem se quiserem mais tutos de eletrônica/Arduino/DIY/Microcontroladores.
Post muito bom cara! Parabéns :) Tava procurando há um tempo, você quem o criou inteiramente?
Valeu amigo pelo reconhecimento! :)
Sim, todos os posts de tutoriais são de autoria nossa.
Podia deixar o codigo com a melodia zelda bro ;)
Yup o/
Suponho que você esteja procurando esse código:
Zelda1:d=4,o=5,b=125:a#,f.,8a#,16a#,16c6,16d6,16d#6,2f6,8p,8f6,16f.6,16f#6,16g#.6,2a#.6,16a#.6,16g#6,16f#.6,8g#.6,16f#.6,2f6,f6,8d#6,16d#6,16f6,2f#6,8f6,8d#6,8c#6,16c#6,16d#6,2f6,8d#6,8c#6,8c6,16c6,16d6,2e6,g6,8f6,16f,16f,8f,16f,16f,8f,16f,16f,8f,8f,a#,f.,8a#,16a#,16c6,16d6,16d#6,2f6,8p,8f6,16f.6,16f#6,16g#.6,2a#.6,c#7,c7,2a6,f6,2f#.6,a#6,a6,2f6,f6,2f#.6,a#6,a6,2f6,d6,2d#.6,f#6,f6,2c#6,a#,c6,16d6,2e6,g6,8f6,16f,16f,8f,16f,16f,8f,16f,16f,8f,8f
Encontrei aqui: http://arcadetones.emuunlim.com/nes/zelda.html
Isso não funciona para o Arduino Leonardo?
Desculpe, não tenho um Arduino Leonardo para testar, mas acredito que funcione sem problemas. Se não estiver conseguindo é só tirar a dúvida aqui.
Eu tentei várias vezes, sem sucesso.
A lib não é totalmente reconhecida, pelo visto.
Desculpa a demora, poderia me dizer qual o erro que está lhe impedindo de compilar?
Cara, isso vai ser interessante como interrupt na minha bobina de tesla :)