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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 |
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 aqui)
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 Arcade Tones, tem vários desses códigos com sons de vídeo-games.
Primeiro baixe a biblioteca aqui Arduino-Library-Tone.
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 :)