TUTORIAL IV – COMO GRAVAR E REPRODUZIR SONS NA PRÓPRIA MEMÓRIA DE PROGRAMA (REF292)

2

Aprenda a gravar e reproduzir sons usando a própria flash de um pic16f877A…

Muitos hobistas em microcontroladores PIC manifestam desejo de colocar sons em suas aplicações. Mas logo desistem por falta de informação de como fazer isto. Este tutorial simplificado foi produzido com a intenção de ajuda-lo a obter sucesso nesta empreitada.
Focalizaremos nesta abordagem apenas a reprodução de sons gravados na própria memória de programa do PIC. Estamos falando de poucos segundos de gravação, mesmo usando um PIC de maior capacidade de memória flash como o PIC16f877a.
Ainda para tornar mais compacto o arquivo, optamos por som a 1 bit, mesmo porque isto facilita o uso de PIC’s sem módulos PWM interno. A ferramenta indicada para trabalhar com sons a 1 bit é o programa BTC Sound Encoder, do RomanBlack. Este programa que roda em ambiente Windows permite editar sons e converte-los para modo 1 bit usando uma rotina desenvolvida pelo autor. Os arquivos resultantes são 8 vezes menores, o que é importante quando temos tão pouca memória a disposição.
Como exemplo, iremos utilizar o PIC16F877A da Microchip. Conforme o datasheet, este PIC dispõem de 8Kbytes de flash ou seja 8192 bytes. O aplicativo BTC Sound Encoder que chamaremos doravante apenas de BTC, gera entre outros, um arquivo com terminação “.asm” próprio para uso com PIC. Basta ao hobista colocar este arquivo na mesma pasta do projeto e em seguida inclui-lo no cabeçalho usando seu nome com extensão ‘.asm’. Como iremos usar linguagem assembly faremos uso do MPLAB-IDE fornecido no site da Microchip. Deixando mais claro, este tutorial usará apenas linguagem assembly para colocar sons em sua aplicação com PIC. O BTC também tem opção de gerar arquivos em “C” próprios para uso com o compilador MIKROC, mas isto talvez possa ser um tema para um outro tutorial.
Vamos então começar com o nosso “passo a passo”:
1) Obtenha o som que deseja gravar na flash do PIC.
O programa BTC somente aceita extensões gravadas com ‘.WAV’ ou ‘.AIFF’ (Audacity). Caso você deseje usar um som obtido da internet que tenha extensão ‘.mp3’, então terá que converte-lo primeiro para ‘.WAV’. Poderá fazer isto usando o programa Format Factory ou similar. Também poderá gravar sua voz, usando o gravador do Windows. Outra opção que considero melhor, é usar programas ‘Text-to-Speech’ para obter uma reprodução livre de ruídos do ambiente caseiro (sons ambientes tais como latidos, aviões passando, carros,etc). Isto foi tratado no tutorial “TUTORIAL I – OBTENDO ARQUIVOS DE SONS “.WAV” A PARTIR DE PROGRAMAS ‘TEXT TO SPEECH’ (REF241)”.
No nosso caso, usaremos um arquivo de som nomeado de “som_porche_turbo.wav” em que se ouve um veículo PORCHE acelerando, gravado originalmente em 44100 Hz. Este arquivo está junto da pasta fornecida no final deste tutorial e você poderá usa-lo para repetir este passo a passo.
Talvez se pergunte: Qual o tamanho do arquivo que poderei usar? A resposta dependerá de alguns fatores:
Qual é o tamanho disponível da flash? Consulte o datasheet do PIC. Qual a taxa de amostragem desejada? Qual o tipo de som? 1bit ou 8 bits?
Para som 1 bit, segundo o que estamos mostrando neste tutorial, poderá determinar da seguinte forma:

Tamanho da flash disponível x tamanho do arquivo _____________________________________________________________
Frequência da amostragem (antes de converter) x 8

Exemplo:

O PIC16F877a tem disponível 8192 bytes. Subtraia 256, pois nas primeiras 256 linhas ficará o código para o funcionamento do programa. Restam 7936 bytes que poderão ser usado para dados de sons. Então, vamos conferir se o arquivo ‘som_porche_turbo.wav’ irá ‘caber’ no espaço calculado:

Sendo:
Tamanho do arquivo(veja abrindo com BTC)= 312704;
Frequência de amostragem= 44100 Hz;
Nova Frequência de amostragem (converter com BTC)= 8000 Hz
Tamanho da memória disponível no PIC= 7936

8000 x 312704
______________ = 7090

44100 x 8

Como o resultado é 7090 bytes e sabemos que temos 7936 bytes disponíveis, poderemos usa-lo sem problemas. Note que a medida que reduzimos o valor da nova frequência de amostragem também reduzimos o tamanho do arquivo, mas pioramos a qualidade do som. Em contrapartida, se melhorarmos o som, precisamos aumentar a nova frequência de amostragem, com o aumento de bytes na flash. Quanto tempo de execução terá com estes valores:

tamanho do arquivo x 8
______________________
Frequência de amostragem

Portanto:

7090 x 8
_________ = 7,09 segundos de reprodução
8000

Nota: Usaremos uma frequência de amostragem de 8000 Hz neste exemplo. Mas você poderá escolher outros valores, levando em conta a qualidade do som e o tamanho disponível da flash.

2) Baixe o programa BTC Sound Encoder 3.0 do site do RomanBlack. Instale em seu computador (PC). Ao abri-lo clicando no atalho, ele se parecerá como a figura abaixo:

ABRINDO_BTC_1

3) Vamos agora abrir o arquivo a ser convertido, no caso o arquivo ‘som_porche_turbo.WAV’. Para isto clique em ‘File’ e ao abrir a caixa de opções, clique em ‘Open a Wave File’. Esta operação é mostrada na figura abaixo:

OPEN_FILE2

3) Após clicar em ‘Open a Wave File’, abrirá um tela para que você informe em que pasta está o arquivo e qual arquivo deseja abrir. Vá na pasta que salvou o arquivo ‘som_porche_turbo.WAV’ e clique nele. Esta operação é mostrada na figura abaixo:

ESCOLHENDO_WAV3

4) Após clicar no arquivo poderemos ver como na figura abaixo:

PORCHE_WAV_ABERTO4

5) Prosseguindo com o nosso objetivo, vamos alterar a frequência de amostragem para 8000 Hz. Para isto clique em “Edit”, depois em “Resample Wav”. Esta operação é mostrada na figura abaixo:

RESAMPLE_WAV5

6) Após clicar em “Resample Wav” abrira uma caixa pedindo para escolher a nova frequência de amostragem: Digite 8000 e clique no botão “Resample”. Esta operação é mostrada na figura abaixo:

RESAMPLE_WAV6

7) Ao acabar de clicar no botão “Resample” abrirá mais uma caixa informando que foi completada a conversão. Dê um clique em “Done”. Esta operação é mostrada na figura abaixo:

TROCADO_8K_7

8) Caso necessite cortar um trecho inicial ou final (reduzir arquivo ou cortar partes sem som) clique em “Edit”, depois em “Trim WAV”. Abrirá uma caixa como mostrado abaixo:

CORTANDO_7A

9) Em ‘Set Start Point’ poderá digitar onde será o novo começo. Depois, aperte “Set” e verifique se é isto que deseja, apertando “Play Test” reproduzir o trecho do som. Se estiver errado poderá refazer o ajuste. Depois de ter certeza que está ok, aperte o botão “Trim the Wav” para cortar definitivamente os bytes iniciais. Em “Set End Point” você pode fazer o mesmo com a parte final do arquivo. Na tela com curvas em amarelo podemos observar se tem espaço vazio que pode ser retirado tanto no começo ou como no fim. Clique sobre eles e obterá o valor do byte na caixa no lado direito do botão “GO”. Não é possível cortar espaços no meio do arquivo. Na figura abaixo mostra o uso do cursor para obter o valor aproximado que poderia ser cortado, por clicar no final da curva de som (curva amarela):

CORTANDO_7B

10) Para arquivos de som gravados com pouco volume, o BTC tem um recurso para aumenta-los. Isto é importante e recomendado pelo autor do BTC, para que a qualidade do som 1 bit fique melhor. Para usar esta funcionalidade, clique em “Edit”, depois em “D-Compress/Increase Vol.Wav”. Abrirá uma tela para digitar quantos porcentos deseja aumentar o som. Depois de digitar o valor, clique em “D-Compress!”. Para se ter uma ideia da necessidade de aumentar o volume, basta ver o gráfico em amarelo. Se os picos são poucos acentuados, então deverá aumentar o volume. Faça aos poucos,de 15 em 15 e acompanhe o gráfico resultante. Esta operação é mostrada na figura abaixo:

AUMENTANDO_VOLUME_7C

12) Até aqui já editamos o arquivo e convertemos sua frequência de amostragem para 8 KHz. Vamos agora salvar o arquivo de uma forma que possa ser usado pelo compilador assembler do MPLAB-IDE. Para isto, primeiro escolha a opção de algoritmo. Na caixa “Algorithm” escolha ‘1 bit’e na caixa “Fineness:” escolha “BTc64”. Em seguida, clique em “File”, depois clique em “Export PIC assembler file.ASM”. Esta operação é mostrada na figura abaixo:

SALVAR_ASM_8

13) Após clicar em “Export PIC assembler file.ASM” abrirá uma caixa para digitar o novo nome e o local onde será salvo o arquivo com terminação “.asm”. Digite o nome PORCHE ou outro nome que desejar. Clique em “Salvar”. Esta operação é mostrada na figura abaixo:

SALVANDO_PORCHE_9

14) Caso você tenha salvo no desktop, verá um arquivo como o marcado com circulo na figura abaixo. Lembrando que os dados de som começam no bloco 1, ficando apenas 256 bytes para o programa principal funcionar:

VENDO_PORCHE_10

15) Para este passo necessitará ter o MPLAB-IDE instalado em seu PC e ter um pouco de conhecimento de programação em assembly se pretender alterar o programa. Caso ainda não tenha este programa poderá obtê-lo baixando do site da Microchip. Em seguida, faça o download dos arquivos desta montagem (pasta zipada “PORCHE_1BIT”) e descompacte. Abra o projeto usando o MPLAB-IDE. Após abrir o projeto você visualizará o arquivo asm nomeado de som_1bit_flash”. Note que foi incluído o arquivo gerado pelo BTC (“PORCHE.ASM”) como marcado na figura abaixo com um circulo vermelho (o de cima).

MPLAB_PROJ__11

A rotina de reprodução é feita por meio de saltos ‘Goto’ os quais retornam o valor do byte da posição da flash apontada pelo par de contadores (ENDEREÇOH/ENDEREÇO). Cada bit é transferido para a saída de som a cada 1/8000 segundos= 125 microssegundos. O timer_0 é usado para controlar este tempo de amostragem.

16) Caso deseje usar outro som de sua preferência, siga os passos de 1 a 13 para obter um novo arquivo Btc de som 1 bit com terminação .asm. Coloque o novo arquivo na mesma pasta dos arquivos a serem compilados. Altere o ‘include’ para o novo nome. Altere também os ‘defines’ do tamanho do arquivo conforme mostrado no circulo de baixo. O novo tamanho tem que ser menor ou igual a capacidade de memória disponível do PIC usado. Você encontrará este valor no cabeçalho do arquivo gerado pelo BTC, na parte chamada de “File Details”. Após estas duas alterações (nome do Include e tamanho do novo arquivo), recompile o projeto para obter um novo arquivo hex para programar o PIC. Para testar iremos montar em um breadboard o circuito abaixo:

PORCHE_1BIT_COLOR

17) Programe o PIC com o arquivo “som_1bit_flash.Hex” (o fornecido na pasta abaixo ou o que você recompilou com um novo som) usando o programador de PIC’s de sua preferência (JDM ou outros).

Segue pasta com os arquivos desta montagem em pasta zipada para download:

PORCHE_1BIT

18) Confira todas as ligações se estão exatamente como mostra o esquema acima.

19) Alimente o circuito com 5 Volts. Ao apertar o interruptor deverá ser ouvido um ronco de um carro ‘PORCHE’ por aproximadamente 7 segundos!

Esperamos que estas informações possam ser úteis e que vocês possam se alegrar colocando sons divertidos e práticos em suas aplicações!

Curiosidades:
“A máquina de aprender mais potente do Universo”
Qualidade da voz
O segredo de um ouvido em miniatura
“Impossível!” — o que isso significa?
Padrões intrigantes nas plantas
O incrível ovo de avestruz

Outros assuntos:
O que os números significam na Bíblia? A numerologia tem base bíblica?
Será que a Bíblia está de acordo com a ciência?
O que é o Reino de Deus?
Os desastres naturais são castigo de Deus?
Problemas financeiros e dívidas — a Bíblia pode ajudar?

Vídeos:
Como enfrentar o bullying sem partir para a briga
Quem é o Autor da Bíblia?
Será que é amor ou paixão?
Tenha mais paciência
Fale a verdade
Eu me cansei das religiões

Até o próximo Tutorial!

2

21 comments

  1. 0

    os comentarios estão fechados nesse projeto, COMO USAR O PWM DO PIC 16F628A PARA FAZER UMA FONTE DE ALIMENTAÇÃO SIMÉTRICA COM 3 DÍGITOS ,seria possivel colocar 2 memorias de voltagem tipo ajustando 5,4v no display ai aperta uma chavinha memoriza essa voltagem ,quando quiser memorizar outra voltagem e so apertar novamente a chavinha na voltagem que estiver no display .obrigado

    1. 0

      Olá Marcos!
      Agradeço a sua sugestão. No entanto, os pinos do microcontrolador estão todos comprometidos. Terei que estudar um novo esquema de funcionamento. Talvez eu faça, futuramente, um novo artigo sobre isto.
      Cláudio

      1. 0

        CLAUDIO BOA TARDE NO PROJETO FONTE V2 FALTOU AS MODIFICAÇOES DO INTERRUPTOR MEM QUE NÃO ESTA NO ESQUEMA NOVO.

        1. 0

          Olá Marcos!
          Realmente, esquecemos de postar os esquemas. Obrigado por nos trazer a atenção este fato. Já foi postado nova pasta zipada contendo os esquemas faltantes.
          Obrigado

          Cláudio

  2. 0

    Olá Claudio , muito obrigado pelos projetinhos que tem postado sempre, fico feliz porque estou aprendendo e seus projetos estão me ajudando um bocado .

    Eu tenho uma duvida e gostaria de saber se você poderia me ajudar … eu estou montando um projetinho que preciso enviar as informações enviadas pelo meu computador (rs232) e ler com o pic … até ai ta tudo certo, nada complicado pra mim … mas preciso que essa informação coletada pelo pic seja transferido para uma saida “1-Wire bus”, simulando um “Slave”.
    Pois meu aparelho possui comunicação “1-wire bus” onde ele é Master. Vi o tutorial da maxim mas ainda estou tendo dificuldades… você pode me auxiliar?

    1. 0

      Olá Joarez!
      Como você deve saber, sou apenas hobista na área, e talvez não seja a pessoa mais indicada para te ajudar. Já fiz alguns projetinhos usando 1_wire por software, sem usar as complicadas bibliotecas fornecidas pelos compiladores ou fabricantes. Tudo na ‘unha’. Qual pic pretende usar? Qual o compilador que você usa? Vai usar bibliotecas? Você disse que leu o tutorial da Maxim mas não entendeu o protocolo? Entendi que vai enviar um comando para o pic via rs232 e depois o pic vai esperar por uma comunicação do equipamento para pegar dado do pic via 1wire/ É isto? Poderia compartilhar a aplicação deste equipamento?
      Cláudio

      1_wire Comunication
      1_wire_Comunications_Maxim

      1. 0

        eu queria simular um sensor de temperartura mesmo … podendo jogar valores aleatórios via serial , convertendo para 1-wire. Há varios projetos na internet explicando como fazer a leitura de sensores , mas não encontrei exemplo de um emulador …

        1. 1

          Olá Joarez!
          Entendi. Muito legal para testar o funcionamento de algum dispositivo que trabalhe com sensor 1wire usando a serial de um PC.
          Não posso prometer nada, mas vou dar uma estudada em como poderia ser um tal dispositivo.
          Cláudio

          1. 0

            Olá Claudio, obrigado pelo retorno vou analisar o projetinho mas acredito que seja bem por ai o que preciso … vou estudar agora e depois tentar fazer algo como um ibutton que deve ser algo bem parecido …
            Obrigado pela dia .. conseguindo algo legal te mando aqui 🙂

          2. 0

            Lendo agora o firmware ja deu pra entender o que estava tendo dificuldades aqui .. sensacional .. cara muito obrigado mesmo …

  3. 0

    Amigo Larios tem como adicionar mais um sensor meste projeto BOIA ELETRÔNICA PARA CAIXAS D’AGUA – C/ PIC 12F675 (REF223) este sensor é pra ficar no cano da bomba para a bomba não trabalhar sem água, no caso, quando der nível mínimo liga, e não chegar água, ela fica ligado por uns 5 segundos e desliga

    1. 0

      Olá Alberis!
      Você poderia usar a versão Boia_Alerta_v2 que tem um alarme quando não enche a caixa, sem usar mais um sensor. O tempo desta versão está em 20 minutos, mas poderá abaixar alterando os defines:
      #define FATOR_MIN 24000 //contagem p/ 1 minuto aproximadamente

      #define LIMITE_MAX_BOMBA_LIGADA 20 * FATOR_MIN //tempo p/ o alerta sonoro (em minutos)

      E recompilando com CCS C compiler para obter o novo hex.

      Cláudio

      1. 0

        Oi larios, esta versão não dar porque quando a caixa estiver quase cheia, e faltar água no poço a bomba desliga para não queimar

          1. 0

            Olá Alberis!
            Uma duvida que me passou: o sensor adicional que você falou ficaria no cano de saída da bomba ou junto a fonte de água?
            Se o sensor ficar no cano de saída irá desligar e ficar nesta condição indefinidamente, a menos que seja usado uma timer que conte um tempo de espera e no término, tente religar de tempos em tempos, se o sensor continuar indicando caixa vazia.
            já com sensor na fonte, se não tiver água nem liga a bomba. Poderia manifestar a sua opinião?
            Cláudio

          2. 0

            ola Larios quando você atualizar o arquivo boia eletrónica você me avisa desde já agradeço. e que DEUS te abençoe

Comments are closed.