Ü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
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 Dateitypen | MP3 und WAV |
Unterstützte SD-Karten | Micro SD(HC) bis 32 GB |
Dateiformat | FAT16 / FAT 32 |
Kommunikation | Seriell RX/TX, Baudrate: 9600 |
USB-Port | USB 2.0 (Flashdrive / PC) |
Audio Ausgänge | Lautsprecher – bis 3W (Verstärker on Board) DAC (für Kopfhörer oder Verstärker) |
Das Anschlusschema
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.
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:
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.
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.
Hallo,
Ich habe mir eine einfache Türklingel mit eben diesen DFPlayer Mini aufgebaut. Die Ansteuerung erfolgt über einen ESP-01. Für dieses kleine Projekt habe ich viel gegoogelt, bin aber letztendlich immer wieder auf deinen Seiten gelandet. Einfach, nachvollziehbar und vor allem auf deutsch erklärt. Vielen Dank dafür. Den DFPlayer gibt es mit vielen unterschiedlichen Chips. Der GD3200B Chip wurde in meinem DFPlayer verbaut. Dieser hat, keine Ahnung warum, auf Statusanfragen nicht geantwortet. Eine wirklich gut funktionierende Bibliothek habe ich nicht gefunden. Und damit bin ich wieder bei deinem Beitrag und dem Absatz “Geht’s auch ohne Bibliothek?”. Ja, es geht. Auf Statusabfragen habe ich verzichtet und benutze dafür den Bussy-Anschluss vom DFPlayer. Die Türklingel habe ich noch über den ESP-01 in meine Heimsteuerung (Raspberry mit Node-Red) eingebunden und damit wird die Klingel noch universeller.
Nochmal Danke und mach weiter so.
Grüße Frank
Danke fürs freundliche Lob. Die Statusabfragen haben bei mir auch nicht funktioniert. Das Label auf meinem Chip ist schlecht lesbar, aber es ist definitiv nicht GB3200B.
hallo,
ich habe auch eine Klingel gebastelt, mehrere Knöpfe führen zu unterschiedlichen mp3s. so die Idee Nun spielt das Ding immer weiter. Die Klingel hört nicht mehr auf. Gibt es einen Play Mode Continous oder sowas, den man abschalten könnte? Danke, liebe Grüsse
vrt66@hotmail.com
Hallo Thomas,
das heißt, du verwendest nur Knöpfe und keinen Mikrocontroller, richtig? Und du würdest gerne erreichen, dass du beim Drücken des Tasters nur einen Titel abspielst und das Teil dann stoppt, richtig? Was der DFPlayer Mini aber tut, ist nach dem gewählten Titel den nächsten Titel zu spielen, wenn ich dich richtig verstanden habe. Eine einfache Lösung habe ich dafür leider nicht. Bei Verwendung eines Mikrocontrollers könnte man mit einem Timer arbeiten, der nach einer festen Zeit ein Stoppsignal sendet. Tut mir leid.
VG, Wolfgang
Lieber Wolfgang,
danke für deine sehr gute Einführung. Ich möchte den Player mit einem Pir starten. Dann sollte ein zufälliger Song in ganzer Länge abgespielt werden. Ist der Song zu Ende soll der Player in den „Standby“ Modus und auf den nächsten Pir-Impuls warten um dann wiederum einen zufälligen Song abspielen e.t.c.
Vor allem geht es mir dabei aber wie ich die Player-Funktionen lösen könnte.
Für einen Lösungsansatz wäre ich dir sehr dankbar.
Herzliche Grüsse, Urs
Hallo Urs,
sagen wir mal du hast 100 Songs im Ordner 01. Wenn des PIR Signal kommt, dann kannst du über die random Funktion eine zufällige Zahl wählen:
long randNumber = random(1, 101); // wählt eine Zufallszahl zwischen 1 und 100
Und dann lässt du den Song spielen, mit:
myDFPlayer.playFolder(1, randNumber);
Ich habe es probiert, es wird tatsächlich nur der eine Song gespielt. Ob das auch so im Hauptverzeichnis oder im Sonderverzeichnis MP3 so funktioniert (also dass nur ein Song gespielt wird), das habe ich nicht probiert).
Oder habe ich die Problematik, vor der du stehst, noch nicht erkannt?
Viel Spaß bei Projekt!
VG, Wolfgang
Danke lieber Wolfgang für die schnelle Antwort und den Tipp.
Ich habe das so umgesetzt und es funktioniert. Das MP3-Verzeichnis habe ich auf der SD-Karte gelöscht und habe Ordner 01, 02, 03 etc erstellt.
Vielen Dank für deine Hilfe und wundervolle Feiertage,
Herzlich, Urs
Hallo Wolle,
mit großem Dank habe ich deine Bibliothek verwendet, um einen Bewegungsmelder mit dem DFPlayer Mini zu kombinieren. Das hat wunderbar geklappt.
Ich habe nur ein Problem: Ich habe auch noch Tasten für next, previous und pause/play integriert. Funktioniert auch alles, nur die pause/start-Taste will nicht so wie ich. Zusammen mit dem Bewegungsmelder, der einen Song nach dem Zufallsprinzip abspielt, klappt alles wie gewünscht. Aber mit den next/prev-Buttons springt er anstelle nach Pause an der alten Stelle fortzufahren manchmal (nicht immer!) an das Lied, das in der internen Reihenfolge an erster Stelle steht.
Dabei ist es egal, ob ich die next/prev-Buttons an die Hardwarepins des Players oder an den Arduino anschließe und per Code steuere. Es macht auch einen Unterschied, ob die Songs in einem MP3-Ordner oder im Root liegen.
Hast du vielleicht eine Idee, wo der Unterschied ist? Also was genau passiert, wenn man den Befehl play bzw playMP3folder oder next/previous verwendet? Weil das scheint ja die Ursache zu sein, dass „start“ nicht als resume funktioniert …
Hallo, erst einmal: es ist nicht meine Bibliothek, sondern ich habe nur darüber berichtet.
Könnte es sein, dass das ein Problem mit Tasterprellen ist? Sprich ein Tasterdruck löst mhrere Signale aus. Am Arduino kannst das per Software verhindern, am DFPlayer nur per Hardware (RC-Glied).
Was anderes fällt mir spontan nicht ein. Ich müsste da selber mal herumprobieren, nur leider fehlt mir dazu im Momnt die Zeit.
VG, Wolfgang
Leider ist es das nicht. Dasselbe Verhalten passiert auch ganz ohne buttons, nur mit der Steuerung über Serial. Sprich: Wähle ich einen Track mit play(n) aus, funktioniert pause/stop wie gewünscht. Steuere ich ihn mit next/previous an, leider nicht, dann springt nach dem Pausieren oft/meistens auf den ersten Track.
Als ob er die Position dann nicht ins EPROOM schreibt?
Hallo, da ich noch eine andere Frage zum Player bekommen habe, habe ich das gute Teil noch einmal aufgebaut und auch die Adkey Tasten probiert. Einen 15k Widerstand für Next / Vol+ und einen 22k Widerstand (hatte keinen 24er) für Pre/Vol-. Das funktioniert wunderbar. Dann habe ich die IO1 und IO2 Anschlüsse probiert und auch mit diesen kann ich problemlos vor- und zurücknavigieren. Wenn der Player manchmal auf das erste Stück zurückspringt, dann klingt das so als würdest du Adkey1 – aus welchen Gründen auch immer – mit auf GND ziehen. Ist da vielleicht ein Gedankenfehler bei der Schaltung?
Hallo Wolfgang, habe ein Problem, das ich nicht gelöst bekomme. Wie bekomme ich es hin, zwei Tracks komplett hintereinander abzuspielen, ohne Dauerschleife (loop). Meine Vorstellung wäre, ich habe fünf Tracks in meinem mp3-Verzeichnis, und weise über mein Script an, Track 0002 (komplett, nicht nur für ein paar Sekunden) und danach Track 0004 (ebenso komplett) abzuspielen.
Danke für jeden Hinweis, der mir weiterhilft!
Hallo Ulrich,
das müsste ich selbst probieren. Theoretisch müsste es so gehen, dass du den ersten Track aufrufst und dann immer wieder den Status mit
int status = myDFPlayer.readState() abrufst.
Müsstest du mal schauen, was er antwortet, so lange er abspielt und wenn er fertig ist. Da kommen hoffentlich unterschiedliche Antworten. Und wenn du weißt, dass er fertig ist, spielst du den nächsten Track. Ob das geht, das weiß ich allerdings nicht.
VG, Wolfgang
Hallo Wolfgang, danke für Deine schnelle Antwort. Mein zweiter Beitrag hat sich wohl mit Deiner Antwort überschnitten.
In jedem Falle eine klasse Seite, die Du hier betreibst. Sehr große Hilfe!
Ergänzend zu meinem letzten Beitrag hier noch die Libs, die ich in meinem Sketch verwende:
# include
# include
Viele Grüße, Ulrich
Hallo Wolfgang,
habe mein Problem mittlerweile mindestens „teilgelöst“. Es funktioniert, wenn auch nicht optimal. Ich arbeite bei meiner Lösung mit der .readState() Funktion. Wenn ich den Wert, der vom Player zurückgemeldet wird verarbeiten möchte, muss ich den Sketch für ein paar Sekunden pausieren, sonst klappt die Erfassung und Verarbeitung nicht. Ich habe meinen Sketch mal unten folgend eingefügt. Meine Lösung scheint aber auch stark von der jeweiligen Track-Länge abzuhängen, kann mich da aber auch täuschen. Im Moment muss ich den Sketch um insgesamt 6sec verzögern, um jeden meiner sechs Tracks vollständig abzuspielen. Die Rückmeldungen von .readState() hängen dabei von den Tracks ab. Gibt es da eine Logik? Ich erfasse:
.readState() im Setup-Teil: -1
.readState() vor Abspielen des ersten Tracks: 2
.readState() vor zweitem Track: 2
.readState() vor drittem Track: 0
.readState() vor viertem Track: 0
.readState() vor fünftem Track: 0
.readState() vor sechstem Track: 0
# include
# include
// RX/TX Port definieren
SoftwareSerial DFPlayerSoftwareSerial(11, 10);
// Name des Players
DFRobotDFPlayerMini mp3Player;
//Variable für Track-Auswahl
int track = 1;
//Initierung der Variablen für Gewitter
int LED=8;
int LED2=9;
int helligkeit=0;
int fadeschritte=5;
int zufall=0;
void setup()
{
DFPlayerSoftwareSerial.begin(9600);
Serial.begin(115200);
// Pins für LEDs
pinMode(LED, OUTPUT);
pinMode(LED2, OUTPUT);
mp3Player.begin(DFPlayerSoftwareSerial);
Serial.print(„Die SD-Karte enthält „);
Serial.print(mp3Player.readFileCounts());
Serial.println(“ Songs.“);
//Equalizer definieren
mp3Player.EQ(DFPLAYER_EQ_ROCK);
Serial.println(„Es geht los“);
// Lautstärke 1 .. 30
mp3Player.volume(10);
//Variable für Zustand des Players, prüft ob mp3Player läuft (2) oder nicht (-1)
int betrieb = mp3Player.readState();
Serial.print(„Vor Abspielen des ersten Tracks meldet der mp3Player als Status zurück: „);
Serial.println(betrieb);
}
void loop()
{
if (track < 7)
{
auswahl();
}
if (track == 7){
track = 1;
Serial.println("Track wieder auf 1 gesetzt. Es geht in 10 Sek wieder los.");
delay(10000);
}
}
void auswahl(){
delay(3000);
Serial.print("Wir sind drin. Es geht um Track Nr. ");
Serial.println(track);
int betrieb = mp3Player.readState();
Serial.println(betrieb);
if (betrieb == 0) (betrieb = 2); //Da auch eine Null vorkommt, die ich nicht zuordnen kann, erfolgt an dieser Stelle eine Korrektur auf 2 (kein Betrieb)
switch(betrieb){
case 2:
mp3Player.playMp3Folder(track);
Serial.print("Wir spielen Track Nr. ");
Serial.println(track);
if (track == 2){
blitz3();
blitz1();
}
if (track == 3){
blitz3();
blitz2();
}
if (track == 4){
blitz2();
}
if (track == 5){
blitz3();
}
track ++;
delay(3000);
break;
case -1:
break;
}
}
void blitz1()
{
helligkeit=255;
analogWrite(LED2, helligkeit);
delay(25);
while (helligkeit != 0)
{
helligkeit=helligkeit-5;
analogWrite(LED2, helligkeit);
delay(15);
}
}
void blitz2()
{
helligkeit=255;
analogWrite(LED, helligkeit);
delay(5);
while (helligkeit != 0)
{
helligkeit=helligkeit-5;
analogWrite(LED, helligkeit);
delay(15);
}
delay(1000);
helligkeit=255;
analogWrite(LED, helligkeit);
delay(25);
helligkeit=random(100, 200);
analogWrite(LED, helligkeit);
delay(25);
helligkeit=random(200, 255);
analogWrite(LED, helligkeit);
delay(25);
helligkeit=0;
analogWrite(LED, helligkeit);
delay(100);
helligkeit=255;
analogWrite(LED, helligkeit);
delay(25);
helligkeit=0;
analogWrite(LED, helligkeit);
delay(25);
helligkeit=255;
analogWrite(LED2, helligkeit);
delay(25);
helligkeit=0;
analogWrite(LED2, helligkeit);
delay(25);
helligkeit=255;
analogWrite(LED, helligkeit);
delay(25);
helligkeit=0;
helligkeit=255;
analogWrite(LED, helligkeit);
delay(25);
helligkeit=0;
analogWrite(LED, helligkeit);
delay(25);
helligkeit=255;
analogWrite(LED, helligkeit);
delay(25);
helligkeit=0;
analogWrite(LED, helligkeit);
delay(25);
helligkeit=255;
analogWrite(LED, helligkeit);
delay(25);
while (helligkeit != 0)
{
helligkeit=helligkeit-5;
analogWrite(LED, helligkeit);
delay(15);
}
}
void blitz3()
{
helligkeit=255;
analogWrite(LED2, helligkeit);
delay(5);
helligkeit=0;
analogWrite(LED2, helligkeit);
delay(25);
}
Hallo Wolfgang
erstmal … super Seite die du da hast
ich benötige da mal deine Hilfe
Frage: ist es egal wie RX und TX Board-/Playerseitig verbunden sind?
wie wirkt sich welche Verbindungsoption aus?
ich stelle da bei mir keine Unterschied fest.
normaler Weise ist doch RX to TX und TX to RX, soweit ich das weiß bei anderen Produkten in der Elektronik
muß hier RX to RX und TX to TX verbunden sein?
Danke für die Info
Hi, RX steht für Receiver und TX für Transmitter. Also muss RX an TX und TX an RX. In meinem Beispiel wird dem Pin 10 des Arduino die Funktion RX und Pin 11 die Funktion TX zugeordnet. Das kannst du in Zeile 28 auch umdrehen:
SoftwareSerial mySoftwareSerial(11, 10)
Aber dann musst du auch die Anschlüsse am DFPlayer Mini vertauschen.
VG, Wolfgang
Hallo Wolfgang
freue mich über deine Antwort, Danke !
Die Bedeutung von RX und TX ist mir bekannt auch wie diese i.d.R. „verschaltet“ werden.
Bei meinem Player stelle ich allerdings keinen Unterschied in der Funktion fest, bei div. Optionen von RX/TX Verschaltungen (Player defekt?) .
Daher die vielleicht komisch erscheinende Frage.
Dann habe ich noch eine Frage.
IO1 und IO2 ziehe ich jeweils mit einem Pullup 1K auf High um dann mit jeweils einem Taster die besagten Eingänge auf Low zu schalten.
Das funktioniert auch, aber nur wenn ich einen der beiden Eingänge beschalte, sind beide Eingänge auf High gezogen nimmt er nur den erten Befehl für einen der beiden Eingänge.
Ich teste den Player gerade, auf seine/meine Möglichkeiten da es mein Ziel ist diesen mit einem Triggerimpuls zu starten und dann für eine Zeit X (ca. 10sec) laufen zu lassen. Nach einem erneuten Triggerimplus soll er dann die gleiche Datei ebenfalls für die gleiche Zeit wieder abspielen.
Wenn du RX und TX einfach vertauschen kannst und sich der DFPlayer trotzdem über diese Anschlüsse mit Arduino per SoftwareSerial steuern lässt, dass ist das schon ausgesprochen merkwürdig. Aber letzten Endes, wenn es geht, dann freue dich einfach!
Bei der Steuerung über IO1 / IO2 wird kein Pull-Up benötigt. Siehe Diagramm in Ansteuerung über Taster. Die Anschlüsse sind High und mittels Taster ziehst du sie auf GND. Vielleicht liegt es daran.
Und die 10 Sekunden Schaltung sollte auch kein Problem sein. Entweder über vollständige Steuerung über RX / TX. Oder du schaltest den Strom für den DFPlayer per MOSFET zu und ziehst dann Adkey1 auf GND um dann die Datei Nr. 1 zu starten. Nach 10 s sperrst du dann einfach die Stromzufuhr.
Hallo Wolfgang
danke für den HInweise das es auch ohne Pull-Up / Down Widerstand funktioniert.
Ich habe nun 4 Exemplare hier liegen und alle spielen die Musikdatei ab (ohne R) wenn ich z.b. IO1 auf Ground ziehe. Soweit normal denke ich.
Jetzt habe ich festgestellt, das der Player auch ohne den Arduino läuft.
Ist das normal, ich verstehe diesen Player nicht *grins* .
Hi Ingo,
ja, das gehört so. Es sind einfach nur zwei Optionen, Steuerung per Tasten oder per Software. Per Software kann man komplexere Abläufe steuern. Schön dass es geht.
VG. Wolfgang
Na dann war ich ja doch nicht auf dem Holzweg 😉
ich werde dann den Player nur mit einem Steuerimplus starten, der mir vom Nano eh für meine eigentliche Anwendung bereitgestellt wird.
Meinen einzigen Audiofile (*.mp3) werde ich dann einfach mit nem Musikmaker auf meine 10sec. schneiden/kürzen/bearbeiten.
Da ich mit Visuino arbeite (für die reguläre Programmierung bin ich zu blöd, trotz Buch von Erik Bartmann) bleibt mir die Steurung mit RX-TX leider verborgen.
DANKE @all für die Zeit die ihr euch für mein Problem genommen habt !!!
Hallo, Ich würde gerne den DF player alleine ohne Arduino mit den 2 Adkeys verwenden. Taste 1 (adkey1=Segment1) soll dann Titel abspielen. Drücke ich Taste 2 (adkey2=Segment2) soll dann der andere Titel abgespielt werden.
Habe es aufgebaut doch spielt immer nur den 1. Titel.
Wie sieht die Dateistruktur auf der SD Karte aus?
Was muss ich beachten, damit dann bei jeweiligen Tastendruck die entsprechende Musik startet.
Wäre schön wenn sie mir helfen könnten.
Hallo, Adkey2 spielt Segment5, wenn kein Widerstand dran hängt. Könnte es sein, dass es keinen Titel Nr. 5 gibt? Evtl. weicht er dann auf den ersten Titel aus. Um Segment2 zu spielen, muss der Taster an Adkey1 über einen 3 kOhm Widerstand mit GND verbunden werden, so wie oben im Schaltplan eingezeichnet. Wenn du (ich sage mal einfach „du“) keinen 3 kOhm Widerstand hast, dann funktioniert es sicherlich auch mit einem 2.7 oder 3.3 kOhm Widerstand oder du nimmst drei 1 kOhm Widerstände in Reihe. Alternativ packst du 5 Titel auf die Karte, wobei die Titel 2,3,4 nur eine Dummy Funktion haben. Wenn du nur zwei Titel spielen willst, dann würde ich sie alle ins Hauptverzeichnis packen. Wichtig ist die Benennung „0001.mpg“ usw. Normalerweise würde ich das Hauptverzeichnis nicht nehmen, weil dort die Titel in der Reihenfolge des Aufspielens gezählt werden. Aber da das bei Nutzung der Adkey Tasten bei allen Verzeichnissen der Fall ist, entfällt das Argument.
Hoffe, das hilft!
VG, Wolfgang
Schönen Guten Abend!
Folgendes…. für mein Projekt möchte ich einzelne Audio Dateien über Infrarot Tasten steuern. Sprich, 1 Audio über die 1ste Taste, 2 Audio – 2Taste usw.. Mein Problem ist, dass der Player die Befehle nicht annimmt, ich kann nur vorwärts, Rückwärts, Lauter und Leiser mit der Infrarot Steuern aber wenn ich einzelne AudioDateien auswählen möchte über die Infrarot Fernbedienung, dann geht das leider nicht. Was müsste ich in meinen Code verändern? Hab leider noch keine Lösung gefunden und alleine komme ich nicht drauf.
#include
#include
#include
#include
const int RECV_PIN = 5;
IRrecv irrecv(RECV_PIN);
decode_results results;
// RX auf Pin D10 & TX auf D11
SoftwareSerial mySoftwareSerial(10, 11);
DFRobotDFPlayerMini player;
bool actionPlay = false;
const int PREVIOUS = 0x44;
const int TASTER1 = 0x30;
const int TASTE_2 = 0x718;
const int TASTE_3 = 0x5;
const int TASTE_4 = 0x708;
const int TASTE_5 = 0x31;
const int TASTE_6 = 0x55;
const int TASTE_7 = 0x42;
const int TASTE_8 = 0x52;
const int TASTE_9 = 0x54;
const int NEXT = 0x43;
const int PLAY_PAUSE = 0x40;
const int VOLUME_UP = 0x46;
const int VOLUME_DOWN = 0x15;
void setup() {
mySoftwareSerial.begin(9600);
Serial.begin(115200);
IrReceiver.begin(5, ENABLE_LED_FEEDBACK);
delay(100);
if (player.begin(mySoftwareSerial)) {
Serial.println(„Fehler beim Aufbau der seriellen Verbindung!“);
} else {
Serial.println(„Verbindung zum DFPlayer Mini hergestellt.“);
player.volume(7);
}
}
void loop() {
if (IrReceiver.decode()) {
int command = IrReceiver.decodedIRData.command;
switch (command) {
case PREVIOUS:
player.previous();
break;
case TASTER1;
player.playMp3Folder(0001);
break;
case TASTE_2:
player.playMp3Folder(0002);
break;
case TASTE_3:
player.playMp3Folder(0003);
break;
case TASTE_4:
break;
case TASTE_5:
break;
case TASTE_6:
break;
case TASTE_7:
break;
case TASTE_8:
break;
case TASTE_9:
break;
case NEXT:
player.next();
break;
case PLAY_PAUSE:
actionPlay = !actionPlay;
if (actionPlay) {
player.pause();
} else {
player.play();
}
break;
case VOLUME_UP:
player.volumeUp();
break;
case VOLUME_DOWN:
player.volumeDown();
break;
default:
break;
}
IrReceiver.resume();
}
}
Hallo, auf den ersten Blick kann ich keinen Fehler entdecken. Sind die Audio Dateien in einem Ordner, der MP3 heißt? Funktioniert der Aufruf der Dateien über FullFunction_Modified.ino? Wird TASTER_1, TASTE_2 usw. richtig erkannt? Dazu würde ich mal ein Serial.println(„Taste x gedrückt“) in die entsprechenden „case:“- Abschnitte einbauen. Mehr fällt mir erstmal nicht ein, aber damit wäre der Fehler eingekreist.
„Ergänzung“: habe nun 2 weitere Bibliotheken vom dfplayer hinzugefügt und siehe da…. es funktioniert 😀
Fein!
Hallo zusammen,
Ich experimentiere gerade mit dem DFPLAYERMINI. Prinzipiell funktioniert er soweit ganz gut. Nur leider fehlt mir der Bass. Egal welche Equalizer Einstellung ich wähle. An dem Lautsprecher liegt es nicht. Kann man den bei dem Player anderweitig einstellen? Oder gibt es einen Trick?
Viele Grüße
Claus
Hallo Claus,
nutzt du die Ausgänge SPK+/- oder DAC_R/DAC_L? Wenn du die Ausgänge SPK+/- benutzt, dürfen die daran hängenden Boxen höchstens 3 W haben. Das klingt naturgemäß nicht gerade „satt“. Bessere Ergebnisse erzielt man mit den DAC Anschlüssen über Kopfhörer, externen Verstärker oder Aktivboxen. Mehr fällt mir spontan nicht dazu ein.
VG, Wolfgang
Hallo Wolfgang,
vielen Dank für die schnelle Rückmeldung. Ich nutze die DAC Ausgänge für einen kleinen 2×5 Watt Verstärker und zwei Lautsprecher die laut Hersteller 45-22000hz und 21 W RMS können. In der Equalizer Einstellung „Jazz“ übersteuern sie stark. In den anderen Einstellungen vermisse ich den Bass. Aber vielleicht habe ich auch zu hohe Erwartungen an den kleinen Verstärker/Player.
VG Claus
Wollte neulich einen DFPlayer einsetzen und auf welche Wissensbasis greift man da zurück? Wolles Blog! Wieder mal Danke dafür.
Weshalb ich schreibe – kleine Ergänzung:
Das MP3-Abspielen arbeitet auch, wenn nur die Sendeleitung des Prozessors TX angeschlossen wird und die Empfangsrichtung RX gar nicht verdrahtet wird. Dann kann zwar kein Status des Moduls abgefragt werden und es gibt keine OK-Meldung, die Lib sendet aber ungeniert trotzdem alle Kommandos an den DFPlayer.
Warum das wichtig ist: der ESP8266 hat zwar eine zweite serielle Hardware Schnittstelle „Serial1“, sodass man die erste serielle Schnittstelle als Programmierport frei lassen kann, ist halt leichter zu debuggen. Aaaaber von Serial1 ist nur der TX Pin verdrahtet, den anderen Pin RX gibt es am Modul gar nicht. Sachen gibts.
Auf jeden Fall immer noch besser als SoftwareSerial.
Das Projekt war:
https://youtube.com/shorts/7WrrfCwW81I
Links sind in der Beschreibung.
Danke für den Kommentar und den Link – schönes Video und Projekt. Sehr schön und passt ja auch genau zu Halloween!
Hallo Wolfgang,
der player läuft. Mein problem ist, zwei weitere softwareSerial Schnittstellen (5 6 und 7 8) zu definieren, die ich für
gps und gsm nutzen möchte.
kannst du mir da helfen?
Viele Grüsse
Uwe
Hallo Uwe,
du kannst mehrere SoftwareSerial Instanzen (Objekte) erzeugen. du musst sie nur unterschiedlich benennen. Also z.B.:
SoftwareSerial mySoftwareSerial_1(10,11);
SoftwareSerial mySoftwareSerial_2(5,6);
SoftwareSerial mySoftwareSerial_3(7,8);
Man muss nur ein wenig aufpassen, wenn man auf allen drei Leitungen eingehende Daten erwartet. Solange du Daten über ein SoftwareSerial Objekt empfängst, bist du auf den anderen Leitungen „taub“.
VG, Wolfgang
Hallo Wolfgang, ich habe ein Board gebaut, mit dem ich Sprachausgabe mit dem DFPlayer Mini machen kann. Der DFPlayer Mini ist an der Hardware-seriellen Schnittestelle eines Prozessors CubeCell-AB02 von Heltec angeschlossen. Auf der SD-Karte sind die Wörter jeweils in einzelnen Dateien gespeichert. Das funktioniert auch alles ganz gut. Leider macht der DFPlayer Mini aber aus unerklärlichen Gründen immer wieder Resets (Watchdog?), so dass die Sprache dann eine Zeitlang aussetzt.
Ich habe schon alles mögliche versucht: CubeCell und DFPlayer über jeweils eigene LiPo-Akkus versorgt (besser, aber noch nicht gut), Entkopplung mit 1000µF Elko und 100nF Keramik-Kondensator, Keramik-Kondensator am Eingang des DF-Player auf GND, weil ich auf dem Oszilloskop Spannungsspitzen gesehen habe, half aber nicht.
Jetzt auf Serial MP3 Player YX5300 umgestellt und alles läuft wunderbar!
Gibt es da vielleicht noch irgendeine Idee?
Allerdings ist mir bei dem YX5300 aufgefallen, dass die Organisation auf der SD-Karte total wartungsunfreundlich ist: Man spricht die Dateien nicht über ihren Namen bzw. Teilnamen an, sondern über die Position im Verzeichnis(!?). Also bei jeder Änderung die SD-Karte formatieren, alle Dateien vom PC draufkopieren – dabei stellte ich fest, dass ich noch am Ende eine Dummy-Datei hinzufügen muss, damit das funktioniert.
Hallo Achim, leider kenne ich den CubeCell Prozessor überhaupt nicht. Resets könnten schon auf einen Watchdog hindeuten. Ich kenne das Problem vor allem vom ESP8266, der so etwas wie leere Warteschleifen nicht mag und dort entsprechenden „feed“ Befehlen gefüttert werden muss. Wie das bei dem CubeCell funktioniert weiß ich nicht. Wenn es ein Watchdog Problem ist, dann müsste man mal schauen, was der Unterschied zwischen dem Code für den YX5300 und dem DFPlayer Mini ist. Mehr helfen kann ich glaube ich nicht. VG, Wolfgang
Sehr geehrter Herr Ewald,
ist es möglich mit Hilfe eines Tasters einen bestimmten Ordner auf der SD-Karte auszuwählen?
Ich habe eine Soundbox gebaut (Arduino Mega) mit 30 Tastern, über die ich jeweils einen Song abspielen lassen kann. Das funktioniert sehr gut. Die MP3-Dateien liegen direkt im Hauptverzeichnis. Meine Idee ist nun, weitere 30 MP3s über die Taster abspielen zu können. Hierzu würde ich auf der SD-Karte 2 Ordner anlegen. Diese Ordner möchte ich nun mit 2 weiteren Tastern aufrufen und dann wie bisher die 30 Titel mit den vorhandenen Tastern auswählen. Ist dies überhaupt möglich und wie müßte der Sketch verändert werden?
Vorab schon mal danke für die Antwort.
Hallo Herr Lenz, mit den ADKEY Tasten geht es wohl nicht, aber sonst kann man natürlich einen Taster einbauen, diesen abfragen ob er gedrückt wurde oder über einen Interrupt beobachten. Und wenn er gedürckt wurde dann kann man dem DFPlayer Mini mit myDFPlayer.playFolder(); „sagen“, dass er den Folder wechseln soll. Oder habe ich ich die Problematik nicht erfasst?
VG, Wolfgang Ewald
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?
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
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
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
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.
Merkwürdig. Mit OUTPUT/LOW müsste es eigentlich gehen. Haben der Player und der Arduino ein gemeinsames GND? Das wäre wichtig.
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.
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.
Herr Ewald, ich danke Ihnen für Ihre Zeit und Ihre Mühe. Eventuell muss ich zu anderen Komponenten greifen.
Ich bin jetzt nur per Zufall auf diese Frage gestoßen. Aber vielleicht hilft das weiter: der Adkey1 kann ja über Widerstände unterschiedliche Sounds abspielen. Wenn nur eine Datei vorhanden ist und der Spannungswert der sich durch das externe Schalten ergibt nicht der Datei entspicht (weil nicht vorhanden) wird der DFPlayer stumm bleiben. Bei den Widerständen sehe ich 200K als höchsten Wert, hier fließen also schon sehr kleine Ströme für das Schalten.
Zum Schalten könnte ich mir noch eine Optokoppler vorstellen um jegliche beeinflussung auszuschließen.
Preferieren würde ich jedoch den DFPlayer über eine Soft-Serielle (wenn keine Hardware-Serielle mehr vorhanden ist) anzusteuern. Damit kann der DFPlayer auch mehrer Drum’s abspielen und ist viel flexibler unterwegs.
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
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
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?
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
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.
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.
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
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
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.
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?
Hallo,
ich hatte das identische Problem, bei mir war es tatsächlich nur dadurch verursacht, dass RX und TX vertauscht waren.
Arduino Uno Pin 10 = Tx = DFPlayer Pin 3
Arduino Uno Pin 11 + 1kOhm = Rx = DFPlayer Pin2
Im Code steht „SoftwareSerial mySoftwareSerial(10,11); // RX, TX“
Ich vermute hier sind RX und TX vertauscht – zumindest meine Interpretation als Laie.
Hallo,
beim Kreieren des SoftwareSerial Objekts wird erst RX und dann TX übergeben. Das heißt im Beispiel ist RX (Arduino) = 10 und TX (Arduino) = 11. RX (Arduino) kommt an TX (DFPlayer) und entsprechend die andere Verbindung. So wie auf der Fritzing Schaltung und dem Foto. Vielleicht ist es zunächst verwirrend, dass es „über Kreuz“ geht. Aber RX ist Receiver und TX Transmitter – und dann macht es Sinn.
VG, Wolfgang
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
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
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
Hallo Florian, ein kurzes Signal im Millisekundenbereich ist ausreichend. Am besten verwendest du Taster und keine Schalter. VG, Wolfgang
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
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.
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.
Über Serial.printIn kann ich dann ja auch nichts ausgeben, da das Board am PC ja funktioniert.
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.
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.
Ich weiß, alter Thread, aber die Thematik ist ja dauernd ein Problem, und ich habe die gleichen Erfahrungen gemacht. Daher kurze Ergänzung:
Der DFMini hat zum eine Startup-Zeit (lt. Datenblatt 500 – 1500 ms, je nach Anzahl der Tracks), dazu kommt noch die Rückbestätigung. In dieser Zeit nimmt er keine Befehle an!
Und weil der Player nach jedem Befehl IMMER auch noch ein „ACKnowledge“ zurücksendet, funktioniert das vermutlich auch nicht, wenn die Befehlszeilen im Setup direkt hintereinander kommen. Dann kommen sich die erste Rückbestätigung und der neue Befehl wohl in die Quere. Ein kurzes Delay von 50 – 100 ms reicht jedenfalls aus, um zuverlässig zu steuern.
Vielen Dank!
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
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.
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.
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.
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.
Es wird immer von SD-Karte, USB-Stick und „Flash“ oder NOR-Flash gesprochen, also drei Varianten, manchmal sogar vier.
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.
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 !
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
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.
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.
Schön, dass es jetzt klappt!!!
Die drei ??? und der Fluch der Feststelltaste, jiihaaa! Man siehts im chromglänzenden Lautsprecher.. 1a!
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“
„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.
Sehr schön, sag mal Bescheid, wenn du den Artikel fertig gestellt hast, dann können wir ihn hier verlinken.
Das Tool meiner Wahl für dieses Problem heißt drivesort.exe ( https://www.portablefreeware.com/index.php?id=2614 )
nach dem Kopieren der mp3-Dateien auf die SD-Karte das Tool einmal drüberlaufen und sortieren lassen – und schon hat man die richtige Reihenfolge auch im dfmini-mp3-Player
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
Hallo Paul, danke für das Teilen deiner Erfahrungen. Schön, dass es geklappt hat! VG, Wolfgang
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!
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
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?
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.
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?
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.
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!
Viel Erfolg!
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
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.
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.
Richtig ist, dass du mehrere DFPlayer anschließen kannst. Es ist aber seriell und nicht I2C. Das heißt für jede Verbindung ein eigenes RX/TX Paar mit eigenen Leitungen.
Schau mal hier, da geht es auch um mehrere DFPlayer im Parallelbetrieb: https://forum.arduino.cc/index.php?topic=627435.0
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
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….
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.
Moin Wolfgang,
ich habe das gleiche Problem und suche nach einem Modul, das das kann. Startet die Wiedergabe nicht, wenn man loop all (51kOhm an ADkey1) aktiviert? Sonst könnte man ja den Widerstand einfach fix anlöten.
Falls das nicht geht, zweite Idee: Dasselbe Stück fünf mal auf die Karte packen, 51k an ADkey1 und 0 Ohm an ADkey2, damit Stück 5 gestartet und dann alle im Loop gespielt werden, sobald Versorgungsspannung anliegt. Funktioniert das?
Gruß und Dank
Jan
Ja, genau. 51 kOhm für Dauerschleife oder 0 kOhm für den ersten Titel. Sollte gehen, ich habe aber nicht ausprobiert, ob es auch funktioniert, wenn die Adkey – GND Verbindung schon beim einschalten besteht. Ich gehe aber davon aus.
VG, Wolfgang
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?
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!
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
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.
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!
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.
Die Funktion zum Abspielen von Dateien im MP3 Folder lautet: „myDFPlayer.playMp3Folder(Nummer des Tracks)“.
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
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.
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
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?
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
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
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
Hallo Wolfgang
Wie frage ich ab, wann ein Titel zu ende ist, damit ich den Nächsten starten kann?
Grüße
Martin
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.
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!
Hi Andreas, schön dass es funktioniert. Ich muss mir das in Ruhe nochmal anschauen. Vielen Dank auf jeden Fall!
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.
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.