Arduino, Internet das Coisas e Computação vestível

Você está em » Home : Projetos diversos

[Voltar]

[Avançar]

3.7. Piano acionado por chave táctil

Piano com 8 teclas

O circuíto abaixo utiliza Arduino Uno, 9 Resistores de 100 ohms, 1 Buzzer ou alto-falante, 9 Chaves tácteis e 8 Leds para criar um teclado para um piano na escala Dó, Ré, Mí, Fá, Sol, Lá, Sí e Dó (8 teclas). Os Leds piscam conforme as notas acionadas. Também aciona uma música do filme Harry Potter. As matrizes musica[ ] e duracao[ ] contém informações da frequência do tom em Hz e duração do tom em milissegundos da música a ser tocada.

Observação: O projeto tomou como referência https://www.thingiverse.com/thing:1174721
Entretanto, a programação foi totalmente refeita e simplificada para uso do arduino Uno (Limite de pinos).
A programação foi preparada para o acréscimo fácil de novas teclas, leds e músicas (Arduino Mega).

// Projeto: Piano acionado por chave táctil com LED
// Autor: André Luis Silveira
// Data: 05/11/2021 

// --------- Música Harry Potter ----- //

int musica[]  = {
        0,494,659,831,740,659,988,880,740,659,831,740,622,698,494,
        0,494,659,831,740,659,988,1175,1109,1047,831,1047,988,932,466,831,659, 
        0,831,988,831,988,831,1047,988,932,740,831,932,988,466,494,988,0,   
        0,831,988,831,988,831,1175,1109,1047,831,1047,932,988,466,831,659
};  
int duracao[] = {
        600,300,450,150,300,600,300,900,900,450,150,300,600,300,900,
        600,300,450,150,300,600,300,600,300,600,300,450,150,300,600,
        300,900,600,300,600,300,600,300,600,300,600,300,450,150,300,
        600,300,600,300,600,300,600,300,600,300,600,300,600,300,450,
        150,300,600,300,900
}; 
int elementos = sizeof(musica)/sizeof(int);            // Número de notas da música 

// --------- Define notas musicais ----- //

#define DO      262
#define RE       294
#define MI       330
#define FA       349
#define SOL     392
#define LA       440
#define SI       494
#define DO_2  523

// ----- Carrega matriz com ordem da escala de notas do teclado ----- //

int melodia[] = {DO,RE,MI,FA,SOL,LA,SI,DO_2};
int teclas = sizeof(melodia)/sizeof(int);              // Número de teclas do piano (melodia) 

// ----- Carrega matrizes com relação de pinos usados no arduino (botões e Leds) ----- //

int botao[]    = {12,11,10,9,8,7,6,5};
int led[]        = {A0,A1,A2,A3,A4,A5,3,2};

int buzzer = 13;                                               // Pino do alto-falante
int botao_toca = 4;                                          // Pino do botão que dispara musica             

void setup() { 
  
    Serial.begin(9600);  
    pinMode(buzzer,OUTPUT);                             // Configura pino buzzer como saída 
    pinMode(botao_toca,INPUT_PULLUP);            // Configura botão toca música como entrada 
  
  // ---- Inicializa Botões ----- //
  
    for(int i=0;i<teclas;i++){
        pinMode(botao[i],INPUT_PULLUP);           // Configura botões do teclado como entradas 
    }
  
  // ---- Inicializa leds ----- //

    for(int i=0;i<teclas;i++){
        pinMode(led[i],OUTPUT);                        // Configura leds como saídas
    }

}

void loop() { 
  
  // ---- Verifica tecla apertada para disparar Música Harry Potter ---- //
  
    if (digitalRead(botao_toca) == LOW) {         // Botão toca música foi acionado? 
        playSom();  
    }  
  
  // ---- Verifica tecla apertada no piano ---- //
  
    for(int i=0;i<teclas;i++) {      
        if (digitalRead(botao[i]) == LOW) {        // Botões do teclado foram acionados?
            digitalWrite(led[i],HIGH);  
            tone(buzzer,melodia[i],100); 
            i=99;
        } 
        digitalWrite(led[i],LOW);
    }   
    delay(10);
  
}

// ---- Toca Música Harry Potter ---- //

void playSom() {
       for(int i=0;i<elementos;i++){
            tone(buzzer,musica[i],duracao[i]);
            EstadoLed (i,1);
            delay(duracao[i]);
            EstadoLed (i,0);
      }
}

// ---- Liga ou desliga Led segundo a melodia da Música Harry Potter ---- //

void EstadoLed (int n, int estado) {

// ---- n = nota tocada 
// ---- estado = 0 (desliga) ou 1 (Liga) led 
int nota = map(musica[n],0,1175,DO,DO_2); // --- Reduz intervalo de notas para escala do teclado for(int i=0;i<=teclas;i++){ if (nota<=melodia[i]){ digitalWrite(led[i],estado); i = 99; } } }

 

[Voltar]

[Avançar]