Communication Esp32 <>Dfplayer

Aïe... mauvaise limonade..
J'ai testé différents scripts qui impliquait le Gpio 16 et 17, ca semble normal en utilisation input/output.

Si je fais un montage en mettant une résistance 1K sur ces ports ça devrait éviter de renvoyer du 5V sur l'Esp, non ?

Je relis votre premier message et c'est ce que vous m'aviez indiqué mais que je n'avais pas compris.

D'autre part, je n'avais pas non, plus compris votre message sur "HardwareSerial",
J'ai mappé les ports 18 et 19 (enfin bon, j'ai trouvé un script tout fait) et je n'ai toujours pas de succès.
Un peu marre là...

le nouveau script:

#include "DFRobotDFPlayerMini.h"

HardwareSerial mySoftwareSerial(1);
DFRobotDFPlayerMini myDFPlayer;
void printDetail(uint8_t type, int value);

void setup()
{
  mySoftwareSerial.begin(9600, SERIAL_8N1, 18, 19);  // speed, type, RX, TX
  Serial.begin(115200);

  Serial.println();
  Serial.println(F("DFRobot DFPlayer Mini Demo"));
  Serial.println(F("Initializing DFPlayer ... (May take 3~5 seconds)"));

  if (!myDFPlayer.begin(mySoftwareSerial, true)) {  //Use softwareSerial to communicate with mp3.

    Serial.println(myDFPlayer.readType(), HEX);
    Serial.println(F("Unable to begin:"));
    Serial.println(F("1.Please recheck the connection!"));
    Serial.println(F("2.Please insert the SD card!"));
    while (true);
  }
  
  Serial.println(F("DFPlayer Mini online."));

  myDFPlayer.setTimeOut(500); //Set serial communictaion time out 500ms

  //----Set volume----
  myDFPlayer.volume(10);  //Set volume value (0~30).
  myDFPlayer.volumeUp(); //Volume Up
  myDFPlayer.volumeDown(); //Volume Down

  //----Set different EQ----
  myDFPlayer.EQ(DFPLAYER_EQ_NORMAL);


  //----Set device we use SD as default----
  myDFPlayer.outputDevice(DFPLAYER_DEVICE_SD);


  int delayms = 100;
  //----Mp3 play----
  
  //----Read imformation----
  Serial.println(F("readState--------------------"));
  Serial.println(myDFPlayer.readState()); //read mp3 state
  Serial.println(F("readVolume--------------------"));
  Serial.println(myDFPlayer.readVolume()); //read current volume
  //Serial.println(F("readEQ--------------------"));
  //Serial.println(myDFPlayer.readEQ()); //read EQ setting
  Serial.println(F("readFileCounts--------------------"));
  Serial.println(myDFPlayer.readFileCounts()); //read all file counts in SD card
  Serial.println(F("readCurrentFileNumber--------------------"));
  Serial.println(myDFPlayer.readCurrentFileNumber()); //read current play file number
  Serial.println(F("readFileCountsInFolder--------------------"));
  Serial.println(myDFPlayer.readFileCountsInFolder(3)); //read fill counts in folder SD:/03
  Serial.println(F("--------------------"));

  Serial.println(F("Primeiro som:"));
  delay(1000);
  playTrackX(1);
}

void loop()
{
  // static unsigned long timer = millis();

  if (Serial.available()) {
    String inData = "";
    inData = Serial.readStringUntil('\n');
    if (inData.startsWith("n")) {
      Serial.println(F("next--------------------"));
      myDFPlayer.next();
      Serial.println(myDFPlayer.readCurrentFileNumber()); //read current play file number
    } else if (inData.startsWith("p")) {
      Serial.println(F("previous--------------------"));
      myDFPlayer.previous();
      Serial.println(myDFPlayer.readCurrentFileNumber()); //read current play file number
    } else if (inData.startsWith("+")) {
      Serial.println(F("up--------------------"));
      myDFPlayer.volumeUp();
      Serial.println(myDFPlayer.readVolume()); //read current volume
    } else if (inData.startsWith("-")) {
      Serial.println(F("down--------------------"));
      myDFPlayer.volumeDown();
      Serial.println(myDFPlayer.readVolume()); //read current volume
    } else if (inData.startsWith("*")) {
      Serial.println(F("pause--------------------"));
      myDFPlayer.pause();
    } else if (inData.startsWith(">")) {
      Serial.println(F("start--------------------"));
      myDFPlayer.start();
    }
    else if (inData.startsWith("f")) {
      Serial.println(F("PLAY--------------------"));
     playTrackX(5);
    }
  }

}


// routine to play a specific song
void playTrackX (byte x) {

  mySoftwareSerial.write((byte)0x7E);
  mySoftwareSerial.write((byte)0xFF);
  mySoftwareSerial.write((byte)0x06);
  mySoftwareSerial.write((byte)0x03);
  mySoftwareSerial.write((byte)0x00);
  mySoftwareSerial.write((byte)0x00);
  mySoftwareSerial.write((byte)x);
  mySoftwareSerial.write((byte)0xEF);
}

Bonne nouvelle

Il faut 2 résistances pour faire un diviseur de tension

Sinon le code poste en #8 utilisait Serial2 directement donc les bonnes pins.

Il faudrait alimenter votre DFPlayer en 5V directement et joignant les masses avec L’ESP et en mettant le pont diviseur de tension au moins entre la broche Tx du DFPlayer et le RX2 de L’ESP. Et tester avec mon code en #8

Bonjour

je prends le fil de discussion en cours de route et n'ai pas de DSPlayer pour tester

il se pourrait que ce type de boucle d'attente de connection du DSPLayer plante et resette l'ESP32 (ce serait à coup sûr le cas pour un ESP8266) :

if (!myDFPlayer.begin(mySoftwareSerial)) {  //Use softwareSerial to communicate with mp3.
    Serial.println(F("Unable to begin:"));
    Serial.println(F("1.Please recheck the connection!"));
    Serial.println(F("2.Please insert the SD card!"));
    while (true)
      ;
  }

Que donne en fin de boucle d'attente un

while (true)  {
    delay(0);
     }  

ou un

while (true)  {
    yield();
     }  

Certes le watchdog reboot sur la boucle infinie mais ce n’est que dans le cas où le DFPlayer n’est pas vu. Le message d’erreur devrait avoir le temps de s’afficher sans doute.

Mais effectivement mettre un yield() serait une bonne idée pour vraiment arrêter le code

Une autre bonne idée serait de faire

myDFPlayer.begin(mySoftwareSerial, false);

Le false disant de ne pas attendre l’ACK qui pourrait être problématique sur esp ou alors d’augmenter le timeout avant le begin en faisant

myDFPlayer.setTimeOut ( 1500 ) ;

Donc le code à tester:

#include "DFRobotDFPlayerMini.h"
DFRobotDFPlayerMini myDFPlayer;


void printDetail(uint8_t type, int value) {
  switch (type) {
    case TimeOut:                 Serial.println(F("Time Out!"));         break;
    case WrongStack:              Serial.println(F("Stack Wrong!"));      break;
    case DFPlayerCardInserted:    Serial.println(F("Card Inserted!"));    break;
    case DFPlayerCardRemoved:     Serial.println(F("Card Removed!"));     break;
    case DFPlayerCardOnline:      Serial.println(F("Card Online!"));      break;
    case DFPlayerPlayFinished:    
      Serial.print(F("Number:"));
      Serial.print(value);
      Serial.println(F(" Play Finished!"));
      break;
    case DFPlayerError:
      Serial.print(F("DFPlayerError:"));
      switch (value) {
        case Busy:              Serial.println(F("Card not found"));          break;
        case Sleeping:          Serial.println(F("Sleeping"));                break;
        case SerialWrongStack:  Serial.println(F("Get Wrong Stack"));         break;
        case CheckSumNotMatch:  Serial.println(F("Check Sum Not Match"));     break;
        case FileIndexOut:      Serial.println(F("File Index Out of Bound")); break;
        case FileMismatch:      Serial.println(F("Cannot Find File"));        break;
        case Advertise:         Serial.println(F("In Advertise"));            break;
        default: break;
      }
      break;
    default: break;
  }
}

void setup() {
  Serial.begin(115200);
  Serial2.begin(9600, SERIAL_8N1, 16, 17);

  Serial.println();
  Serial.println(F("DFRobot DFPlayer Mini Demo"));
  Serial.println(F("Initializing DFPlayer ... (May take 3~5 seconds)"));
  
  myDFPlayer.setTimeOut (1500) ;
  if (!myDFPlayer.begin(Serial2, FALSE)) {
    Serial.println(F("Unable to begin:"));
    Serial.println(F("1.Please recheck the connection!"));
    Serial.println(F("2.Please insert the SD card!"));
    Serial.flush();
    while (true) yield();
  }

  Serial.println(F("DFPlayer Mini online."));

  myDFPlayer.volume(10);  //Set volume value. From 0 to 30
  myDFPlayer.play(1);     //Play the first mp3
}

void loop() {
  static unsigned long timer = millis();

  if (millis() - timer > 3000) {
    timer = millis();
    myDFPlayer.next();  //Play next mp3 every 3 second.
  }

  if (myDFPlayer.available()) {
    printDetail(myDFPlayer.readType(), myDFPlayer.read());  //Print the detail message from DFPlayer to handle different errors and states.
  }
}

merci à vous deux, je me fais une pause de 48heures et je m'y mets. :slightly_smiling_face:

Il y a des exemples qui montrent que cela a déjà été réalisé avec d’autres types d’esp donc c’est sans doute faisable, mais sur le github ils y a des soucis documentés par exemple lire

A voir aussi

Ici un souci de qualité ➜ testez au multimètre le fait que les pins ne soient pas connectées entre elles

Ici un tuto (je ne l’ai pas lu)

Ici un code sur le forum expressif

Bonjour

Sur les dépots de plusieurs librairies pour DFPlayer Mini on commence à voir apparaître des problèmes dus à la présence de puces autres que YX5200-24SS sur des DFPlayer Mini

Quelle puce est au dos du module douteux ? YX5200-24SS ou pas ?

EDIT : je viens de mettre la main sur un DFPlayer Mini, l'ai câblé avec une carte LOLIN32 Lite, DFPlayer alimenté ici en 3,3V par la carte LOLIN32 LIte

Pour le code , j'ai fait au plus simple : après installation de la librairie proposée pour ce module par DFRobot j'ai chargé l'exemple AdvancedSettingsViaSerial1 , choisi pout éviter l'usage de SoftSerial sur une carte qui possède 3 UARTS.

Seule modification : Serial1.begin complété de la manière suivante pour adapatation à un ESP32

Serial1.begin(9600, SERIAL_8N1, 16, 17); //Rx,Tx

J'aurais pu tout aussi bien utliser Serial2 , quand aux GPIO le choix est vaste pour un port série matériel sur l'ESP32...

L'exemple tourne sans problème perceptible, l'ESP32 et le DFPlayer dialoguent.

ESP32-DFPlayer

je trouve deux fois plus de montages à problèmes que de montages qui fonctionnent... J'en ai eu pour mon argent , c'est très probablement ces modules qui sont défectueux comme vous l'aviez envisagé.

Quelque part ça me rassure.
J'ai tenté le même montage/code : rien
j'ai modifié les Gpio : nada
j'ai alimenté en 5v : pas mieux

non, c'est une puce marquée: GD3200D 2205315AC7.

Je vais probablement en acheter deux chez Dfrobot.

Tout s'explique, c'est un DFPlayer 'déviant' ! (logiquement non pris en charge par la librairie de DFRobot ..)

Peut être une solution avec cette librairie pour DFPlayer particulière de Makuna qui tente de prendre en charge des DFPlayer dont la puce est autre que YX5200-24SS présente sur les DFPlayers originels de DFRobot, il ya est question de la puce alternative MH2024K-24SS

Avec la même cible : 'DFPlayers en tous genres' , voici la librairie DFPLAYER de enjoyneering

qui anonce :

This is small and fast Arduino library for:

DFPlayer Mini, MP3-TF-16P, FN-M16P (YX5200, YX5300, JL AAxxxx from Jieli)
FN-M10P, FN-M10P (FN6100)
DFPlayer Mini HW-247A (GD3200B)

Supports:

Arduino AVR
Arduino ESP8266
Arduino ESP32
Arduino STM32

:point_right: Je commencerai par celle là pour tes DFPlayers, @chief-brody !!
code exemple à adapter au ESP32

Ça ressemble à une bonne piste à suivre en effet!

c'est très alléchant !
Merci pour la contribution :slightly_smiling_face:

Hélas.. j'ai essayé avec les Gpio 16 et 17 (en inversant aussi au cas-où) j'ai testé avec les Gpio 25, 26 le tout en 3.3v ou en 5v.
et rien que ce message d'erreur:

ets Jun  8 2016�ets Jun  8 2016 00:22:57

rst:0x1 (POWERON_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:1
load:0x3fff0018,len:4
load:0x3fff001c,len:1216
ho 0 tail 12 room 4
load:0x40078000,len:10944
load:0x40080400,len:6388
entry 0x400806b4

pfff... 13 jours sur ce problème...

ça fait longtemps que j'aurais commandé une MEGA (plusieurs ports séries) ou UNO ou Nano et un vrai DFPlayer pour explorer, et puis ça peut toujours servir :slight_smile:

un des soucis pour vous aider c'est que l'on ne connait pas assez les conditions de vos tests, le code utilisé , la démarche pour vous assurer que l'ensemble des éléments pris séparément (jusqu'aux fils DuPont et câble USB) fonctionnent...
tester la voie série sur 16/17 de l'ESP avec un adaptateur Série TTL vers USB
tester que l'ESP fait bien blink
alimenter le DFPlayer séparément en 5V en joignant les GND et mettre un adaptateur de tension sur la voie série entre l'ESP et le DFPlayer

ensuite ne tester qu'avec le code le plus simple fourni dans les exemples d'une des bibliothèques

Je ne vois pas de message d'erreur. C'est un boot normal : POWERON_RESET

Mon découragement me fais voir des pannes partout :roll_eyes:
j'ai édité le code et rajouté " mp3.playTrack(1);" sans effet.

C'est_à_dire que je tente un peu de limiter les frais ... :wink:
Mon projet est à faire en double (quelle idée...) et je ne me vois pas mettre 28€ dans deux Dfplayer de chez Dfrobot pour l'instant.

Il est très possible que je commette une erreur quelque part.
J'ai échangé mes câbles, ma source d'alim, l'esp et le dfplayer, même l'emplacement sur la board.
Le code est mon point faible, (je ne comprend peu de ce que je fais) mais logiquement j'aurais du obtenir quelque chose avec tous les codes testés, normalement.

Il vaut mieux que je renonce à la communication série tant qu'un de mes Dfplayer n'aura pas été testé par un électronicien compétent.

Voici mon nouvel axe:
-je peux me contenter de la commande de lecture d'un seul MP3.
-Je peux commander cette lecture simplement en reliant la borne "IO_1" ou "IO_2" du Dfplayer au Gnd. Ca fonctionne.
-Si je peux commander la fermeture de cette connexion par une instruction j'aurais un résultat exploitable et avancer dans mon projet.

Quel serait le moyen le plus élégant pour commander cette connexion ?
Mes recherches de débutants font ressortir les transistors Mosfet..
ou carrément ce genre de truc:

Il faudrait savoir ce qu'il passe sur le fil entre la borne "IO_1" ou "IO_2" du Dfplayer et le Gnd.

A mon avis c'est une mise à la terre de base avec quasiment aucun courant qui ne passe par là - c'est sans doute fait pour mettre un interrupteur qu'on peut relier à la masse et cette pin est en pullup côté DFPlayer

Donc vous pouvez sans doute prendre un relais Reed ou un optocoupleur. regardez mon tuto sur Contrôler son Appareil photo (Canon) et un Flash Cobra avec Arduino, un besoin similairese posait pour le déclenchement.

Bonjour

Voici le schéma du module DFPlayer d'origine avec son microcontrolleur YX5200 dédié décodage MP3 et ses GPIO dont GPIOA0 et GPIOA2

c'est sans doute fait pour mettre un interrupteur qu'on peut relier à la masse et cette pin est en pullup côté DFPlayer

Pullups internes sur IO0 et IO2 dans le YX5200, quand ont les mets à la masse par un fil il y circule environ 80µA

OK donc un simple optocoupleur fera l'affaire

@J-M-L et @al1fch
Merci pour la piste! Je m'y mets et je vous tiendrai au courant.

édition: le tuto sur l'appareil photo est très intéressant.
A sa lecture je me dis que je pourrais peut-être commander également l'alimentation du Dfplayer de la même façon, de manière à éviter qu'il ne consomme en permanence?
Il est possible qu'il prenne un petit instant à s'initialiser mais je ne le constate pas quand je le fais fonctionner en indépendant.
Comme mes Dfplayer fonctionnent mieux en 5v , il me faudrait donc un optocoupleur qui soit commandé par du 3.3 et qui laisse passer jusqu' 5v si j'ai bien compris.

ceci pourrait correspondre ?

PC817 Features and Specifications

    Input Diode Forward Voltage: 1.25V
    Collector-Emitter Voltage: 80V (max)
    Collector Current: 50mA (max)
    Cut-off frequency: 80 kHz
    Rise Time: 18us
    Fall Time: 18us
    Available as 4-pin DIP through hole and also as SMT package.

Youhou !
J'ai pu avancer un peu, c'est fou comme ça fait du bien... :upside_down_face:
En attendant de commander/recevoir des optocoupleurs j'ai pu mettre la main sur
un commutateur Mosfet


et ça fonctionne!
C'est pas élégant, c'est énorme mais j'avance...
Mon code est écrit (pour info, j’établis la connexion de IO_1 vers Gnd pendant 500ms)

J’éteins la lumière et le montage joue mon Mp3.

Je ne mets pas résolu car ce n'est qu'un pis-aller pour l'instant.