DFPlayer Mini Ansteuerung mit dem Arduino

Über den Beitrag

Nachdem ich in meinem letzten Beitrag über das MP3-Player Modul YX5300 geschrieben habe, möchte ich mich der DFPlayer Mini Ansteuerung mit dem Arduino widmen.

  • Technische Daten und Pinbelegung
  • Dateistruktur der SD-Karte
  • Schaltung bei serieller Ansteuerung mit Arduino
  • Die DFRobotDFPlayerMini Bibliothek
  • Ein eigener Sketch mit Menüführung
  • Ansteuerung über Taster
  • DFPlayer Mini vs. YX5300 Modul
DFPlayer Mini: Foto der Vorder- und Rückseite
Klein aber oho, der DFPlayer Mini

Technische Daten / Eigenschaften des DFPlayer Mini

Übersicht

Der DFPlayer Mini ist für 5-10 Euro bei Amazon oder anderen Onlineshops erhältlich. Sehr beeindruckend ist die geringe Größe des Moduls, denn es ist kaum größer als der Micro SD-Kartenslot. Nicht weniger beeindruckend finde ich, dass dabei auch noch ein Verstärker auf dem Teil Platz findet, so dass man Lautsprecher bis 3 Watt direkt anschließen kann. Ein Datenblatt zum DFPlayer Mini findet man im Netz z.B. hier. Hier ein paar Basisdaten:

Spannungsversorgung 3.2 – 5.0 V
Stromaufnahme (Standby)~ 20 mA
Unterstützte DateitypenMP3 und WAV
Unterstützte SD-KartenMicro SD(HC) bis 32 GB
DateiformatFAT16 / FAT 32
Kommunikation Seriell RX/TX, Baudrate: 9600
USB-PortUSB 2.0 (Flashdrive / PC)
Audio AusgängeLautsprecher – bis 3W (Verstärker on Board)
DAC (für Kopfhörer oder Verstärker)

Das Anschlusschema

Pinbelegung des DFPlayer Mini
Anschlusschema des DFPlayer Mini
Bedeutung der Anschlüsse des DFPlayer Mini

Zu beachten ist, dass man vor den RX Eingang einen 1 kOhm Widerstand setzen muss, sonst produziert man ein sehr unschönes, lautes Brummen. 

Die Adkeyx und IOx Anschlüsse sind eine ziemlich geniale Einrichtung, die es einem erlaubt, den DFPlayer Mini weitgehend mit Tastern zu steuern. Dazu weiter unten mehr. 

Verzeichnis- und Dateistruktur auf der SD-Karte

Der DFPlayer Mini erwartet die Verzeichnis- und Dateinamen in einem bestimmten Format. Die Regeln für die Dateinamensgebung und die maximale Anzahl der Dateien pro Verzeichnis hängen von der Art des Verzeichnisses ab. 

Hinweis: Wenn es Probleme mit der SD-Karte gibt, dann prüft ob ihr dort mehrere Partitionen habt. Manchmal ist auf der SD-Karte eine kleine Bootpartition vorhanden, die Probleme machen kann. Wie man das Problem beseitigt, habe ich in meinem letzten Beitrag beschrieben.  

1. Hauptverzeichnis

Im Hauptverzeichnis der SD-Karte finden bis zu 3000 wav- oder mp3-Dateien Platz. Sie müssen als 0001.mp3 (bzw. 0001.wav), 0002.mp3 …. 3000.mp3 benannt werden. Hier gibt es allerdings das kuriose Problem, dass die Dateien in exakt der Reihenfolge ihrer Namen aufkopiert werden müssen. Sagt man dem Modul es soll 0001.mp3 abspielen, aber 0007.mp3 wurde zuerst aufkopiert, dann wird 0007.mp3 gespielt. Ich persönlich würde davon absehen Dateien ins Hauptverzeichnis zu kopieren. Andere Verzeichnisse haben das Problem nicht. 

2. Standardverzeichnisse

Man darf 99 Standardverzeichnisse erstellen, die nach dem Schema 01, 02, 03 …. 99 benannt werden müssen. In jedes Verzeichnis passen bis zu 3000 Dateien, allerdings lassen sich nur die ersten 255 direkt über die seriellen Kommandos ansprechen. Das heißt, dass ein Kommando wie „spiel Datei Nummer 627“ in den Standardverzeichnissen nicht möglich ist und man sich mit „next“-Anweisungen durchhangeln müsste. Die Dateinamen müssen die Struktur 001xxxxx.mp3 (bzw. wav), 002xxxxx.mp3, ….. 255xxxxx.mp3 haben. Dabei ist „xxxxx“ frei wählbar und kann mehr als die hier angedeuteten 5 Stellen haben. Auch Leerzeichen sind erlaubt. 

3. Sonderverzeichnis „MP3“

Dieses Verzeichnis muss exakt als „MP3“ benannt werden.  Hier passen bis zu 3000 Dateien mit dem Namensschema 0001.mp3 (bzw. wav), 0002.mp3, ….. 3000.mp3 hinein. Im Gegensatz zum Hauptverzeichnis sind alle Dateien direkt ansprechbar und es gibt auch keine Probleme mit der Reihenfolge. 

4. Sonderverzeichnis „ADVERT“

Es gelten dieselben Regeln wie für das MP3 Verzeichnis. Das ADVERT Verzeichnis hat eine besondere Funktion. Spielt man eine Datei aus einem der anderen Verzeichnisse ab und ruft währenddessen eine Datei aus dem ADVERT Verzeichnis auf, so wird das Abspielen der ursprünglichen Datei lediglich unterbrochen. Nach dem Beenden der ADVERT Einspielung wird das ursprüngliche Stück fortgesetzt. Es ist wie eine Werbeeinblendung und so deutet es der Name des Verzeichnisses ja auch schon an.

Die Schaltung für den seriellen Betrieb

Die Schaltung für den Betrieb über die serielle Schnittstelle ist relativ einfach. Zu beachten ist, dass man vor den RX Eingang des DFPlayer Moduls einen 1 kOhm Widerstand setzt.

Hinweis: Bei meiner Schaltung versorge ich den DFPlayer mit Strom vom Arduino. Bei Verwendung größerer Lautsprecher bis hin zu den max. 3 Watt sollte man den Gesamtstromverbrauch des Arduino im Auge behalten und 500 mA nicht überschreiten.  

Fritzing: DFPlayer Mini Ansteuerung mit dem Arduino - Schaltung auf dem Breadboard
DFPlayer Mini Ansteuerung mit dem Arduino – Schaltung
Photo: DFPlayer Mini Ansteuerung mit dem Arduino - Schaltung auf dem Breadboard
Und so sieht die Schaltung auf dem Breadboard aus

Ansteuerung über die Bibliothek
DFRobotDFPlayerMini

Die DFPlayer Mini Ansteuerung mit dem Arduino ist nicht schwer, da es eine Reihe von Bibliotheken auf Github gibt. Ich nutze die DFRobotDFPlayerMini Bibliothek, was aber nicht heißt, dass die anderen schlecht sind. Ich habe sie schlicht zuerst probiert und bin dabei geblieben. 

Wie üblich installiert man die Bibliothek indem man die Zip-Datei herunterlädt und im „Arduino\libraries“ Ordner entpackt. Der mitgelieferte Beispielsketch „FullFunction.ino“ gibt einen guten Überblick über alle Funktionen. Ich habe ihn ein wenig modifiziert, so dass man die Kommandos über den seriellen Monitor aufrufen kann. Hier ist das Ergebnis:

/***************************************************
 Durch Wolfgang Ewald modifizierte Version des FullFunction.ino Beispielsketches der DFRobotDFPlayerMini Bibliothek:
 
 DFPlayer - A Mini MP3 Player For Arduino
 <https://www.dfrobot.com/product-1121.html>
 
 ***************************************************
 This example shows the all the function of library for DFPlayer.
 
 Created 2016-12-07
 By [Angelo qiao](Angelo.qiao@dfrobot.com)
 
 GNU Lesser General Public License.
 See <http://www.gnu.org/licenses/> for details.
 All above must be included in any redistribution
 ****************************************************/

/***********Notice and Trouble shooting***************
 1.Connection and Diagram can be found here
<https://www.dfrobot.com/wiki/index.php/DFPlayer_Mini_SKU:DFR0299#Connection_Diagram>
 2.This code is tested on Arduino Uno, Leonardo, Mega boards.
 ****************************************************/

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

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

void setup()
{
  mySoftwareSerial.begin(9600);
  Serial.begin(9600);
  
  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."));
  printHelp();
  
  myDFPlayer.setTimeOut(500); //Set serial communictaion time out 500ms
  
  //----Set volume----
  myDFPlayer.volume(10);  //Set volume value (0~30).
 // myDFPlayer.volumeUp(); //Volume Up
 // myDFPlayer.volumeDown(); //Volume Down
  
  //----Set different EQ----
  myDFPlayer.EQ(DFPLAYER_EQ_NORMAL);
//  myDFPlayer.EQ(DFPLAYER_EQ_POP);
//  myDFPlayer.EQ(DFPLAYER_EQ_ROCK);
//  myDFPlayer.EQ(DFPLAYER_EQ_JAZZ);
//  myDFPlayer.EQ(DFPLAYER_EQ_CLASSIC);
//  myDFPlayer.EQ(DFPLAYER_EQ_BASS);
  
  //----Set device we use SD as default----
//  myDFPlayer.outputDevice(DFPLAYER_DEVICE_U_DISK);
  myDFPlayer.outputDevice(DFPLAYER_DEVICE_SD);
//  myDFPlayer.outputDevice(DFPLAYER_DEVICE_AUX);
//  myDFPlayer.outputDevice(DFPLAYER_DEVICE_SLEEP);
//  myDFPlayer.outputDevice(DFPLAYER_DEVICE_FLASH);
  
  //----Mp3 control----
//  myDFPlayer.sleep();     //sleep
//  myDFPlayer.reset();     //Reset the module
//  myDFPlayer.enableDAC();  //Enable On-chip DAC
//  myDFPlayer.disableDAC();  //Disable On-chip DAC
//  myDFPlayer.outputSetting(true, 15); //output setting, enable the output and set the gain to 15
  

}

void loop(){
  if(Serial.available()){
    readCommand();
  }
 
  if (myDFPlayer.available()) {
    printDetail(myDFPlayer.readType(), myDFPlayer.read()); //Print the detail message from DFPlayer to handle different errors and states.
  }
}

void readCommand(){
  char cmd = ' ';
  int value1, value2 = 0;
  cmd = Serial.read();
  value1 = Serial.parseInt();
  value2 = Serial.parseInt();
 
  switch(cmd){
    case 'h': 
      printHelp();
      break;
      
    case '>':
      myDFPlayer.next();
      break;
      
    case '<':
      myDFPlayer.previous();
      break;
      
    case 'p':
      if(value2 == 0) myDFPlayer.play(value1);
      else if(value1 != 0) myDFPlayer.playFolder(value1, value2);
      break;

    case 'P':
      if(value2 == 0) myDFPlayer.playMp3Folder(value1); 
      else if(value1 != 0)myDFPlayer.playLargeFolder(value1, value2);
      break;
    
    case '+':
      myDFPlayer.volumeUp(); 
      break;
      
    case '-':
      myDFPlayer.volumeDown();
      break;
      
    case 'v':
      myDFPlayer.volume(value1);
      break;
      
    case 'b':
      myDFPlayer.pause();
      break;

    case 's':
      myDFPlayer.start();
      break;
          
    case 'z':
      myDFPlayer.sleep();
      break;
      
    case 'L':
      if(value1 == 0) myDFPlayer.enableLoopAll();
      else myDFPlayer.loopFolder(value1);
      break;
    
    case 'l':
      if(value1 == 0) myDFPlayer.disableLoopAll();
      else myDFPlayer.loop(value1);
      break;
    
    case 'A':
      myDFPlayer.advertise(value1);
      break;
    
    case 'a':
      myDFPlayer.stopAdvertise();
      break;
    
    case 'q':
      if(value1 == 1) Serial.println(myDFPlayer.readState()); 
      else if(value1 == 2) Serial.println(myDFPlayer.readVolume());
      else if(value1 == 3) Serial.println(myDFPlayer.readEQ());
      else if(value1 == 4) Serial.println(myDFPlayer.readFileCounts());
      else if(value1 == 5) Serial.println(myDFPlayer.readFolderCounts());
      else if(value1 == 6) Serial.println(myDFPlayer.readCurrentFileNumber());
      break;
    default:
      Serial.println("Ungültiges Kommando");
      break;
  }

}

void printHelp(){
  Serial.println("DFPlayer Commands:");
  Serial.println(" h - help");
  Serial.println(" > - next ");
  Serial.println(" < - previous");
  Serial.println(" p3 - play");
  Serial.println(" p3,5 - play folder 3, file 5");
  Serial.println(" P3,5 - play large folder 3, file 5");
  Serial.println(" P3 - play file 3 in MP3 folder"); 
  Serial.println(" + - volume up");
  Serial.println(" - - volume down");
  Serial.println(" v10 - set volume to 10");
  Serial.println(" b - Pause");
  Serial.println(" s - start ");
  Serial.println(" z - sleep ");
  Serial.println(" L - enable loop all");
  Serial.println(" l - disable loop all");
  Serial.println(" L3 - loop folder 3");
  Serial.println(" l3 - loop file 3");
  Serial.println(" A3 - advertise file 3");
  Serial.println(" a - stop advertise "); 
  Serial.println(" qx - query No. x");
  Serial.println("     x = 1 - read state");
  Serial.println("     x = 2 - read volume");
  Serial.println("     x = 3 - read equalizer");
  Serial.println("     x = 4 - read file counts");
  Serial.println("     x = 5 - read current file number");
  Serial.println("     x = 6 - read file counts in folder");
  Serial.println("     x = 7 - read folder counts");
}

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 DFPlayerUSBInserted:
      Serial.println("USB Inserted!");
      break;
    case DFPlayerUSBRemoved:
      Serial.println("USB Removed!");
      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;
  }  
}

Das Einzige was zumindest noch nicht funktioniert, sind die Abfragen (in meinem Menü die „q“ Kommandos). Da muss ich wohl nochmal tiefer einsteigen. Wenn ihr das herausbekommt, dann wäre ich für einen Hinweis dankbar. 

In meinem letzten Beitrag habe ich gezeigt, wie man das YX5300 MP3 Modul mit dem Smartphone steuern kann. Das ließe sich hier hierauf mit relativ wenig Aufwand übertragen.  

Geht’s auch ohne Bibliothek?

Den DFPlayer Mini mit dem Arduino ansteuern ist auch ohne Bibliothek kein großes Hexenwerk, da das Datenblatt recht gut verständlich ist. So sieht die Struktur der Befehle aus:

DFPlayer Ansteuerung mit dem Arduino - Struktur der seriellen Befehle

Jede Befehlssequenz startet mit „7E“. Darauf folgt VER (Version), die grundsätzlich „FF“ ist. „Len“ steht die Befehlslänge in Bytes. Dabei werden Startbyte, Endbyte und Checksumme nicht mitgezählt. Bleiben im Normalfall sechs Bytes. „CMD“ ist das eigentliche Kommando und dafür gibt es eine Liste im Datenblatt. „Feedback“ steuert ob man eine Antwort vom Modul haben möchte. Es gibt nur „01“ für Feedback und „00“ für kein Feedback. „para1“ und „para2“ sind – nicht zur Überraschung – die Befehlsparameter. Diese sind auch im Datenblatt aufgeführt. Die Checksumme gibt zusätzliche Sicherheit, man kann sie aber auch weglassen. Im Datenblatt ist erklärt, wie man die Checksumme berechnet. 

Hier nun ein Beispiel. Um eine bestimmte Datei in einem Standardverzeichnis abzuspielen, wird das Kommando 0x0F verwendet. Wenn Datei 002 im Ordner 01 gespielt werden soll und kein Feedback gefordert wird, lautet die Befehlssequenz ohne Checksumme:

7E FF 06 0F 00 01 02 EF

Die Bytes werden einzeln über ein Serial.write(x-tes Byte) übermittelt. Dabei ist „Serial“ durch den vereinbarten SoftwareSerial zu ersetzen. Es ist schon eine ziemliche Fleißarbeit die Kommandos zu implementieren, so dass man froh sein kann, dass es Bibliotheken gibt. Aber ich persönlich möchte gerne auch immer verstehen was hinter den Kulissen passiert. 

Ansteuerung über Taster

Die DFPlayer Mini Ansteuerung mit dem Arduino ist noch nicht alles. Wie oben schon erwähnt, lassen sich viele Funktionen auch über die Adkeyx und IOx Anschlüsse an den Pins 9, 11, 12 und 13 erreichen. 

Die IOx Anschlüsse werden über Taster mit GND verbunden. Je nachdem ob man kurz oder lang drückt, wird die nächste Datei gespielt oder die Lautstärke erhöht bzw. die vorhergehende Datei gespielt oder die Lautstärke verringert. 

Bei den ADKEYx Anschlüssen kann man verschiedene Funktionen erreichen, indem man noch zusätzliche Widerstände einbaut. Ich habe es probiert und es funktioniert einwandfrei.

„Segment X“ heißt dabei übrigens „spiel Datei Nr. X“. Allerdings ist hier wieder die Reihenfolge des Aufkopierens entscheidend und zwar unabhängig von der Verzeichnisart. 

Schaltplan für Anschluss von Tastern an ADKEY und IO ohne Widerstände

Anschluss von Tastern an ADKEY und IO ohne Widerstände
Schaltplan für Anschluss von Tastern an ADKEY mit Widerständen
Anschluss von Tastern an ADKEY mit Widerständen

DFPlayer Mini vs. YX5300

Nachdem ich nun beide Module getestet habe muss ich sagen, dass beide vom Funktionsumfang her recht ähnlich sind. Man ist aber mit dem DFPlayer Mini durch seine Tastenfunktionen deutlich flexibler unterwegs  als mit dem YX5300 Modul. Für den DFPlayer Mini spricht darüber hinaus noch, dass er Pins für den Lautsprecher- bzw. Verstärkeranschluss hat. Hinzu kommt die geringe Größe des Moduls. Der Vorteil des YX5300 Moduls hingegen ist die Klinkensteckerbuchse, an die man Kopfhörer oder (Aktiv-)Lautsprecher direkt anschließen kann. Wer keine Lust hat zu basteln, ist mit dem YX5300 vielleicht besser bedient. 

84 thoughts on “DFPlayer Mini Ansteuerung mit dem Arduino

  1. Hallo,
    in den Datenblätter findet man bei den seriellen Befehlen auch Befehle um die Soundquelle auszuwählen. Wie würde denn z.B. so eine Befehlssequenz aussehen um Dateien z.B. von einem angeschlossenen USB Stick (USB+/USB-) abzuspielen?

    1. Hallo Ulrich,
      ich habe es nicht ausprobiert, aber ich wenn ich das Datenblatt richtig verstehe, muss man lediglich USB als „Playback Device“ spezifizieren. Dazu steht dort:

      Specify playback device: –U-disk, Sequenz: 7E FF 06 09 00 00 01 xx xx EF
      Und ansonsten sind die Befehle dieselben.

      Und es steht im Datenblatt, dass das Device (also hier USB) angeschlossen sein muss, wenn man die obige Sequenz eingibt.

      Wenn es nicht geht, würde ich es mal über die DFRobotDFPlayerMini Bibliothek probieren. Zeile 67 auskommentieren und Zeile 66 entkommentieren.

      VG, Wolfgang

  2. Guten Tag Herr Ewald,
    mein Name ist Cortes. Ich benötige Hilfe, da ich leider keine Lösung finde.

    Ich möchte einen DFPlayer Mini (Adkey1-Pin) mit einem Arduino steuern.
    Der Adkey1-Pin des DFPlayer muss auf GND gelegt werden, um einen Sound zu spielen.
    Der Ausgang des Arduino liefert High-Pegel.
    Immer wenn vom Arduino ein High-Pegel kommt, soll der Masse-Kontakt (Adkey1-Pin) am DFPlayer hergestellt werden.

    Zwei Versuche habe ich bereits unternommen.

    Versuch 1 mit NPN Transistor (BC547):

    Digital-Pin vom Arduino über einen 10K Widerstand an die Basis. Collektor an Adkey1-Pin und Emitter an GND.

    KEIN Erfolg

    Versuch 2 mit Quad Bilateral Switch (CD4016)

    Pin 7 an GND und Pin 14 an +5 Volt

    Digital-Pin vom Arduino an Pin 13 (CD4016 Control A) , Pin 1 (CD4016) an Adkey1 ( DFPlayer) , Pin 2 (CD4016) an GND.

    Leider kein Erfolg

    Was mache ich falsch, oder was übersehe ich?

    Vielen lieben Dank im Voraus

    1. Hallo,

      eine Schaltung zum Invertieren eines Signals mit einem Transistor gibt es hier (ein wenig herunterscrollen):

      https://wolles-elektronikkiste.de/ltc6995-long-timer-low-frequency-oscillator#Power-On-Reset

      Aber, wenn das Signal von einem Arduino kommen soll, dann geht es doch direkt sehr viel einfacher. Sie können doch einfach den Pin zum Schalten des Adkeys OUTPUT/HIGH einstellen und nur, wenn der Sound gespielt werden soll, auf OUTPUT/LOW gehen. Damit ist Adkey auf Masse Niveau.
      VG, Wolfgang

      1. Vielen Dank für Ihre schnelle Antwort.
        Ich habe es soeben getestet, leider funktioniert es nicht.
        Wenn ich zum Test Adkey1 direkt mit GND verbinde, dann wird der Sound gespielt.
        Mit dem Arduino funktioniert es leider bisher Nicht.

        1. Merkwürdig. Mit OUTPUT/LOW müsste es eigentlich gehen. Haben der Player und der Arduino ein gemeinsames GND? Das wäre wichtig.

          1. Ich möchte mal den Hintergrund meines Vorhabens näher erläutern.

            Ich habe eine Drum Machine (Behringer RD6), welche ich über MIDI (UART) mit dem Arduino Nano, über einen Optokoppler, verbunden habe.

            Ich werte dabei drei MIDI Bytes aus (StatusByte, DataByte1, DataByte2), was auch wunderbar funktioniert.

            Jetzt möchte ich, wenn die Bass Drum (MIDI Kanal10 Note 36) = (statusByte == 153 && dataByte1 == 36) sind, der Ausgang 4 des Arduino auf LOW-Pegel schaltet und somit den DFPlayer (Adkey1) triggert.

            Leider scheint der DFPlayer (Adkey1 Eingang) nicht schnell genug schalten zu können, um das Sample abzuspielen. Ein Test mit einer LED funktionierte problemfrei.

            1. Ja, das kann natürlich sein, dass der DFPlayer einfach zu langsam reagiert. Leider sind die Datenblätter zu dem Teil nicht übermäßig detailliert. Eigentlich würde man solche Werte dort erwarten. Leider fällt mir dann auch nicht mehr ein.

              1. Herr Ewald, ich danke Ihnen für Ihre Zeit und Ihre Mühe. Eventuell muss ich zu anderen Komponenten greifen.

  3. Hallo Wolfgang,

    aktuell nutze ich einen Arduino Mega zur Steuerung einer Modellbahndrehscheibe und möchte entsprechende Betriebsgeräusche über den DF Mini-MP3-Player abspielen. Dies hat auch im Versuchsaufbau funktioniert, allerdings war die Klangqualität nicht so gut und immer dann, wenn der Steppermotor-Treiber gleichzeitig in Betrieb war.
    Im Echtbetrieb höre ich beim Start der Drehscheibe nur einen kurzen Ton und dann kommt Stille. Angeschlossen habe ich den DF-Player an 3,3 V. Ich vermute, dass bei Betrieb des Stepper-Treibers (TBB 6600) nicht genügend „Saft“ vorhanden ist.
    Daher möchte ich den DF-Player nun mit 5 V extern versorgen, um auf der sicheren Seite zu sein.
    Da ich unterschiedliche Infos zum Anschluss vorliegen habe, möchte ich auf der sicheren Seite sein und freue mich auf Mithilfe hier aus der Runde.
    Mein Anschlussplan:
    5 V + aus ext. Stromversorgung an VCC DF-Player
    GND – aus ext. Stromversorgung an GND – DF-Player
    RX (mit 1KOhm Wiederstand) + TX DF-Player an entsprechende RX-/TX-Eingänge des Mega
    Anschluss Lautsprecher (ist soweit klar)

    Passt das so oder muss ich GND – der ext. Stromversorgung noch mit GND – des Mega zusätzlich verbinden?

    Danke für Deine/eure Hilfe

    LG

    Bernd

    1. Hallo Bernd,
      wenn der DFPlayer und Arduino Mega über nur RX und TX verbunden sind, kann deren GND Niveau durchaus unterschiedlich sein. Ich habe auch schon so manche Schaltung mit „fliegender Masse“ aufgebaut und mich gewundert warum es nicht funktioniert. Man braucht die gemeinsame Masse für die RX/TX Kommunikation als Bezugspunkt. Das läuft ja über HIGH/LOW Signale. Wenn aber keine gemeinsame Masse da ist, dann ist auch nicht klar, was ein HIGH oder ein LOW Signal ist.
      VG, Wolfgang

  4. Hallo,
    ich versuche den DFPlayer Mini mit einen Timer – Sketch (Ultra-Mega-Timer) zum laufen zu bekommen. Im ausführenden Teil der Loop-Schleife habe ich an die if Anweisung (nach den schalten des Relays) die Zeile
    „myDFPlayer.play(2); //Spielt die zweite MP3-Datei ab“ eingefügt.
    Der Timer schaltet wie gewollt das Relay. Die mp3 startet für ca. 0,5 Sekunden, bricht ab und startet wieder von vorn. Das geht die ganze Einschaltzeit so. Ich vermute, daß mit jedem durchlaufen der Schleife die mp3 neu startet. Was kann der Fehler sein?
    Kannst du mir helfen?

    1. Hallo,
      allein basierend auf diesen Informationen kann ich nicht viel dazu sagen.

      Wenn ich so ein Problem habe, dann versuche ich immer erst einmal Komponenten herauszunehmen um zu sehen, an welcher Stelle die Dinge nicht mehr funktionieren oder welche Kombination nicht kompatibel ist. Also z.B.: läuft der MP3 File überhaupt mit dem DFPlayer , also ohne Relais und Timer?

      Ich kenne deine Schaltung nicht, weiß nicht welchen Microcontroller du benutzt, was du genau mit dem Relais machst, was du für einen Timer verwendest, usw. Wenn du möchtest, kannst du mir deinen Sketch und alle Informationen an Wolfgang.Ewald@wolles-elektronikkiste schicken. Dann schaue ich mal, ob mir etwas einfällt. Ich kann da aber nur begrenzte Zeit investieren.

      VG, Wolfgang

      1. Hallo Wolfgang,
        das Problem habe ich mit einer Forschleife gelöst. Jetzt stehe ich vor dem nächsten Problem. Wie halte ich die MP3 wieder an. Mit

        for (Stop; Stop <= 1; Stop++) {
        myDFPlayer.pause();
        }

        oder

        for (Stop; Stop <= 1; Stop++) {
        myDFPlayer.stop();
        }

        funktioniert es nicht.

        1. Hallo, mit einem so kleinen Programmausschnitt kann ich dir nicht helfen. Ich brauche mehr Informationene. Ich kann nur sagen, dass myDFPlayer.pause() den DFPlayer stoppen sollte. Aber vielleicht geht er ja gar nicht in die Schleife? Welchen Wert hat Stop, wenn es in die Schleife geht? Meistens wird ja der Zähler in der Schleife deklariert, also for( int i = 0, usw. Und wieso willst du eine Schleife durchlaufen? Einmal stoppen reicht doch eigentlich und dann kannst du die Schleife auch weglassen.

  5. Hallo.
    Ich nutze einen Arduino Nano und habe alles genau so angeschlossen wie beschrieben und ich nutze auch das gleiche Programm aber in dem Seriellen Monitor steht immer:
    „Unable to begin:
    1.Please recheck the connection!
    2.Please insert the SD card!“
    Verstehe aber nicht warum.
    Können sie mir da weiter helfen?

    LG Lukas

    1. Hallo Lukas,

      aus der Entfernung schwer zu sagen. Die Verkabelung hast du ja schon überprüft. Manchmal hat man auch ganz profane Fehler wie kaputte Steckbrückenkabel.

      Ansonsten fallen mir noch folgende Dinge ein, die du überpüfen könntest: Ist die SD Karte richtig formatiert (FAT16/FAT32)? Sind die Verzeichnisse so angelegt wie beschrieben? Ist die SD-Karte <= 32 GB? Hat sie eine ausreichende Qualität (nach Möglichkeit Klasse 10)? Ist sie richtig eingelegt? Außerdem darf die die SD Karte nur eine Partition haben. Zu diesem Thema habe ich etwas gegen Ende dieses Beitrages geschrieben: https://wolles-elektronikkiste.de/mp3-player-yx5300

      Mehr fällt mir auf die Schnelle nicht ein. Melde dich ruhig nochmal, wenn das alles nicht nützt. Gerne aber auch wenn du das Problem gefunden hast.

      VG, Wolfgang

      1. Hallo!
        Danke für die schnelle Antwort.
        Ja die SD Karte ist richtig und funktioniert hat.
        Habe das MP3 Modul auch im IO-Mode ausprobiert und da hat es geklappt Songs abzuspielen Aber wenn ich versuche über den Arduino Songs abzuspielen kommt halt im Seriellen Monitor die Nachricht.

        1. Das Gute ist, dass es die Fehlermöglichkeiten einschränkt. Die schlechte Nachricht ist, dass ich nicht weiß, woran es liegen könnte. Der Sketch war völlig unverändert? Funktionieren auch die Beispielsketche der Bibliothek nicht? Ich habe mal auf GitHub in den Issues zur Bibliothek gesucht, aber keinen ähnlichen Fall gefunden. Vielleicht machst du da mal einen neuen Issue auf?

  6. Hallo Wolfgang,

    kann ich den DFPlayer auch über den RX/TX Eingang des Arduinos steuern ? Ich brauche nämlich die PWM-Pins 10 und 11.

    Viele Grüße
    Moritz

    1. Hallo Moritz, prinzipiell ja. Allerdings verwendet die in meinem Beitrag benutzte Bibliothek Software Serial. Weiß nicht, ob man ihr Serial anstelle SoftwareSerial übergeben kann. Aber viel einfacher ist es doch, wenn du anstelle Pin 10, 11 RX oder TX andere Pins nimmst. SoftwareSerial ist nicht auf die Pins 10 und 11 festgelegt. VG, Wolfgang

  7. Hallo Wolfgang,
    Spielt der Player Segment 1 solange ab, wie ich ADKEY1 an GND lege und beendet die Wiedergabe, wenn der Schalter wieder geöffnet wird?

    Oder reicht ein kurzes signal, z.B. 1s um Segement 1 abzuspielen?

    Danke für deine Antwort

    1. Hallo Florian, ein kurzes Signal im Millisekundenbereich ist ausreichend. Am besten verwendest du Taster und keine Schalter. VG, Wolfgang

  8. Hallo Wolfgang,

    Ich hab nochmal eine Frage. Und zwar habe ich das Problem, dass das Beispielprogramm „GetStarted“ für den DFPlayer nach Neustart bzw. Trennen der Stromversorgung nicht startet, nur wenn ich extern einmal resette.
    Es muss an dem Setup liegen, da ich das Programm bereits verändert habe und alles andere ausgeschlossen habe. Es liegt auch nicht am Board, das habe ich schon getestet.
    Im Grunde genommen kommt nur das infrage:

    #include „Arduino.h“
    #include „SoftwareSerial.h“
    #include „DFRobotDFPlayerMini.h“

    SoftwareSerial mySoftwareSerial(10, 11);
    DFRobotDFPlayerMini myDFPlayer;

    void setup()
    {
    mySoftwareSerial.begin(9600);
    Serial.begin(115200);

    if (!myDFPlayer.begin(mySoftwareSerial))
    while(true)
    {
    delay(0);
    }

    Vielleicht weißt du da was ?

    Viele Grüße
    Moritz

    1. Hallo Moritz,

      das setup sieht eigentlich genauso aus wie im Original, jedenfalls wenn die while Schleife Teil der if-Konstruktion ist (da war keine geschweifte Klammer nach der if-Bedingung:
      if (!myDFPlayer.begin(mySoftwareSerial)){
      while(true)
      {
      delay(0);
      }
      ….
      }
      Schau doch erstmal, wo das Programm hängenbleibt. Einfach an einigen Stellen irgendetwas mit Serial.println ausgeben. Wenn er in der while-Schleife hängt, hat der DFPlayer nicht geantwortet. Oder nicht rechtzeitig? Vielleicht braucht er ein bisschen Zeit, wenn er frisch gestartet wird. Füge mal vor dem
      if (!myDFPlayer.begin(mySoftwareSerial)){
      ein delay(1000) ein. Geht es dann? Ansonsten würde ich den Originalsketch testen und gucken, ob der sich auch so verhält.

      1. Also m.E. wird die erste Zeile nach einer if-Anweisung auch ohne Klammer ausgeführt (stand aber so im Originalsketch, alles was da steht ist unverändert).

        Das Problem liegt an der externen Spannungsversorgung. Scheinbar wird er dort nicht resettet, das muss erst manuell geschehen. Schließe ich ihn über USB am PC an, auch ohne das das Programm geöffnet ist, klappt alles (Über USB-Netzteil geht es auch nicht, da der PC scheinbar immer mit dem Board kommuniziert).
        Und, wie gesagt, der Originalsketch verhält sich genauso.

        1. Über Serial.printIn kann ich dann ja auch nichts ausgeben, da das Board am PC ja funktioniert.

          1. Ja, die erste Anweisung nach dem if wird auch so ausgeführt. Ich dachte, das wäre ein Ausschnitt und danach kommen weitere Anweisungen (wie im Originalsketch). Geht es denn auch nicht mit dem delay? Das könnte helfen, wenn die Spannungsversorgung beim Einschalten einknickt und der DFPlayerMini verzögert startet. Sonst wechsele mal die Spannungsversorgung. Mehr fällt mir dann auch nicht ein.

            1. Jetzt klappt es. Ich habe aber die ganze if-Anweisung entfernt UND die Bedingung oben eingefügt, damit die Software ausgeführt wird (das hab ich letztes Mal nämlich nicht gemacht).
              Ich habe das auch mit dem „delay“ versucht, das hat zumindest teilweise funktioniert. Das Programm hat gestartet, aber manche Befehle im Setup wie Lautstärke und Titel nicht richtig ausgeführt.

  9. Hallo Wolfgang,

    Wie kann ich denn das Modul ohne Arduino steuern ? Also seriell mit Windows mit oben genannten Befehlen ?
    Ich habe nämlich gehört, dass es einen Befehl gibt, um einen internen Flash-Speicher von 64MB anzusteuern.

    Vielleicht kannst du da helfen !

    Viele Grüße
    Moritz

    1. Hallo Moritz,

      du kannst den DFPlayer Mini im Prinzip auch direkt von Windows ansteuern. Von der Hardware her ist das kein Problem. Da heutige Rechner keine serielle Schnittstelle (RS232) mehr besitzen, nimmst du einen USB-zu-seriell Adapter wie diesen:

      https://www.amazon.de/AZDelivery-Adapter-FT232RL-Serial-gratis/dp/B01N9RZK6I/ref=asc_df_B01N9RZK6I/?tag=googshopde-21&linkCode=df0&hvadid=308897333482&hvpos=&hvnetw=g&hvrand=4255910642995481917&hvpone=&hvptwo=&hvqmt=&hvdev=c&hvdvcmdl=&hvlocint=&hvlocphy=9044831&hvtargid=pla-388910303692&psc=1&th=1&psc=1&tag=&ref=&adgrpid=61522440175&hvpone=&hvptwo=&hvadid=308897333482&hvpos=&hvnetw=g&hvrand=4255910642995481917&hvqmt=&hvdev=c&hvdvcmdl=&hvlocint=&hvlocphy=9044831&hvtargid=pla-388910303692

      Dann nimmst Du ein Terminal Programm wie z.B. Putty:

      https://www.putty.org/

      Da richtest du eine serielle Verbindung ein und dann kannst du die seriellen Anweisungen, die normalerweise der Sketch bzw. die Bibliothek beim Arduino für dich sendet, selber senden. Im Datenblatt ist das aufgeschlüsselt.

      Das Problem ist, dass das sehr kryptisch ist. Im Beitrag habe ich ja ein Beispiel gebracht. 7E FF 06 0F 00 01 02 EF heißt z.B.: Spiele Datei 002 im Ordner 01 und gebe kein Feedback.

      Mit komfortableren Terminalprogrammen, wie diesem:

      https://www.iftools.com/tools/cleverterm/index.de.php

      lässt sich das Ganze wahrscheinlich bequemer gestalten. Nur da muss man sich erst einmal reinarbeiten.

      Ein andere Möglichkeit sehe ich nicht bzw. kenne ich nicht.

      1. Ok, erstmal danke für deine Antwort.
        Gibt es denn einen internen Speicher ? Ich habe mehrfach davon gehört, aber das ist alles recht schwammig.

        1. Ich weiß nicht, was mit diesem internen Speicher gemeint ist und wo genau der sein soll. Natürlich ist die Speicherkarte auch ein Flashspeicher, aber an die kommst du nur über den DFPlayer Mini. Und mit dem kannst du nur über die seriellen Befehle. Du kannst also nicht auf etwas „dahinter“ direkt zugreifen. Jedenfalls ist mir kein Weg bekannt. Wenn du mir einen Link zu der Stelle zukommen lässt, wo über diesen Flash Speicher Zugriff gesprochen wird, dann schaue ich mir das gerne an.

          1. Also mit dem Speicher meine ich einen fest verbauten, z.B. ein Speicher-IC. Es wird öfter von einem NOR-Flash gesprochen mit 64MB. Wenn man das googelt, findet man ein paar Sachen. Auch direkt beim Hersteller, z.B. bei Alibaba, liest man, dass so etwas verbaut sein soll. Auf der Homepage https://wiki.dfrobot.com/DFPlayer_Mini_SKU_DFR0299 ist davon auch zu lesen, direkt unter den Tabellen mit den Befehlen für serielle Kommunikation.

            Da nirgendwo richtig was dazu erklärt wird, bin ich mir nicht sicher, ob ich falschliege. Vielleicht findest du was Näheres.

            1. Es wird immer von SD-Karte, USB-Stick und „Flash“ oder NOR-Flash gesprochen, also drei Varianten, manchmal sogar vier.

              1. Ich denke ich kann dir da nicht weiterhelfen. In dem Link, den du mir geschickt hast, steht lediglich, dass man den DFPlayer Mini seriell per PC ansteuern kann. Und das funktioniert so, wie ich es beschrieben habe: USB -> USB-zu-Seriell Adapter -> DFPlayer und mit einem Terminalprogramm bei dem man die entsprechenden Parameter (Baudrate, etc) einstellen muss. Dann gibt es noch die ADKEYs, wo man per Widerstandsgröße die Anweisungen steuert, aber das nützt einem nichts vom PC aus.

                Flash Speicher und NOR Flash und solche Sachen, ja die gibt es. Aber ich wüsste nicht, dass es irgendein Bauteil auf dem DFPlayer Mini gäbe, dass sich direkt unter Umgehung der seriellen Schnittstelle ansprechen ließe. Ich denke durch diese Schnittstelle muss man durch und deswegen ist nur die Frage wie man die seriellen Befehle übermittelt. Per Arduino oder direkt über Terminal.

                1. Ok, dann werde ich das wohl ohne machen. Ich brauche dann aber größere Mengen Speicherkarten, was anderes übrig bleibt mir nicht.

                  Aber danke trotzdem !

  10. Hallo,
    ich arbeite schon seit längerem an einem Projekt „International Talking Clock“, das die Uhrzeit in 15 verschiedenen Sprachen ansagt. Ich habe die entsprechenden Sprachelemente als mp3 in 15 verschiedenen Ordner 00 ,01,… für die verschiedenen Sprachen sortiert, innerhalb diese Ordner sind die „Sprachatome“ in entsprechenden mp3 -Dateien 0001_de_xxxx, 0002_de_xxx usw. abgelegt. Alle Verzeichnisse und Dateien befinden sich in dem MP3-Verzeichnis. Mit dem Befehl myPlayer.playFolder (v1,v2) soll das mp3 abgespielt werden. Ich hatte einen ähnlichen Parser geschrieben wie Sie. Das Verrückte: Das Ganze hat auch schon wunderbar geklappt.
    Nach einem Neu-Kopieren der Dateien werden die entsprechenden Dateien nicht mehr gefunden. Die Anzahl der Dateien wird korrekt angegeben (1436), die Anzahl der Ordner allerdings nicht (-1). Der playFolder-Befehl gibt immer die Fehlermeldung: File not found
    Können Sie mir irgendwie auf die Sprünge helfen. Natürlich könnte ich alle mp3s in einen Ordner tun und dann mit offsets ansprechen – aber wenn’s doch sowas gibt wie playFolder???
    Danke im voraus

    1. Die Talking clock klingt sehr interessant, aber auch nach ziemlich viel Fleißarbeit diese Dateien zusammenzustellen.
      Aber zum Problem: Wenn es vorher ging und jetzt nicht, dann muss ja irgendetwas anders sein als vorher. Könnte es mit der SD-Kartenformatierung zusammenhängen? Schau mal hier (ist zwar aus dem Beitrag über YX5300 Module, gilt aber auch hier):

      https://wolles-elektronikkiste.de/mp3-player-yx5300#Probleme

      Ansonsten hätte ich es genau so gemacht wie du bezüglich der Namensgebung der Dateien und Ordner. Ich bin mir nur nicht ganz sicher, ob es einen Ordner „00“ geben darf. Laut Datenblatt ist 01-99 erlaubt. Das könntest du nochmal probieren. Und was anderes als die playFolder(x,y) Funktion habe ich auch nicht zu bieten. Vielleicht kannst du erstmal das und das SD Kartenformat prüfen.

      1. Danke für die Tipps. Nach längerem Probieren habe ich mit folgender Ordnerstruktur Erfolg gehabt:
        Die Sprachordner 01 … 16 in das Root-Verzeichnis der SD-Karte und nicht in das MP3-Verzeichnis. Die „Sprachatome“ kommen dann als 001_de_0h.mp3 …0024_de_24h.mp3 (nur als Beispiel) in die entsprechenden Sprachverzeichnisse 02..16. (Der Ordner 01 enthält die Ansage der entsprechenden Sprachen in diesen Sprachen). Zum Testen ist das obige Programm mit serieller Eingabe der Befehle eine gute Hilfe.
        Ich verwende inzwischen DFRobotDFPlayerMini.h als Bibbliothek und kann dann mit dem Befehl myDFPlayer.play(ordner, datei) gezielt die entsprechenden Datei aufrufen.
        Wenn man eine Datei ändern will, formatiert man die Karte am besten neu und kopiert die gesamte korrigierte Verzeichnisstruktur auf die SD-Karte. Offenbar werden die Dateiadressen aus der physikalischen Anordnung der Dateien auf der SD-Karte gewonnen.

    1. Oha – man muss ja richtig vorsichtig sein! Gut gesehen.

      http://www.getdigital.de, da gibt es lauter Zeug wie dieses.

      Ach ja, und das wichtige ist, dass es die „drei ßßß und der Fluch der Feststelltaste ist“

  11. „Hier gibt es allerdings das kuriose Problem, dass die Dateien in exakt der Reihenfolge ihrer Namen aufkopiert werden müssen. Sagt man dem Modul es soll 0001.mp3 abspielen, aber 0007.mp3 wurde zuerst aufkopiert, dann wird 0007.mp3 gespielt.“

    Der DFPlayer arbeitet im ADKEY Modus nur aus dem Root Verzeichnis und die dort liegenden Dateien werden nach ZEITSTEMPEL sortiert abgespielt. Der Dateiname ist völlig irrelevant.
    Ich arbeite derzeit genau dazu ein Artikel aus und bin auch an einem kleinen Playlist-Tool dran, welches die Zeitstempel passend setzt.

    1. Sehr schön, sag mal Bescheid, wenn du den Artikel fertig gestellt hast, dann können wir ihn hier verlinken.

  12. Hallo Wolfgang,

    ich hatte mich für den DFPlayer Mini interessiert, um ihn unter Verwendung eines WeMos D1 mini (billiger, für den Zweck ausreichend, davon habe ich einige im Einsatz) in meine Homematic-Hausautomation einzubauen (für akustische Signalisierungen).

    Da ich sowas schrittweise angehe, habe ich mich zuerst bemüht, den DFPlayer Mini mit der Beispieldatei GetStartet ans Laufen zu bringen. Das hat aufs Verrecken nicht geklappt. Bei der Suche nach möglichen Ursachen bin ich u.a. auf deiner Web-Seite gelandet (und habe auch dort ein bisschen gestöbert).

    Ursache war, dass die (frisch und vollständig Fat-formatierte) SD-Karte (Transcend High Endurance 16 GB HCI) nicht erkannt wurde. Eine alte ausgemusterte 2GB-Karte war dann die Lösung.

    Nächster Schritt: Einbindung in die Hausautomation, d.h. Einrichtung des WeMos D1 mini als Webserver. Das war völliges Neuland für mich. Ich hatte einen Lösungansatz vorgeschlagen bekommen, mit dem ich jedoch nicht klargekommen bin. Da erinnnerte ich mich auf deiner Webseite was gelesen zu haben (Wemos D1 Mini Bordas : LED per Wlan schalten). Mit entsprechenden Anpassungen hat das Schalten der LED geklappt. Auch wav-Dateien im Ordner mp3 werden abgespielt.

    Dann habe ich die beiden Sketche kombiniert und im Teil wo die Led an/bzw ausgeschaltet wird, habe ich statt dessen die Befehle zum Spielen der verschiedenen Audio-Dateien eingebaut und erweitert: Spiele Audiodatei 0001.mp3 / Audiodatei 0002.mp3 … lauter, leiser und Spielstop.

    Je nach Konstellation schickt jetzt meine Hausautomation über curl einen http-Aufruf an den WeMos und die entsprechende Audio-Datei wird gespielt bzw. Befehl wird ausgeführt.

    Klappt prima.

    Danke
    Paul

    1. Hallo Paul, danke für das Teilen deiner Erfahrungen. Schön, dass es geklappt hat! VG, Wolfgang

  13. Hallo Wolfgang,
    vielen Dank für diesen hilfreichen Blog. Vielleicht ist meine Frage zu weitreichend oder geht am Thema vorbei. Ich versuche es trotzdem mal: Ich nähere mich dem Arduino von der Modellbau-Seite, Programmierkenntnisse sind nicht vorhanden. D.h. ich kann einen Sketch kopieren, klar erkennbare Parameter (PIN, etc.) ändern und aufspielen.
    Aktuell erstelle ich vie 3D-Drucker einen Star-Wars-Blaster als Deko. Um der Sache den letzten Schliff zu geben, wären Lichteffekte und Geräusche erwünscht. Mit Deinem Sketch ist es mir zumindest gelungen über Tasterdruck ein definiertes Geräusch wiederzugeben. Für mich schon ein Erfolg. Zur Beleuchtung soll ein WS2812b-LED-Lightstripe (auch Neopixel genannt) zur Anwendung kommen. Unabhängig vom Ton gelingt es mir auch einen Beispiel-Sketch aus der Adafruit Neopixel oder Fast-Led Library aufzuspielen und anzupassen (Anzahl der LED, Farbe, Helligkeit, etc.
    DIe Frage die sich mir nun stellt ist, wie verbinde ich beides? Ziel: Taster 1 – schnelles rotes Lauflicht an WS2812b und Laserschussgeräusch (mp3). Taster 2 – rotes Blinken und Störungsgeräusch. Taster 3…
    Alternativ kommt natürlich ein zusätzlicher Controller (bspw. ws2812b controller SP105E) in Betracht. Dieser ermöglicht sogar die Steuerung des Lightstripes vie BT vom Smartphone. Dieses ist aber gar nicht erforderlich, ein vordefinierter Effekt wäre völlig ausreichend. Zudem ist Platz ein rares Gut, ein Nano+mp3-Modul+5Powerbank 5000mah wäre die Wunschhardware.
    Vielleicht stellt das ja eine kleine Danksportaufgabe dar, oder es ist gar uninteressant. Die Try-and-Error-Methode verbleibt mir ja in jedem Fall. In jedem Fall Danke den Blog und das Lesen. Frohes Fest!

    1. Hallo Philipp, das ist eigentlich keine große Herausforderung, aber ohne Programmierkenntnisse natürlich schon. Ich schaue mir gerne mal Programme an, z.B. um bei der Fehlersuche zu helfen. Aber ich schaffe es nur nicht, ganze Programme für andere zu schreiben, selbst wenn es keine großen sind. Dann bleiben meine eigenen Arbeiten zu sehr auf der Strecke (oder meine Familie!). Ich hoffe auf dein Verständnis. Frohes Fest und guten Rutsch, Wolfgang

  14. Hallo Wolfgang
    besten Dank für die Anleitung
    Als Arduino-Neulng habe ich es nun soweit gebracht, dass ich die einzelnen Files aufrufen kann. Was ich aber noch nicht geschafft habe ist folgendes: falls das aufgerufene File nicht vorhanden ist, dann soll das Ersatzfile (999) abgespielt werden. Mit welchem Begehl kann ich z.B. „Filemismatch“ sauber auslesen?

    1. Hallo, wenn du dem DFPlayer sagst er soll einen Titel spielen und er findet ihn nicht, Dann gibt er einen Fehlercode zurück. Im Beispielsketch in Zeile 87 wird abgefragt, „ob der DFPlayer etwas zu sagen hat“. Ist das der Fall, wird die Fehlermeldung in Zeile 88:
      printDetail(myDFPlayer.readType(), myDFPlayer.read());
      mit readType und Read gelesen und die Ergebnisse an die Funktion printDetail übergeben. Als type käme im Fall eines nicht vorhandenen Titel ein „DFPlayerError“ und als value „FileMismatch“. Es sollte auf dem Seriellen Monitor „“Cannot Find File“ erscheinen (Zeile 257). Du müsstest danach nur eine Zeile einfügen:
      myDFPlayer.play(999).
      Oder mit weniger Ballast:
      if (myDFPlayer.available()) {
      if(myDFPlayer.readType()==DFPlayerError){
      if(myDFPlayer.read()==FileMismatch){
      myDFPlayer.play(999);
      }
      }
      }

      Die Einrückungen musst du dir dazu denken – die Kommentarfunktion hat sie leider entfernt.

      1. Guten Abend
        Vielen Dank für die schnelle Antwort. Funktioniert! aber nicht stabil. Der Player hängt sich auf einmal auf bzw. schaltet ab und dann muss ich neu starten. Gibt es da einen Trick?

        1. Hallo, schwer zu sagen, auf die Entfernung. Da müsstest du erstmal schauen, in welchem Schritt das passiert. Ich mache das oft so, dass ich in den Programmcode an bestimmte Stellen so etwas wie Serial.println(„Zeile n“); einbaue um so eizugrenzen über welchen Punkt er nicht hinaus kommt. Vielleich gibt er ja auch noch ein Error zurück bevor er sich aufhängt. Du könntest mal in den Code etwas einbauen:

          if(myDFPlayer.available()) {
          if(myDFPlayer.readType()==DFPlayerError){
          uint16_t error = myDFPlayer.read();
          Serial.println(error);
          if(error==FileMismatch){
          myDFPlayer.play(999);
          }
          }
          }

          und hier sind die Definitionen der Fehler:

          #define Busy 1
          #define Sleeping 2
          #define SerialWrongStack 3
          #define CheckSumNotMatch 4
          #define FileIndexOut 5
          #define FileMismatch 6
          #define Advertise 7

          Fehlersuch auf die Ferne ist nicht ganz einfach.

          1. Nochmals vielen Dank und den Code. Wenn’s funktioniert, dann bekomme ich den richtigen Fehlercode 6. Im anderen Fall kommt kein Fehlercode, die Schlaufe wird nicht durchfahren. Der Fehler liegt wahrscheinlich in der (systembedingt, da Wählscheibe) nicht sehr stabilen Eingabe. Aber das ist halt bei der alten Technik so.
            Trotzdem nochmals besten Dank!

  15. Auch hier ein Moin, aus HH.
    Schöne übersichtliche Einleitung in die DFPlayer Mini mp3 Spielerei. Ich bin noch ein Neuling in Sachen Arduino.
    Somit kommen da für mein Wunschprojekt eine Frage auf:
    Ich möchte 2-3 DFPlayer Mini an den Arduino gleichzeitig betreiben können wie Spreche ich die einzelnen DFPlayer über i2C an? Und wie kann ich 2 Autio Spuren gleichzeitig ausgeben?

    Ich möchte quasi eine Hintergrund Ambiente fürs Tabletop haben, welche aber Zufällige audio Ereignisse hinzufügt. (1 SD Karte für Random, 1 SD Karte für den Backgrund)
    Oder kann man 2 Audio Files gleichzeitig aus einem DFPlayer Mini auslesen?

    MfG
    Thomas

    1. Moin moin in den Norden. Zwei oder mehr DFPlayer Mini anzusprechen ist kein Problem. Du musst nur entsprechend viele DFPlayer Objekte (myDFplayer1, myDFPlayer2, usw.) und SoftwareSerial Objekte (mySoftwareSerial1, mySoftwareSerial2, usw.) erzeugen. Und dann startest du die DFPlayer mit myDFPlayer1(mySoftwareSerial1), dasselbe mit Nr 2 usw. Limitierender Faktor sind nur die Pins für die SoftwareSerial Verbindungen. Der Sketch oben, also die Steuerung über den seriellen Monitor müsste dann aber noch weiter umgeschrieben werden.
      Zwei Titel von einem DFPlayer gleichzeitig abspielen geht nicht.

      1. Danke, für die Hilfe.
        Also kann ich einfach jeden DFPlayer Mini Instantiieren und einfach alle I2C Device paralell anschließen.
        Jetzt muss ich nur noch schauen wie groß die Pullup Widerstände auf SCL und SDA sein müssen. Die beiden DFPlayer Mini sollen nebeneinanderliegen.

  16. Moin moin.

    Ich werfe meine Frage mal in den Ring der Profis.

    Ist es möglich das der Player (mit eingelgter Karte, NUR einTitel (0000.mp3) auf der Karte) OHNE zusätzliche Hard-/Software, beim Anlegen der 5V diesen einen Titel aufruft und endlos wiederholt????

    Mit freundlichem Gruß und gesund bleiben

    1. Hallo Paul, interessante Frage. So ganz einfach geht es aus meiner Sicht nicht, weil der Player nicht automatisch startet. Wenn, dann irgendwie über den Adkey1 Pin. Hier eine verrückte Idee: Das Einschalten könnte man als Signal nutzen um einen Transistor zu schalten, der die Verbindung von Adkey1 über 33kOhm zu GND zu schalten (Play). Nun sind die 5 Volt ja ein Dauersignal, aber man kann mit einem CR Glied aus einem langen Signal ein kurzes machen. Es muss aber lang genug sein, damit der Player schon betriebsbereit ist. Dann könnte man das Busy Signal nutzen, um wieder einen Transistor zu schalten, der eine Verbindung von Adkey1 über 51 kOhm zu GND schaltet (Loop All). Oder so….

      1. Hallo Wolfgang.
        Danke für die so promte Antwort!
        Tchja, das hab ich mir fast gedacht ;-((
        Will eigentlich nur einen FastLED – Effekt, begleitet von eben diesem mp3 Titel über (m)EINE NodeMCU V3 fahren.
        Kompilieren und Hochladen ohne Fehler.
        Der Durchlauf des LED Effektes funtioniert Einwand frei.
        Mit eingebundenen Player Zeilen, bleibt der Strip jedoch dunkel ( ab der Ansprache des Player Zeile „myDFPlayer.volume“.
        Kommentiere ich die Playerzeilen wieder ab da aus, funktioniert der LED-Effekt wieder.
        MUSS dazu erwähnen, das die Player noch im Zulauf sind und ich keinerlei Erfahrung mit ihm habe, ob vielleicht die fehlende (nicht abfragbare Hardware MiniPlayer) die Ursache ist.
        Ich denke zum WoE habe ich sie, dann heisst’s learning by ……..
        Ich melde mich dann wieder, wenn ich nach 5 Liter Cola und ypsen Versuche, mehr heraus gefunden habe.

  17. Hallo Herr Ewald,
    wunderbare Anleitung; funktioniert praktisch sofort auf Anhieb. Woran ich jedoch scheitere, ist es andere Pins als 10 und11 zu benutzen. Also heisst in der Befehlszeile SoftwareSerial mySoftwareSerial(10,11); // RX, TX stattdessen SoftwareSerial mySoftwareSerial(2,3); // RX, TX zu vewenden. Haben Sie einen Tipp für mich?

    1. Hallo Herr Müller,

      ja, eigentlich mySoftwareSerial(2,3) am UNO genauso funktionieren. 2 ist dann RX und 3 ist dann TX. Merkwürdig, wenn das nicht geht. Funktionieren andere Pins auch nicht? Beim UNO gibt es eigentlich keine Einschränkungen, alle digitalen I/O Pins (außer 0/1) sollten funktionieren. Beim „Umstöpseln“ sollten Sie den Widerstand am RX Eingang des DFPlayer Mini nicht vergessen. Und die Verkabelung ist „über Kreuz“ – RX an TX und TX and RX. Aber wenn es vorher ging und sie einfach von 10 nach 2 und von 11 nach 3 umziehen, sollte es auch wieder gehen.

      Bei anderen Boards gibt es Einschränkungen:
      Note:
      Not all pins on the Mega and Mega 2560 support change interrupts,
      so only the following can be used for RX:
      10, 11, 12, 13, 50, 51, 52, 53, 62, 63, 64, 65, 66, 67, 68, 69

      Not all pins on the Leonardo and Micro support change interrupts,
      so only the following can be used for RX:
      8, 9, 10, 11, 14 (MISO), 15 (SCK), 16 (MOSI).

      Viel Erfolg!

      1. Hallo Herr Ewald,

        tausend Dank für die superschnelle Antwort. Aber Sie haben im Prinzip mein Problem gelöst. Ich setze, weil ich es halt immer so gemacht habe, Mega 2560 ein. Nach Ihren Ausführungen kann das dann mit Pin2 und 3 auch nicht funktionieren. Nochmal Danke. Aber als nicht Fachmann verstehe ich nicht, warum dann auf meinem Mega 2560 8 Pins für die Communication (14-21) vorgesehen sind. Aber nochmal Tausend Dank.

        Grüße
        Christof Müller

        1. Ja, das ist verwirrend. Pin 14 -19 sind Hardware Serial I/Os, so wie Pin 0 und 1 am Arduino UNO. 20/21 sind I2C Pins. SoftwareSerial benötigt aber eine Pineigenschaft, die sich Pin Change Interrupt nennt. D.h. man kann auf den Pins einstellen, dass ein Interrupt ausgelöst wird, wenn ein HIGH/LOW oder LOW/HIGH Wechsel stattfindet. Und das nutzt SoftwareSerial eben. Auf Pindiagrammen heißen die Pins dann oft auch PCINTx. Und diesen Pin Change Interrupt können nicht alle Pins des Mega2560.

          1. Nochmal vielen Dank und weiterhin viele Erfolg und vor allen Dingen Spass. Ich erobere diese Welt immer einen schritt mehr, wenn ich eine neue Idee umsetzen will und fall dabei halt manchmal auch zwischendurch auf die Nase. Bleiben Sie gesund!

  18. Ich möchte aus dem MP3-Modul einen „Soundgenerator“ machen, für mein Modellschiff.
    Also sollen die MP3s in den Ordner MP3 und dort gezielt ausgewählt werden.
    Angesteuert wird das ganze über eine IR-FB, die auch die nautische Beleuchtung steuert.
    Also, ich möchte auf Tastendruck eine bestimmte Datei abspielen.

    Da ich noch Anfänger bin wollte ich fragen, wo dieser Abfragemodus zu finden ist im Sketch.

    1. Die Funktion zum Abspielen von Dateien im MP3 Folder lautet: „myDFPlayer.playMp3Folder(Nummer des Tracks)“.

  19. ja aber welcher wiederstand ???????P.S. haben sie e mal oder facebook das ich ein viedeo machen kann und ihnen schichen kann ????und ja das mein ich mfg Fabian

    1. Meine erste Antwort war vielleicht etwas vorschnell. Das beißt sich natürlich mit der Widerstandssteuerung am Widerstand R7. Ich würde den Taster K4 durch einen npn Transistor ersetzen. Kollektor an R7, Emitter an GND. Die Basis mit einem Pullup Widerstand hochziehen. Zusätzlich einen Taster zwischen Basis und GND. Solange der Taster gedrückt ist, ist die Basis auf GND Niveau und der Transistor geschlossen. Beim öffnen fließt ein kleiner Strom über die Basis und öffnet den Transistor. Ich habe dir eine kleine Zeichnung geschickt.

  20. hallo ich hab eine frage ich möchte das das modul erst einen song abspielt wen der schalter nicht mehr gedrückt ist ,aber ich bekomme es nicht hin . Z.B. als arlam anlage das heist schalter in eine tür einbauen und so balt die tür auf geht soll das modul loskreuschen: mfg Fabian

    1. Hallo Fabian, du willst also ein „HIGH“ an einem Eingang haben, wenn du einen Taster loslässt. Dann hast du so etwas wie Eingang – Taster – Ground. Dann musst du an die Verbindung Eingang – Taster einen Pull Up Widerstand hängen und das war’s auch schon. Oder verstehe ich die Frage falsch?

      1. ja aber welcher wiederstand ???????P.S. haben sie e mal oder facebook das ich ein viedeo machen kann und ihnen schichen kann ????und ja das mein ich mfg Fabian

  21. Hallo,

    ich habe irrtümlich zwei MP3-Module zugeschickt bekommen, statt der bestellten IR-Dioden, die ich bestellt hatte. nun will ich diese in meinem Modellschiff nutzen.
    Hatte ich das richtig verstanden, dass im Folder ,MP3′ die Tracks gezielt angewählt/abgespielt werden können?
    Zur Zeit nutze ich eine IR-Fernbedienung, um die nautische Beleuchtung zu schalten, also auch das blaue Funkellicht. So könnte ich dazu noch das Martinshorn abspielen, oder eine Durchsage abspielen.

    Gruß und Ahoi,
    Markus

    1. Hi Markus, MP3-Module anstelle von IR-Dioden, interessante Verwechslung! Ja, richtig verstanden, die Tracks im Folder „MP3“ können individuell angesprochen werden. 3000 Tracks um genau zu sein. Aber man kann keine Unterverzeichnisse anlegen. Alternativ nimmst du die Standardverzeichnisse, wo jeweils 256 Tracks individuell ansprechbar sind. Viel Erfolg! VG, Wolfgang

  22. Hallo Wolfgang
    Wie frage ich ab, wann ein Titel zu ende ist, damit ich den Nächsten starten kann?
    Grüße
    Martin

    1. Hi Martin, du kannst über „myDFPlayer.readState()“ in regelmäßigen Abständen abfragen. Aber wozu eigentlich? Du hörst ja wenn ein Titel zu ende ist. Und wenn du automatisch den nächsten Titel spielen willst, dann gibt es ja die „loop folder“-Funktion.

  23. Hallo Wolfgang, Du schreibst unter dem Code „Das Einzige was zumindest noch nicht funktioniert, sind die Abfragen (in meinem Menü die „q“ Kommandos). “
    Bei mir funktioniert q1 bis q6 wunderbar. Du hast im Hilfetext geschrieben: q6 = „read file counts in folder“ und q7 = „read folder counts“. Im Code realisiert hast Du aber q6 = „read folder counts“ und q7 gar nicht. Also q6 liefert tatsächlich die Ordneranzahl (Hauptverzeichnis mitgezählt).
    Bei q5 werden offensichtlich die Files gezählt aus Hauptverzeichnis + 1. Standardverzeichnis + 2. Standardverzeichnis usw…. bis zum aktuell laufenden File (wie die Reihenfolge inklusive den Sonderverzeichnissen „MP3“ und „ADVERT“ ist, habe ich nicht ausprobiert).

    Bei meinem Modul darf ich „myDFPlayer.sleep();“ nicht verwenden; aufwecken kann ich es dann nicht mehr – nur noch ein Power-on-Reset hilft.

    Besten Dank für Deine Elektronik-Wunderkiste. Schau ich immer wieder gerne rein!

    1. Hi Andreas, schön dass es funktioniert. Ich muss mir das in Ruhe nochmal anschauen. Vielen Dank auf jeden Fall!

  24. Hallo Bernhard, ich habe den Link zum Datenblatt gerade noch einmal ausprobiert. Ging ohne Probleme. Vielleicht war der Sever kurz down? Vielleicht probierst du es einfach nochmal. Und danke für die Hinweise bezüglich der FAT.

  25. Ein Hinweis zum Problem mit dem Hauptverzeichnis: dieses Problem haben auch Phillips-Fernseher, wenn sie Bilder per USB-Stick abspielen sollen. Die Geräte implementieren offensichtlich nur das absolute Minimum an FAT-Funktionalität – die erste Datei ist halt die erste Datei im FAT-Verzeichnis (FAT definiert keine Sortierung). Als Lösung bieten sich Tools an, die die File-Allocation-Table sortieren (einfach mal nach „fatsort“ googeln).

    Außerdem funktioniert der Link zum Datenblatt nicht mehr.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.