sábado, 15 de julho de 2017

Reproduzindo som MP3 com auxilio do PIC.

             Olá quando pensamos em reproduzir sons MP3 imaginamos sempre um chip ou talvez algum microcontrolador que possua isso em seu hardware(mas são caros e de difícil aquisição, o que prejudica o uso em pequenos projetos), mas existe uma outra possibilidade, estou me referindo aos módulos DSPLAYERS que pode ser controlados por qualquer microcontrolador, bastando para isso ter acesso ao seu set de instruções.
             Veja na figura abaixo a aparência de um modulo DSPLAYER,já vem equipado com entrada USB, comunicação rs_232 para fazer a interface e saída de som analógica(alto falantes) + saídas para fone de ouvido. Neste site tem um exemplo de como usa-lo com arduino além de explorar melhor seus aspectos construtivos https://www.dfrobot.com/wiki/index.php/DFPlayer_Mini_SKU:DFR0299.


            Graças ao meu parceiro Renato que tem me enviado vários materiais para postar (pois como já disse anteriormente em outros "post", estou tendo dificuldade para desenvolver novos projetos), este projeto conta com os recursos principais para fazer funcionar o modulo usando um microcontrolador PIC.Agradeço muito nosso colaborador por compartilhar conosco sua experiencia com este módulo.Ele ainda me deixou uma dica "Se alguém se interessar posso produzir o circuito impresso, só entrar em contato: -> Renato : lobosoft@oi.com.br".

A aparência do protótipo pronto ficou assim:



O código fonte:

 Programa principal: Código para compilação no CCS.

////////////////////////////////////////////////////////////////////////////////
//              Projeto: Aparelho de som com modulo DFPlayer Mini             //
//                 Nome: Renato Lôbo Rodrigues                                //
//                 Data: 12/07/17                                             //
//                Email: lobosoft@oi.com.br                                   //
////////////////////////////////////////////////////////////////////////////////

#include "config_pic675.h"

void main()
{
   int1 st1=false, st2 = false, st3=false, st4 = false, play = true, di = false;
   int8 equ = 1,disp = 1;
   tris_bot1 = 1;
   tris_bot2 = 1;
   tris_bot3 = 1;
   tris_bot4 = 1;
   tris_bot5 = 1;
   GPPU      = 0;
   delay_ms(2000);
   Uart_SendCMD(0x06 , 0 , 0x16 ) ;  //volume inicial
   delay_ms(200);
   sorteia();
   delay_ms(200);
   Tocar();   
   delay_ms(200);          
   Proxima_trilha();
   delay_ms(500);
 
   while(true)
   {
      if( bot1) st1 =false;         //Equalizador
      delay_ms(50);
      if(!bot1 && !st1)
      {
         st1 = true;
         equ++;
         if(equ>5)equ=1;
         if(equ==1)equaliza(1);
         if(equ==2)equaliza(2);
         if(equ==3)equaliza(3);
         if(equ==4)equaliza(4);
         if(equ==5)equaliza(5);
         delay_ms(1000);
      }
      if( bot2) st2 =false;         //troca o dispositivo: Memoria/Pendrive
      delay_ms(50);
      if(!bot2 && !st2)
      {
         st2 = false;
         di=~di;
         if(di) disp=2; else disp=1;
         dispositivo(disp);
         delay_ms(500);
      } 
 
      if(!bot3) st3 =false;         //toca tudo altomaticamente
      delay_ms(50);
      if( bot3 && !st3  && play)
      {
         st3 = true;
         Proxima_trilha();
         delay_ms(200);
      }

      if( bot4) st4 =false;         //tocar/pausa
      delay_ms(50);
      if(!bot4 && !st4)
      {
         st4 = true;
         play = ~play;
         if (play)Tocar();else Pausa();
         delay_ms(500);
      }         
   }
}

Configuração do PIC 12F675

////////////////////////////////////////////////////////////////////////////////
//              Projeto: configuração de cabeçalho de projeto com pic12F675   //
//                 Nome: Renato Lôbo Rodrigues                                //
//                 Data: 12/07/17                                             //
//                Email: lobosoft@oi.com.br                                   //
////////////////////////////////////////////////////////////////////////////////
#include "12F675.h"
#use delay(clock=4Mhz)
#include "DFPlayer.h"
//=======================================================================
//Configurando fusiveis
//=======================================================================
#fuses NOWDT
#fuses PUT
#fuses NOBROWNOUT
#fuses NOMCLR
#fuses INTRC_IO
#fuses PROTECT
//=======================================================================
//Configurando I/O de direção dos pinos
//=======================================================================
#bit  bot1        = 0x05.0
#bit  bot2        = 0x05.2
#bit  bot3        = 0x05.3
#bit  bot4        = 0x05.4
#bit  bot5        = 0x05.5

#bit  tris_bot1   = 0x85.0
#bit  tris_bot2   = 0x85.2
#bit  tris_bot3   = 0x85.3
#bit  tris_bot4   = 0x85.4
#bit  tris_bot5   = 0x85.5

#bit  GPPU        = 0x81.7


Biblioteca do DSPlayer Mini

////////////////////////////////////////////////////////////////////////////////
//              Projeto: Biblioteca para acessar o DFPlayer Mini              //
//                 Nome: Renato Lôbo Rodrigues                                //
//                 Data: 12/07/17                                             //
//                Email: lobosoft@oi.com.br                                   //
////////////////////////////////////////////////////////////////////////////////


#use rs232(baud=9600,xmit=PIN_A1,rcv=PIN_A2, ERRORS)

static unsigned INT8 Send_buf[10] = {0} ;


void SendCmd(unsigned INT8 leng)
{
INT8 i = 0 ;
putc(0x7E);
for(i=0; i<leng; i++)//dados
{
putc(Send_buf[i]);
}
putc(0xEF);
}

void DoSum( unsigned INT8 *Str, unsigned INT8 len)
{
   unsigned INT16 xorsum = 0;
   unsigned INT8 i;
   for(i=0; i<len; i++)
   {
      xorsum = xorsum + Str[i];
   }
   xorsum = 0 -xorsum;
   *(Str+i) = (unsigned INT8)(xorsum >>8);
   *(Str+i+1) = (unsigned INT8)(xorsum & 0x00FF);
}
void Uart_SendCMD(unsigned INT8 CMD ,unsigned INT8 feedback , unsigned INT16 dat)
{
   Send_buf[0] = 0xFF;                       //bytes reservados
   Send_buf[1] = 0x06;                       //comprimento
   Send_buf[2] = CMD;                        //instruções de controle
   Send_buf[3] = feedback;                   //A necessidade de feedback
   Send_buf[5] = (unsigned INT8)(dat);       //datal
   Send_buf[4] = (unsigned INT8)(dat >> 8);  //datah
   DoSum(&Send_buf[0],6);                    //Verifique
   SendCmd(8);                               //Esta transmissão da trama de dados
}

void Arquivo_musica(int8 pasta,int8 numero)
{
   int16 pasta_numero;
   pasta_numero = (pasta * 256) | numero ;
   Uart_SendCMD(15 , 0, pasta_numero);
}

void Proxima_trilha()
{
   Uart_SendCMD(1 , 0, 0);
}

void Trilha_anterior()
{
   Uart_SendCMD(2 , 0, 0);
}

void Diminuir_volume()
{
   Uart_SendCMD(5 , 0, 0);
}

void Aumentar_volume()
{
   Uart_SendCMD(4 , 0, 0);
}

void Volume(int8 vol)
{
   Uart_SendCMD(6 , 0, vol);
}

void Equaliza(int8 equa)
{
   Uart_SendCMD(7 , 0, equa);
}

Void Pausa()
{
   Uart_SendCMD(14 , 0, 0);
}

Void Tocar()
{
   Uart_SendCMD(13 , 0, 0);
}

void dispositivo(int8 disp)
{
   Uart_SendCMD(9 , 0, disp);
}
void sorteia()
{
   Uart_SendCMD(24 , 0, 3);
}
void sequencia()
{
   Uart_SendCMD(24 , 0, 1);
}

Até a próxima pessoal.


Nenhum comentário :

Postar um comentário

olá,digite aqui seu comentário!