ESP32 DFPlayer Mini keine serielle Hardware-kommunikation

Hallo Forum,

ich habe ZWEI ESP32 DEV Boards (von 2 verschiedenen Herstellern) und DREI DFPlayer Mini (zwei davon vom selben und das andere von eine anderen Hersteller) versucht zusammen zu betreiben.
Aus dem angeschlossenen Minilautsprecher kommt nur ein regelmäßiges knattern. Es kommt gar nicht erst zur seriellen Kommunikation.

Ich habe vieles ausprobiert. Meine Vorlage ist dieses Beispiel hier:
Git-ESP32_DFPlayer_full.

Allem voran habe ich das ganze auf einem Arduino Nano ohne Probleme zum Laufen gebracht (allerdings durch Softwareserial, nicht möglich mit dem ESP). Das bedeutet, dass sich das Problem auf den ESP32 eingrenzen lässt.

Ich verwende außerdem Visual Studio Code und darin PlatformIO. Habe die beiden Bibliotheken "DFRobotDFPlayerMini by DFRobot" und "DFPlayer Mini Mp3 by Makuna by Michael C. Miller". ausprobiert. Beides mit demselben Ergebnis. Die serielle Kommunikation kommt nicht zustande.

Das ist der Code, auch aus der Bibliothek auf GitHub - zumindest der Anfang. Fehlerfrei kompiliert. Nach dem Upload auf das Dev Board geht es nicht weiter, als bis in die Schleife mit den Ausgaben "unable to begin:"...

RX-TX und TX-RX samt Widerstand hab ich hundertfach überprüft. Auch eine separate Spannungsversorgung mit 3,3 bzw. 5V habe ich dem DFPlayer zeitweise mal gegönnt. Hat das Problem nicht gelöst.

#include <Arduino.h>
#include "DFRobotDFPlayerMini.h"

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

void setup()
{
  HwSerial.begin(9600, SERIAL_8N1, 16, 17);  // 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(HwSerial)) {  //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);
  }...

Kennt jemand das bzw. ein Problem mit der UART-Schnittstelle und der seriellen Kommunikation?

[EDIT] Habe die overrides in der Header-Datei der Bibliothek auskommentiert. Führt zu neuem Fehler: A fatal error occurred: MD5 of file does not match data in flash!
ICh möchte weiterhin die HW-Serial-Schnittstelle verwenden. Wozu sollte sie sonst da sein? :slight_smile:

Grüße
René

Du kannst den DFPlayer nicht parallel zum seriellen Anschluss betreiben.
Da liegt auch USB drauf. Das beste ist, du verwendest SoftwareSerial für den DFPlayer.
Das wird funktionieren.
Und von welchen Widerständen redest du, die du verwendest ?

Hallo Dieter,

der ESP32 hat 3 UART-Schnittstellen. Ich verwende die, die auch auf dem Board mit TX2 und RX2 beschriftet ist. Im ESP32-Datenblatt entsprechend beschrieben: GPIO16-U2RXD und GPIO17-U2TXD.
Mal abgesehen davon: das Beispiel auf GitHub ist nicht das einzige - und dort funktionieren Hardwareaufbau und Code.
[EDIT] Hier auch ein Video, bei dem das Setup mit HW und SW umgesetzt wird.

Was die Widerstände betrifft, habe ich 2 Varianten ausprobiert: 2k in der Leitung DFPlayer RX - TX ESP32 (AZdelivery-Schematic) und einen 640k Widerstand in derselben Leitung parallel an GND (wie im Beispiel aus der zuvor genannten Bibliothek).

Softwareserial bekomme ich auf dem ESP32 bisher nicht zum Laufen. Das Beispiel swsertest aus der Bibliothek EspSoftwareSerial funktioniert leider nicht. Sobald ich die Bibliothek nur einbinde und kompiliere erhalte ich den Fehler:

...SoftwareSerial.h:165:12: error: 'size_t SoftwareSerial::readBytes(char*, size_t)' marked 'override', but does not override

Gruß René

Dann musst du das auch entsprechend konfigurieren.
Du hast nur Serial verwendet, nicht aber Serial1 bzw Serial2.
Also deinen Sketch musst du schon anpsssen.

Ich habe SoftwareSerial problemlos am ESP32 zum Laufen bekommen.
Kann leider aktuell nicht sagen, welche Lib ich verwende, da ich am Tablet sitze.

Und für den Anschluss zwischen DFPlayer und ESP brauchst du keine Widerstände, beide arbeiten auf der Seriellen mit 3,3V.

Hallo,

ich hatte mal probleme mit DF mini Player in Verbindung mit einem ESP D1 mini , ständiges knacken , aussetzter , hörte sich so an als wenn der Player ständig neu bootet. Es trat nur auf bei größeren Lautstärken auf.

Letztlich die Stromversorgung und Last des Lautsprechers. ich hab dann einen 8 Ohm statt 4 Ohm Lautsprecher genommen und den Player stabil mit 5V versorgt.

Das Problem trat aber auch ohne esp auf , einfach mal laut Anleitung mit eine Verbindung nach GND starten ganz ohne ESP.

Heinz

Hallo Heinz, hallo Dieter,

das Knacken ist ein anderes Problem :slight_smile: Evtl. werde ich das Hardware-Setup nochmal anpassen. Aber zunächst geht es darum den DFPlayer am ESP zum Laufen zu bringen.

Ich habe alle möglichen Varianten mit "Serial" ausprobiert. Die richtige ist m.E. Serial2. Folgender Code führt zum selben Ergebnis, keine Serielle Kommunikation, bleibt also in besagter Schleife hängen.

Die Verbindung RX-TX und TX-RX (mit und ohne Widerstände), separate Spannungsversorgung... All das habe ich ebenfalls probiert.

#include <DFRobotDFPlayerMini.h>
DFRobotDFPlayerMini myDFPlayer;

bool playing = false;

void setup() {
  Serial2.begin(9600, SERIAL_8N1);  //Serial2.begin(9600);
  Serial.begin(115200);
  Serial.println(F("Initializing DFPlayer ... (May take 3~5 seconds)"));
  
  if (!myDFPlayer.begin(Serial2)) {
    Serial.println(F("ERROR")); 
    while(true);
  }
  Serial.println(F("DFPlayer Mini online."));
  myDFPlayer.setTimeOut(500); //Set serial communictaion time out 500ms

  myDFPlayer.volume(10); // von 0 bis 30)
  myDFPlayer.EQ(DFPLAYER_EQ_NORMAL);
}

void loop() {
  if (playing == false){
    myDFPlayer.play(1);
    Serial.print("playing");
    playing = true;
  }
}

Gruß René

Hallo,

dann lass die Scheife doch mal weg um zu sehen ob das senden geht. HotSystems hatte doch geschrieben das er das mit der Softserial hinbekommen hat. Vermutlich musst Du dann aber zwei neutrale andere pins benutzen.
Heinz

Neue Erkenntnis: Habe die Serielle Schnittstelle getestet, funktioniert. Habe auch das selbe Vorgehen beim DFPlayer-Code übernommen - ohne Erfolg.

Zum Test-Code:
Ausgabe auf dem Seriellen Monitor (Serial):
--> Wenn DFPlayer KEINE Spannungsversorgung hat: - Keine Ausgabe -
--> Wenn der DFPlayer Spannungsversorgung hat: Es werden Zahlen geprintet.

Ich vermute also ein Problem mit myDFPlayer.begin(), respektive der Bibliothek DFRobotDFPlayerMini.
Aber wieso sollte das bei anderen Funktionieren, in diesem Fall aber nicht? Ich hatte ja erwähnt, dass ich auch verschiedene Hardware getestet habe. Und mit dem Arduino läufts, der kommt aber nicht infrage.
Habe an stelle von VSCode auch die Arduino IDE ausprobiert, gleiches Ergebnis.

#include <HardwareSerial.h>
HardwareSerial MySerial(1);
void setup() {
    MySerial.begin(9600, SERIAL_8N1, 16, 17);
    Serial.begin(115200);
}
//uint8_t byteFromSerial;
void loop() {
    while (MySerial.available() > 0) {
        uint8_t byteFromSerial = MySerial.read();
        Serial.print(byteFromSerial);
    }
}

[EDIT:] Ohne die Schleife rebootet er immer wieder, Monitor:

Initializing DFPlayer ... (May take 3~5 seconds)
DFPlayer Mini online.
Guru Meditation Error: Core  1 panic'ed (LoadProhibited). Exception was unhandled.
Core 1 register dump:
PC      : 0x400d0e18  PS      : 0x00060130  A0      : 0x800d0e6a  A1      : 0x3ffb1f20  
A2      : 0x3ffbfd08  A3      : 0x3ffbfd25  A4      : 0x3ffb8630  A5      : 0x3ffbfdec  
A6      : 0x00000000  A7      : 0x00000000  A8      : 0x00000000  A9      : 0x0000000a  
A10     : 0x00000000  A11     : 0x3f40134a  A12     : 0x0000000a  A13     : 0x0000ff00  
A14     : 0x00ff0000  A15     : 0xff000000  SAR     : 0x0000001f  EXCCAUSE: 0x0000001c
EXCVADDR: 0x00000000  LBEG    : 0x400e91a8  LEND    : 0x400e91b2  LCOUNT  : 0x00000000  

Backtrace: 0x400d0e18:0x3ffb1f20 0x400d0e67:0x3ffb1f40 0x400d0e8c:0x3ffb1f60 0x400d0ba8:0x3ffb1f80 0x400d1be3:0x3ffb1fb0 0x40087911:0x3ffb1fd0

Rebooting...

Hallo,

dann mach mal einen Widerstand je 1K in die Leitung

Rentner:
Hallo,

dann mach mal einen Widerstand je 1K in die Leitung

Wozu sollen die gut sein ?

Die werden nur eingesetzt, wenn der Controller mit 5Volt arbeitet. Der DFPlayer arbeitet intern mit 3,3Volt.

@TO
Dann kann ich nur vermuten, dass die Library für den DFPlayer nicht mit dem ESP32 kompatibel ist.

Sorry, das hatte ich nicht bedacht, da ich nur die Serielle Schnittstelle betrachtet habe. Und die funktioniert bei mit mit andere Hardware fehlerfrei.

HotSystems:
Wozu sollen die gut sein ?

Die werden nur eingesetzt, wenn der Controller mit 5Volt arbeitet. Der DFPlayer arbeitet intern mit 3,3Volt.

Hallo,

mag sein , ich habe einen DF Player aun einem ESP8266 Wemos D1 , TXD1=D4 auf RX am Player. Damit bootete der Wmos ständig neu beim Zuschalten der Spannung für beide Teile gleichzeitig. Mit dem 1K in der Leitung klappte das. Zugegeben D4 ist beim Wmos schon was besonderes.

auf die Empfanfsrichtung hab ich verzichtet, da es keinen nutzbaren RXD1 gibt. Ich wollte in dem Zusammenhang immer mal die Softserial probieren hat sich aber bisher nicht ergeben. Der Schlaflied-Player für die Enkelin läuft auch so. Busy genutzt.

Heinz

Rentner:
Hallo,

mag sein , ich habe einen DF Player aun einem ESP8266 Wemos D1 , TXD1=D4 auf RX am Player. Damit bootete der Wmos ständig neu beim Zuschalten der Spannung für beide Teile gleichzeitig. Mit dem 1K in der Leitung klappte das. Zugegeben D4 ist beim Wmos schon was besonderes.

auf die Empfanfsrichtung hab ich verzichtet, da es keinen nutzbaren RXD1 gibt. Ich wollte in dem Zusammenhang immer mal die Softserial probieren hat sich aber bisher nicht ergeben. Der Schlaflied-Player für die Enkelin läuft auch so. Busy genutzt.

Heinz

Ok, die 2. Hardware Serielle habe ich noch nicht eingesetzt, da eben nicht komplett.

Allerdings habe ich SoftwareSerial auf dem Wemos, NodeMCU und ESP32 bisher mehrfach problemlos verwendet.
Da kann ich nur wieder mitteilen, wenn Hardware nicht geht dann SoftwareSerial einsetzen.

Nu rwie schon geschrieben, den DFPlayer habe ich am ESP noch nicht verwendet.