COMO GERAR NOTAS MUSICAIS EM UM PIC – COM PIC 16F628A (REF105)

Muitos brinquedos eletronicos usam musicas geradas por chips dedicados para o produto. Será que poderiamos fazer algo parecido com um PIC? Leia mais…

Partindo-se do princípio que um tom musical nada mais é que uma frequência sonora definida, facilmente podemos gerar frequencias em um microcontrolador. Veja o esquema abaixo, de um circuito que nos permitirá iniciar os testes ‘musicais’:

Com este arranjo bem simples, com poucos componentes, podemos começar a fazer testes musicais e criar as ‘sequencias melodiosas’ que poderão ser usadas em projetos bem mais ‘animados’. O som é produzido por um disco piezoelétrico, retirado da campainha de um telefone antigo, com boa capacidade sonora, sem usar amplificador.
Nos pic’s, temos os Timers que facilitam a obtenção de temporizações necessárias. Então, usaremos o Timer1, com 16 bits para gerar os tons musicais. De que forma? Por carregar o Timer1 com um valor que, ao estourar a contagem, irá produzir uma interrupção. Nesta, testamos o estado do pino de saída de som, e se for ‘1’ invertemos para ser ‘0’ e se for ‘0’ invertemos para ‘1’. Carregamos novamente o Timer 1, e assim sucessivamente, gerando uma onda quadrada na saída de som, no pino 1 (PA1).
E como conseguimos a ‘duração da nota’? Podemos usar o Timer0 para isto. A cada interrupção do Timer 0, devemos decrementar uma variável que foi previamente carregada com o tempo de duração da nota musical. Quando a contagem chegar em ‘0’, devemos encerrar a rotina que gera a nota e voltar a rotina principal para executar a nota seguinte.
E se quisermos um tempo entre as notas? Mais fácil ainda. Basta colocarmos um ‘delay’ sem acionar a saída de som.
Nas cargas do Timer 1, foi usado o recurso dos ‘equates’ e deixando o compilador fazer o ‘trabalho sujo’ dos cálculos dos valores apropriados. Como trata-se de um exemplo didático, não se primorou a precisão das notas, pois, nem sequer usamos um cristal oscilador na base de tempo, mas sim, o oscilador interno do PIC.
Se observar o arquivo ASM. verá que uma nota é chamada por meio de uma subrotina:

MOVLW .30 ;TEMPO QUE A NOTA PERMANECE SENDO GERADA NA SAÍDA DO PIC
CALL N_C1 ; AQUI ESCOLHEMOS A NOTA ( NO CASO, A NOTA ‘DÓ OITAVADA’)

Para obter as ‘pausas’ entre notas e estrofes, usamos o ‘DELAY_W’:

MOVLW .100 ;TEMPO DO INTERVALO SEM SOM NA SAÍDA DO PIC
CALL DELAY_W ;SUB-ROTINA DE DELAY DE TEMPO

Para intervalos bem maiores, deve ser usado a rotina ‘CALL DELAY_G’:

MOVLW .100 ;TEMPO DO INTERVALO SEM SOM NA SAÍDA DO PIC
CALL DELAY_G ;SUB-ROTINA DE DELAY DE TEMPO PARA INTERVALOS GRANDES

Qual foi a maior dificuldade encontrada?
Se você for músico e também hobista de microcontrolador, não vai ter nenhuma. Mas se você for como eu, que ‘nada’ entende de música, terá um pouco de problema para gerar as sequencias musicais de ouvido. Neste caso, peça ajuda! Lembra daquele colega que toca violão? Ou guitarra? Peça que ele anote as sequencias e os possíveis tempos musicais. E daí, é só experimentar e aprimorar até ficar parecido com a música desejada. Dá um pouco de trabalho, eu garanto! Mas, é o preço do Hobby! Felizmente, tive a ajuda dos dotes musicais de Renan Lários, para obter a introdução de ‘Sweet Child O’Mine’ e ‘Super Mario Bros Theme’. Note que são poucas notas, mas … que alegria ver elas sendo tocadas em um PIC!!!
Já ao ligar ou ao dar um ‘reset’, inicia-se a execução das musicas gravadas na Flash.
Se você se interessa neste assunto, poderá baixar na Internet, programas que facilitam a obtenção das sequencias musicais de inúmeras musicas (como o programa ‘Guitar Pro’).

USO PRÁTICO

Existe um gama muito grande de aplicações em que se possa dotar equipamentos com sons musicais. Podemos citar: Brinquedos, Jogos, Campainhas, Despertadores, Sinal de aviso em aparelhos eletrodomésticos, sirenes de carros personalizadas, etc.
Também, colocando um conjunto de interruptores nos pinos do PIC, podemos criar um ‘pequeno orgão’. Outras idéias vão surgir, com certeza, sobre este assunto! Aguarde!

Segue o arquivo ASM:

musica_asm

Segue o arquivo HEX:

musica_hex

LINKS:
Notas musicais
Pic 16f628a

Curiosidades:
Como uma música se torna um sucesso?
O encanto da música
“Cavalos que bailam ao vento”
Encantamento de serpentes
Enxaqueca — o que você pode fazer?
Como estimular o desejo de aprender
Como ajudar pessoas com transtornos de ansiedades
Como contornar o problema do trânsito?
Capoeira — dança, esporte ou arte marcial?
Qualidades que nos tornam especiais

Outros assuntos:
Aprenda a perdoar
Como acabar com a tática do silêncio
Como criar filhos responsáveis
Como administrar o seu dinheiro
Ensine valores morais a seus filhos
Ensine seus filhos bons principios com atividades de colorir
Como posso ter ânimo para exercitar
Como posso controlar meu peso?
Entrevista com um bioquímico
Adolescentes- O que fazer se estou sofrendo bullying?
Como evitar ferir com palavras?
Como tratar seu cônjuge com respeito?

Até o próximo artigo!!!

5 comments on “COMO GERAR NOTAS MUSICAIS EM UM PIC – COM PIC 16F628A (REF105)

  1. Oi Cláudio, tudo bem? 😛
    Então , o problema que encontrei não foi na montagem, e sim em um caso particular em relação a modificação do projeto.

    Utilizei um dos pinos (No caso o b7) para ser acionado por um botão, para que quando o mesmo fosse pressionado , uma musiquinha fosse executada. Entretanto, não sei como faço para criar a sequencia de notas. Tentei o seguinte código:

    ” if(!input(PIN_B7)){

    {output_high(TONE_PIN);
    set_timer1(0xffff – (500000/nota_la-10));
    t1if=0;
    while(!t1if);
    output_low(TONE_PIN);
    set_timer1(0xffff-(500000/nota_la-10));
    t1if=0;
    while(!t1if);}

    {output_high(TONE_PIN);
    set_timer1(0xffff – (500000/nota_re-10));
    t1if=0;
    while(!t1if);
    output_low(TONE_PIN);
    set_timer1(0xffff-(500000/nota_re-10));
    t1if=0;
    while(!t1if);}

    {output_high(TONE_PIN);
    set_timer1(0xffff – (500000/nota_sol-10));
    t1if=0;
    while(!t1if);
    output_low(TONE_PIN);
    set_timer1(0xffff-(500000/nota_sol-10));
    t1if=0;
    while(!t1if);}

    Este era um teste, apenas notas aleatórias. Tentei adicionar delay_ms(3000); depois do while(!t1if) mas não deu certo…

    Poderia me ajudar? Desde já gradeço! 🙂

    1. Olá Amskiller!
      Você está no caminho certo. Mas o que você esqueceu foi que a nota tem que ser reproduzida por um tempo (duração da nota). Tente colocar cada nota (tanto o ciclo on como off) dentro de um laço de repetição por uma quantidade de vezes correspondente ao tempo que você quer que ela toque. Talvez um laço ‘for’:

      if(!input(PIN_B7)){
      int16 a;
      const int16 tempo_la= 400;//apenas exemplo (terá que determinar pois será diferente para cada nota)
      const int16 tempo_re= 500;//apenas exemplo (terá que determinar pois será diferente para cada nota)
      const int16 tempo_sol= 800;//apenas exemplo (terá que determinar pois será diferente para cada nota)

      for(a=0;a<tempo_la;a++){

      {output_high(TONE_PIN);
      set_timer1(0xffff – (500000/nota_la-10));
      t1if=0;
      while(!t1if);
      output_low(TONE_PIN);
      set_timer1(0xffff-(500000/nota_la-10));
      t1if=0;
      while(!t1if);}
      }

      delay_ms(20); //pausa entre notas (terá que determinar, pois depende da música

      for(a=0;a<tempo_re;a++){

      {output_high(TONE_PIN);
      set_timer1(0xffff – (500000/nota_re-10));
      t1if=0;
      while(!t1if);
      output_low(TONE_PIN);
      set_timer1(0xffff-(500000/nota_re-10));
      t1if=0;
      while(!t1if);}

      }

      delay_ms(50); //pausa entre notas (terá que determinar, pois depende da música

      for(a=0;a<tempo_sol;a++){

      {output_high(TONE_PIN);
      set_timer1(0xffff – (500000/nota_sol-10));
      t1if=0;
      while(!t1if);
      output_low(TONE_PIN);
      set_timer1(0xffff-(500000/nota_sol-10));
      t1if=0;
      while(!t1if);

      }

      Lembre-se que na música, o compositor determina a nóta (do-re-mi…), a sua duração e o tempo entre notas.

      Cláudio

  2. Oi Claudio,gostei desse comentario sobre pic gerar notas musicais,trabalho com manutençao de orgãos eletrônicos desde 1985 e como sou apaixonado por música desde 1981, sempre quis desenvolver meu próprio projeto.
    Esses órgãos mais antigos usa c.i.s que gera suas próprias notas musicais.
    O qual o teclado superior tem 44 notas,o teclado inferior 44 e a pedaleira 13 notas.
    Queria ver com você,se a como programar o pic com essas caracteristicas acima.
    Abraços,
    Atenciosamente
    Clayton Pereira Gregório

    1. Olá Clayton!
      Você trabalha em uma área bem interessante! Quanto a gerar notas musicais no pic, para pequenos projetos vai bem, mas para equipamento profissional, não sei se seria o mais recomendado. A frequência de trabalho do pic limita muito sua aplicação. Creio que os integrados dedicados para geração de musica ainda são a melhor opção. Mas não posso dizer muito por não ter conhecimento profundo de programação voltada a música. Pode até ser que um DsPic consiga gerar esta quantidade enorme de notas musicais.
      Cláudio

Comments are closed.

Back To Top