Forum: Mikrocontroller und Digitale Elektronik DFPlayer Serial funzt nicht


von Thomas S. (fragsalat)


Lesenswert?

Hey Leute,

ich versuche das DFPlayer mini Modul zum laufen zu bekommen aber 
scheitere kläglich.
Wenn ich am Chip den trigger fürs nächste Lied nutze, spielt ein Lied 
und die LED am Chip leuchtet. Sprich die SD Karte ist drin und der 
Speaker funzt und der Chip hat Strom.
Wenn ich den Beispiel Code nutze schlägt das Initialisieren aber fehl. 
Ich habe auf meinem Arduino Nano Klon schon einige Pins ausprobiert 
(A6+A7, TX1+RX0, D6+D7) und auch mit 1K Widerstand an RX,TX und RX+TX 
aber kein Glück.

Habt ihr ne Idee was ich noch versuchen kann?
Kann mir jemand verraten wie ich messen kann ob der Chip überhaupt die 
serielle Verbindung annimmt? Habs mit nem Multimeter versucht aber 
bekomme auf beiden Pins ca 3V wobei ich dachte nur der TX würde 3V haven 
weil Output und so.

Danke schon mal :)

von Chregu (Gast)


Lesenswert?

Thomas S. schrieb:
> Wenn ich den Beispiel Code nutze

Sehe ich nirgends. Warte, ich geb Dir meinen:
1
#include <SoftwareSerial.h>
2
const byte txPin = 4;
3
const byte rxPin = 5;
4
SoftwareSerial mySerial (rxPin, txPin);
5
int Volume[10] = {0x7E, 0xFF, 0x06, 0x06, 0x00, 0x00, 0x00, 0xFE, 0xF5, 0xEF};
6
const int zero = 0x00;
7
int val = 0;
8
int photo1 = A0;
9
int photo2 = A1;
10
11
void setup() {
12
  pinMode(rxPin, INPUT);
13
  pinMode(txPin, OUTPUT);
14
  // set the data rate for the SoftwareSerial port
15
  mySerial.begin(9600);
16
  Serial.begin(9600);
17
  wiederHolt(1);
18
}
19
20
void loop() {
21
  for (int j = 0; j < 31; j = j + 1) {
22
    delay(500);
23
    setVolume(j);
24
    val = analogRead(photo1);
25
    Serial.print(val);
26
    Serial.print(" ");
27
    val = analogRead(photo2);
28
    Serial.println(val);
29
  }
30
}
31
32
void setVolume(int v){
33
  if (v > 30) {
34
    v = 30;
35
  }
36
      Volume[6] = v;
37
      Volume[8] = 0xF5 - v;
38
  for (byte i = 0; i < 10; i = i + 1) {
39
    mySerial.write(Volume[i]);
40
  }
41
}
42
43
void wiederHolt(int v){
44
  // 7E FF 06 08 00 00 01 FE F2 EF   1. Stück wiederholt abspielen
45
  mySerial.write(0x7E);
46
  mySerial.write(0xFF);
47
  mySerial.write(0x06);
48
  mySerial.write(0x08);
49
  mySerial.write(zero);
50
  mySerial.write(zero);
51
  switch (v) {
52
    case 1:
53
      mySerial.write(0x01);
54
      mySerial.write(0xFE);
55
      mySerial.write(0xF2);
56
      break;
57
    case 2:
58
      mySerial.write(0x02);
59
      mySerial.write(0xFE);
60
      mySerial.write(0xF1);
61
      break;
62
    case 3:
63
      mySerial.write(0x03);
64
      mySerial.write(0xFE);
65
      mySerial.write(0xF0);
66
      break;
67
    default:
68
      mySerial.write(0x04);
69
      mySerial.write(0xFE);
70
      mySerial.write(0xEF);
71
      break;
72
  }
73
  mySerial.write(0xEF);
74
}

Der funzt bei mir. Hier noch die wichtigsten Befehle mit fertig 
berechnetem Checksum:
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

von Thomas S. (fragsalat)


Lesenswert?

Hey,

sorry das ich den code nicht mitgeschickt hab. Es ist aber der Beispiel 
code von der DFPlayer Seite.


Als Serial Pins hatte ich auch schon mehrere versucht. 30 + 31, 32 + 1, 
10 + 11 und 22 + 19. Hab auch die pins mal getauscht und mit und ohne 
1kOhm Widerstand.

Kann man denn i.wie überprüfen ob die serielle Verbindung am Start ist? 
Ich habe mehrfach gelesen, dass Leute kaputte Chips bekommen haben wo 
die Lötstellen kaputt waren oder so. Ich weiß leider nicht wie und wo 
ich da messen muss um das zu prüfen.
1
#include "Arduino.h"
2
#include "SoftwareSerial.h"
3
#include "DFRobotDFPlayerMini.h"
4
5
SoftwareSerial mySoftwareSerial(7, 8); // RX, TX
6
DFRobotDFPlayerMini myDFPlayer;
7
void printDetail(uint8_t type, int value);
8
9
void setup()
10
{
11
  mySoftwareSerial.begin(9600);
12
  Serial.begin(115200);
13
14
  Serial.println();
15
  Serial.println(F("DFRobot DFPlayer Mini Demo"));
16
  Serial.println(F("Initializing DFPlayer ... (May take 3~5 seconds)"));
17
18
  if (!myDFPlayer.begin(mySoftwareSerial)) {  //Use softwareSerial to communicate with mp3.
19
    Serial.println(F("Unable to begin:"));
20
    Serial.println(F("1.Please recheck the connection!"));
21
    Serial.println(F("2.Please insert the SD card!"));
22
    while(true);
23
  }
24
  Serial.println(F("DFPlayer Mini online."));
25
26
  myDFPlayer.volume(10);  //Set volume value. From 0 to 30
27
  myDFPlayer.play(1);  //Play the first mp3
28
}
29
30
void loop()
31
{
32
  static unsigned long timer = millis();
33
34
  if (millis() - timer > 3000) {
35
    timer = millis();
36
    myDFPlayer.next();  //Play next mp3 every 3 second.
37
  }
38
39
  if (myDFPlayer.available()) {
40
    printDetail(myDFPlayer.readType(), myDFPlayer.read()); //Print the detail message from DFPlayer to handle different errors and states.
41
  }
42
}
43
44
void printDetail(uint8_t type, int value){
45
  switch (type) {
46
    case TimeOut:
47
      Serial.println(F("Time Out!"));
48
      break;
49
    case WrongStack:
50
      Serial.println(F("Stack Wrong!"));
51
      break;
52
    case DFPlayerCardInserted:
53
      Serial.println(F("Card Inserted!"));
54
      break;
55
    case DFPlayerCardRemoved:
56
      Serial.println(F("Card Removed!"));
57
      break;
58
    case DFPlayerCardOnline:
59
      Serial.println(F("Card Online!"));
60
      break;
61
    case DFPlayerPlayFinished:
62
      Serial.print(F("Number:"));
63
      Serial.print(value);
64
      Serial.println(F(" Play Finished!"));
65
      break;
66
    case DFPlayerError:
67
      Serial.print(F("DFPlayerError:"));
68
      switch (value) {
69
        case Busy:
70
          Serial.println(F("Card not found"));
71
          break;
72
        case Sleeping:
73
          Serial.println(F("Sleeping"));
74
          break;
75
        case SerialWrongStack:
76
          Serial.println(F("Get Wrong Stack"));
77
          break;
78
        case CheckSumNotMatch:
79
          Serial.println(F("Check Sum Not Match"));
80
          break;
81
        case FileIndexOut:
82
          Serial.println(F("File Index Out of Bound"));
83
          break;
84
        case FileMismatch:
85
          Serial.println(F("Cannot Find File"));
86
          break;
87
        case Advertise:
88
          Serial.println(F("In Advertise"));
89
          break;
90
        default:
91
          break;
92
      }
93
      break;
94
    default:
95
      break;
96
  }
97
}

: Bearbeitet durch User
von Ein Freund (Gast)


Lesenswert?

Schau mal in diesen Thread - das sind alle möglichen Probleme (und deren 
Lösung) besprochen worden:

Beitrag "Projekt fertiggestellt: MP3 Player für Kinder auf ATTiny-Basis"

von Schlaumaier (Gast)


Lesenswert?

vielleicht hilft dir diese Seite.

https://wolles-elektronikkiste.de/dfplayer-mini-ansteuerung-mit-dem-arduino

Man beachte die Pin-Beschreibungs-Tabelle in der Mitte.

Ich habe das Modul auch mal in China bestellt aber leider noch keine 
Zeit gehabt es zu testen/nutzen.

von Astro (Gast)


Lesenswert?

Schau dir am DFPlayer die Lötstelle an Pin 3 (TX) genau an, ob dort eine 
leitende Verbindung zu der Lasche des SD-Kartenlesers existiert. Dann 
kommt aus TX nichts mehr heraus, da das Gehäuse des Lesers auf GND 
liegt.

Der Abstand von Lasche zu Lötstelle ist sehr gering, und das Problem 
entsteht wenn zuviel Lötzinn verwendet wurde. Dies war bei einem meiner 
Boards der Fall, und es hat mich einige Zeit gekostet diese Info in den 
Tiefen des Internets zu finden.

von Thomas S. (fragsalat)


Angehängte Dateien:

Lesenswert?

Astro schrieb:
> Schau dir am DFPlayer die Lötstelle an Pin 3 (TX) genau an

Interessanter Tipp, bei einem der 3 Chips scheint wirklich das Lötzinn 
das Metall zu berühren. Bei dem aktuellen allerdings scheint alles ok zu 
sein wie man eventuell den Bildern entnehmen kann.

Ein Freund schrieb:
> Schau mal in diesen Thread

Heilige Makrele, da sind 500 Beiträge in dem Thema o.O Ich guck mal ob 
ich per Suche was finde. Lesen kann man das alles nicht.

Schlaumaier schrieb:
> vielleicht hilft dir diese Seite.

Die Seite kenne ich schon. Danke trotzdem :)


Ich habe auch mal mein Breadboard fotografiert. Ich nutze im Code die 
Pins RX 10 und TX 11

Ist da irgendein Fehler drin der mir einfach nicht bewusst wird?

von Thomas S. (fragsalat)


Lesenswert?

Ich habe jetzt auch mal ein ESP32 Modul mit HardwareSerial genommen um 
zu prüfen ob es am Arduino lag, jedoch ohne Erfolg. Ich kann leider 
immer noch nicht sagen ob ich die serielle Verbindung richtig 
hergestellt habe und ob sie wirklich funktioniert aber ich nehme die 
Pins laut esp32 pinout G17 und G16 welche UART 2 sein sollten. Die LED 
am DFPlayer leuchtet leicht kontinuierlich .

von Chregu (Gast)


Lesenswert?

Thomas S. schrieb:
> Ich nutze im Code die
> Pins RX 10 und TX 11

Im Bild aber 6 und 7, dass kann ja nicht gehen!
Ausserdem hast Du den RX vom Modul nicht verbunden, dass geht auch 
nicht!

Versuch erst mal mit einem Terminal-Programm direkt mit dem Rechner zu 
senden, z.B. mit HTerm, da kannst Du die HEX-Sequenzen direkt senden und 
sehen, ob etwas passiert. Mit irgendeinem FT232 Board siehst Du dann 
auch die LEDs blinken - oder eben nicht...

Mit dem Nano dazwischen hast DU zuviele Baustellen, kannst das Problem 
nicht gut eingrenzen.

von Chregu (Gast)


Lesenswert?

Nachtrag: TX geht auf RX, und umgekehrt, das ist Dir schon klar, oder?!

von Thomas S. (fragsalat)


Lesenswert?

OMFG, ich raste aus. Ich bin nach den Pins gegangen und nicht nach DX 
oder AX omg. Sprich der 10te Pin ist D6 und der 11te D7. Ich habe 10 und 
11 anstatt 6 und 7 genutzt. Funzt jetzt :D
Ich hasse mich grade selber für diese Dummheit.

Danke fürs Aufklären <3

: Bearbeitet durch User
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.