Fragen zum DFPlayer mini (Lexikon)

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    • Fragen zum DFPlayer mini (Lexikon)

      Hallo zusammen,

      zuerst einmal vielen Dank an @Zitronenfalter für Deinen Lexikon-Beitrag zum DFPlayer mini.

      Was mich sehr interessieren würde, ist die "Werbungsfunktion":
      "advertising sound waiting function, the music can be suspended. when advertising is over in the music continue to play"
      Im Befehlssatz finde ich nichts Passendes.
      Es muss ja ein "Advertising Sound" eingespielt werden und dann an der Stelle, an der der ursprüngliche Sound unterbrochen wurde, weitergemacht werden.


      Wie geht das?
      Wo und wie wird die "Unterbrechungsstelle" gespeichert und ist sie vielleicht änderbar?

      Der DFPlayer mini kann wirklich viel - faszinierend.


      Viele Grüße
      Mathias
      Heisenberg bei einer Radarkontrolle:
      Polizist: "Wissen Sie, wie schnell Sie waren?"
      Heisenberg: "Nein. Aber ich weiß genau, wo ich jetzt bin!"

    • Hallo zusammen,

      ja, wenn ich meinen Freund Willie nicht hätte...

      Er hat dieses Datenblatt gefunden.

      Es schwirren ja einige Datenblätter herum, die aber bisher beim Befehlscode 0x11 endeten.
      Willies Fund bringt Licht ins Dunkel: Ab Seite 19 findet sich das "Command Summary" mit Erklärungen.
      Befehle bis 0x1A. Inklusive Advertising!
      Hier wird auch klar, dass zwischen Speicherreihenfolge auf dem Medium (FAT Number) und Dateibezeichnungen in Ordnern unterschieden wird.

      Viele Grüße
      Mathias
      Heisenberg bei einer Radarkontrolle:
      Polizist: "Wissen Sie, wie schnell Sie waren?"
      Heisenberg: "Nein. Aber ich weiß genau, wo ich jetzt bin!"

    • In meinem Datenblatt (das natürlich auch ein anderes ist :D ), stehen die Befehle zwar auch drin, nur bin ich da nicht näher drauf eingegangen :whistling: .

      Ich werde aber bei Gelegenheit den Artikel im Lexikon entsprechend überarbeiten.

      Vorerst sollte es ja kein Problem sein , die beiden BasCom-Befehle (MP3_PlayAD und MP3_StopAD) einfach zu ergänzen, ist ja nur ein anderes Befehlsbyte z.B. im MP3_Play - Befehl ;) .
    • Da habe ich mich wohl zu früh gefreut...

      Ich habe die Bascom Vollversion 2.0.8.0

      Das Modul soll an einem M328P mit I2C-LCD betrieben werden.
      Also habe ich Controllerdetails, Config Submode = New, I2C-LCD und eine leere Do Loop Schleife eingefügt.
      Die serielle Schnittstelle habe ich auf Com1 geändert.

      So:

      BASCOM-Quellcode

      1. ' ##############################################################################
      2. ' #
      3. ' # MP-Player DFmini
      4. ' #
      5. ' # Je nach Controllertyp kann es notwendig sein die Konfiguration der
      6. ' # seriellen Schnittstelle anzupassen.
      7. ' #
      8. ' # Hier im Beispiel wird ein Controller mit zwei Hardwareschnittstellen
      9. ' # verwendet wovon die erste für RS485 Verkehr Verwendung findet!
      10. ' #
      11. ' # Es ist notwendig, dass die serielle Schnittstelle entsprechend eingerichtet
      12. ' # ist und vorher z.B. mit dem folgenden Befehl geöffnet wurde,
      13. ' # Open "Com2:" For Binary As #255
      14. ' # Der Kanal ist unbedingt mit #255 zu definieren
      15. ' #
      16. ' ##############################################################################
      17. '***********
      18. $regfile = "m328pdef.dat" ' ATMega328P; Stacks etc.automatisch aus Bascom übernommen
      19. $crystal = 8000000 ' ATMega328P intern auf 8 MHz eingestellt (Fuse-Bits!)
      20. $hwstack = 50
      21. $swstack = 50
      22. $framesize = 100
      23. '*************
      24. Config Submode = New
      25. '***** I2C & LCD konfigurieren
      26. Config Scl = Portc.5 ' I2C Scl (Pin 28)
      27. Config Sda = Portc.4 ' I2C Sda (Pin 27)
      28. Config Lcd = 20x4
      29. $lib "YwRobot_Lcd_i2c.lib" 'YwRobot Treiber für LCD
      30. Const Pcf8574_lcd = 78 'Slave-Adresse des I2C-LCDs
      31. 'Pcf8574_lcd = 78
      32. 'Pcf8574A_lcd = 126
      33. Dim Lcd_backlight As Byte '1 = an; 0 = aus. Wird erst durch einen LCD-Befehl umgesetzt!
      34. Lcd_backlight = 1
      35. Config I2cdelay = 1 '1=1Mhz,5=200Khz,10=100Khz,15=66,66Khz
      36. 'Wenn in Lcd keine Anzeige muß der Delaywert erhöht werden.Mit Wert 15 beginnen und dann langsam verringern.
      37. Waitms 300
      38. I2cinit
      39. Cursor Off , Noblink 'Kein Cursor, kein Blinken
      40. Cls
      41. $baud1 = 9600
      42. Config Com1 = Dummy , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8
      43. Open "Com1:" For Binary As #255
      44. Config Input1 = Cr , Echo = Cr
      45. Config Serialin = Buffered , Size = 64 '
      46. Dim Asend(16) As Byte ' Kommandstring
      47. Dim Sserialbuffer2 As String * 64
      48. Sub Clearserialbuffer2()
      49. Local Fx As Byte
      50. Clear Serialin1
      51. Sserialbuffer2 = ""
      52. For Fx = 0 To 63
      53. _rs232inbuf1(fx) = 0
      54. Next
      55. End Sub
      56. '***************************************
      57. Do
      58. Loop
      59. '*******************************************
      60. ' ##############################################################################
      61. ' #
      62. ' # MP3_hSetCmd
      63. ' # Initialisiert die Befehlsstruktur
      64. ' #
      65. ' ##############################################################################
      Alles anzeigen
      Programm unter einer neuen Version gespeichert und mal die Syntax gecheckt...

      MP3 Modul Bascom-Errors.PNG

      Zeile 486 ist die letzte Zeile.
      Die Fehlercodes konnte ich nicht identifizieren.

      Wo liegt das Problem?

      Viele Grüße
      Mathias
      Heisenberg bei einer Radarkontrolle:
      Polizist: "Wissen Sie, wie schnell Sie waren?"
      Heisenberg: "Nein. Aber ich weiß genau, wo ich jetzt bin!"

    • Danke Michael,

      ich habe folgende "einfache" Änderungen vorgenommen:

      BASCOM-Quellcode

      1. '$baud1 = 9600
      2. Config Com1 = 9600 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8
      und keine Syntaxfehler mehr.
      Mal sehen, was der Aufbau morgen auf dem Steckbrett sagt...

      Jetzt brauche ich erst mal eine Mütze Schlaf.

      CU
      Mathias
      Heisenberg bei einer Radarkontrolle:
      Polizist: "Wissen Sie, wie schnell Sie waren?"
      Heisenberg: "Nein. Aber ich weiß genau, wo ich jetzt bin!"

    • mac5150 schrieb:

      ich habe folgende "einfache" Änderungen vorgenommen:
      $baud1 auskommentiert

      und keine Syntaxfehler mehr.
      Das wird solange funktionieren, solange du in den BasCom-Optionen-Communication-Baudrate "9600" eingetragen hast.
      Wenn da aber was anderes steht, wird der Compiler eben diesen anderen Wert verwenden und deine serielle Kommunikation nicht funktionieren, da die falsche Baudrate verwendet wird.
      Daher solltest du einfach $baud = 9600 verwenden (die 1 entfernen), dann wird der erste (und bei deinem µC der einzige) Com-Port definiert ;) .

      Man sollte generell im alles Programm definieren und sich nicht auf Einstellungen des Compilers verlassen.
      Auch ist dadurch ein Programm auch für andere leichter nachvollziehbar, da niemand weiß, was in deinen Einstellungen drin steht :D .
    • Danke für den Hinweis, Zitronenfalter!
      Dass der Compiler in die Config Com1 verändernd eigreifen könnte, war mir nicht bekannt.

      Alles im Programm zu definieren und ausführlich zu kommentieren ist auch mein Ziel.
      Heisenberg bei einer Radarkontrolle:
      Polizist: "Wissen Sie, wie schnell Sie waren?"
      Heisenberg: "Nein. Aber ich weiß genau, wo ich jetzt bin!"

    • @Zitronenfalter Wir versuchen jetzt schon lange, dem Player via serieller Ansteuerung einen Ton zu entlocken.
      Keine Chance.
      Manuell über das Widerstandsnetzwerk lassen sich unsere 20 Test-MP3s problemlos abspielen; diese Befehle nimmt das Modul an.

      Mir ist nach einiger Recherche klar geworden, dass ich im Code aus Post #4 in Zeile 57
      _rs232inbuf1(fx) = 0 statt _rs232inbuf0(fx) = 0 übernommen hatte
      und dass offenbar ein "Enable Interrupts" für die Pufferung nötig ist.
      Das war in der Bascom-Hilfe nicht zu finden (aber im zuerst nicht installierten Samples-Ordner).
      Auch ein "Define Base = 0" war nötig.
      Hauptprogramm etc. stehen jetzt auch *nach* den Sub- und Function-Definitionen.
      Nebenbei: Die Subs MP3_PlayTrack und MP3_Pause haben denselben Befehlscode.
      Auch die Dimensionierung der Variablen aSend(16) As Byte und sSerialBuffer2 As String * 64 ist mir unklar. Jedes Kommando hat doch nur 10 Byte.


      Wäre es möglich, ein komplettes, evtl. abgespecktes, funktionierendes Programm z. B. auf der Basis des vielgenutzten Mega8 zu veröffentlichen?
      Sonst bringt Dein Lexikon-Beitrag dem fortgeschrittenen Anfänger nichts. Profis brauchen eh' nur das Datenblatt...

      Viele Grüße
      Mathias
      Heisenberg bei einer Radarkontrolle:
      Polizist: "Wissen Sie, wie schnell Sie waren?"
      Heisenberg: "Nein. Aber ich weiß genau, wo ich jetzt bin!"

    • mac5150 schrieb:

      Wir versuchen jetzt schon lange, dem Player via serieller Ansteuerung einen Ton zu entlocken.
      Das funktioniert bei mir klaglos sogar unter der "Erschwernis" der Verwendung von RS485 anstatt der direkten RS232.

      mac5150 schrieb:

      _rs232inbuf1(fx) = 0 statt _rs232inbuf0(fx) = 0
      Naja, je nach verwendeter HW-Schnittstelle muss man sich da eben entscheiden, welchen Buffer man verwenden möchte.
      Das ganze ist entstanden, weil ich in meiner Erstanwendung einen ATmega1284p verwende und bei dem ich die erste Schnittstelle für RS485 verwende und somit dann erst die zweite für den MP3-Player.

      Ich werde mir aber was überlegen, ob man das mit Compilerdirektiven die über Benutzerkonstanten gesteuert werden noch weiter vereinfachen kann.
      Außer dem könnte es ja auch vorkommen, dass der Player via Softwareschnittstelle gesteuert wird, da gibt es dann gar keine Hardware-Buffer.

      mac5150 schrieb:

      dass offenbar ein "Enable Interrupts" für die Pufferung nötig ist
      Jetzt wo du es schreibst, nur in der Hilfe wird dies (zumindest nicht direkt) erwähnt, da wird nur auf die xMega hingewiesen obwohl es im nach hinein betrachtet durchaus logisch erscheint, dass auch die kleineren µCs dies benötigen. Im der Hilfe steht jedenfalls nur:
      Additional Infos for XMEGA Devices:
      Since buffered serial input and output uses interrupts, you must enable the global interrupts in your code with : ENABLE INTERRUPTS.
      For the XMEGA, if you set the priority with CONFIG PRIORITY, you must enable the MED priority.

      Auch da werde ich mir was überlegen, weil einerseits zwar auch für das Hauptprogramm notwendig ist die Interrupts zu erlauben, es aber an der Stelle wo die MP3-Routinen stehen für das Hauptprogramm noch zu früh sein kann.

      mac5150 schrieb:

      Hauptprogramm etc. stehen jetzt auch *nach* den Sub- und Function-Definitionen.
      Ja, dafür muss man die nicht deklarieren und der Compiler übernimmt auch nur verwendete Subs und Funktionen.

      mac5150 schrieb:

      Auch ein "Define Base = 0" war nötig.
      Ja, das ist wohl eine Eigenart von BasCom, In anderen von mir verwendeten Hochsprachen beginnen die Arrays immer mit Null, daher habe ich das auch meistens in BasCom so weitergeführt.

      mac5150 schrieb:

      Auch die Dimensionierung der Variablen aSend(16) As Byte und sSerialBuffer2 As String * 64 ist mir unklar. Jedes Kommando hat doch nur 10 Byte.
      Ja, das stiiiiimmt (hat mal ein "berühmter" österreichischer Fussballtrainer gesagt).
      aSend könnte (und kann man auch) auf 10 dimensionieren.
      Und der Serialbuffer sollte eigentlich wie folgt lauten weil er sonst sinnlos ist: :D

      BASCOM-Quellcode

      1. Dim sSerialBuffer2 As String * 64 At _rs232inbuf1 Overlay
      Es ist jetzt die Frage ob man überhaupt einen Buffer braucht.
      In meiner Anwendung schon, weil da die CPU nicht nur auf die serielle Kommunikation wartet sondern "nebenher" auch noch was anderes zu tun hat (RS485 Master mit mehreren Nebenstellen)

      mac5150 schrieb:

      Die Subs MP3_PlayTrack und MP3_Pause haben denselben Befehlscode.
      Habe ich korrigiert, fließt dann bei Gelegenheit mit den anderen Änderungen auch ins Lexikon ein.

      mac5150 schrieb:

      Wäre es möglich, ein komplettes, evtl. abgespecktes, funktionierendes Programm z. B. auf der Basis des viel genutzten Mega8 zu veröffentlichen?
      Auch das ist sicher möglich, ist alles nur eine Frage der Zeit ;) .
    • @Zitronenfalter Danke für Deine Antworten.
      Meines Erachtens sollte man sich bei einem Lexikon/Wiki-Beitrag noch mehr anstrengen als bei einem normalen Thread - schließlich sind keine Anmerkungen erlaubt.

      Der Beitrag ist m. E. "mit der heißen Nagel gestrickt".
      OK, das "Programm" ist aus einem größeren Projekt "herausgelöst" worden.
      OK, wenn man genügend Platz hat, kann man auch Variable "überdimensionieren"
      Das Folgende ist aber merkwürdig:

      Zitronenfalter schrieb:

      Und der Serialbuffer sollte eigentlich wie folgt lauten weil er sonst sinnlos ist:
      Dim sSerialBuffer2 As String * 64 At _rs232inbuf1 Overlay
      Es ist jetzt die Frage ob man überhaupt einen Buffer braucht.
      Selbst wenn aus einem größeren Projekt "herausgelöst", verliert man mit Copy/Paste nicht in der Mitte eines "Programmblocks" eine halbe Zeile.
      Ja, ich sehe jetzt schon die üblichen Verdächtigen ihre Messer wetzen: Dennoch, Zitronenfalter, der Lexikon-Beitrag ist Deiner nicht würdig.


      Viele Grüße
      Mathias
      Heisenberg bei einer Radarkontrolle:
      Polizist: "Wissen Sie, wie schnell Sie waren?"
      Heisenberg: "Nein. Aber ich weiß genau, wo ich jetzt bin!"

    • @Mathias: Beim Lexikoneintrag hast Du selbst - zu Recht - auf „gefällt mir“ geklickt, am Anfang dieses Threads hast Du Dich noch bei Zitronenfalter bedankt und hier gibt Zitronenfalter Dir noch gute Hinweise, da finde ich (als einer der „üblichen Verdächtigen“) es in der Tat nicht nett, wie Du Deinen letzten Beitrag formuliert hast.
      Wie auch immer: Ich schlage vor, Du kopierst den kompletten Lexikoneintrag in einen Editor, überarbeitest ihn und schickst die verbesserte Version an einen Moderator zum Einstellen in das Lexikon. Dann können andere von Deinen Erfahrungen profitieren. Ich denke, das ist ein guter Weg, die Qualität des Lexikons weiter zu verbessern. Dann kommen nachfolgende Leser noch besser klar.
      Danke schon einmal im Voraus
      Stefan
    • mac5150 schrieb:

      Der Beitrag ist m. E. "mit der heißen Nagel gestrickt".

      Selbst wenn aus einem größeren Projekt "heraus gelöst", verliert man mit Copy/Paste nicht in der Mitte eines "Programmblocks" eine halbe Zeile.


      ...der Lexikon-Beitrag ist Deiner nicht würdig.
      Danke für die Blumen, konstruktive Kritik nehme ich gerne an ^^ .
      Ich wollte eigentlich für den Anfang nur helfen, nachdem hier im Forum nach eben diesem Player gefragt wurde ich eigentlich keine wirklichen Probleme damit hatte.

      Das der Code mit der Benutzung dessen mitwächst sollte auch klar sein, daher hat auch das Overlay gefehlt, weil ich das bis zu diesem Zeitpunkt noch gar nicht brauchte.

      Anbei aber eine überarbeitete und vielleicht sogar komfortablere Version des Codes.
      Probiere die mal aus, wenn es soweit passt, fließt das auch im Lexikon ein und wird hier wieder verschwinden.
      Das ganze sollte jetzt auch soweit unabhängig vom verwendeten Prozessor sein, enthebt den Benutzer aber dennoch nicht davon, zu überlegen welche COM-Ports der jeweils verwendete Prozessor eigentlich verwendet.
      Auch auf die Array-Basis und den SUB-Mode des Compilers habe ich jetzt Rücksicht genommen.
      Was ich jetzt aus Zeitmangel nicht probiert habe, ist der Software-COM-Port.
      Und da ich denke, dass das jetzt auch mit einem Mega8 funktionieren wird (korrekte Einstellparameter vorausgesetzt), habe ich das jetzt auch nicht explizit getestet.

      Unten im Code-Fenster sind nur die Voreinstellmöglichkeiten.

      BASCOM-Quellcode

      1. ' ##############################################################################
      2. ' #
      3. ' # MP-Player DFmini (c) HFEDV 2017
      4. ' # Nur für die private Verwendung, keinerlei kommerzielle Verwendung gestattet.
      5. ' #
      6. ' # Siehe auch die Hinweise weiter unten zu den SUBs und Funktionen!
      7. ' #
      8. ' ##############################################################################
      9. ' # FOLGENDE BENUTZEREINSTELLUNGEN SIND VORZUNEHMEN
      10. ' #-----------------------------------------------------------------------------
      11. ' # MP3_COMPORT Stellt den verwendeten Com-Port ein
      12. ' # 0= Softwareschnittstelle (siehe den Ausnahmehinweis unten!)
      13. ' # 1= Hardwareport 1
      14. ' # 2= Hardwareport 2
      15. ' #-----------------------------------------------------------------------------
      16. ' # MP3_IRQ Aktiviert ab hier die Interrupts (nur bei HW-Com-Port notwendig)
      17. ' # 0= Nein, Interrupts müssen aber dennoch später selbst aktiviert
      18. ' # werden weil sonst der Softwarebuffer nicht funktioniert!
      19. ' # 1= Ja, Interrupts werden bereits ab hier aktiviert
      20. ' #-----------------------------------------------------------------------------
      21. ' # MP3_BASE Setze die Arraybasis auf 0 oder 1 (Arrays beginnen entweder
      22. ' # mit 0 oder 1)
      23. ' # HINWEIS: Dies ist eine globale Einstellung und gilt dann
      24. ' # IMMER für das gesamte Programm!
      25. ' #-----------------------------------------------------------------------------
      26. ' # MP3_SUBMODE Setzt das globale Verhalten mit SUBs und Funktionen
      27. ' # 0= Alte Variante
      28. ' # SUBs und Funktionen MÜSSEN deklariert werden.
      29. ' # Die SUBs und Funktionen müssen NACH dem Hauptprogramm
      30. ' # platziert werden!
      31. ' #
      32. ' # 1= Neue Variante
      33. ' # SUBs und Funktionen werden NICHT deklariert.
      34. ' # Die SUBs und Funktionen müssen VOR dem Hauptprogramm
      35. ' # platziert werden!
      36. ' #
      37. ' ##############################################################################
      38. Const MP3_COMPORT = 2
      39. Const MP3_IRQ = 0
      40. Const MP3_BASE = 0
      41. Const MP3_SUBMODE = 1
      Alles anzeigen


      Die aktuelle Lib mit Programm findet ihr jetzt hier im Lexikon
    • @Zitronenfalter Vielen Dank für Deine schnelle Antwort. Und auch, dass Du meinen Post, wie von mir beabsichtigt, als konstruktive Kritik verstehst.
      Ich schätze die Qualität Deiner Forenbeiträge und Deine Hilfsbereitschaft sehr.

      Ich habe mir den Code angesehen und schon Fragen, die ich notiert habe, da ich erst am WE wieder ans Breadboard kann.
      Ist es Dir lieber, wenn ich Fragen und evtl. Code hier poste oder lieber via PN?

      Ganz sicher werde ich keine "verbesserte Version an einen Moderator zum Einstellen in das Lexikon" versenden.
      Du bist der Autor - Dritte, auch wenn sie sich ganz wichtig und über jegliche Meinung erhaben fühlen, werden kein Feedback von mir erhalten.
      Eventuelle Änderungen sind gefühlt Dein und nur Dein Recht.
      Was bevorzugst Du? Einen Beitrag in diesem Thread oder PN?

      LG
      Mathias
      Heisenberg bei einer Radarkontrolle:
      Polizist: "Wissen Sie, wie schnell Sie waren?"
      Heisenberg: "Nein. Aber ich weiß genau, wo ich jetzt bin!"

    • mac5150 schrieb:

      Kann es sein, dass der Player während er abspielt, keine Befehle annimmt?
      Nein, denn wie sonst sollte er dann auf diesem Wege verschiedenste Einstellungen wie z.B. Lautstärke, EQ oder den Start von Advise oder eines anderen Tracks, das stoppen des gerade laufenden Tracks und zum Schluss sogar Statusmeldungen bewerkstelligen können ;) .

      Das ist zwar jetzt nur meine Meinung, aber hier Orts tut er genau das zur vollsten Zufriedenheit.
      Möglicherweise gibt es verschiedene Hersteller wäre aber unlogisch, denn dann würde das Datenblatt nicht dazu passen.