DFPLAYER y micro 16f628A

#1
Buenas a todos. Compré este módulo mp3 DFPLAYER mini.
Leí los comandos y he estado intentando mandar los comandos con el PIC16F628A sin éxito, no logro reproducir ni una sola canción.
Deseo saber qué se debe hacer con este módulo. ¿Tengo que enviar una lista específica para la reproducción de archivos en una ubicación específica en la SD o qué debo hacer para reproducir al-menos 1 canción? ¿O debo enviar alguna configuración previa?

Este código que cito aquí es parte de los intentos que he realizado con varios comandos para la reproducción de canciones.
Espero me ayuden. Gracias.
C:
#include <16f628A.H> //pic a utilizar

#fuses XT,NOWDT,NOPROTECT,NOPUT,NOBROWNOUT

#use delay (clock=4000000)

#bit RCIF=0xF9E.5

#use RS232 (baud = 9600, bits = 8, parity = N, xmit = pin_b2, rcv = pin_b1)



unsigned char comandoDFplayer2[10] = {0x7E, 0xFF, 0x06, 0x0D, 0x00, 0x00, 0x00, 0xFE, 0xEE, 0xEF};

unsigned char comandoDFplayer1[10] = {0x7E, 0xFF, 0x06, 0x0F, 0x00, 0x04, 0x01, 0xFE, 0xE7, 0xEF};

unsigned char comandoDFplayer[10] = {0x7E, 0xFF, 0x06, 0x3F, 0x00, 0x00, 0x02, 0xFE, 0xF0, 0xEF};

int i=0;


void main(void)

{



for (i=0;i<10;++i)

{


printf("%02X",comandoDFplayer); // primer intento de reproducir una cancion!

printf("\n");

}


delay_ms(5000);


for (i=0;i<10;++i)

{

printf("%02X",comandoDFplayer1); // segundo intento de reproducir una canción!

printf("\n");

}

delay_ms(5000);

for (i=0;i<10;++i) {

printf("%02X",comandoDFplayer2);// tercer  intento de reproducir una canción!

printf("\n"); }


printf("0x7E");  // cuarto  intento de reproducir una canción!

printf("0xFF");

printf("0x06");

printf("0x03");

printf("0x00");

printf("0x00");

printf("0x01");


printf("0xEF");   // quinto  intento de reproducir una canción!

delay_ms(5000);

printf("0x7E");

printf("0xFF");

printf("0x06");

printf("0x0F");

printf("0x00");

printf("0x01");

printf("0x01");

printf("0xFF");

printf("0xBA");

printf("0xEF");
 
Última edición por un moderador:
#3
Leí los comandos y he estado intentando mandar los comandos con el PIC16F628A sin éxito, no logro reproducir ni una sola canción.
Estás enviando los comandos como texto y se deben enviar como un número.
No es lo mismo enviar el número "0x0C" entre comillas (Texto) que como un número putc(0x0C);
También se puede así: printf("%c", 0x0C); pero con putc(0x0C); es suficiente porque no se necesita ningún formato.
De igual forma se puede enviar así: putc(12); que es el mismo valor que 0x0C pero en decimal.
O así, pero en binario: putc(0b00001100);
Para el caso, siempre se enviará el número 12 y el reproductor lo interpretará igual, porque a final de cuentas no deja de ser 12

y las libreria del DFplayer?
No se necesita ninguna librería, son comandos básicos los que se implementan.
 

Adjuntos

pandacba

Rocker Bear
#4
Hace tiempo prove uno de esos, que de echo funcionan sin un micro, pero encontre una lib que tenía todoso los comandos y probe y funcionaba perfecto, estoy a 100km de mi casa así que no puedo poner cual es ni de donde la tome
La idea es que busque, que aprenda a buscar, que sondee que lea, que es preferible el pescado o la caña?
Tengo ese Pdf y otros, en su momento me baje toda la información que había al respecto, tanto leer me di cuenta que era mucho más simple de lo que me imaginaba.
Como primera medida busque todlo lo referente al DFplayer
por ejemplo aqui dfplayer, solo pretendía que lo encuentre buscandolo, yo prefiero dar la caña
 
Última edición:
#5
buenas tardes a todos, muchas gracias por toda la información y los aportes que me han generado, voy a probar los concejos que me han brindado, ahora tengo una pregunta y es si en el envió de los datos es necesario el calculo del checksun ? ya que vi en varios ejemplos que no lo enviaban, osea que es ves de ser un dato de 10 byte solo enviaban 8 de estos! gracias a todos, pronto les estaré retro alimentando.
 
#6
Mejor lee la hoja de datos, porque ahí se explica el por qué del uso del checksum.

También tiene ejemplos y se explica muy bien cómo se reproduce una pista.
DFPlayer Mini - Play track.jpg
 
#8
buenas noches a todos, les agradezco el apoyo brindado, ya he logrado reproducir un par de audios después de probar y probar, tenia errores en la forma de enviar los datos, ejemplo de ello es que en este caso como son variables chart, así mismo debo utilizar la forma mas adecuada para enviar este tipo de dato, así como al mismo tiempo me di cuenta que en Internet hay una gran cantidad de errores o mala información, lo que aun no he sabido es como setear el volumen, ya realice varias pruebas con el comando 7E-FF-06-06-00-00-0F-X-X-EF, pero no me ha sido posible, ya lo hice calculando el checksum y con los ejemplos que e hallado pero aun nada, estaré atento a sus sugerencias, y nuevamente muchas gracias por los aportes,apenas pueda tratare de explicar mejor los errores que comiti y donde estaban las fallas.
 
#9
buenas noches a todos, quiero obsequiar esta información ya probado y verificado su funcionalidad

esta forma de reproducir canciones es validad para hacerlo directamente, lo que debe hacer es primero que todo mandar el comando "d" que es igual a un "13", con la trama que corresponde 7e-ff-06-0d-00-00-01-fe-ed-ef, recordando que la trama la cabeza y la cola son obligatorias, el dato ff y el 06 son tambien obligatorios y tienen que ir, el cuarto dato en este caso la "d" es quien me esta definiendo reproducir y el resto de datos es el checksumel cual debe coincidir con la suma de los 6 datos que serian en este caso ff-06-0d-00-00-01, para un resultado total de 275 y multiplicado por -1, da -275 que en hexadeximal es igual a checksum = fe-ed



putchar(0x7e);// mando a reproducir con dato 13

putchar(0xff);

putchar(0x06);

putchar(0x0d);

putchar(0x00);

putchar(0x00);

putchar(0x01);

putchar(0xfe);

putchar(0xed);

putchar(0xef);

delay_ms(4000);



despues de enviar la orden de reproduccion con la "d", se envia el numero de la cancion a reproducir con su respectivo checksum, como se puede ver el dato de la "d" cambia por un "03", que es igual a reproducion de la cancion de numero "xx", en este ejemplo basico tenemos el dato 7e-ff-06-03-00-00-04-fe-f4-ef,que es igual a decir reproducion de la cancion numero 4 y con la suma de checksum es igual a -268, para un checksum = fe-f4

putchar(0x7e);// reproduccion directa con dato 3 cancion 4

putchar(0xff);

putchar(0x06);

putchar(0x03);

putchar(0x00);

putchar(0x00);

putchar(0x04);//-268

putchar(0xfe);

putchar(0xf4);

putchar(0xef);

delay_ms(4000);

espero esta información le ayude aquellos que como yo han tenido que pasar varios días leyendo y leyendo sin encontrar las respuesta correcta a sus inquietudes, así mismo comento que aun no me funciona el comando para setear el valor del volumen en un nivel dado, no se si es que hay que hacerlo en una posición dada dentro del código, o después de de un tiempo o que debo tener en cuenta ? ya que como este ejemplo que doy hay que primero mandar una orden para luego reproducir la canción que deseo!, si me pudiesen colaborar con esa parte lo agradecería, a todos gracias por sus aportes y espero este sea de ayuda!!

Nota: no es necesario una librería, con que coloquen esto en su código principal la canción se reproducirá!
 
#10
Por eso es mejor leer la hoja de datos, que buscar ejemplos.
Yo tengo ese módulo desde hace varios años, pero no lo usé porque encontré otro mejor.
Así que, jamás le dediqué tiempo, pero estoy 100 % seguro que si la lees, no tendrás problemas para generar el código adecuado.
El problema es, que siempre buscan ejemplos creados por otros, y la hoja de datos nunca la toman en cuenta.

Ahora... Ve como te la complicas con un putchar en lugar de un printf.
 
#13
Buenos días. Estoy haciendo un proyecto que consiste en activar el DFplayer a través del un pulso de 3 segundos proveniente del micro 12f675 pero por mas que lo conmute con un opto, un mosfet, y un 2n3904 el módulo no me arrancó desde el pin de play por conexión a tierra.
¿Cómo puedo hacer que me funcione? Ya que de forma directa si funciona.
Uso como fuente una pila cargador de celular, desde la pila a 3.8v y desde la salida del inversor a 5.1v pero no me funciona de ninguna manera.
¿Alguien puede ayudarme?
¿Cómo lo puedo controlar desde el pic12f675 ?
Muchas gracias.

El código es:
C:
//****************************************************************************************************************************************************
//******************************************************************************************************************************************************

#include <RELOJJ.h>
#define GP0 PIN_A0
#define GP1 PIN_A1
#define GP2 PIN_A2
#define GP3 PIN_A3
#define GP4 PIN_A4
#define GP5 PIN_A5
#define PULSE PIN_A2
#define LDR PIN_A4




VOID MAIN ()
{
//***********************************************************************
//*****************CONFIG***************************************

SET_TRIS_A(0B00010100);
SETUP_ADC_PORTS(NO_ANALOGS);
SETUP_COMPARATOR(NC_NC_NC_NC);
setup_adc( ADC_OFF ); // disable A2D
enable_interrupts(GLOBAL);
enable_interrupts(INT_RA2);

while (TRUE)
{
IF (input(PULSE) == 1)
{
if (input(LDR) == 1)
{

// generacion de pulso 5s

//*****************************************************************************
output_high (PIN_A5);
delay_ms(3000);
output_low (PIN_A5);
delay_ms(5000);

//**************************************************************************
// ***led intermitente para test

output_high (PIN_A1);
delay_ms(200);
output_low (PIN_A1);
delay_ms(400);
output_high (PIN_A1);
delay_ms(200);
output_low (PIN_A1);
delay_ms(200);
output_high (PIN_A1);
delay_ms(200);
output_low (PIN_A1);
delay_ms(400);
output_high (PIN_A1);
delay_ms(200);
output_low (PIN_A1);
delay_ms(200);
SLEEP();
}

ELSE
{

output_low (PIN_A0);
output_low (PIN_A5);
output_low (PIN_A1);


}


}

}
}


// *******************************************************************
#INT_RA
despierta()
{
input(PULSE);


IF (input(PULSE) == 1)
{
if (input(LDR) == 1)
{

// generacion del pulso al despertar
//*******************************************************************

output_high (PIN_A5);
delay_ms(3000);
output_low (PIN_A5);
delay_ms(5000);


// led intermitente al despertar
//***********************************************************

output_high (PIN_A1);
delay_ms(200);
output_low (PIN_A1);
delay_ms(400);
output_high (PIN_A1);
delay_ms(200);
output_low (PIN_A1);
delay_ms(200);
output_high (PIN_A1);
delay_ms(200);
output_low (PIN_A1);
delay_ms(400);
output_high (PIN_A1);
delay_ms(200);
output_low (PIN_A1);
delay_ms(200);
sleep();
}
}
}
 
#15
Bueno, este es el montaje.

Y el código:
C:
el código es:
//****************************************************************************************************************************************************
//******************************************************************************************************************************************************

#include <RELOJJ.h>
#define GP0 PIN_A0
#define GP1 PIN_A1
#define GP2 PIN_A2
#define GP3 PIN_A3
#define GP4 PIN_A4
#define GP5 PIN_A5
#define PULSE PIN_A2
#define LDR PIN_A4




VOID MAIN ()
{
//***********************************************************************
//*****************CONFIG***************************************

SET_TRIS_A(0B00010100);
SETUP_ADC_PORTS(NO_ANALOGS);
SETUP_COMPARATOR(NC_NC_NC_NC);
setup_adc( ADC_OFF ); // disable A2D
enable_interrupts(GLOBAL);
enable_interrupts(INT_RA2);

while (TRUE)
{
IF (input(PULSE) == 1)
{
if (input(LDR) == 1)
{

// generacion de pulso 5s

//*****************************************************************************
output_high (PIN_A5);
delay_ms(3000);
output_low (PIN_A5);
delay_ms(5000);

//**************************************************************************
// ***led intermitente para test

output_high (PIN_A1);
delay_ms(200);
output_low (PIN_A1);
delay_ms(400);
output_high (PIN_A1);
delay_ms(200);
output_low (PIN_A1);
delay_ms(200);
output_high (PIN_A1);
delay_ms(200);
output_low (PIN_A1);
delay_ms(400);
output_high (PIN_A1);
delay_ms(200);
output_low (PIN_A1);
delay_ms(200);
SLEEP();
}

ELSE
{

output_low (PIN_A0);
output_low (PIN_A5);
output_low (PIN_A1);


}


}

}
}


// *******************************************************************
#INT_RA
despierta()
{
input(PULSE);


IF (input(PULSE) == 1)
{
if (input(LDR) == 1)
{

// generacion del pulso al despertar
//*******************************************************************

output_high (PIN_A5);
delay_ms(3000);
output_low (PIN_A5);
delay_ms(5000);


// led intermitente al despertar
//***********************************************************

output_high (PIN_A1);
delay_ms(200);
output_low (PIN_A1);
delay_ms(400);
output_high (PIN_A1);
delay_ms(200);
output_low (PIN_A1);
delay_ms(200);
output_high (PIN_A1);
delay_ms(200);
output_low (PIN_A1);
delay_ms(400);
output_high (PIN_A1);
delay_ms(200);
output_low (PIN_A1);
delay_ms(200);
sleep();
}
}
}
 

Adjuntos

Última edición por un moderador:
Arriba