MP3プレーヤーminiモジュールを使ってみます

〔ボイスモジュール〕 〔プレーヤーモジュール(PIC)〕 〔マイコンのトップに戻る〕


最近、Arduinoを扱っていないなぁ〜、
ってんでぇ秋月通商の"DFPlayer mini(MP3プレーヤー)"チョットぉ鳴らして見ます。
前回はメモリにデータを書き込んでUART通信で制御しましたね。
今度のはマイクロSDカードを使います、UART通信の他にI/O制御モード(押しボタン)で操作します。
なのでぇ、I/O制御モードならマイコンは要らないんでぇないかい。(このHPではUART通信のみ実験)

またまたDFROBOTの製品ですねぇ。
今度はArduinoのライブラリが有るらしいのでArduinoUNOで鳴らして見ます。
ライブラリはここのHPの"Sample Code"の所のリンク" DFRobotDFPlayerMini"をクリックします。
マニュアルはそのダウンロードした"doc"ディレクトリ内に有ります。(今度のはそこそこ詳しい)

《ファイルについて》

・マイクロSDカードは2GB〜32GBで、FAT16/FAT32ファイルシステム
・再生させるファイルの指定はファイル名でなくトラック番号(書き込んだ物理的な順番)となります。
・ルートディレクトリには最大3000のトラックファイルをサポートします。
・サブディレクトリは”01”〜”99”で作成する、
 サブディレクトリ内ファイルは最大で0x01から0xFFまでの255トラックをサポートします。
 但し、[0x14]コマンドを使用すれば”01”〜”15”の15フォルダのみ各フォルダに3000トラックを
 保存できます。
・”MP3”と言う特別な目的のフォルダーが有り3000のトラックファイルをサポートします。
 このディレクトリは[0x12]コマンドを使用して再生します。
・”ADVERT”と言う特別な目的のフォルダーが有り3000のトラックファイルをサポートします。
 このディレクトリは広告を再生する為のファイルを作成し、曲を再生中に[0x13]コマンドで
 広告ファイルを挿入し、広告を再生終了後中断した曲に戻って再開します。
・ルートディレクトリに直接保存されているオーディオファイルは、
 0001.mp3/0001.wav、0002.mp3/0002.wav、....3000.mp3/3000.wavの様に名前を変更する
 必要があります。
・トラック番号指定のコマンドは、ファイル名は何でもOKの様です動作はします。

《モジュールについて》

このモジュールには押しボタンのみで操作する"ADkey Control モード"が有りますが、
ここではマイコンに繋ぎUARTモードで操作する機能のみ記載します。

ピンの構成図

ピン配置図
この図はデータシートから拝借しました。

No
ピン名称
機能
1
VCC
電源 3.3V-5.0V、best at 4.2V (3.3VのIOポートレベル)
2
RX
データ受信ポート MCUのTXと接続する
3
TX
データ送信ポート MCUのRXと接続する
4
DAC_R
音声出力右チャンネル
(イヤホンを駆動するか外部アンプに接続する)
5
DAC_L
音声出力左チャンネル
6
SPK1
スピーカーの出力+(4Ω/8Ω 3W以下)
7
GND
Ground
8
SPK2
スピーカーの出力ー(4Ω/8Ω 3W以下)
9
I/O1
トリガーポート1
短く押すと前の曲を再生します(長く押すと音量が小さくなります)
10
GND
Ground
11
I/O2
トリガーポート2
短く押すと次の曲を再生します(長く押すと音量が大きくなります)
12
ADKEY1
ADポート1
最初のセグメントを再生するためのトリガー
13
ADKEY2
ADポート2
5番目のセグメントを再生するためのトリガー
14
USB+
USBポート(USBフラッシュドライブ又はPCに接続)
15
USB-
USBポート(USBフラッシュドライブ又はPCに接続)
16
BUSY
通常はHIGH出力、再生中はLOW出力

・今回の接続は青い色のピンのみ配線します。
・シリアルポートのTTLレベルは3.3Vです。
 5V MCUと接続する場合は、1KΩの抵抗を使用してください。
・ヘッドフォンとモジュールの間に、100Ωの抵抗を追加して制限する事ができます。

《コマンド》

メッセージフォーマット

[・・・・]内は全て1バイト、全部で10バイト
[開始コード][バージョン][データ長][コマンド][返答有無]
            [Para_MSB][Para_LSB][Check_MSB][Check_LSB][終了コード]
開始コード  :0x7E
バージョン  :0xFF
データ長   :データの個数、[バージョン]〜[Para_LSB]まで通常は0x06
コマンド   :操作コマンド=0x01-0x1A 問い合わせコマンド=0x3A-x4F
返答有無   :0x00=返答不要  0x01=返答必要、確認をMCUに送り返す
        返答必要で送信した場合は[0x41]コマンドが返される
        (7E FF 06 41 00 00 00 FE BA EF)
Para_MSB  :パラメータの最上位バイト
Para_LSB   :パラメータの最下位バイト
Check_MSB :チェックサの最上位バイト
Check_LSB  :チェックサの最下位バイト
終了コード  :0xEF

チェックサムの計算
0xFFFF - ([バージョン]〜[Para_LSB]までの総合計)+ 1

「通常、ユーザーがチェックサムを使用するかどうかを選択しても問題ありません。
 モジュールはチェックサムの有無にかかわらずシリアルデータを受け取る事ができますが、
 何人かのユーザは水晶発振器なしでMCUを使用します、従ってその場合私達は通信安定性を
 確かめる為にチェックサムを追加する事を強く推奨します。」
と、データシートに有る私も推奨して置きましょう。

(モジュールが返すコマンド)

電源投入時の動作[0x3F]

@ モジュールに電源が投入された後又はリセット後、通常は(記憶装置内の実際のトラック数に応じて)
  500msから1500ms以下の初期化時間が必要です。
  初期化が完了すると、モジュールはMCUにデータ0x3Fを返します。
  初期化時間を超えてもデータが返されない場合は、初期化にエラーがある事を意味しています。
  ハードウェアの接続を確認してください。
A 初期化後にモジュールから返されるデータは、現在有効なストレージデバイス/オンライン機器を
  意味します。例えば、モジュールは”7E FF 06 3F 00 00 03 xx xx EF”を返します。
  0x3Fはモジュールによって返されたコマンドで、パラメータの0x03はUSBフラッシュドライブと
  SDカードが同時に有効/オンラインである事を表します。
Para_MSB
Para_LSB
パラメータの内容
00
00
電源投入後、SDカードが刺さっていない時にでる
00
01
USBフラッシュドライブオンライン
00
02
SDカードオンライン
00
03
USBフラッシュドライブとSDカードが両方オンライン
00
04
PCオンライン
B MCUは、モジュールの初期化が完了してデータが返されるまでモジュールを制御する為のコマンドを
  送信できません。
  それ以外の場合、MCUによって送信されたコマンドは無視され、モジュールの初期化にも影響します。

曲の再生終了後に返されるデータ[0x3C][0x3D]

@ トラックの再生が終了した後に返されるデータがあります。
  例えば、返されるデータは”7E FF 06 3C 00 00 01 xx xx EF”です。
  コマンドの0x3CはUSBフラッシュドライブを表し、0x3DならSDカードを表します。
  パラメータの0x00と0x01は再生した1番目のトラックを表します。
A ストレージデバイス内の全てのファイル(トラック)は物理的な順序で読み取られる為、
  返されたデータは当然物理的な順序に従っているので、注意が必要です。

※ 0x3Dコマンドが再生終了後に2回返されたがぁ...まぁ、よかたい。

モジュールからのフィードバックの返送データ[0x41]

コマンドを送信する際に"返答要求有り"で送るとこのデータが返されます。
@ データ通信間の安定性を高める為に、モジュールからのフィードバック機能が追加されています。
  モジュールからMCUへのフィードバックがあると、モジュールがMCUから送信されたコマンドを
  正常に受信した事を意味します。返されるコマンドは、”7E FF 06 41 00 00 00 FE BA EF”です。
A ユーザーはこのフィードバックを自由に選択できます。この機能を利用しないのもいいでしょう。

エラーの返却データ[0x40]

@ モジュールの電源が入ると、まずSDカードを読み取り、SDカードが使用できない場合は
  USBフラッシュドライブにアクセスします。
  返されるコマンドは、”7E FF 06 40 00 00 01 xx xx EF”です。パラメータの0x01は”ビジー”です。
Para_MSB
Para_LSB
パラメータの内容
00
01
モジュールビジー(この情報は初期化が完了していない時に返されます)
SDカードが刺さっていない時にコマンドを発行した時もでる(初期化未完了)
00
02
現在はスリープ中(スリープモードで指定されたデバイスのみをサポート)
00
03
シリアル受信エラー(未受信フレーム)
00
04
チェックサムが正しくありません
00
05
指定されたトラックは現在のトラックの範囲外です
00
06
指定したトラックが見つかりません
00
07
広告の挿入エラー(挿入操作はトラック再生中のみ可能)
00
08
SDカードの読み取りに失敗しました(SDカードの引き出し又は破損)
(初期化完了後のメッセージはこちらが出ると思う)
00
0A
スリープモードに入りました

ストレージデバイスの抜き差し後に返されるデータ[0x3A][0x3B]

@ コマンドの0x3Aはデバイスが接続されている事を表し、
  コマンドの0x3Bはデバイスが引き出されている事を表します。
Para_MSB
Para_LSB
パラメータの内容
00
01
USBフラッシュドライブ
00
02
SDカード
00
04
PCに接続されたUSBケーブル

(モジュールを操作するコマンド)

コマンドの一部のみ記載して置きます、その他はデータシートを見ましょう。

トラックの再生指定(ルートディレクトリ)[0x03]

@ 例えば、最初に再生する曲を選択して、コマンド”7E FF 06 03 00 00 64 FF E7 EF”を送信します。
A トラックの選択に関しては、100曲目(トラック)を選ぶ場合、最初に100を16進数に変換してください
  パラメータは2バイト、つまり0x0064です。MSB = 0x00 LSB = 0x64

ボリュームを指定する[0x06]

@ システムの電源投入時のデフォルトの音量はレベル30です。(指定可能範囲は0-30レベルです)
  音量を設定したい場合は、対応するコマンドを直接送信してください。
A 例えば、音量をレベル15に指定した場合は、コマンド”7E FF 06 06 00 00 0F FF D5 EF”を送信して
  ください。
B パラメータは MSB = 0x00 LSB = 0x0F、15は16進数0x000Fに変換されます。

イコライザーの指定[0x07]

@ 例えば、ロック調のEQを指定する場合、コマンドは”7E FF 06 07 00 00 02 FE F2 EF”を送信します
  EQのパラメータは、00:Normal 01:Pop 02:Rock 03:Jazz 04:Classic 05:Bass です。

シングルリピート再生を指定する[0x08]

@ 一部のユーザーがシングルリピート再生を必要とするというニーズを満たす為に、
  この制御コマンド0x08を追加しました。
A シングルリピート再生中も、通常の再生/一時停止、前へ、次へ、音量+/-、EQ等の操作を実行できます
  シングルトラック再生を指定するか又はスリープ状態にしてシングルリピート再生ステータスを、
  オフにする事ができます。

再生するデバイスを指定する[0x09]

@ このモジュールは、2種類の再生デバイス(USBフラッシュドライブとSDカード)をサポートしています
  再生を指定するには、デバイスがオンラインである必要があります。
  デバイスがオンラインかどうかを自動的に検出しますのでユーザーが注意をする必要はありません。
  このコマンドは0x09です。
  パラメータは 01=USBフラッシュドライブの再生を指定 02=SDカードの再生を指定
A デバイスを指定した後、自動的にスタンバイ状態になり、再生をを指定するまでMCUを待ちます。
  デバイスの指定からモジュールまでのファイルシステムの初期化が完了するまで約200msかかります。
  200ms待ってから操作したいコマンドを送信してトラックを再生してください。

フォルダ内のトラックを指定して再生をする[0x0F]

@ デフォルトのフォルダは、この様に "01"、 "11"、 "99"と名前が付けられています。
  システムの安定性を高める為に、最大99個のフォルダーと最大255個のファイルをサポートします。
A 例えば、フォルダ "11"で "100.mp3"を再生する様に指定した場合は、
  コマンド”7E FF 06 0F 00 0B 64 xx xx EF”を送信します。
  このコマンドは0x0Fです。0x0B(MSB) 0x64(LSB) がパラメータです。
  MSB:フォルダの名前を表し、最大99個の"01"から"99"までのフォルダをサポートします。
  LSB:ファイルの名前を表し、最大で0x01から0xFFまでの255ファイルをサポートします。
B 曲をターゲットにするには、フォルダーとファイル名の両方を指定する必要があります。
  この機能はMP3およびWAVオーディオフォーマットをサポートしています。

※ この機能は、ファイル名で指定する事に注意して下さい。
  ファイル名は001.mp3〜255.mp33桁で作成して置きます、
  ファイルの名前を変更した時に元の名前を保持する事もできます。
  例えば、元の名前は「Yesterday Once More.mp3」ですが、
  名前を「001Yesterday Once More.mp3」に変更できます。

全ての繰り返し再生を指定する[0x11]

@ ストレージデバイスのルートディレクトリにある全てのトラックを繰り返し再生する必要がある
  ユーザーのニーズを満たす為に、この様な制御コマンド0x11を追加しました。
  パラメータは、00=停止 01=開始 です。
A 全てのリピート再生中に、再生/一時停止、前へ、次へ、音量+/-、EQ等の操作を通常通り実行できます
B 全ての繰り返し再生を開始した後モジュールは、停止又は一時停止のコマンドを受け取るまで、
  デバイス内の全てのトラックを何度も何度も何度も繰り返し再生します。

※ このコマンドはフォルダー内の曲も再生します。

“ MP3”フォルダの再生を指定する[0x12]

@ フォルダの再生を指定する事に基づいて、この様な単一フォルダ機能を拡張しました。
  ここのコマンドは0x12ですが、操作は0x03と同じ様に行います。
  フォルダは「MP3」という名前にする必要があります。
A この特別なフォルダは最大トラック数をサポートしています。
  65536曲(トラック)ですが、フォルダが大きくなるにつれて動作速度が遅くなりますので、
  このフォルダには3000曲(トラック)以下にしてください。
  このフォルダのオーディオファイルは、0001.mp3/0001.wav、0002.mp3/0002.wav、....
  .. 3000.mp3/3000.wavの様に名前を変更する必要があります。

“ ADVERT”フォルダの再生を指定する[0x13]

@ このモジュールは、トラックの再生中に広告を挿入する事をサポートしているので、
  アプリケーションによっては特別なニーズを満たす事ができます。
A コマンド0x13を送信した後、システムは再生中のトラックのIDV3情報を保存して一時停止し、
  指定された挿入トラック(広告)を再生します。
  挿入されたトラックが終了すると、システムは戻って最後まで中断されたトラックを再生し続けます。
B 設定方法は、記憶装置に「ADVERT」という名前のフォルダを作成し、その中に必要なトラック(広告)
  を置き、ファイルの名前を0001.mp3/wav、0002.mp3/wavに変更します。
C モジュールが一時停止状態 又は停止状態の時に挿入コマンドを送信した場合は、
  挿入コマンドは機能せず、エラー情報が返されます。
  挿入の過程で、あなたは他のトラック(広告)を挿入し続ける事ができます。
  最後に挿入したトラックが最後まで移動しても、システムは最初に保存したIDV3の位置に戻ります。
D この特別なフォルダに格納されているオーディオファイルは、0001.mp3/0001.wav、
  0002.mp3/0002.wav.... 3000.mp3/3000.wavの様に名前を変更する必要があります。

3000トラックをサポートするフォルダ内のトラックの再生を指定する[0x14]

@ 各フォルダがより多くのトラックを管理できるという一部のユーザーのニーズを満たす為に、
  ユーザーが使用できるこのコマンドを特別に追加しました。
  それは最高を支えますが15フォルダのみ("01"フォルダ〜"15"フォルダまで)、
  各フォルダに3000ファイルを保存できます。
A コマンドバイトは0x14です。
  例えば、フォルダ "12"のファイル名"1999.mp3"の再生を指定した場合、
  シリアルコマンド”7E FF 06 14 00 C7 CF FD 51 EF”を送信する必要があります。
  0xC7と0xCFはパラメータであり、組み合わされたデータは0xC7CFで合計16バイトです。
  上位4バイトはフォルダ名を表し、ここでCはフォルダ "12"を意味します。
  下位12バイトはファイル名を表し、ここでの7CFは、ファイル「1999」を意味します。
B これらのフォルダに格納されているオーディオファイルは、0001.mp3/0001.wav、
  0002.mp3/0002.wav.... 3000.mp3/3000.wavの様に名前を変更する必要があります。

※ この機能は、ファイル名で指定する事に注意して下さい。
  ファイル名は0001.mp3〜3000.mp34桁で作成して置きます、
  ファイルの名前を変更した時に元の名前を保持する事もできます。
  例えば、元の名前は「Yesterday Once More.mp3」ですが、
  名前を「0001Yesterday Once More.mp3」に変更できます。

停止を指定する[0x15][0x16]

@ モジュールの再生中に停止するモードは2つあります。
  1つは挿入された広告の再生を停止し、中断された音楽の再生を続けて再生する事です。
  このコマンドは0x15です。
A もう1つのモードはすべての再生を停止する事です(デコードの停止)。
  このコマンドは0x16です。

フォルダの繰り返し再生を指定する[0x17]

@ フォルダ名は01から99、99以下でなければなりません。
A コマンドを送信した後、特定のフォルダ内のトラックを繰り返し再生し、
  停止するコマンドを受け取るまで停止しません。
  このコマンドは0x17です。
B このコマンドを使用すると、フォルダは255を超えるファイルを再生できます。

ランダム再生を指定する[0x18]

@ このコマンドは、物理的な順序に従ってストレージデバイス内のサウンドファイルをランダムに
  再生する為に使用されます。デバイス内にフォルダが存在するかどうかは関係ありません。
  再生される為に行われる最初のサウンドファイルは、デバイスの最初の物(0001)です。
  このコマンドは0x18です。

現在のトラックの繰り返し再生を設定する[0x19]

@ 再生中にターンオンコマンドを送信すると、現在のトラック(曲)が繰り返し再生されます。
  このコマンドは0x19です。
  モジュールが一時停止又は停止の場合、このコマンドには応答しません。
A 繰り返し再生をオフにする必要がある場合は、単に停止コマンドを送信してください。

DACを設定する[0x1A]

@ このコマンドは0x1Aです。パラメータは 00=DACをオンにする 01=DACをオフにする(high抵抗)
A モジュールの電源がオンになると、DACはデフォルトでオンになります。
  コマンドを送信して設定するまで、DACは切れません。

(モジュールに問い合わせるコマンド)

現在のオンラインストレージデバイスを問い合わせる[0x3F]

@ モジュールが動作している時、ユーザーはコマンド(0x3F)を使用してオンラインストレージデバイスの
  ステータスを問い合わせる事ができます。
A 例えば、モジュールがデータ”7E FF 06 3F 00 00 02 xx xx EF”を返した場合、
  LSB 0x02(00 02)はSDカードがオンラインである事を表します。

現在のステータスを問い合わせる[0x42]

@ モジュールのデコード中に照会できるステータスは4つ(再生中/一時停止中/停止中/スリープ中)
  ユーザーはコマンドを送信して現在の状態を問い合わせる事ができます。
A パラメータの表現
Para_MSB
Para_LSB
パラメータの内容
01

USBフラッシュドライブ
02

SDカード
10

スリープモードのモジュール

00
停止

01
再生中

02
一時停止
B 例えば、返されたデータのパラメータが"0x0201"であれば、SDカードが再生中となります。

フォルダ内のトラック数を問い合わせる[0x4E]

@ 例えば、フォルダ11内のトラック数の問い合わせは”7E FF 06 4E 00 00 0B FE A2 EF”です。
A 照会されたフォルダーがファイルなしで空の場合、モジュールはエラーを報告し、
  データ7E FF 06 40 00 00 06 FE B5 EFが返されます。
  (パラメータが06?ファイルが6個とかありえないのかなぁ?、不明)

現在の記憶装置内のフォルダ数の問い合わせる[0x4F]

@ ユーザーは、コマンド0x4Fを送信して現在のストレージデバイスの合計フォルダ番号を照会できます。
  返されるコマンドは0x4Fでパラメータにフォルダ数があると思う
  これは単にデバイスのルートディレクトリのフォルダ番号を問い合わせる事をサポートします。
  サブフォルダの番号を問合わせる事はできません(フォルダ内にサブフォルダを作成しないでください)

《回路について》


DFROBOTのHPのこちらにある”Connection Diagram”の配線図通りに接続しました。
電源は5.0Vです、Arduinoの11(TX)番ピンとモジュールの2(RX)番ピンの間に1KΩ抵抗を入れるのを
お忘れなく、念の為に。(抵抗を入れなかった場合は、ノイズに悩まされます。)

《ダウンロードファイルについて》

ライブラリはここのHPの"Sample Code"の所のリンク" DFRobotDFPlayerMini"をクリックします。
Arduinno IDE 1.8.1 で説明、
メニューバーの[スケッチ]→[ライブラリをインクルード]→[.ZIP型式のライブラリをインストール...]を
順番にクリックし、ダウンロードしたファイル"DFRobotDFPlayerMini-1.0.3.zip"を指定します。

examplesフォルダの説明
AdvancedSettingViaSerial1.......2個目のハードUART(Serial1)が存在するArduinoでのサンプル
AdvancedSettingWithoutACK....コマンド送信時の応答要求有りでのサンプル
AdvancedSettingWithoutReset..初期化時にリセットを行うサンプル
FullFunction...........................ライブラリの全ての関数を記述したサンプル
GetStarted.............................標準のサンプル
ReadValues............................モジュールに問い合わせを行うだけのサンプル

UART通信は9600bps固定です。
サンプルの基本動作は、ボリュームを"10"に設定しトラック1を再生します。
次に、3秒毎に次のトラックを再生させます、最後まで再生したら頭に戻って再生、永遠に繰り返します。

って事は、nextコマンド(0x01)は最後まで再生したら頭に戻るという事よねぇ。
それとぉ、3秒毎なのでそれより長い曲は切れて次の曲が再生されます。

DFRobotDFPlayerMiniライブラリの使い方説明は割愛させていただきます。

《その他》

ディレクトリも作れるしぃ、MAX32GBの容量だしぃ、押しボタンだけでも動作するしぃ、
もう、ウォークマン決定かぁ?
でもぉ、PIC版どおしよう、ライブラリ作るかなぁ...
PS. 作ってしまいました、こちらです。




【きむ茶工房ガレージハウス】
Copyright (C) 2006-2019 Shigehiro Kimura All Rights Reserved.