sexta-feira, 7 de agosto de 2015

Reproduzindo som com o Arduino

Que montar uma caixinha de música? Ou montar um despertador? Ou até mesmo colocar aquela musiquinha tradicional em um PABX usando o Arduino? Pois bem, com muito pouco é possível tudo isso!

Você vai precisar de:

Um Arduino:
Um alto falante (speaker):
Ligue o negativo do seu falante ao GND do Arduino e o positivo ao pino 3:
Na linguagem C para Arduino existe o comando tune(), com ele é possível enviar uma frequência por um determinado tempo para um dos pinos PWM (pulse with modulation) existentes. A sintaxe é:

tone(pino,frequência,duração);
ou
tone(pino,frequência);

Importante também é saber que ao enviar um novo tom para o pino o tom anterior é cessado e que também  há um comando que faz com que o som pare, cuja sintaxe é:

noTone(pino);

Sabendo que existem 7 notas musicais básicas:

C
D
E
Mi
F
G
Sol
A
B


E suas respectivas frequências e durações:

Nota
Nome
Frequência
Duração
C
261 Hz
1915 ms
D
294 Hz
1700 ms
E
Mi
329 Hz
1519 ms
F
349 Hz
1432 ms
G
Sol
392 Hz
1275 ms
A
440 Hz
1136 ms
B
523 Hz
956 ms


Com o código abaixo podemos percorrer todas as notas:

// Constantes com as notas
#define DO  262
#define RE  294
#define MI  330
#define FA  349
#define SOL 392
#define LA  440
#define SI  523
 
void setup() {
pinMode(3,OUTPUT);
pinMode(13,OUTPUT);
}
 
void loop() {
digitalWrite(13,HIGH);
tone(3,DO);
delay(500);
tone(3,RE);
delay(500);
tone(3,MI);
delay(500);
tone(3,FA);
delay(500);
tone(3,SOL);
delay(500);
tone(3,LA);
delay(500);
noTone(3);
digitalWrite(13,LOW);
delay(5000);
}


Com um pouco mais de aprimoramento podemos até arriscar algo como Ode para Joy (partitura obtida em http://www.music-scores.com/midi.php?sheetmusic=Beethoven_Ode_to_Joy_easy):

O código fonte:

 
void setup() {
pinMode(3,OUTPUT);
}
 
void loop() {
int C = 262, D = 294, E = 330, F = 349, G = 392, A = 440, B = 523;
int P = 0;
int i;
int ode[]   = {
E,E,F,G,G,F,E,D,C,C,D,E,E,D,P,D,P,
E,E,F,G,G,F,E,D,C,C,D,E,D,C,P,C,P,
D,D,E,C,D,E,P,F,E,C,D,E,P,F,E,D,C,D,P,
E,E,D,G,G,F,E,D,C,C,D,E,D,C,P,C  };
int tempo[] = {
1,1,1,1,1,1,1,1,1,1,1,1,1.5,1,.5,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1.5,1,.5,1,1,
1,1,1,1,1,1,.5,1,1,1,1,1,.5,1,1.5,1,.5,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1.5,.125,1,1};
 for(i=0;i<sizeof(ode)/2;i++) {
if(ode[i] != 0) tone(3,ode[i]); else noTone(3);
delay(tempo[i] * 500);
noTone(3);
}
noTone(3);
delay(10000);
}


Confesso que não ficou um clássico do piano, mas dá para entender como se deve fazer usando-se uma partitura e o conceito de notas semibreves, mínimas, semínimas, colcheias e etc.

← Postagem mais recente Postagem mais antiga → Página inicial

0 comentários:

Postar um comentário