DFPlayer miniを使ってmp3ファイルを再生
秋月電子などで売られているDFPlayer miniをMicroPythonを使って制御する。
DFPlayer mini
DFPlayer miniは、YX5200-24SSというmp3ファイルをデコードするチップ、8002というアンプ、マイクロSDスロットなどを搭載しており、マイコンなしでもmp3ファイルの再生が可能である。が、ここでは、ESP32を使ってmp3ファイルを再生する。Wikiにあり。データシートもそこからたどれる。
Micropythonソースコード
だいたいこの手のものは、githubなどを探せば見つかる。いくつか見つけたが、ここにあるものを利用した。
解説
UART
マイコンからはUART経由で制御を行う。用いるESP32には3つのUARTがある。MicroPython的には、UART0、UART1、UART2である。そのうち1つ(UART0)はPCとの接続用(USB経由)に使われており利用不可。UART1またはUART2とが使える。ハードウェアシリアルとしては、UART1ではTX=10/RX=9(GPIO番号)、UART2ではTX=17/RX=16となっているが、使用したESP32用Micropython Firmwareでは、ハードウェアシリアルを使うことができなかった。詳細は調査していないが、無理やりセットしてもリセットがかかってしまう。今回は、ソフトウェアシリアルを使うことにし、
- TX = 4
- RX = 2
と設定した。
SDカードのフォルダ及びファイルの構成
DFPlayer miniにて、mp3ファイルをSDカードに置く構成については、このサイトの”Modes of Operation”の説明がわかりやすい。今回は、mp3というフォルダーを作り、その配下に、再生する順に0001.mp3、0002.mp3、0003.mp3、、、のようにファイルを置く。
ソースコード
ライブラリ(dfplayermini.py)
まずはコアであるdfplayermini.pyの補足説明。
class Player:
def __init__(self, pin_TX, pin_RX):
self.uart = UART(1, 9600, tx=pin_TX, rx=pin_RX)
self.cmd(0x3F) # send initialization parametres
self._fadeout_timer = Timer(-1)
self._volume = 15
self._max_volume = 15
self._fadeout_speed = 0
- ここでは、UART1を利用。UART2を使いたいときは”2”を指定する。
- ボーレートは9600bps固定。
- max_volumeは0-30まで指定可能。
このファイルに記載されているコマンドについては、YX5200-24SSデータシートを参照するとよい。
再生サンプルコード
こちらの簡略版である。
from dfplayermini import Player
from time import sleep
import sys
music = Player(pin_TX=4, pin_RX=2)
sleep(1)
music.volume(10)
sleep(1)
music.play(2)
sleep(10)
music.play(6)
sleep(30)
sys.exit()
実験
下記写真の中央に位置するのが、DFPlayer miniである。
結果的には動作したのであるが、コマンド設定(含む音声再生)前に、ある程度Sleepを入れないと動作しないことがしばしば発生。Pythonはインタープリターなので、対話形式でコードを入力したときは、ほぼ問題なく設定および再生ができていた。また、ハードウェア不良らしき状況もあった(DFPlayer miniの電源入れ直しが必要だったこともあり)。上記ライブラリ内にある、module_reset()なども試すとよいかと思われる。個体の問題なのか、YX5200-24SSの制御の仕方が不適切なのか、詳細は未調査。