Eigenbau MP3 Funkgong mit DFPlayer Mini

Begonnen von kaihs, 25 Februar 2017, 01:17:53

Vorheriges Thema - Nächstes Thema

kaihs

Es gibt ein günstiges MP3 Modul Namens "FN-M16P Embedded MP3 Audio Module" (Datenblatt). Oft wird es unter dem Namen DFPlayer Mini angeboten.
Dieses ist in China für unter 2€ zu bekommen und hat u. a. folgende Eigenschaften:

       
  • Steuerbar über serielle Schnittstelle und/oder Tasten
  • Kann mehrere tausend mp3/wav Dateien von SD-Karte und USB-Stick abspielen
  • Enthält einen eingebauten 3W Verstärker für den direkten Anschluss eines Lautsprechers
  • Hat einen Kopfhörerausgang an den auch ein externer Verstärker angeschlossen werden kann
Es gibt auch negative Punkte:

       
  • hohe Ruhestromaufnahme von 20mA, daher ohne weitere Maßnahmen nicht für Batteriebetrieb geeignet
  • etwas merkwürdige/inkonsistente Kommandos
  • kein Streaming möglich, die Dateien müssen auf dem angeschlossenen Speichermedium vorhanden sein
Ich habe dafür ein Modul geschrieben, mit dem der Player vollständig gesteuert werden kann. Außerdem unterstützt es dabei das Speichermedium mit mp3 Dateien zu füllen und diese einfach abzuspielen.
Anwendungsfall ist hauptsächlich Sprachausgabe von vorgefertigten Sprachkonserven.
Durch eine Anbindung an das Text2Speech Modul unterstützt das Modul bei der Erzeugung dieser Sprachkonserven.

Getestet habe ich die Anbindung

       
  • direkt an einer seriellen Schnittstelle bzw. per USB2Seriell-Wandler
  • über TCP/IP mittels einer transparenten seriellen Bridge (z. B. ESPEasy Ser2Net)
  • als MySensors Node mit Hilfe eines speziellen Sketches

Die ersten beiden Möglichkeiten sind sehr einfach, Beispiele:

define dfp_usb DFPlayerMini /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A9ED9FNB-if00-port0@9600



define dfp_easy DFPlayerMini 192.168.2.28:23


Die Anbindung an MySensors ist etwas komplizierter:

  • Das MySensors Gateway muss bereits in fhem vorhanden sein
  • Anhängenden Sketch auf einen Arduino flashen, der RX-Pin des DFPlayers muss über einen 1kOhm Widerstand an Pin 3, der TX-Pin an Pin 4
  • MySensors GW in den inclusion-mode versetzen
  • Arduino starten, danach sollte per autocreate ein neues MySensors Device angelegt worden sein, dieses in mys_dfp umbenennen
  • DFPlayer Device ohne direkte Hardwareanbindung erstellen (define dfp_mys DFPlayerMini none)
  • Antworten von der Hardware die im MySensors Device ankommen müssen an das dfp_mys Device weitergeleitet werden, das macht ein notify
    (define ntfy_dfp_mys_receive notify mys_dfp:value11:.* set dfp_mys response $EVTPART1)
  • Das dfp Device muss die Kommandos über das MySensors Device an die Hardware schicken, dafür das Attribut sendCmd setzen
    (attr dfp_mys sendCmd set ntfy_dfp_mys_receive inactive; set mys_dfp value11 $msg; set ntfy_dfp_mys_receive active)

Weitere Dokumentation findet sich in der commandref des Moduls.
Das Kopieren der mp3 Dateien mit Hilfe dieses Moduls wird aktuell wohl nur auf einem Unix System funktionieren, weil ein bash-Script erzeugt wird das dem Text2Speech Modul als MPlayer Kommando untergeschoben wird.

Das Modul und der Sketch sind noch im Alpha-Stadium und könnten weitere Tests brauchen.

Fragen beantworte ich hier natürlich gerne.

Edit 12.3.2017:

Aktualisierte Version des Moduls.
- Bugfixes
- Bessere Einbindung von Text2Speech, braucht die aktuellste Version von 98_Text2Speech
- neue Sets tts, uploadTTScache
Banana Pi, Add-On Board mit 1.8" TFT LCD und IR-Sender, CULFW V1.61, div. Homematic Komponenten, Pollin Funksteckdosen, Selbstbau CUL433 MHz, Jeelink Clone, EC3000
Selbstbau CUL868MHz für Wireless M-Bus, SIGNALduino mit Logilink Temp.-sensoren und Auriol Wetterstation

ArduPino

Kann man eigentlich auch per nanoCul einen Code senden und diesen per Arduino/Attiny mit 433 Empfänger empfangen? Damit wäre eine Funksteuerung des MP3 Players möglich.

Gesendet von meinem Wileyfox Swift mit Tapatalk


kaihs

#2
Die Funksteuerung ist jetzt schon möglich.

Entweder per WLAN mit einem ESP8266 und ESPEasy Firmware oder mit MySensors.
MySensors kann man auf 2,4GHz, 868 und 433MHz nutzen, je nachdem welches Funkmodul man einsetzt. Den passenden Sketch habe ich ja auch veröffentlicht.

Prinzipiell unterstützt mein Modul auch jede andere Art von Übertragung, dafür ist das Attribut sendCmd und das set response gedacht.
MySensors habe ich so angebunden, siehe das Beispiel im 1. Post.

Theoretisch kann auch ein nanoCUL verwendet werden. Was dann noch fehlt ist ein passendes Übertragungsprotokoll mit Unterstützung in der culfw das 10 Bytes Nutzdaten übertragen kann und sich um die Adressierung, Acknowledge, Fehlerkorrektur, Signierung, Verschlüsselung kümmert.
Die 10 Bytes könnte man noch auf die wirklich wichtigen 4 Bytes verkürzen, siehe Datenblatt Kapitel 3.1.

Wahrscheinlich könnte man das IT-Protokoll nutzen, wenn man ein passendes Programm auf Empfängerseite hat das die übertragenen Daten wieder in das Format konvertiert was der DFPlayer versteht.
Besser wäre noch AskSin (Homematic), dafür gibt es ja verschiedene Opensource Implementierungen und das bietet viele der oben angesprochenen Protokolleigenschaften.
Ich habe mich selbst noch nicht tief genug damit beschäftigt.

Hast du für Arduino/Attiny mit 433 Empfänger ein bestimmtes Protokoll im Sinn? Dann kann ich dich evtl. bei der Umsetzung unterstützen.

Oder eben MySensors, das bietet alle oben genannten Punkte und war für mich sehr einfach zu implementieren.   
Banana Pi, Add-On Board mit 1.8" TFT LCD und IR-Sender, CULFW V1.61, div. Homematic Komponenten, Pollin Funksteckdosen, Selbstbau CUL433 MHz, Jeelink Clone, EC3000
Selbstbau CUL868MHz für Wireless M-Bus, SIGNALduino mit Logilink Temp.-sensoren und Auriol Wetterstation

ArduPino

Mit MySensor hatte ich mich ganz am Anfang mal beschäftigt, habe damit aber nichts erreichen können. Dann hat hier jemand Eigenbau Sensoren veröffentlicht und habe darum einen nanoCul gebaut.
Muss ich mir mal ansehen.

Gesendet von meinem Wileyfox Swift mit Tapatalk


eppi

Danke für das Modul! Ich habe es heute nachgebaut mit


  • NodeMCU V0.9
  • ESPeasy Build 147
  • DFPlayer

Die MP3 files habe ich auf die Speicherkarte kopiert in einem Verzeichnis namens "mp3". Das abspielen funktioniert problemlos!
Was ich nicht verstehe ist das Attribut uploadpath. Kann mir jemand dies erklären?

Danke nochmals! Ich nutze das Teil als Signalgeber. Jetzt bastle ich das ganze in ein Gehäuse...
Gruss Dani

kaihs

Zitat von: eppi am 05 März 2017, 16:51:42
Danke für das Modul! Ich habe es heute nachgebaut mit

Schön, dass es jemand außer mit noch brauchen kann.

Zitat
Was ich nicht verstehe ist das Attribut uploadpath. Kann mir jemand dies erklären?

Das Modul unterstützt auch dabei das Speichermedium (i.A. eine Micro-SD Karte) passend für den Player zu befüllen.
Dazu muss die SD-Karte auf dem FHEM-Rechner gemounted werden.
D.h. Karte aus dem Player entnehmen, in einen geeigneten Cardreader stecken und mit dem Rechner verbinden.
Wie die Karte dann in dem FHEM-Rechner sichtbar gemacht werden kann hängt vom Betriebssystem ab, unter Linux geht das mit dem Kommando mount.
Danach ist die SD-Karte in einem bestimmten Verzeichnis ansprechbar.

Genau dieses Verzeichnis muss bei uploadPath eingetragen werden.
Anschließend können dann z. B. mit

set <dfp> readFiles

die Dateien auf der SD-Karte die vom Player ansprechbar sind eingelesen werden.
Diese werden dann als Reading angelegt.
Das kann dann z. B. so aussehen:

Internals:
   DEF        /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A9ED9FNB-if00-port0
   DevState   initialized
   DeviceName /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A9ED9FNB-if00-port0@9600
   FD         4
   LAST_RECV_TS 1487982260.61949
   LAST_SEND_TS 1488737616.53276
   NAME       dfp_usb
   NOTIFYDEV  global,tts
   NR         113
   NTFY_ORDER 50-dfp_usb
   PARTIAL
   STATE      opened
   TYPE       DFPlayerMini
   storage
   PLAYQUEUE:
   QUEUE:
   Readings:
     2017-02-21 20:06:46   File_99/001     _null
     2017-02-21 20:06:46   File_99/002     _ein
     2017-02-21 20:06:46   File_99/003     _zwei
     2017-02-21 20:06:46   File_99/004     _drei
     2017-02-21 20:06:46   File_99/005     _vier
     2017-02-21 20:06:46   File_99/006     _fünf
     2017-02-21 20:06:46   File_99/007     _sechs
     2017-02-21 20:06:46   File_99/008     _sieben
     2017-02-21 20:06:46   File_99/009     _acht
     2017-02-21 20:06:46   File_99/010     _neun
     2017-02-21 20:06:46   File_99/011     _zehn
     2017-02-21 20:06:46   File_99/012     _elf
     2017-02-21 20:06:46   File_99/013     _zwölf
     2017-02-21 20:06:46   File_99/014     _zwanzig
     2017-02-21 20:06:46   File_99/015     _dreissig
     2017-02-21 20:06:46   File_99/016     _vierzig
     2017-02-21 20:06:46   File_99/017     _fünfzig
     2017-02-21 20:06:46   File_99/018     _sechzig
     2017-02-21 20:06:46   File_99/019     _siebzig
     2017-02-21 20:06:46   File_99/020     _achtzig
     2017-02-21 20:06:46   File_99/021     _neunzig
     2017-02-21 20:06:46   File_99/022     _hundert
     2017-02-21 20:06:46   File_99/023     _sechzehn
     2017-02-21 20:06:46   File_99/024     _siebzehn
     2017-02-21 20:06:46   File_99/025     _und
     2017-02-21 20:06:46   File_99/026     _hundert
     2017-02-21 20:06:46   File_99/027     _tausend
     2017-02-21 20:06:46   File_99/028     _million
     2017-02-21 20:06:46   File_99/029     _millionen
     2017-02-21 20:06:46   File_99/030     _komma
     2017-02-21 20:06:46   File_99/031     _minus
     2017-02-24 22:58:16   currentTrackSD  5
     2017-02-22 21:00:15   equalizerMode   Jazz
     2017-02-22 21:00:42   noFolders       4
     2017-03-05 19:12:36   state           opened
     2017-02-24 22:36:09   storage         SD
     2017-02-24 22:57:45   volume          9
   TTSQUEUE:
   Helper:
     BUFFER      ����
     LAST_RESPONSE @
   Keepalive:
     ok         0
     retry      1
Attributes:
   TTSDev     tts
   cmdIcon    prev:rc_PREVIOUS play:rc_PLAY next:rc_NEXT pause:rc_PAUSE stop:rc_STOP
   requestAck 0
   room       Player
   uploadPath /run/media/kai/VELOMAP_D
   verbose    5
   webCmd     volumeStraight:prev:play:next:pause:stop


Alle Readings die mit File anfangen entsprechen einer Datei.
Diese Readings kann man dann beim play Kommando nutzen um die Datei abzuspielen, und zwar sowohl über den Namens des Readings als auch über den Readingswert.

set <dfp> play File_99/030

und

set <dfp> play _komma


spielen beide die Datei 030 im Order 99 ab.
Das geht für alle vom Player unterstützten Order (., MP3, ADVERT, 00, ..., 99).
Es wird jeweils das passende Player Kommando automatisch ermittelt, da es für die Order unterschiedliche Kommandos gibt, siehe Datenblatt.

Es ist auch möglich (für Sprachausgabe) passende MP3 Dateien auf die SD-Karte zu kopieren.
Dafür sind die Kommandos uploadTTS, uploadNumbers und uploadTTScache gedacht.
Den Teil überarbeite ich aber gerade, da das mit der neuesten Version des Text2Speech Moduls einfacher geworden ist.


Banana Pi, Add-On Board mit 1.8" TFT LCD und IR-Sender, CULFW V1.61, div. Homematic Komponenten, Pollin Funksteckdosen, Selbstbau CUL433 MHz, Jeelink Clone, EC3000
Selbstbau CUL868MHz für Wireless M-Bus, SIGNALduino mit Logilink Temp.-sensoren und Auriol Wetterstation

eppi

Danke vielmals für die ausführliche Beschreibung! Jetzt ist mir klar, für was das steht. Ich werde es heute Abend versuchen und berichten, falls etwas nicht klappen sollte.
Nochmals Danke und viele Grüsse Dani

kaihs

Im ersten Post gibt es eine aktualisierte Version des Moduls.

Der DFPlayerMini lässt sich übrigens auch direkt per USB mit einem PC verbinden und man hat dann Zugriff auf die SD-Karte.
Dazu muss man die Anschlüsse USB-, USB+, GND mit einem USB-Kabel/-Buchse verbinden.

Solange die USB Verbindung besteht kann allerdings der DFP nichts mehr von der SD-Karte abspielen.

Banana Pi, Add-On Board mit 1.8" TFT LCD und IR-Sender, CULFW V1.61, div. Homematic Komponenten, Pollin Funksteckdosen, Selbstbau CUL433 MHz, Jeelink Clone, EC3000
Selbstbau CUL868MHz für Wireless M-Bus, SIGNALduino mit Logilink Temp.-sensoren und Auriol Wetterstation

eppi

Du gibst ja richtig Gas  :D Danke vielmals für das Update!
Ich habe noch eine Frage: Ich habe mir einen Mini-Lautsprecher gekauft, 8 Ohm, 2.5W. Obwohl ich die Lautstärke auf 30 gestellt habe, ist er ziemlich leise. Hast du einen Tipp, wie man es lauter machen kann oder eine Mini-Lautsprecher Empfehlung?

Danke und viele Grüsse Dani

kaihs

Ich habe verschiedene Lautsprecher ausprobiert, alle von Pollin.
Die Lautstärke wird durch den Typ maßgeblich bestimmt.

Kleinlautsprecher, 8 Ω, 29 mm
Sehr leise, nur bei voller Lautstärke halbwegs zu hören

Mini-Lautsprecherbox
Um einiges lauter und besser verständlich. Verzerrt bei höchster Lautstärkeeinstellung

Lautsprecherbox mit 2 Mini-Lautsprechern, 10 W
Bester Klang, allerdings auch ziemlich groß.

Bester Kompromiss ist für mich der zweite.


Banana Pi, Add-On Board mit 1.8" TFT LCD und IR-Sender, CULFW V1.61, div. Homematic Komponenten, Pollin Funksteckdosen, Selbstbau CUL433 MHz, Jeelink Clone, EC3000
Selbstbau CUL868MHz für Wireless M-Bus, SIGNALduino mit Logilink Temp.-sensoren und Auriol Wetterstation

szoller

Finde das Ganze nun sehr interessant, was mir aber nicht ganz klar ist, ist wie ich das Ganze in's W-LAN bekomme.
Da fallen ja sicherlich Lötarbeiten an, oder? Wenn ja, bin ich leider raus  ::)

RaspiLED

Hey, hey, das hier ist fhem. Nicht so schnell aufgeben. Dafür gibt es einen Thread Löthilfe:
https://forum.fhem.de/index.php/topic,44057.msg359268.html#msg359268
Gruß Arnd

Diverse RasperryPi mit FHEM, CUL, Signalduino, MySensors, HomeBridge, Presence, Bravia, WifiLight ...

Raspberry Pi mit FHEM, CUL, Signalduino, MySensors, HomeBridge, Presence, WifiLight2, Bravia, ...

kaihs

Zitat von: szoller am 14 März 2017, 08:18:55
Finde das Ganze nun sehr interessant, was mir aber nicht ganz klar ist, ist wie ich das Ganze in's W-LAN bekomme.
Da fallen ja sicherlich Lötarbeiten an, oder? Wenn ja, bin ich leider raus  ::)

Zumindest für einen Prototypen muss man nicht löten, das kann man auch zusammenstecken.
Hier mal das Bild von der MySensors-Variante. Ein Arduino Uno mit einem Prototype-Shield.

Auf diesem Bild ist oben die direkte Anbindung per USB2Seriell Wandler und unten die WLAN Variante mit einem Wemos D1. Darauf kann man auch das Prototype-Shield setzen.

Auf den Bildern sieht man auch die Lautsprecher die ich im Einsatz habe.

Banana Pi, Add-On Board mit 1.8" TFT LCD und IR-Sender, CULFW V1.61, div. Homematic Komponenten, Pollin Funksteckdosen, Selbstbau CUL433 MHz, Jeelink Clone, EC3000
Selbstbau CUL868MHz für Wireless M-Bus, SIGNALduino mit Logilink Temp.-sensoren und Auriol Wetterstation

kaihs

Ich habe das Modul jetzt in svn eingecheckt, es wird also ab morgen per update ausgeliefert.

Aktuell arbeite ich an Version der Hardware die mit Batterien funktioniert, momentan auf Basis von MySensors.
Mit fehlt noch der passende MOSFET, um den DFPlayer zum Energiesparen abzuschalten.
Banana Pi, Add-On Board mit 1.8" TFT LCD und IR-Sender, CULFW V1.61, div. Homematic Komponenten, Pollin Funksteckdosen, Selbstbau CUL433 MHz, Jeelink Clone, EC3000
Selbstbau CUL868MHz für Wireless M-Bus, SIGNALduino mit Logilink Temp.-sensoren und Auriol Wetterstation

eppi

Zitat von: kaihs am 27 März 2017, 20:57:50
Ich habe das Modul jetzt in svn eingecheckt, es wird also ab morgen per update ausgeliefert.

Aktuell arbeite ich an Version der Hardware die mit Batterien funktioniert, momentan auf Basis von MySensors.
Mit fehlt noch der passende MOSFET, um den DFPlayer zum Energiesparen abzuschalten.
Cool, Danke!