DFPlayer Mini - Aktuellen Dateinamen auswerten?

Hallo Freunde der Bits und Bytes,
nach langer Zeit mal wieder eine echte „Frage“ an die Gemeinschaft.

Vorgeschichte:

Generell betreibe ich am Arduino lediglich (teils recht intensive) „Grundlagenforschung“. Ich habe schon vieles herausgefunden und durch äußerst erfolgreiche Experimente bestätigt bekommen („SudokuSolver Uno“ oder auch „Schach auf 328p“). Im Zusammenhang mit meinem parallelen Hobby „Modellbau“ bin ich letztens über den „DFPlayer“ gestolpert und konnte dieses Teil ebenfalls problemlos in Betrieb nehmen. Nebenbei habe ich für die örtliche Kirchengemeinde speziell zum "500. Jahrestag der Reformation" - ein Modell der hier ansässigen „Martin-Luther-Kirche“ gebaut. Alles zusammen brachte mich auf den Gedanken, dieses Modell mit einstellbarem Glockenklang zu bestücken...

So weit, so gut. Der DFPlayer beherbergt diverse MP3-Files mit verschiedenen Klängen - auch ein paar „versteckte und haarsträubende Glocken-Sounds“... Diese Files kann ich per DIP-Schalter auswählen sowie 'Volume' und 'Next Track' mittels Taster steuern. Je nach Schalter-Stellung betreibe ich den Player alternativ als USB-Stick, um die Files direkt vom PC aus pflegen zu können. Übrigens alles auf einem ATTiny 84 – schön kompakt und übersichtlich. Bei diesen Versuchen mit dem DFPlayer ist mir jedoch etwas aufgefallen, was mich irritiert.

Daher die Frage:

Ist es irgendwie möglich, an Hand der (evtl. zufällig) ausgewählten Dateinummern zum Abspielen auch den dazu gehörenden „kompletten“ Dateinamen auszuwerten?

Zum Beispiel aus:

0001_Glockenklang_Martin_Luther_Kirche.mp3
0002_Klang_Katholische_Kirche.mp3
0003_Die_Glocken_Von_Rom.mp3
0004_Tuerglocke_Tante_Emma_Laden.mp3
...
0031_Leonard_Cohen_Halleluja.mp3
0032_AC_DC_Hells_Bells.mp3 :wink:

Hierzu wäre es für eine spätere Version meiner Bastelei mit geplantem LCD-Display und mehreren 100 Dateien sehr vorteilhaft zu wissen, welcher Titel gerade gespielt wird. Gibt es also auf dem DFPlayer hierfür eine Funktion, die ich vielleicht ständig übersehe? Oder hat jemand vielleicht eine Idee, wie man so etwas im Zweifelsfalle alternativ lösen könnte?

Sorry wenn diese Frage schon woanders beantwortet wurde - ich habe leider nichts gefunden, was meine eigene Frage endgültig klärt.
LG, Rudi

Hallo Rudi,

Auf dem DFPlayer ist mir keine derartige Funktion bekannt.
Allerdings wo nimmst du die "Zufälligkeit" her ?
Steuert das der Arduino ? Dann hast du doch die Nummer und kannst darüber den Titel ermitteln.
Evtl. über eine SD-Card-Funktion.

Macht es der DFPlayer habe ich keine Idee.

Moin Moin HotSystems,

grundsätzlich hat der DFPlayer eine Funktion "randomAll()", diese dudelt dann in der Tat aus dem gesamten Pool an MP3s irgend ein zufälliges Lied. Seltsam ist nur, dass beim Start das ERSTE immer das selbe ist, danach lässt sich nix mehr vorhersagen. Daher habe ich den Arduino dazu bewegt, selbst den "Zufall" zu übernehmen und initialisiere "randomSeed" halt über millis() & Tastendruck beim Start - so als eine Art "SplashScreen", bei dem ich nie in der selben Millisekunde auf "Go" drücke(n kann). DAS bringt echten (Pseudo-) Zufall.

Dadurch bekäme ich "natürlich" die Songnummer geliefert - aber nicht den vollständigen Dateinamen. Bei wenigen Files wie z.B. 25 Songs könnte man natürlich die Titel im PROGMEM ablegen und von dort auslesen. Ganz einfach eben. Nur wenn ich auf meiner 8 GB Karte ca. 1700 MP3s hinterlege ... wird das nicht mehr machbar.

Das nächste Dilemma ist dann, von genau "dieser" SD-Karte "life" über eine eventuelle SD-Bibliothek auf die Dateien zuzugreifen. In diesem Fall fehlt mir aber am DFPlayer die sonst übliche SPI-Schnittstelle, über die ich das dann seriell auslese ... Oder geht das auch über das eingebaute RX/TX ??

Damit bin ich im Moment etwas am hadern...
vy73

Abgsehen vom Zugriffsproblem (daran scheitert es dann evtl. wirklich):
mp3tag erlaubt es ausgewählte Tags in Text Dateien zu exportieren. Ist ein kleiner Umweg aber du könntest dann einfach die entsprechende Zeile in der Datei auslesen

Hallo Serenifly,

danke für die Info. Sicherlich, den "mp3tag" kenne ich sehr wohl, auch habe ich diesen selbst schon öfters ausgelesen und ggf. neu gesetzt. So weit so gut.

Es bleibt aber immer noch das Problem, mittels DFPlayer "direkt" auf die Dateien zuzugreifen, wie es z.B. über die SD-Library geschehen könnte. Es steht beim DFPlayer lediglich RX/TX mit einer handvoll festen Kommandos zur Verfügung. Ich habe im Moment halt noch keinen Plan, wie ich das dermaßen umsetze, damit ich an Stelle von SPI derart auf die Header (und/oder den Dateinamen) zugreifen kann. Auch habe ich im Forum von DFRobot und Google nichts annähernd brauchbares dazu gefunden.

Ein "Dirty Trick" wäre im Moment lediglich, bei meinen vielen MP3s die Interpreten und Titel in einem EEPROM zu hinterlegen. Rein rechnerisch müsste es (mit Kompression) auf einem 24FC1025 gut funktionieren. Nur erfordert das wieder ein zusätzliches Programm auf dem PC, welches mir die Daten entsprechend aufbereitet.

Und diese Arbeit hätte ich mir gerne erspart :wink:

Wenn Du sowieso eine SD nutzt, kannst Du das doch auch darauf abspeichern. Da ist doch Platz und die Pflege der Musik machst Du sowieso am PC. Da kannst Du diese Datei gleich mit pflegen und aufspielen.

Gruß Tommy

Hi Tommy,

auch daran habe ich längst schon gedacht. Aber dann fehlt mir immer noch die Info, wie ich mittels RX/TX am DFPlayer auf die laufende SD-Karte zugreifen soll?! Oder wo habe ich nun das Brett vorm Kopf?

Nein. Das geht wohl wirklich nicht

Die Karte ist im DF-Player? Ich dachte am Arduino.
Ok, dann habe ich mich wohl zu weit aus dem Fenster gebeugt. Den kenne ich leider nicht. Da müßtest Du mal im Datenblatt schauen, ob es da Zugriffsmöglichkeiten auf die SD gibt.

Ansonsten: Da sich die Musik ja auch ändert, wäre evtl. ein FRAM anstelle eines EEPROM angesagt (unbegrenzte - oder zumindest wesentlich höhere) Anzahl Schreibzyklen. Ist problemlos über I2C anzusteuern. Ich habe da mal was geschrieben, wenn Interesse besteht.

Gruß Tommy

In der Tat, die SD-Karte mit den MP3s ist im DFPlayer - und dort liegt wohl wahrscheinlich das größte Problem.

Okay, ein FRAM wäre gegenüber einem EEPROM sicherlich eine alternative Erwägung, aber soooo oft ändert sich die Musik nicht. Auf dem PC sind meine MP3s nach Alben usw. sortiert, und wenn ich ca. 1750 gesammelt habe ist meine 8 GB Karte eh ziemlich voll. Da ändert sich dann auch nix mehr dran und ich könnte lange Zeit Berieselung genießen, ohne dass sich die Titel zu schnell wiederholen. Es wäre dann auch noch viel Zeit übrig, eine 16 GB oder 32 GB Karte zu füllen. Aber so viele "gut anhörbare" MP3s müssen erst mal zusammenkommen...

Nur eben so ein separates EEPROM "einmalig" zu füllen - das wollte ich mir irgendwie ersparen.
Dennoch Danke fürs Angebot. Vielleicht komme ich drauf zurück.

Mit einem Host-Shield oder einem Arduino mit USB-Host Interface könntest du auf die Dateien zugreifen,
habe ich aber noch nicht versucht. Der DFPlayer scheint jedenfalls ein USB Interface zu haben.

dfrobot.com/wiki DFPlayer_Mini

Hi Whandall,
stimmt, der DFPlayer kann auch als simpler USB-Stick geschaltet werden mit der Möglichkeit, vom PC (oder sonst wo her) die Daten direkt zu pflegen und abzurufen. Das habe ich schon erfolgreich ausprobiert. Jedoch erscheint es mir (im Moment) etwas weit hergeholt, ein Shield auf den Arduino zu packen. Ich würde das Ding gerne so klein, kompakt und autonom wie möglich halten und bauen, am besten ein einzelner Controller mit etwas Peripherie und Software - fertig.

You don’t get something for nothing. :wink:

So groß sind die Dinger auch nicht (habe selbst keinerlei Erfahrung damit)

Mini-USB-Host-Shield-2-0-for-Arduino-ADK-SLR-development-tool
HostShield1.png
Wenn ich einen MP3 Player (ausser zur reinen Geräuscherzeugung) benutzen wollte,
würde ich auf einen Zugriff auf die Dateien und damit die MP3 Tags nicht verzichten wollen.
Macht aber hauptsächlich mit einer Anzeige Sinn.

Na super, dieses Gerätchen ist ja wirklich mal etwas in meiner angestrebten Größenordnung. Das werde ich genauer untersuchen ob es für mich in Betracht kommt.
:slight_smile:
Vielen Dank für die Info

Nachsatz

Noch einmal ein herzliches Dankeschön für die gut gemeinten Hinweise und Vorschläge zur Lösung meiner Projekt-Idee.

In den vergangenen Tagen hatte ich etwas Zeit, mich mit den Tipps und Ratschlägen zu befassen und habe eine Entscheidung getroffen: Da es offensichtlich nicht möglich ist, den angesprochenen Dateinamen auf dem MP3-Player „direkt“ zu ermitteln – werde ich die damit verbundenen Textdaten tatsächlich in einem externem EEPROM unterbringen. Der Weg über einen USB-Host erscheint mir ebenfalls als viel zu großer Umweg und würde meinem Plan „kompakt und einfach“ deutlich entgegenstehen. Den Aufwand an zusätzlicher Software wollte ich mir zwar gerne ersparen – aber manchmal bleibt einem nichts anderes übrig als solche „Klimmzüge“ zu machen. Nun denn, die dazu notwendigen Hardware-Komponenten spielen als einzelne Module bereits optimal zusammen. Nun habe ich „nur noch“ eine gemeinsame Platine zu entwerfen und etwas Programmier-Arbeit zu leisten...

Auf der PC-Seite

Meine bisherigen ca.1800 Lieblings-MP3-Dateien liegen aufbereitet und schön sortiert nach Interpreten auf der Festplatte. Diese kann ich mit DELPHI einlesen und aus den Dateinamen die entsprechenden Informationen aufbereiten. Hierzu erstelle ich zwei Tabellen: Eine mit ca. 500 Interpreten und eine mit den Titeln, zu denen der Interpret als Kennziffer hinterlegt ist. Diese beiden Listen übertrage ich seriell auf ein großes EEPROM und kann sie entsprechend auslesen. Da ich feste Datensatz-Längen verwende klappt das auch optimal mit der Verwaltung. Die Menge der Daten füllt eine 8GB SD-Karte und ein externes EEPROM nahezu vollständig aus.

Hardware auf der AVR-Seite

Bei den oben erwähnten einzelnen Modulen handelt es sich um folgende Geräte:

  • MP3-Player – Der besagte DFPlayer-Mini, der das Dudelnde Etwas darstellt
  • Display – Eine 20x4 LiquidCrystal-Anzeige in Verbindung mit einem PCF8574 via I2C
  • Tastatur – Eine Tastenmatrix 3x3, die analog angeschlossen und deutlich unterschiedliche Signale liefert
  • EEPROM – Ein 24FC1025 via I2C mit 2 mal 64 kByte Speicher, gut ausreichend für 1800 + 500 Datensätze
  • Controller – Ein AT Tiny 85 (!) – DIP8 mit 8 kByte Flash sowie je 512 Byte SRAM und internem EEPROM

All diese einzelnen Platinchen sind im Moment via Steckverbindungen zusammengeschaltet und funktionieren seit Tagen – abgesehen von relativ seltenen Wackelkontakten - ohne Probleme.

Software auf der AVR-Seite

Die vollständige Software besteht aus den Bibliotheken

  • SoftwareSerial.h
  • LiquidCrystal_I2C.h
  • TinyWireM.h
  • USI_TWI_Master.h
  • DFRobotDFPlayerMini.h
  • EEPROM.h
  • TEeprom_I2C.h (Eigenbau)
  • TSimpleMenu.h (Eigenbau)
  • TSimpleTimer.h (Eigenbau)
  • TAnalogButtons.h (Eigenbau)

sowie einigen „normalen“ Funktionen zur Verwaltung. Man kann vielleicht denken „das passt doch alles gar nicht in 8 kByte...“ Ähm, doch, das passt relativ gut - weil ich (bis auf SoftwareSerial.h) alle Bibliotheken „zerpflückt“ und extrem abgespeckt direkt im Code integriert habe, teils als Objekte, teils als Funktionen. Letztendlich verbraucht alles zusammen in der ersten Version nur noch ca.6100 von ca.8200 Bytes FLASH und ca.250 von ca.500 Byte RAM. Es bleibt also noch genügend Raum, das Menü aufzuhübschen, ein paar Dialoge und Optionen einzubauen. Falls es am Ende doch noch eng wird lager ich die Menü-, Dialog-Texte und andere Konstanten ins interne EEPROM aus – und erhalte einen netten Eigenbau-MP3-Player, der kaum Wünsche übrig lässt. Wahrscheinlich funktioniert sogar eine beliebig einstellbare Playliste und die Auswahl bestimmter Interpreten.

Okay, und da ich noch weitere MP3s sammel – bereite ich die zukünftige Platine für drei weitere EEPROMs vor und nehme halt eine 16GB- oder 32GB-Karte. Das ist genügend Lieblings-Mukke für lange Zeit, die ich sogar auf Batterie- oder Akku-Betrieb unterwegs arbeiten lassen kann. Wenn ich mit der ersten Ausbaustufe fertig bin, kann ich ja (falls Interesse besteht) das ganze Dingen zeigen. Eventuell inkl. Sketch, Schaltplan und Doku. Man(n) hat ja sonst nix besseres zu tun :wink: :slight_smile:

Bis demnächst
Rudi

Man kann vielleicht denken „das passt doch alles gar nicht in 8 kByte..." Ähm, doch, das passt relativ gut..."

Gratulation zu diesem ambitionierten Projekt!

@uxomm
Danke für die Blümchen :wink:

In dem Projekt steckt so einiges interessantes und aufschlußreiches drin! Vor allem wenn man anfängt zu verstehen, was in den LIBs im Hintergrund abläuft. Das ist genau das andere Ende der Fahnenstange, wo man 4 Shields stapelt, 7 Bibliotheken einbindet und nach 30 Zeilen Code betet, dass alles klappt... :smiley:

Ein wohl letzter "Nachbrüller"...

Etappen-Ziel erreicht! Mein kleiner "DFPlayer.85" zeigt nun tatsächlich Titel und Interpreten an! Heißt: Ich habe (bisher) 1.400 MP3s von der PC-Festplatte auf die SD-Card kopiert, daraus zwei Listen generiert (Titel und Interpreten) inkl. Verknüpfungen der Datensatz-Adressen, sowie diese Listen mit einem eigenen Terminal-Programm in ein EEPROM 24FC1025 (128 kByte) übertragen. Datensatzlänge 64 Bytes je Song inkl. Verknüpfungs-Adresse. 1x EEPROM und 1x 8GB-SD reichen für ca. 1800 Songs. Der ATTiny 85 (8 kByte) ist nun aber - trotz Optimierungen - schon recht voll geworden (7.374 von 8.194 FLASH; 317 von 512 SRAM) und ich musste die Menü- und andere Display-Texte tatsächlich ins interne EEPROM auslagern. Egal, etwas Platz für "Spielerei" bleibt noch, weil alle gewünschten Funktionen wie "gezielte Songauswahl", "USB-Modus" etc. bereits vorhanden sind und funktionieren.

Jetzt bleibt "nur noch" meine MP3-Sammlung zu vervollständigen (noch ein paar CDs scannen) und eine Platine (evtl. 'n nettes Gehäuse) zu entwerfen. Das Kabelgedöns inkl. I2C zwischen ATTiny 85, EEPROM, LCD-Display, DFPlayer und Analog-Tastatur 3x3 ist recht gierig auf "Wackler" :wink:

Man liest sich bei Fertigstellung
LG, Rudi