Player de Marcha Imperial 8 bits (Arduino)

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.

Screen Shot 04-10-14 at 12.55 AMNã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

Este slideshow necessita de JavaScript.

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:

Screen Shot 04-10-14 at 01.26 AMDepois disso coloque o cristal nos pinos XTAL1 e XTAL2 que podem ser vistos na imagem 1.

Screen Shot 04-10-14 at 01.25 AM

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.

Screen Shot 04-10-14 at 01.39 AM

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.

Screen Shot 04-11-14 at 07.07 PM
O regulador de tensão e a bateria são colocados só após o código ter sido gravado, cuidado com as ligações e pra não inverter o regulador.

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

BreadboardAVR
Imagem retirada de arduino.cc

Este slideshow necessita de JavaScript.

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.

Robson Couto

Recentemente graduado Engenheiro Eletricista. Gosto de dedicar meu tempo a aprender sobre computadores, eletrônica, programação e engenharia reversa. Documento meus projetos no Dragão quando possível.

9 thoughts to “Player de Marcha Imperial 8 bits (Arduino)”

    1. 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

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *