Forum: Mikrocontroller und Digitale Elektronik DFPlayer Mini - keine Lib funktioniert richtig, oder?


von Frank E. (Firma: Q3) (qualidat)


Lesenswert?

Für eine wechselnde Ansage in einem Museums-Projekt will ich den 
DFPlayer Mini verwenden. Dafür gibt es mind. 6 verschieden Libs, 
auswählbar und installierbar direkt aus der Arduino-IDE ...

Nach Datenblatt soll die verwendete SD-Karte (FAT32) mindestens einen 
Ordner mit dem Namen "01" haben und/oder einen Ordner "MP3" ... die 
Dateien darin heissen 0001.mp3, 0002.mp3 usw. Zusätzlich habe ich noch 
meine 9 Files einfach in das Rootverzeichnis kopiert.

Langer Rede kurzer Sinn, ausser dem Befehl player.next() bzw. 
player.playNext() (heisst je nach Lib etwas anders) funktioniert quasi 
kein einziges der verfügbaren Kommandos.

Kein einziger Befehl, um ein File direkt "anzuspringen", wie z.B. 
player.play(1,1) - soll das Abspielen von Datei 0001.mp3 im Ordner 01 
bewirken. Auch player.playFromMP3(3) - soll File 0003.mp3 aus dem 
"Sonderverzeichnis" MP3 abslielen ... NICHTS!

Selbst das Kommando player.volume(20) bewirkt, dass jede Datei nur noch 
mit einem extrem kurzen Zischlaut "wiedergegeben" wird. In Verbindung 
mit dem Komando player.next... wird es bestenfalls ignoriert. Es wird 
immer mit maximaler Lautstärke wiedergegeben. Es ist auch völlig egal, 
ob das Volumen-Kommando vor oder nach dem Play-Befehl steht.

Ich habe einen kleinen 8-Ohm-Lautsprecher dran, für Testzwecke noch mit 
10 Ohm Vorwiderstand, damit es mich auf dem Schreibtisch nicht so 
anbrüllt und um evtl. Fehler über die Stromversorgung (aus USB, parallel 
zum Arduno Nano) zu minimieren.

Ich glaube ja nicht, dass all die Autoren der Libs alle blöd sind, aber 
ich finde die Ursache des Problems nicht. Notfalls verzichte ich auf die 
Libs und verpacke die par Befehlsbytes selber, aber man muss ja das 
Fahrrad nicht jedesmal neu erfinden.

Die Verkabelung (z.B. 2x Ground am DF), RS232 ... alles dutzendfach 
geprüft, kein Fehler. Mehrere SD-Karten probiert, in FAT16 und FAT32 ... 
macht keinen Unterschied.

Was könnte die Ursache für dieses Verhalten sein?

: Bearbeitet durch User
von Stefan F. (Gast)


Lesenswert?

Frank E. schrieb:
> Ich glaube ja nicht, dass all die Autoren der Libs alle blöd sind, aber
> ich finde die Ursache des Problems nicht.

Das Hauptproblem ist, dass immer wieder andere Produkte unter dem Namen 
"DFPlayer" verkauft werden. Da kaufst du eine Katze im Sack. Man kann 
sich nicht einmal anhand von Fotos orientieren, weil die Firmware darauf 
nicht immer gleich ist.

von Christian M. (christian_m280)


Lesenswert?

Frank E. schrieb:
> RS232

Das ist ja schon mal falsch!

Eben weil

Stefan F. schrieb:
> immer wieder andere Produkte unter dem Namen "DFPlayer" verkauft werden.

habe ich das direkt an einen FT232 angeschlossen und die Kommandos 
selber geschickt, bis es funktioniert hat. Dann weiss man was läuft! Und 
Checksumme nicht vergessen!

Ich habe glaube ich habe sogar 68R vor dem Lautsprecher, sonst stürzt 
mir das Teil ab...

Gruss Chregu

Edit: PS: Hier meine verwendeten Befehle:
1
7E FF 06 03 00 00 01 FE F7 EF   1. Stück abspielen
2
7E FF 06 03 00 00 02 FE F6 EF   2. Stück abspielen
3
4
                     ^^ ^^
5
Checksum: 0x1000-
6
  (^^+^^+^^+^^+^^+^^)
7
8
7E FF 06 03 00 00 03 FE F5 EF   3. Stück abspielen
9
7E FF 06 03 00 00 04 FE F4 EF   4. Stück abspielen
10
11
7E FF 06 08 00 00 01 FE F2 EF   1. Stück wiederholt abspielen
12
7E FF 06 08 00 00 02 FE F1 EF   2. Stück wiederholt abspielen
13
7E FF 06 08 00 00 03 FE F0 EF   3. Stück wiederholt abspielen
14
7E FF 06 08 00 00 04 FE EF EF   4. Stück wiederholt abspielen
15
16
7E FF 06 06 00 00 1E FE D7 EF   Volume 30
17
7E FF 06 06 00 00 1D FE D8 EF   Volume 29
18
7E FF 06 06 00 00 1C FE D9 EF   Volume 28
19
7E FF 06 06 00 00 1B FE DA EF   Volume 27
20
7E FF 06 06 00 00 1A FE DB EF   Volume 26
21
7E FF 06 06 00 00 19 FE DC EF   Volume 25
22
7E FF 06 06 00 00 18 FE DD EF   Volume 24
23
7E FF 06 06 00 00 17 FE DE EF   Volume 23
24
7E FF 06 06 00 00 16 FE DF EF   Volume 22
25
7E FF 06 06 00 00 15 FE E0 EF   Volume 21
26
7E FF 06 06 00 00 14 FE E1 EF   Volume 20
27
7E FF 06 06 00 00 13 FE E2 EF   Volume 19
28
7E FF 06 06 00 00 12 FE E3 EF   Volume 18
29
7E FF 06 06 00 00 11 FE E4 EF   Volume 17
30
7E FF 06 06 00 00 10 FE E5 EF   Volume 16
31
7E FF 06 06 00 00 0F FE E6 EF   Volume 15
32
7E FF 06 06 00 00 0E FE E7 EF   Volume 14
33
7E FF 06 06 00 00 0D FE E8 EF   Volume 13
34
7E FF 06 06 00 00 0C FE E9 EF   Volume 12
35
7E FF 06 06 00 00 0B FE EA EF   Volume 11
36
7E FF 06 06 00 00 0A FE EB EF   Volume 10
37
7E FF 06 06 00 00 09 FE EC EF   Volume 09
38
7E FF 06 06 00 00 08 FE ED EF   Volume 08
39
7E FF 06 06 00 00 07 FE EE EF   Volume 07
40
7E FF 06 06 00 00 06 FE EF EF   Volume 06
41
7E FF 06 06 00 00 05 FE F0 EF   Volume 05
42
7E FF 06 06 00 00 04 FE F1 EF   Volume 04
43
7E FF 06 06 00 00 03 FE F2 EF   Volume 03
44
7E FF 06 06 00 00 02 FE F3 EF   Volume 02
45
7E FF 06 06 00 00 01 FE F4 EF   Volume 01
46
7E FF 06 06 00 00 00 FE F5 EF   Volume 00
47
48
7E FF 06 16 00 00 00 FE E5 EF   Stop Playback

: Bearbeitet durch User
von Falk B. (falk)


Lesenswert?

Frank E. schrieb:
> Was könnte die Ursache für dieses Verhalten sein?

Zeig uns einen VOLLSTÄNDIGEN Schaltplan und ein paar Bilder vom Aufabu.

von Al. K. (alterknacker)


Lesenswert?

Stefan F. schrieb:
> weil die Firmware darauf
> nicht immer gleich ist.

..habe ich bisher noch nicht bemerkt, habe aber auch nicht ALLE Befehle 
immer getestet.
Abstürze werden  vermieden wenn ein Abblockkondensator direkt an GND und 
Uv

angeschlossen ist.

Ein kleines Testprogramm ohne MP3 Lib ist schnell gemacht.


MfG
alterknacker

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Frank E. schrieb:
> Die Verkabelung (z.B. 2x Ground am DF), RS232 ... alles dutzendfach
> geprüft, kein Fehler.
Was meinst du mit RS232?
DFPlayer verträgt 3.3V max. an Rx.

Frank E. schrieb:
> die Dateien darin heissen 0001.mp3, 0002.mp3 usw.
Muss nicht sein.
Nur die ersten 4 zeichen werden geprüft.
Also, "0004.mp3" und "0004MySong.mp3" ist genau dasselbe.

P.S.
Und nicht der Name ist wichtig, sondern die Reihenfolge beim
kopieren auf SD-card.

: Bearbeitet durch User
von Falk B. (falk)


Lesenswert?

Marc V. schrieb:
> P.S.
> Und nicht der Name ist wichtig, sondern die Reihenfolge beim
> kopieren auf SD-card.

Jaja, sagt der Oberexperte . . .
Kleiner Tipp. Es soll Leute geben, die ein FAT gescheit lesen können und 
keine vermurksten Amateuerlösungen zu Stande bringen.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Falk B. schrieb:
> Jaja, sagt der Oberexperte . . .
Das du neidisch auf klügere bist, verstehe ich vollkommen...

> Kleiner Tipp. Es soll Leute geben, die ein FAT gescheit lesen können und
> keine vermurksten Amateuerlösungen zu Stande bringen.
Kleiner Tipp:
Kluge Leute, wenn sie schon keine Ahnung haben, melden sich erst gar 
nicht.
Noch klügere, wenn sie schon nicht mit diesem IC gearbeitet haben,
lesen erst das DaBla.

Für solche, die nicht lesen können, hier ein Auszug aus DaBla:
Here it works according to physical sequence when you copy the files
from computer to SD card or USB flash drive.
For example, when the module receives a command to play the track
0001.mp3, it will play the 1st track you copied from computer,
probably 0001.mp3 or not (maybe it would play 0007.mp3 if it was
the first one you copied from computer).

Und jetzt ab in die Ecke und melde dich nicht wenn du keine Ahnung hast.

: Bearbeitet durch User
von Frank E. (Firma: Q3) (qualidat)


Lesenswert?

Marc V. schrieb:
> Und jetzt ab in die Ecke und melde dich nicht wenn du keine Ahnung hast.

Ich habe die Files in der richtigen physischen Reihenfolge kopiert, 
bezüglich des jeweilgen Ordners. In meinem Post geht es übrigens nicht 
mal darum, dass die nicht in der richtigen Reihenfolge gespielt werden, 
sondern ausser mit player.next(), überhaupt nicht ...

von Frank E. (Firma: Q3) (qualidat)


Lesenswert?

Marc V. schrieb:
> Frank E. schrieb:
>> Die Verkabelung (z.B. 2x Ground am DF), RS232 ... alles dutzendfach
>> geprüft, kein Fehler.
> Was meinst du mit RS232?
> DFPlayer verträgt 3.3V max. an Rx.

Sorry, da habe ich meine Zweifel, mir war so, von 3,3...5V gelesen zu 
haben.

Der CHip enthält ja auch einen Class-D-Verstärker, der 2,5...3W an 8 Ohm 
liefern soll. Der Chip hat keine 2 Vcc-Anschlüsse. Mit 3,3 statt 5V 
stelle ich mir das etwas schwierig vor.

Aber ich sehe natürlich nochmal nach ...

von Marc V. (Firma: Vescomp) (logarithmus)


Angehängte Dateien:

Lesenswert?

Frank E. schrieb:
> In meinem Post geht es übrigens nicht
> mal darum, dass die nicht in der richtigen Reihenfolge gespielt werden,
> sondern ausser mit player.next(), überhaupt nicht ...

Und was genau hast du mit RS232 gemeint?
RS232 schreibt +/-12V vor.
DFPlayer verträgt aber maximal 3.3V am Rx.

Hier:

: Bearbeitet durch User
von Frank E. (Firma: Q3) (qualidat)


Lesenswert?

Marc V. schrieb:
> Frank E. schrieb:
>> In meinem Post geht es übrigens nicht
>> mal darum, dass die nicht in der richtigen Reihenfolge gespielt werden,
>> sondern ausser mit player.next(), überhaupt nicht ...
>
> Und was genau hast du mit RS232 gemeint?
> RS232 schreibt +/-12V vor.
> DFPlayer verträgt aber maximal 3.3V am Rx.

Das Protokoll heisst schon RS232. Die konkrete Ausführung, die du 
meinst, ist V24 (wegen der Spannungsdifferenz +-12V). RS232 geht auch 
mit TTL-Pegel ...

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Frank E. schrieb:
> Das Protokoll heisst schon RS232.
RS232 ist kein Protokoll.

> RS232 geht auch mit TTL-Pegel ...
Ja, nur heißt es dann üblicherweise nicht RS232, sondern Serielle
Schnittstelle, UART oder USART.
RS232 ist für positive/negative Pegel vorgesehen.

P.S.
Und Signalpegel zwischen −3 V und +3 V gelten als undefiniert.

: Bearbeitet durch User
von Rainer W. (rawi)


Lesenswert?

Frank E. schrieb:
> Das Protokoll heisst schon RS232.

Nein. Außerdem sind bei RS232 die Signale gegenüber UART invertiert.

von Vanye R. (vanye_rijan)


Lesenswert?

> Das Protokoll heisst schon RS232.

Nein heisst es nicht. Vergleich auch mal mit RS485 oder RS422.

Allerdings hat es sich irgendwie eingebuergert weil RS232 in
Bastlerkreisen am verbreitesten ist und asyncrone serielle Uebertragung
so unangenehm nach Streber klingt. :)

Vanye

von Falk B. (falk)


Lesenswert?

https://wiki.dfrobot.com/DFPlayer_Mini_SKU_DFR0299

Das Ding will eine UART SIgnal haben, das 3,3V hat. Also sowas, wie es 
aus einem FTDI232 oder ähnlichem kommt. Oder einem Arduino. Der läuft 
zwar meist mit 5V, da scheint die Kiste aber zu vertragen.

"NOTE: The order you copy the mp3 into micro SD card will affect the 
order mp3 played , which means play(1) function will play the first mp3 
copied into micro SD card. "

Ohje! Noch welche, die nicht gescheit programmieren können oder wollen.
Möglicherweise verschluckt sich die schlaffe Software an der vorhandenen 
FAT. Versuch mal die SD-Karte komplett zu formatieren und dann ein paar 
Dateien neu draufzukopieren. Also erst Verzeichnis MP3 anlegen und dann 
die Dateien reinkopieren.

von Falk B. (falk)


Lesenswert?


von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Frank E. schrieb:
> Ich glaube ja nicht, dass all die Autoren der Libs alle blöd sind,

Es gibt von den DFPlayern verschiedene Firmwareversionen. Am besten 
liest Du mal die Firmware-Version aus, dafür gibt es einen gesonderten 
Befehl. Dann ist man schon mal einen Schritt weiter. Einige 
Firmawreversionen können nämlich nur platt vorliegende Dateien, andere 
beherrschen Ordnerstrukturen, andere können nur Dateien im Format 8.3, 
andere können nur Hochzähldateien. Typisch chinesisches Chaos halt.

Hinzu kommt, dass es im Netz genauso viel voneinander abweichende 
Dokumentationen zu der DFPlayer-Software gibt.

Verschlimmert wird die Situation dadurch, dass bestimmte 
Firmware-Versionen auch noch Bugs haben, die sich nur durch 
Drumherumprogrammieren lösen lassen. Ich kenne da zum Beispiel einen 
Kandidaten, dem man einen ganz bestimmten Befehl exakt zweimal schicken 
muss, damit er dann funktioniert. Andere Firmawareversionen allerdings 
reagieren darauf allergisch.

> Dafür gibt es mind. 6 verschieden Libs

Gehe mal davon aus, dass die 6 verschiedenen Libs auch 6 verschiedene 
Firmware-Versionen abfackeln. Es ist also nicht einfach, die für Dich 
passende zu finden - falls es die gibt.

> Notfalls verzichte ich auf die Libs und verpacke die par Befehlsbytes
> selber

Jepp.

von Armin K. (-donald-) Benutzerseite


Lesenswert?

Marc V. schrieb:
> Hier:

Excel verwenden um Schaltplan zu zeichnen finde ich Oberklasse...

von Chris (Gast)


Lesenswert?

Keine Ahnung, was du falsch machst. Ich habe eine zufällige Bibliothek 
genommen, die mich ansprach. Dazu irgendein Board vom Chinesen. Die 
Beachaltung gemäß Vorgabe. SD Karte gemäß Vorgabe. Funktionierte auf 
Anhieb und läuft seit Jahren.

von Marc V. (Firma: Vescomp) (logarithmus)


Angehängte Dateien:

Lesenswert?

Armin K. schrieb:
> Marc V. schrieb:
>> Hier:
>
> Excel verwenden um Schaltplan zu zeichnen finde ich Oberklasse...

Noch ein Klugscheißer?
Hier noch einmal, nur für dich.
Du verstehst natürlich sofort um was es da geht?

: Bearbeitet durch User
von Falk B. (falk)


Lesenswert?

Chris K. schrieb:
> Keine Ahnung, was du falsch machst. Ich habe eine zufällige Bibliothek
> genommen, die mich ansprach. Dazu irgendein Board vom Chinesen. Die
> Beachaltung gemäß Vorgabe. SD Karte gemäß Vorgabe. Funktionierte auf
> Anhieb und läuft seit Jahren.

Toll, das hilft dem OP ungemein weiter! Danke für deinen wertvollen 
Beitrag!

von Frank E. (Firma: Q3) (qualidat)


Lesenswert?

Vielen Dank bis hierher. Im konkreten Projekt (was mal wieder gaaanz 
eilig ist), komme ich mit dem Befehl player.next() erstmal hin, weil die 
Ansagen tatsächlich pseudo-zufällig sein dürfen.

Aber in ca. 3 Wochen brauche ich die gezielte Auswahl von Files ...

Firmware-Version (falls der Befehl akzeptiert wird) versuche ich 
auszulesen und hier reinzuschreiben.

von Lutz (lutz1966)


Lesenswert?

Hallo,

zu der Aussage das bestimmte Firmware Versionen Bugs haben weil man 
jedes Kommando 2 x senden muss für die korrekte Antwort.
ich weiß nicht mit welcher Library das getestet wurde und ob da 
vielleicht wirklich ein Firmware Bug vorliegt, aber für die 
"DFRobotDFPlayerMini" library hatte ich auch das Phänomen und es lag 
nicht am DFplayer, es lag an einem Bug in der Library

Grund ist, das der Chip "AA20HFJ648" und auch andere ein Acknowledge 
senden, das kann man mit "mp3Player.begin(SoftwareSerial,false,true);" 
auch abstellen, das false ist für ack das true für reset

Die library arbeitet aber an der Stelle nicht korrekt, weil nicht auf 
das Ack gewartet wird, stattdesssen wir beim nächsten Befehl gewartet 
bis alles gesendet ist, hier läuft es dann wild durcheinander weil mal 
timeout und mal die Antwort abgeholt werden.

Ich habe hier eine Korrektur hochgeladen
https://github.com/DFRobot/DFRobotDFPlayerMini/issues/55

und hier noch eine kurze Beschreibung der Änderungen
https://forum.arduino.cc/t/dfplayer-mini-library-dfrobotdfplayermini/1193601

: Bearbeitet durch User
von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Lutz schrieb:
> zu der Aussage das bestimmte Firmware Versionen Bugs haben

Hier ein Bug, der speziell in der DFPLayer-Version 0x0005 auftritt: Der 
DFPlayer sendet hier seine Finished-Meldung zweimal, was dazu führt, 
dass die Anwendung meint, der nächste Track wäre schon vorbei, bevor er 
eigentlich abgespielt wurde.

Den Bug kann man vermeiden, indem man, wenn die Version 0x0005 vorliegt, 
jede zweite Finished-Meldung ignoriert.

Nachzulesen in 
https://github.com/ukw100/wordclock24h/blob/main/src/dfplayer/dfplayer.c, 
suche dort nach "version 0x0005".

von Crazy Harry (crazy_h)


Lesenswert?

Das soll jetzt kein Arduino-Gemecker werden, aber so ist das, wenn man 
sich auf Libs verläßt, anstatt selber ein bisschen nachzudenken. Die 
paar Bytes kann man doch selber ohne Lib senden oder?
1
// $7E=Start, $03=Länge ohne Start/Stop, $01=Befehl, $02=CheckSum, $EF=Stop
2
  // CheckSum= $03 XOR $01 XOR $02
3
  MP3CMD             : Array[0..10, 0..4] of Byte = (($7E, $03, $01, $02, $EF), //  0 Play
4
                                                     ($7E, $03, $02, $01, $EF), //  1 Pause
5
                                                     ($7E, $03, $03, $00, $EF), //  2 Next song
6
                                                     ($7E, $03, $04, $07, $EF), //  3 On song
7
                                                     ($7E, $03, $05, $06, $EF), //  4 Volume +
8
                                                     ($7E, $03, $06, $05, $EF), //  5 Volume -
9
                                                     ($7E, $03, $07, $04, $EF), //  6 Standby/normal
10
                                                     ($7E, $03, $09, $0A, $EF), //  7 Reset
11
                                                     ($7E, $03, $0A, $09, $EF), //  8 Fast forward
12
                                                     ($7E, $03, $0B, $08, $EF), //  9 Rewind
13
                                                     ($7E, $03, $0E, $0D, $EF));// 10 Stop
14
  // wie oben, aber + 2 Bytes Parameter
15
  MP3Track           : Array[11..13,0..6] of Byte = (($7E, $05, $41, $00, $01, $45, $EF), // Track001
16
                                                     ($7E, $05, $41, $00, $02, $46, $EF), // Track002
17
                                                     ($7E, $05, $41, $00, $03, $47, $EF));// Track003
18
19
Procedure SetMP3Command(CMD:Byte);
20
  Begin
21
    If CMD in [0..10]
22
      then
23
        SerOutBlock_P(USARTE1,@MP3CMD[CMD,0],5);
24
      elsif
25
        CMD in [11..13]
26
          then
27
            SerOutBlock_P(USARTE1,@MP3Track[CMD,0],7);
28
      EndIf;
29
  End SetMP3Command;
30
31
32
Procedure SetMP3Volume(Volume:Byte);
33
  Var CheckSum : LongWord;
34
  Begin
35
    CheckSum:=0;
36
    If Volume in [0..30]
37
      then
38
        MP3Volume[0]:=$7E;
39
        MP3Volume[1]:=$04;
40
        MP3Volume[2]:=$31;
41
        MP3Volume[5]:=$EF;
42
        MP3Volume[3]:=Volume;
43
        CheckSum:=LongWord(MP3Volume[1]) Xor LongWord(MP3Volume[2]) Xor LongWord(MP3Volume[3]);
44
        MP3Volume[4]:=Lo(CheckSum);
45
        SerOutBlock_P(USARTE1,@MP3Volume[0],6);
46
      EndIf;
47
  End SetMP3Volume;

von Steve van de Grens (roehrmond)


Lesenswert?

Crazy H. schrieb:
> Die paar Bytes kann man doch selber ohne Lib senden oder

Sollte man meinen, ja. Allerdings fürchte ich, dass die 
Haupt-Intelligenz der guten Bibliotheken darin besteht, Workarounds für 
die unterschiedlichen DfPlayer Versionen zu enthalten.

Kennt noch jemand jquery? Ist ein ähnliches Thema.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.