DFPlayer-Modul

DFPlayer Mini Modul

Merkmale des DFPlayer

Technische Daten

Anschlüsse

Anschlüsse des DFPlayer Mini
Abb.: Anschlüsse des DFPlayer Mini
Nr Pin Beschreibung Funktion
1 VCC Betriebsspannung 3,3V - 5V
2 RX UART serieller Eingang
3 TX UART serieller Ausgang
4 DAC_R Audio-Ausgang (rechter Kanal) für Kopfhörer oder Verstärker
5 DAC_L Audio-Ausgang (linker Kanal) für Kopfhörer oder Verstärker
6 SPK2 Lautsprecher (-) für passive Lautsprecher bis zu 3 Watt
7 GND Ground
8 SPK1 Lautsprecher (+) für passive Lautsprecher bis zu 3 Watt
9 IO1 Trigger port 1 Short press to play previous (long press to decrease volume)
10 GND Ground
11 IO2 Trigger port 2 Short press to play next(long press to increase volume)
12 ADKEY1 AD Port 1 Trigger play first segment
13 ADKEY2 AD Port 2 Trigger play fifth segment
14 USB+ USB+ DP USB Port
15 USB- USB- DM USB Port
16 BUSY Play status LOW: Geräte spielt; HIGH: Geräte in Ruhe

Bedienung

Zum Steuern des MP3-Moduls steht eine serielle Schnittstelle zur Verfügung. Eine Befehlssequenz besteht immer aus zehn Byte:

Byte Bedeutung
0x7E Startbyte
0xFF Versionsbyte
0x06 Anzahl der Bytes beginnend mit dem Versionsbyte bis einschließlich dem LSB des Parameters, immer 0x06
CMD Befehlsbyte (siehe Steuerbefehle)
FB Feedback, 0x01: Gibt Feedback zurück, 0x00: kein Feedback
PMSB Höherwertiges Byte des Parameters
PLSB Niederwertiges Byte des Parameters
CMSB Höherwertiges Byte der Prüfsumme
CLSB Niederwertiges Byte der Prüfsumme
0xEF Endbyte

Die Prüfsumme berechnet sich aus der folgenden Formel:
0 - Versionsbyte - Anzahl der Bytes - Commandbyte - Feedback - Parameter_MSB - Parameter_LSB
Wenn dann das Ergebnis im Hexadezimalformat vorliegt, ergeben die rechten vier Stellen der Hexadezimalzahl die Prüfsumme. Aus diesen nunmehr vier Stellen ergeben die linken zwei Stellen (ein Byte) das Checksum_MSB und die rechten zwei Stellen (ein Byte) das Checksum_LSB.

Dateinamen

Audiodateien, die direkt im Hauptverzeichnis des Speichermediums (SD-Karte oder USB-Flash) gespeichert sind (maximal 3000 Dateien), müssen in 0001.mp3 / 0001.wav, 0002.mp3 / 0002.wav, 0003.mp3 / 0003.wav, ....... 3000.mp3 / 3000.wav usw. umbenannt werden.
Nach dem vierstelligen numerischen Wert kann weiterer Text entsprechend dem verwendeten FAT-Format verwendet werden (z.B. 0001_Testdatei.MP3)
Grundsätzlich unterstützt das Modul auch verschiedene Unterverzeichnisse \00 bis \99 mit dreistelligen Dateinamen (001.MP3 bis 255.MP3).
In den Ordnern "/MP3" und/oder "/ADVERT" können jeweils bis zu 9999 Dateien gespeichert werden. Die oben genannten Namensregeln gelten aber auch hier.

Hinweis: Es ist wichtig zu wissen, dass in der Folge beim Absetzen eines Befehls keine tatsächlichen Dateinamen übergeben werden, sondern eine Platznummer welche sich aber auf die tatsächliche physikalische Position in der Dateizuordnungstabelle (FAT) des Mediums bezieht und nichts mit dem Dateinamen zu tun hat. Von daher ist es von essentieller Bedeutung in welcher Reihenfolge die Dateien auf das Speichermedium übertragen werden.

Aufbau mit "AD-Key-Modul"

Aufbau der Schaltung AD-Key-Modulen
Abb.: Laut dem Manual des Herstellers kann ein Aufbau mit sog. AD-Key-Modulen stattfinden. (Nicht getestet!)

Minimaler Aufbau

Minimaler Aufbau der Schaltung
Abb.: Laut dem Manual des Herstellers ist dies der minimalste Aufbau.
Video: Live-Demonstration des DFPlayer mit Minimal-Konfiguration (hier wurde nur Pin9 mit einem Taster belegt, damit die mp3-Tracks weitergeschaltet werden konnten. Es wurden freie Demo-Audioeffekte von der Website SoundBible verwendet.

Aufbau mit dem Arduino

Steuerbefehle

Hinweis: Es kann sein, dass nicht jeder Befehl bei jedem Modul funktioniert oder plausible Daten zurück gibt.

Befehle

Befehlsbyte Funktion Parameter (16bit)
0x01 Spielt die nächste Datei -
0x02 Spielt die vorherige Datei -
0x03 Spielt eine bestimmte Datei aus dem Hauptverzeichnis [0..2999] bzw. [1..3000]
0x04 Lautstärke um 1 erhöhen -
0x05 Lautstärke um 1 verringern -
0x06 Lautstärke auf bestimmten Wert setzen [0..30]
0x07 Equalizer auf Preset setzen [0..5] = [Normal, Pop, Rock, Jazz, Klassik, Bass]
0x08 Abspielmodus setzen [0..3] = [repeat, folder repeat, single repeat, random]
0x09 Setzt die Datenquelle fest [0..4] = [U, TF, AUX, SLEEP, FLASH]
0x0A Modul in Standby-Modus versetzen -
0x0B Modul in den Normal-Modus versetzen (aufgeweckt) -
0x0C Modul zurücksetzen und gibt den Status zurück -
0x0D Spielt einen pausierten Track weiter oder startet den aktuellen Track -
0x0E Pausiert den gerade abgespielten Track
0x0F Spielt eine Datei aus dem Ordner [1..10] bzw. [1..99]
0x10 Schaltet den Verstärker ein oder aus und setzt den Verstärkungsfaktor DH=1: Open volume adjust; DL: set volume gain [0..31]
0x11 Schaltet das wiederholende Abspielen aller Datein ein oder aus 1: einschalten; 0: auschalten
0x12 Spielt eine Datei aus dem Ordner "/MP3" ab [1..9999]
0x13 Unterbricht die laufende Datei, spielt eine Werbeunterbrechung aus "/ADVERT" und setzt das Abspielen fort [1..9999]
0x14 Spielt eine Datei aus einem "großen" Ordner ab [1..15]
0x15 Beendet das Abspielen einer ADVERT-Datei und setzt danach das abspielen der zuvor unterbrochenen Datei wieder fort
0x16 Beendet das Abspielen des laufenden Tracks
0x17 Wiederholt die Dateien aus dem Ordner [1..99]
0x18 Spielt alle Dateien des Mediums in zufälliger Reihenfolge
0x19 Spielt eine laufende Datei wiederholend ab
0x1A Schalte den Verstaerker stumm

Abfragen

Befehlsbyte Funktion Parameter (16bit)
0x3F Gibt das aktuelle Speichermedium zurück [1..4]
0x42 Gibt den aktuellen Status zurück
0x43 Gibt den aktuellen Lautstärkepegel zurück
0x44 Gibt den aktuellen Equalizer-Modus zurück
0x45 Gibt den aktuellen Abspiel-Modus zurück
0x46 Gibt die aktuelle Softwareversion zurück
0x47 Gibt die Anzahl der Dateien vom Medium USB-Speicherstick zurück
0x48 Gibt die Anzahl der Dateien vom Medium SD-Karte zurück
0x49 Gibt die Anzahl der Dateien vom Medium Flash zurück
0x4B Gibt die momentan gespielte Datei vom Medium SD-Karte zurück
0x4C Gibt die momentan gespielte Datei vom Medium USB-Speicherstick zurück
0x4D Gibt die momentan gespielte Datei vom Medium Flash zurück
0x4E Gibt die Anzahl der Dateien im abgefragten Ordner zurück
0x4F Gibt die Anzahl der Ordner auf dem Medium zurück

Verwendete Bauteile

Aufbau der Schaltung mit dem Arduino
Abb.: Aufbau der Schaltung mit dem Arduino

Der folgende Sketch ist eine Demo, die auf der Library DFRobotDFPlayerMini basiert:

#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.print(F("Init DFPlayer..."));
    if (!myDFPlayer.begin(mySoftwareSerial)) {
        Serial.println(F("Error!"));
        while(true);
    }
    Serial.println(F("[ok]"));

    //Set volume value. From 0 to 30
    myDFPlayer.volume(17);

    myDFPlayer.play(1); // Play the first mp3
}

void loop()
{
    static unsigned long timer = millis();

    //Play next mp3 every 10 seconds
    if (millis() - timer > 10000) {
        timer = millis();
        myDFPlayer.next();
    }

    if (myDFPlayer.available()) {
        printDetail(myDFPlayer.readType(), myDFPlayer.read()); //Print the detail message from DFPlayer to handle different
    }
}

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 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;
            }
            break;
    }
}
zurück