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
' ' 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