DFplayer mini – ovládání sériovým portem

DF player je modul k přehrávání připravených souborů, uložených ve formátu MP3 nebo WAV na microSD kartě. Soubory mohou být organizovány v jednoúrovňové hieararchii adresářů (složek). Podíváme se podrobněji na ovládání modulu po sériovém portu, protože manuál výrobce je v tomto směru poněkud strohý. Všude, kde jsou zmíněny soubory MP3, mohou být použity i soubory formátu WAV. Ve shodě s vývojovým prostředím Picaxe označujeme hexadecimální čísla prefixem $, výrobce v manuálu používá prefix 0x nebo ponechává čísla bez prefixu.

Komunikace

Komunikace probíhá rychlostí 9600Bd v napěťových úrovních 3V logiky, polarita signálu je ‚TTL’, čili klidová úroveň vysoká. Pokud modul ovládáme z 5V procesoru, postačí dát do série se vstupem RX modulu rezistor 1k, vstup RX procesoru by pak měl mít rozhodovací úroveň nejvýše 2.5V, aby spolehlivě přijímal data z modulu. Jenom pro jistotu uvádím, že se propojuje TX procesoru s RX modulu a RX procesoru s TX modulu. Některé aplikace vystačí pouze s jedním signálem, data z modulu není nutné přijímat.

Organizace souborů na microSD kartě

Zde je několik možností, zvolíme tu, která lépe vyhovuje konkrétní aplikaci.
1. Soubory jsou uloženy v kořenovém adresáři (složce), mohou být pojmenované libovolně. Záleží na pořadí, v jakém jsou kopírovány na kartu, nedochází k žádnému třídění nebo vyhledávání podle názvu (příkaz $03). Soubor číslo sedm je sedmý soubor v kořenovém adresáři a je jedno, jestli se jmenuje 007.mp3 nebo Lucie.mp3. Souborů může být až 2999, číslování souborů začíná od 1 a končí 2999.
2. Soubory jsou roztříděny až v 99 adresářích s dvoucifernými číselnými názvy \01 až \99. Soubory jsou pojmenované trojmístným číselným názvem od 001.mp3 do 255.mp3. V tomto případě nezáleží na pořadí, v jakém jsou kopírovány na kartu, soubory se vyhledávají podle názvu (příkaz $0F). Číselné označení souboru může být libovolně rozšířeno, například 029BarrandovaJeskyne.mp3.
3. Soubory jsou uloženy v adresáři \MP3. Soubory jsou pojmenované čtyřmístným číselným názvem od 0001.mp3 do 3000.mp3. Ani v tomto případě nezáleží, v jakém pořadí jsou kopírovány na kartu, soubory se vyhledávají podle názvu (příkaz $12). Číselné označení souboru může být libovolně rozšířeno, například 0002Jozin-z-bazin.mp3, 0088_Razeni_dolu_meziplyn.mp3 apod.
4. Soubory jsou roztříděny až v 15 adresářích s dvoucifernými číselnými názvy \01 až \15, v každém adresáři až 3000 souborů. Soubory jsou pojmenované čtyřmístným číselným názvem od 0001.mp3 do 3000.mp3. Opět nezáleží na pořadí, v jakém jsou kopírovány na kartu, soubory se vyhledávají podle názvu (příkaz $14). I v tomto případně souboru může být číselné označení libovolně rozšířeno.

Formát příkazu

Příkazy zaslané sériovým portem obsahují 10 byte a mají následující formát:

| $7E | Ver | Len | CMD | Feedback | Para1 | Para2 | Checksum Hi | Checksum Lo | $EF |

$7E je startovací byte, označuje začátek příkazu
Ver je verze, ve všech příkladech má hodnotu $FF
Len je délka příkazu, nezapočítává se první a poslední byte ani Checksum
CMD je kód příkazu
Feedback indikuje zda požadujeme odpověď (=$01) nebo nepožadujeme odpověď (=$00)
Para1 je vyšší byte předávaných dat
Para2 je nižší byte předávaných dat
Checksum Hi je kontrolní součet vyšší byte
Checksum Lo je kontrolní součet nižší byte
$EF je ukončovací byte, označuje konec příkazu

Checksum je 16 bitové číslo, vzniklé složením dvou byte Hi a Lo. Platí:
Ver + Len + CMD + Feedback + Para1 + Para2 + Checksum(16bitů) = 0
Do kontrolního součtu se nezapočítává pouze startovací a ukončovací byte.

Příkazy

$09 – Zdroj dat pro přehrávání

Kromě microSD karty můžeme připojit též USB disk jako zdroj dat, tímto příkazem určujeme, který zdroj použít. Para2 označuje zdroj přehrávání, 1 je USB disk, 2 je microSD karta. Po připojení napájecího napětí by měla být nastavena jako zdroj microSD karta, pokud jsme zdroj změnili nebo „pro jistotu“, nastavíme microSD kartu následujícím příkazem:

$7E, $FF, $06, $09, $00, $00, $02, $FE, $F0, $EF

$03 – Přehrát soubor z kořenového adresáře

Para1 a Para2 tvoří dohromady 16-bitové číslo, které označuje přehrávaný soubor. Číslování je podle pořadí v adresáři, na název souboru se vůbec nebere ohled. Například pátý soubor přehrajeme příkazem:

$7E, $FF, $06, $03, $00, $00, $05, $FE, $F3, $EF

$0F – Přehrát soubor z adresářů 01 až 99

Para1 označuje název adresáře v rozsahu 01-99, Para2 pak první tři číslice v názvu přehrávaného souboru. Název adresáře i název souboru musí být v případě potřeby doplněn na dvě nebo tři číslice. Například soubor /01/022test.mp3 přehrajeme příkazem:

$7E, $FF, $06, $0f, $00, $01, $16, $FE, $D5, $EF

$12 – Přehrát soubor z adresáře MP3

Para1 a Para2 tvoří dohromady 16-bitové číslo, které označuje první čtyři číslice v názvu přehrávaného souboru. Menší číslo musí být zleva doplněno nulami. Například soubor /mp3/0005Ella.mp3 přehrajeme příkazem:

$7E, $FF, $06, $0c, $00, $00, $05, $FE, $EA, $EF

$14 – Přehrát soubor z adresářů 01 až 15

Tento příkaz může přehrát soubor z adresářů /01 až /15, každý z nich může obsahovat až 3000 souborů s názvy 0001.mp3 až 3000.mp3. Para1 a Para2 tvoří dohromady 16 bitové číslo, jeho nejvyšší čtyři bity označují název adresáře v rozsahu 01-15, nižších 12 bitů pak první čtyři číslice v názvu přehrávaného souboru. Nebo si můžeme představit, že číslo adresáře vynásobíme 4096 a k výsledku přičteme číslo souboru. Název adresáře i název souboru musí být v případě potřeby doplněn na dvě nebo čtyři číslice. Například soubor /12/1999Ellington.mp3 přehrajeme příkazem:

$7E, $FF, $06, $14, $00, $C7, $CF, $FD, $51, $EF

Jak jsme testovali

Testovací zapojení bylo realizováno pomocí Picaxe-08M2, AXEboardu, nepájivého pole, modulu DFplayer s microSD kartou, malého 8Ω reproduktoru a 1 kΩ rezistoru. Abychom se vyhnuli neustálému ručnímu dopočítávání kontrolního součtu, použijeme podprogram CmdOut, který udělá práci za nás. Kromě startovacího a koncového byte jsou odesílaná data uchovávána v paměti b20 až b27, ovšem jsou uložena pozpátku. Je to takový malý trik, protože Picaxe ukládá 16 bitové proměnné jako little endian, nižší byte na nižší adresu, vyšší byte na vyšší. Při uložení v sestupném pořadí můžeme k proměnným Para1 a Para2, taktéž k ChksumHi a ChksumLo přistupovat v případě potřeby jako k 16 bitům, aniž by bylo třeba dalších operací, jenom použijeme pojmenování Param16 a Chksum16 (w11 a w10).

Program lze stáhnout zde DFPlayerMini.bas, nutno smazat příponu _.txt a ponechat pouze .bas

DFplayerSerPort

Testovací zapojení DFplayer mini

'
' DFplayer mini
'

#picaxe 08m2
#no_data

'
' Pins
'
symbol txpin=2

'
' Constants
'
symbol TXBAUD=T9600_8

'
' Variables
'
symbol buffirst=27    'command buffer first byte
symbol ver=b27
symbol len=b26
symbol cmd=b25
symbol feedback=b24
symbol para1=b23
symbol para2=b22
symbol param16=w11
symbol buffchks=21    'command bufer last byte for chksum calc
symbol chksumhi=b21
symbol chksumlo=b20
symbol chksum16=w10
symbol buflast=19        'command buffer last byte

Init:
    ver=$FF            'Tyto hodnoty nastavíme jednou, nebudeme je během programu měnit
    len=$06
    feedback=$00

    setfreq m8    'Hodinový kmitočet 8MHz abychom mohli používat 9600Bd
    pause 8000     'Po náběhu napájení počkáme 4s 

Main:
    'Zdroj dat microSD karta
    cmd=$09
    param16=$0002
    gosub CmdOut
    pause 200
    
    'přehrávání souborů v kořenovém adresáři
    'přehraj prvních 10 souborů
    cmd=$03
    for    param16=1 to 10
        gosub Cmdout
        pause 4000        'počkáme 2s před spuštěním dalšího souboru
    next param16
    
    'přehrávání souborů v adresáři /MP3
    'přehraj soubory /MP3/0001.mp3 až /MP3/0015.mp3
    cmd=$12
    for    param16=1 to 15
        gosub CmdOut
        pause 6000        'počkáme 3s před spuštěním dalšího souboru
    next param16
    
    'přehrávání souborů v adresáři /01
    'přehraj soubory /01/001.mp3 až /MP3/010.mp3
    cmd=$0F
    para1=1
    for    para2=1 to 10
        gosub CmdOut
        pause 4000        'počkáme 2s před spuštěním dalšího souboru
    next para2
    
end

CmdOut:
    'Spočítáme kontrolní součet
    chksum16=0
    bptr=buffirst
    do 
        chksum16=chksum16-@bptrdec
    loop while bptr>buffchks
    'Odešleme data
    bptr=buffirst
    serout txpin,TXBAUD,($7E, @bptrdec, @bptrdec, @bptrdec, @bptrdec, @bptrdec, @bptrdec, @bptrdec, @bptrdec, $EF)
return