Communication Esp32 <>Dfplayer

Bonjour,
Merci de m’accueillir ici.

J'ai un projet: je voudrais réaliser un montage qui déclencherait la lecture d'un message sonore "Ca va être tout noir!" lorsque la lumière s'éteint.
Je me suis procuré un ESP32 il y a 15 jours. ( uPesy ESP32 Wroom DevKit v2)
En attendant mon Dfplayer j'ai créé un montage qui affiche un message texte sur un écran Oled (en alternance avec un dessin de mammouth) dès que la lumière s'éteint. On se rapproche du but...

J'ai un souci: je n'arrive pas à commander le Dfplayer avec mon Esp32.

J'ai tenté d'utiliser quelques scripts dont celui-ci qui est souvent proposé.

#include "Arduino.h"
#include "SoftwareSerial.h"
#include "DFRobotDFPlayerMini.h"

SoftwareSerial mySoftwareSerial(16, 17);  // RX, TX
DFRobotDFPlayerMini myDFPlayer;
void printDetail(uint8_t type, int value);

void setup() {

  mySoftwareSerial.begin(9600);
  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)) {  //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)
      ;
  }

  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.
  }
}

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;
  }
}

voici le message d'erreur:

"Unable to begin:
1.Please recheck the connection!
2.Please insert the SD card!"

voici mon câblage: 1 hosted at ImgBB — ImgBB

J'ai refais mes connections.
j'ai vérifié que je ne prenais pas le Dfplayer à l'envers...
inversé les Gpio 16 et 17
Changé d'emplacement sur ma board.
changé mes câbles.
j'ai testé avec un autre Dfplayer (j'en ai 4...)
Testé en 3.3v et 5v
Changé de port pour la masse.

Le Dfplayer fonctionne en indépendant, je lis des fichiers MP3, je zappe et je modifie le volume sans problème.

Lorsque je supprime la partie test du script j'obtiens ce message sur le moniteur:



A6      : 0x00060520  A7      : 0x00000000  A8      : 0x00000000  A9      : 0x0000000a  
A10     : 0x00000000  A11     : 0x3f40037f  A12     : 0x0000000a  A13     : 0x0000ff00  
A14     : 0x00ff0000  A15     : 0xff000000  SAR     : 0x0000001f  EXCCAUSE: 0x0000001c  
EXCVADDR: 0x00000000  LBEG    : 0x400eadb0  LEND    : 0x400eadba  LCOUNT  : 0x00000000  

ELF file SHA256: 0000000000000000

Backtrace: 0x400d1a84:0x3ffb1f20 0x400d1ad3:0x3ffb1f40 0x400d1b1c:0x3ffb1f60 0x400d0e3a:0x3ffb1f80 0x400d3096:0x3ffb1fb0 0x4008651d:0x3ffb1fd0

Rebooting...
ets Jun  8 2016 00:22:57

rst:0xc (SW_CPU_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

Merci pour votre aide :slight_smile:

voici la carte que vous avez

pourquoi utiliser SoftwareSerial sur 16/17 alors que c'est déjà un port série (UART2)

vous pouvez l'actionner comme cela

#include <HardwareSerial.h>
HardwareSerial DFPort(2); // DFPort utilise UART2

void setup()  {
  DFPort.begin(15200, SERIAL_8N1, 16, 17); 
}

void loop() {}

ou simplement en l'appellant Serial2 et en mettant dans le setup

  Serial2.begin(115200, SERIAL_8N1, 16, 17);

attention c'est un port 3.3V donc votre Dfplayer doit parler en 3.3V. si ce n'est pas le cas il faut mettre une adaptation de tension au moins entre RX2 (de l'ESP) et le TX du Dfplayer

C'est vrai que c'est pas très explicite. Pour comprendre toute la subtilité de ce genre de message, il te faut installer une petite extension dans l'IDE. Ici
Elle fonctionne dans l'IDE avant version 2. Pour la version 2, je ne sais pas car je ne l'utilise pas.

pas encore supportée

Merci pour la réponse.
Je revenais pour dire que j'avais beau tenter de l'installer comme il faut je ne trouvais pas ce nouvel outil dans le menu.
Et pour cause ...

Deux solutions : tu installes (temporairement) une version ancienne de l'IDE, ou quelqu'un traduit le backtrace pour toi (moi je n'ai pas l'IDE sur cet ordi, désolé)

Merci pour le code.
Désolé, je n'avais pas vu la réponse. (je m'habitue au forum.)
J'avoue que je ne sais pas exactement ce que je fais en utilisant cette commande, Je procède de manière empirique en m'inspirant de code existant que j'essaye de comprendre une fois qu'ils fonctionnent.

Je tente de comprendre du haut de mes 15 jours d'expèrience...
j'ai essayé en rajoutant simplement ces lignes et également en supprimant Serial.begin(115200);
mais j'ai le même résultat.

essayez de compiler et tester cela

attention alimentez le DFPlayer en 3.3V pas en 5V (et assurez vous que votre modèle sait parler en 3.3V)

#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)"));

  if (!myDFPlayer.begin(Serial2)) {
    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.
  }
}

Encore merci pour le code. C'est sympa. :+1:

J'obtiens ,hélas, le même message d'erreur.

Je dois préciser que j'ai parfois rencontré des problèmes de parasites et de lecture (arrêt) lorsque je le faisais travailler en 3.3v.
J'avais mis les arrêts sur le dos des premiers haut-parleurs trop gourmands car ça fonctionne sans problème lorsque je baisse le son.

avez vous décodé le message d'erreur ? (cf l'outil mentionne au post 3)

comment est votre circuit exactement ?
vous avez un lien sur votre module ?

avez vous décodé le message d'erreur ? (cf l'outil mentionne au post 3)

Non, il faudrait que j'installe une version plus ancienne de l'IDE et je n'ai pas eu le courage ce soir.

comment est votre circuit exactement ?



Le 3.3v et le Gnd n'étant pas au même endroit sur ma carte.

vous avez un lien sur votre module ?

https://fr.aliexpress.com/item/1005002673613684.html

comment avez vous repéré les pins sur le DFPlayer ? ils ne disent pas non plus qu'il est OK en 3.3V

Effectivement, Je suis parti du principe que c'était un clone de l'original.

Les pins correspondent exactement en tout cas.

Ok

Faut installer la 1.8.19 et le décodeur d’erreur pour avoir plus d’infos (elle peut être installée à côté de la 2.0)

Avez vous testé les exemples du DFPlayer pour voir si ça fonctionne ?

Je pense qu’il faut tester avec un adaptateur 5V pour la communication Tx DF —> RX ESP et l’alimentation du DFPlayer

je ne sais pas si ça tient compte d'une installation particulière des fichiers

Je crains que si en regardant les exemples de résultats.

Je vais attendre quelques jours.
Un copain va me prêter un esp32 différent.

Qui sait si ça ne va pas mettre en lumière un souci de compatibilité entre mes composants ?

merci :slightly_smiling_face:

vous avez quoi comme ordi ??

pouvez vous poster

  • le code tel que vous le compiler
  • le lien vers les bibliothèques que vous avez installées
  • l'intégralité de ce que vous voyez défiler dans la console

pas sûr quand même de pouvoir reproduire car l'analyse de l'erreur fait référence au code, je ne sais pas si ça tient compte d'une installation particulière des fichiers

et voilà que j'édite mon message précédent au lieu de poster un nouveau... la honte.

je ne sais pas si ça tient compte d'une installation particulière des fichiers

Je crains que si en regardant les exemples de résultats.

Je vais attendre quelques jours.
Un copain va me prêter un esp32 différent.

Qui sait si ça ne va pas mettre en lumière un souci de compatibilité entre mes composants ?

merci :slightly_smiling_face:

la loi de Murphy m'agace un peu.
On vient de me prêter un Esp32. je fais un un ou deux essais et j'ai droit à l'erreur: " A fatal error occurred: MD5 of file does not match data in flash!"
-Recherche internet.
-installation de python.
-installation de Esptool.
-réparation de l'esp. (par injection de " esptool.py write_flash_status --non-volatile 0"
tuto ici :

(je raconte tout ça au cas où on me lise dans le futur)

Bref...
mon code original (celui qu'on trouve partout) ne fonctionne pas mieux sur cet Esp32.
Mais le code proposé par J-M-L au post#8 a fait réagir mon Dfplayer.
un fichier son se lançait mais s'arrêtait au bout d'une seconde.

J'ai du régler le problème " A fatal error occurred: MD5 of file does not match data in flash!" et maintenant le nouvel Esp32 ne réagit pas plus que le l'autre et me donne les mêmes messages d'erreur.

donc : -il y a peu de chance que ce soit le micro-contrôleur.
-j'ai testé plusieurs codes.
-j'ai testé avec plusieurs Dfplayer (qui avaient fonctionné indépendamment de l'Esp)
-j'ai testé deux cartes Sd et des fichiers sons différents. (0001.mp3)
-j'ai testé avec une alimentation séparée pour le Dfplayer
-j'ai changé mes câbles.

voilà, voilà...

Je parlais de l’adaptation de tension du port série de 3.3V à 5V

le Dfplayer fonctionne bien en l'alimentant directement par le 3.3 de l'Esp.
par contre:

Je ne comprend pas, désolé.