DFPlayer Mini - keine Lib funktioniert richtig, oder?

OP (Firma: Q3) #7408348
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?

Gast #7408417
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.

#7408435
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
(Firma: Vescomp) #7408746
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.

(Firma: Vescomp) #7408774
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.

OP (Firma: Q3) #7408776
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 ...

OP (Firma: Q3) #7408782
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 ...

OP (Firma: Q3) #7408789
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 ...

#7408898
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.

Moderator Persönliche Seite #7408957
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.

Gast #7408996
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.

OP (Firma: Q3) #7409278
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.

Gast #7544074
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

Moderator Persönliche Seite #7544610
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".

#7544634
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;
Gast #7544880
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren