SSブログ

DFPlayerをPICで制御 [電飾しましょ]

【プロローグ】
多機能で安価なMP3プレーヤー、DFPlayer mini を使ってみました^^
今まで作品の効果音やセリフ等は、市販のMP3プレーヤーを分解して、操作スイッチをトランジスタ・スイッチでPICから操作していました。
人間の代わりにPICでボタンを操作する格好です。
それなりに動いてくれていましたが、展示会などではみなさんDFPlayerというMP3プレーヤーを使っていて、とても良いとのウワサを聞いていました。
ただ、ほとんどの方はArduinoで制御されていて、それもそのはず、ライブラリが公開されていて、それを組み込むだけで簡単に操作できるみたいです。
そこで、PICからも操作出来ないかと試してみたところ、アッサリ出来たので公開してみようと思います。
PICからMP3プレーヤーを制御したいと言う要望が、どれだけあるのか判りませんが、この記事がお役に立てれば幸いです。

【DFPlayer mini とは?】
さっそく、Amazonで購入してみました。
秋月電子通商でも取り扱っていますが、2019.12現在、1、050円です。
Amazonでは海外から発送されるショップもあり、そこから買うと2週間くらい掛かってしまいます。
ボクは5個セットで1,300円くらいで購入できましたし、2日後には届きましたので、購入する際は購入先にご注意下さいね。
ちなみに、1,300円で5個なので、1個260円です^^
本当に動くのか不安になる値段ですね。

DFPlayer mini は、とても小さなMP3プレーヤーです。
DFPlayermini 外観.jpg
曲はMicroSDカードに入れて使いますが、サイズはほぼSDカードスロットと同じですね^^
再生させたり停止させたり、次の曲にスキップしたり、ボリュームを上げたりするには、幾つか方法があります。
DFPlayer mini のピンアサインです。
PINアサイン.jpg
1 VCC 電源のプラスを接続します。今回は5Vで使用します。
2 RX シリアル通信の受信端子です。後程PICで制御させます。
3 TX シリアル通信の送信端子です。こちらもPICと繋ぎます。
4,5 DAC_R&L 別にアンプを繋ぐ場合の出力端子です
6 SPK2 なんと直接スピーカーを繋げます。3Wのアンプ内蔵です。
7 GND 電源のマイナスを繋ぎます。2つありますが、どちらも同じです。
8 SPK1 スピーカーのマイナス端子です。
9 IO1 マイコン無しで、直接スイッチで動作させる端子です。
10 GND 電源のマイナスを繋ぐ、もうひとつの端子です。
11 IO2 直接操作端子が、もうひとつあります。
12,13 ADKEY1&2 これもマイコン無しで操作できる端子ですが、
        抵抗値で機能を分けられるので、色々操作出来ます。
14,15 USB+- パソコンと接続したり、ほかのUSB機器用の端子です。
16 BUSY 曲の再生中を検知できる端子です。

今回は、2番と3番ピンを使って、シリアル通信でPICから制御しますが、スイッチを繋げばマイコン無しでも使える仕組みがあります。
その1 IO1&2
speaker2.png
データシートに参考回路が載っていますが、IO1をGNDに繋ぐスイッチを付けるだけで、SDカードの曲を順番に再生してくれます。
IO2なら前の曲になります。
長押しすればボリュームは変えられますが、ストップもポーズも出来ません。

その2ADKEY
adkey_control.png
ADKEY は2本ありますが、ここに抵抗を介してGNDへ繋ぐことで、抵抗値によって様々な機能が使えます。
抵抗が沢山必要になりますが、ちょっとしたMP3プレーヤーを作る事も可能ですね。

【PICとの接続】
さて、ここからが本題です^^
PICと接続してみましょう。
今回はPIC12F1822を使ってみますが、PICにはほぼシリアル通信機能が付いているので、基本的な使い方さえ覚えればどのPICでも使えると思います。

回路図です。
DFPlayer for PIC.PNG
回路図のDFPlayerは、丸い切り欠きがある方が上で、SDカードが刺さる方が下です。念のため^^
DFPlayerのTXとPICのRX,RXはPICのTXへ繋ぎます。
DFPlayerの送信はPICの受信へ、DFPlayerの受信はPICの送信へと、送受信の関係が逆になります。
これはベテランでも間違うことがありますので、注意して下さい^^
1kΩの抵抗が入っていますが、PICは5VでDFPlayerの通信端子だけ3Vの仕様のため、電圧を調整するためのものです。
後は電源とスピーカーを繋ぐだけですので、非常にスッキリした配線になりますね。
ブレッドボードに組んでみました。
DFPlayer ブレッドボード.jpg
DFPlayerのピンは太いので、ブレッドボードに挿すにはキツイです。
あまり奥まで差し込むと、ブレッドボードのピンソケットを痛めてしまいますので、程々にしましょう^^

SDカードに入れる曲は、曲名ではなく連番になります。
0001.mp3 0002.mp3 0003.mp3 ・・・
と、4桁の数字で書き込んでください。
フォルダを作る事も可能ですが、模型製作では連番で充分でしょう。

【MCCでのプログラム】
次にプログラムですが、MCC(MPLAB Code Configurator)を使う方法と使わない方法があります。
MCCとは、MPLAB X にプラグインとして追加できる、PICの持つ様々な機能を簡単に設定してくれる優れものです。
標準では入っていないので、MicriChip社のHPからDownLoadして下さい。
組み込み方法は詳しいサイトがたくさんありますので割愛します。
ただ、MPLAB X のバージョンが古いとインストールできない場合があるらしいです。
これで出力端子やタイマーなどPICの持つ機能がグラフィカルにセット出来ます。
もちろんシリアル通信の設定もしてくれるのですが、基本的に機能の意味を知らないと何を設定して良いのか判りません。
余計なインクルードファイルも追加されて若干ですがメモリも消費しますので、MCCを使う方法はボクからはあまりお勧めしません。
ただ、実験的に使うには便利なプラグインですので、一応MCCでのUSARTの設定を掲載しておきます。
MCC設定.jpg
この設定でGenereteしたmain.cへ、以下のプログラムを追記します。
MCCにより、1バイト送信するEUSART_Write()関数が使えるようになっています。
送信するピンや、通信速度も設定済みなので、いとも簡単にシリアル通信が出来ちゃいます。
ボリュームを15に設定して、2曲目をセット、5秒間隔で再生・停止を繰り返します。
PROG.JPG

送信するデータは、8個が一組です。
7E FF 06 command para1 para2 para3 EF で1セットになります。
command が機能で、para1~3がパラメータ値になります。
例えば、ボリュームを15にセットするなら、
7E FF 06 06 00 00 1F EF
7E FF 06 の後に、ボリューム機能の06 、設定値の 00 00 1F(10進数で15)と続き、EF で終わります。
再生開始なら、
7E FF 06 0D 00 00 00 EF
0Dが再生開始機能で、設定値は無いので00です。
これらのコマンドは、DFPlayerのデータシートに記載されています。
こちらからダウンロードして下さい。
http://www.flyrontech.com/uploadfile/download/2016441645109830.pdf
6~7ページに記載されています。
コマンド.jpg

【MCCを使わないプログラム】
次に、MCCを使わない方法です。
こちらは設定をすべてプログラムしなくてはなりませんが、何を設定しているのか把握できます。
回路はそのままで使用できます。
今度は普通にプロジェクトを作成して、「電飾しましょっ2 PIC編」のPIC12F1822のテンプレートをコピペしてください。
そこへ以下のプログラムを打ち込んで下さい。
PORG 1.jpg
PROG 2.jpg
すみません。プログラムは画像ファイルで、コピペは出来ません。

#defaine _XTALFREQ 8000000
 動作周波数を8MHzに設定

void DFP(char command,char par){
 コマンドと設定値をDFPlayerへ送信する関数を作りました。
 TXIFは送信可能かを判断するもので、送信可能なら1バイトずつ送信しています。

OSCCON 動作クロックは内部発信で8MHz
ANSELA アナログ入力に設定するピンの指定
TRISA デジタル入力にするピンの指定
    今回RXにしたRA5は、入力にしなくてはならないはずですが、自動的に
    入力になっているみたいです
PORTA 出力を全て0に

ここからがシリアル通信の設定です。
RXDTSEL PIC12F1822は、RX,TXの端子を2箇所から選択できます。
TXCKSEL        今回はRX=RA5 TX=RA4 を選択しました。
TXSTA 送信の設定レジスタです。非同期、8Bit、パリティ無し
RCSTA 受信の設定レジスタです。詳しくは後述するサイトで
SPBRG 通信速度(ボーレート)を設定します。

設定するのはこれだけです。
あとはコマンドと設定値を引数にしてDFP()関数をコールするだけです。
プログラムは、ボリュームを20にセット、2曲目を指定してから、次の曲を10秒再生して2秒停止する を繰り返します。

ここで難解なのは、TXSTA、RCSTA、SPBRG ですね^^
TXSTAとRCSTAはシリアル通信ではスタンダードな設定値で、このまま丸写しでほぼ問題ないと思います。
設定を変えたい、中身を知りたいという場合には、こちらのサイトがとても詳しいです。
マイコンの実験:PIC16F628A-12F1822 USART実験(1-2)
http://zattouka.net/GarageHouse/micon/USART/USART.htm
※失礼ながら、無断でリンクを記載しております。問題がある場合はご指摘下さい

SPBRGはボーレートの設定で、使用するPICのデータシートから設定値を決めます。
今回は非同期(SYNC=0)、高速モード(BRGH=1)、ボーレートは8Bit(BRG16=0)です。
PIC12F1822の場合は、データシートの300ページにある表から
BR設定表.jpg
この表から51と言う数値を設定しました。
ちなみに、表が無くても計算で値を出すことも可能です。
今回の場合は
( Fosc ÷ 通信速度 ÷ 16 ) - 1
(8000000 ÷ 9600 ÷ 16 ) - 1
= 51.08 = 51
という計算でも求められます。

これらの設定は、シリアル通信がどのように行われているのか、細部まで詳しく理解していないと設定出来ません。
今回設定した値は標準的なもので、大抵の通信はこの設定で行けるハズですが、使用する機器によっては、もっと高速なボーレートだったり、チェックサムが必要だったりする場合もありますので、その場合は自分で設定内容を調べなくてはならなくなります。
簡単に設定できるMCCを使って、上手く通信できるか試してみて、設定内容が判ったらMCCを使わないでプログラムする といった使い方がベストかも知れません。
とりあえず、DFPlayerはこの設定で動きますから、まずは動かして楽しみましょう^^

最後にオマケ
コマンドの一覧表を掲載しておきます。
コマンド表.jpg
自分でも参照しやすい様に編集したものです。

【最後に】
DFPlayer mini は、安価で小型であるにも関わらず、アンプ内蔵で音質も良く、たった数行のコードで自在にコントロールできるスグレモノです^^
この記事でPICからサウンドを自在にコントロール出来る様になって頂けたら幸いです。

コメント(27) 

コメント 27

tezno

早速のブログアップありがとうございます!
ただいまPICのお勉強中なのでDFplayerも
入手してみたいと思います。
by tezno (2019-12-30 11:20) 

toshi

早速のブログアップありがとうございます!
ブロ友のなおさんから頂いたサンプルと合わせてやってみます。
これができると更に夢が膨らみますね。
そして宿題になっている依頼品がより簡単にできるww
by toshi (2019-12-30 11:42) 

なお

こんにちは。
分かりやすい記事をありがとうございます。私はMCCに頼ってるので制御レジスタの設定項目とかあらためて勉強になります。
Arduinoは簡単にいろいろ使えて便利な反面、どうも制御が自分の手の内にはいらない感じがあって個人的にあまり積極的に使おうという気になりませんので、PIC関連のノウハウは助かります!
by なお (2019-12-30 12:25) 

よっしー

すごい!
仕事が速いし、丁寧!
次に音声ギミック付きのジオラマ作る時は、頑張って試してみたいと思います♪
by よっしー (2019-12-30 13:26) 

どろぼうひげ

teznoさん、こんばんは
ウワサのDFPlayerでしたが、かなり使えるアイテムです^^
ぜひ使ってみてくださいね!
by どろぼうひげ (2019-12-31 00:18) 

どろぼうひげ

toshiさん、こんばんは
宿題を抱えておられるのですね(^_^;)お疲れっす
今回DFPlayerの記事を書けたのは、toshiさんが背中を押してくれたおかげです
自分の備忘録としても活用できそうです。
ありがとうございました(^^)/
by どろぼうひげ (2019-12-31 00:21) 

どろぼうひげ

なおさん、こんばんは
MCCはPICをArduinoライクに使える優秀なアイテムですよね
面倒な設定はブラックボックスとして捕らえる時代なのかも知れません(^_^;)
MCCはボクも使っていて、決して否定派ではありません
どんどん楽をして、楽しみましょう
by どろぼうひげ (2019-12-31 00:26) 

どろぼうひげ

よっしー さん、こんばんは
DFPlayerを使ってみて、その使いやすさに驚きました。
なるほどみんなが薦めるわけです^^
この記事がお役に立って頂けたなら嬉しいですo(^_^)o
by どろぼうひげ (2019-12-31 00:28) 

toshi

取り敢えずMCCを使わない方で記事の通りにプログラムを書いて、試してみたところ、ちゃんと動きました!!
なんかあっけないというか、こんなに簡単にできちゃっていいの?ってな感じでした。ありがとうございます!!
フォルダを作り、連番の音声ファイルの中から指定したものを再生するところまでできたので、早く模型に活用しなければ!

by toshi (2020-01-03 11:58) 

Vivid

初めまして、これまではReadOnlyでした(笑)
「なお」さんつながりでコメントさせていただきました。
飲み屋さんで「ドロオフ」のお話もお聞きして、盛り上がりました。

DFPlayerは安くて便利で、模型ギミックには最適ですよね。
以前から時々使用していますが、私の個体では。最初、Resetコマンドではまってしまい苦労しました。Reset後は、5-10msec空けて次のコマンドを送らないと「ハングアップ」して、動作しない現象がありました。今回はResetコマンドを使用されないので問題はないと思いますが。
おまけにチェックサムを付けないと動作不良だったこともありましたので、それでもはまりました(笑)
この様な記事は、これから使用される方にきっと役立ちますね。
私も、もっと早く見たかったです。(笑)
by Vivid (2020-01-09 17:16) 

どろぼうひげ

toshiさん、こんばんは
お役に立てて良かったです^^
ウワサ通り、素晴らしい性能ですね
もう市販のプレーヤーをバラすことは無いでしょうね
当面、使う予定は無いのですが(^_^*)
by どろぼうひげ (2020-01-09 19:35) 

どろぼうひげ

Vividさん、はじめまして^^
なおさんのお知り合いでしたか~
よろしくお願いしますね
貴重な体験談をありがとうございます
今後困ったときに活用させて頂きますね
ボクの場合は、余程運が良かったらしく、アッサリと制御できちゃいました^^
PICで使う情報がほとんど無いので、きっと誰かのお役に立てると信じています
とても良いアイテムなので、もっと広がると良いですね

by どろぼうひげ (2020-01-09 19:43) 

吉田

こんばんは。
現在DFplayerをPICで操作しようとしています。
電飾しましょう2PIC編を参考にしてどろぼうひげさんの記事内の
プログラムがご説明のとおり動作することまではできました。
PIC初心者(電子工作自体)の私でもわかりやすい解説で非常に助かります。

質問があります。

PLAY NEXTの命令 
DFP(0x01,0x00)
だけのプログラムで実行しても最後まで再生されず
それぞれのデータの最初のみ数秒を再生をくりかえします。
PLAY の命令
 DFP(0x0D,0x00)
でも最初のデータが数秒再生されて終了でした。

自分では再生の命令がでたら最後まで再生が続くと思っていましたが
そうではないものなのでしょうか?

どろぼうひげさんのプログラムでも再生のあとのDELEYの秒数だけ
再生されているので、そういうことなのでしょうか?

もしよろしければ回答お願いします

以上、よろしくお願い申しあげます。


by 吉田 (2020-05-06 19:31) 

どろぼうひげ

吉田さん、こんばんは
こちらでは、一度再生を開始すれば、終わりまで行って、次の曲が再生されています。
もしかして、単にDELAYを外しただけではありませんか?
while()で無限ループになっていますので、再生コマンドが何度も送信されているのかも知れません。
whileを外してみてはいかがでしょうか?

by どろぼうひげ (2020-05-06 20:20) 

吉田

ご回答有難うございます。
WHILEもはずしてあったんですが....
・・・・・
SPBRG = 51;
__delay_ms(2000);

DFP(0x06,0x14);
DFP(0x03,0x01);

DFP(0x0D,0x00);

こんな感じです。
各データの冒頭のみ数秒再生の繰り返しです。

本体をADKEYと抵抗で操作すると普通に動作します。

接続や設定をさらに確認してみます。

有難うございます。


by 吉田 (2020-05-06 21:52) 

どろぼうひげ

何でしょうね(^_^;)
ちょっと原因がわかりません
回路的なものかな?
SPK-はGNDに繋いでいませんよね?
回路図にはありませんが、PICの+と-に0.1μFのコンデンサを入れてみてどうでしょう?

by どろぼうひげ (2020-05-06 22:08) 

吉田

アドバイス大変有難うございます。
結局うまくいきませんでした。
更にいろいろ確認してみます。
有難うございます。
by 吉田 (2020-05-06 23:48) 

どろぼうひげ

全然お役に立てなくてすみませんm(__)m
上手く行く事をお祈りしています
by どろぼうひげ (2020-05-08 23:01) 

吉田

いえいえ、有難うございます。
また質問することがあるかもしれませんが
宜しくお願いいたします。
by 吉田 (2020-05-09 01:57) 

初心者

どろぼうひげさん、大変恐縮ですが、メールで質問しても
そちらに届いているかどうかわかりませんので、こちらから
失礼します。
当方、DFplayer mini の単純使用ができなくて、困っております。
購入したもの、全部だめです。
PICにつないで云々ではなく、シンプルに「その1 IO1&2」の
回路接続をして、だめだということです。

現象として、電源接続するだけで、スピーカーより
「ジジジ…」という異音が大音で始まります。
SDカードを挿入し、IO1をGNDにつないでも、この現象は
かわりません。そもそも、ランプが点灯しません。

接続を確認しても、まちがったところも見当たらず、
どうなっているのか全く分かりません。不良品でしょうか?
スピーカー自身の問題とも思えないですが、、、

アドバイスいただけると助かります。
できれば、「その1 IO1&2」のシンプル回路を
ライブで組んで、実演してみていただけないでしょうか?
当方、初期動作確認自体で苦しんでおりますので。

どうぞよろしくお願い致します。m(_ _)m
by 初心者 (2020-07-18 16:22) 

初心者

追記です。どろぼうひげさんのDatasheetの説明に
「8 SPK1 スピーカーのマイナス端子です。」と書かれていますが
Datasheetでは、SPK1はプラス(+)となっています。
どちらが正しいのでしょうか?

ちなみに、Datasheetの通りスピーカーの接続をしても
当方の現象は変わりませんでした (T_T)

by 初心者 (2020-07-18 17:22) 

どろぼうひげ

初心者さん、こんばんは^^
返信がすっかり遅くなってしまって申し訳ございません。
電源を繋いだだけでジジジ・・・ですか
ランプも点灯しない
はて?皆目見当が付きません
初期不良なんてあるのかな?
ごめんなさい。判らないですm(__)m

by どろぼうひげ (2020-09-04 22:41) 

初心者

コメントありがとうございます。
現在、普通に動作するようにできました。ノイズもないです。
原因はわかりません。接続を特に変えたわけでも
ないのですが...

ブログありがとうございます。さっそくPICで動作するよう
試してみます。

by 初心者 (2020-09-19 09:01) 

初心者

たびたび失礼します。m(_ _)m ちょっとでもアドバイスいただけますと
助かります。
当サイトの通りPICにプログラムしてDFplayerに接続して
試しているのですが、DFplayerが全く再生動作しません(泣)
DFplayerは抵抗ーGNDで普通に動作します。PICとの接続も
確認しましたが、問題ありません。先にどろひげさんが吉田さんに
アドバイスされているように、0.1uFのコンデンサをPICの+-に
接続して見ましたが、変化ありませんでした。
PIC、DFplayerとも、別のものに取り換えてもだめです。

アドバイスのしようもないとは思いますが、これはもう
当方のPICプログラムのどこかが、コンパイル、ダウンロードできるけど、
やはりおかしい、何かが間違っている
と考えていくしかないのでしょうか?
(もちろん、どろひげさんサイトのプログラム記述が間違っている、
 という意味ではなく、
 当方のプログラムのどこかに、エラーがある、という意味です。念のため)

一言いただけると助かります。ご迷惑おかけしますが
よろしくお願いします。m(_ _)m
by 初心者 (2020-09-27 12:10) 

初心者

どろひげさん、追記させていただきます。他者様のサイトにPICシリアル
通信~MP3player の記事がないかどうか検索していたところ、「なお」さん
という方のブログで、PICシリアル通信でMP3playerを動かす旨の記載がありました。
この方もどろひげさん同様、相当PICについての知見がおありで、シリアル通信の
エラー改善についての記載内容もプロすぎて私程度ではちんぷんかんぷんです。残念ですが (T_T)

ただ、この方は「以前トラブルにあったときは時間がなかったので、端子制御でDFplayerを動かした」旨の記載がありました。
当方、シリアル通信については現状、ドツボにはまっていますので、
理解が深まるまでは、端子制御、でやろうと思います。

また、「MCCでプログラムしたら、エラーが治った」旨の記載もありました。こちらも、余裕ができたら、やってみようと思います。

ブログにたびたびお邪魔してコメントいろいろ書いた件、
大変申し訳ありません m(_ _)m

今回の私のコメントが、ほかにも同様のことでお悩みになっている方の
一助になればと思い書きましたので、その点、ご理解・ご容赦お願いします。 m(_ _)m
by 初心者 (2020-09-27 14:04) 

どろぼうひげ

初心者さん、こんばんは^^
返信が遅くなって申し訳ございません
DEPlayer単体では動作しているのに、PICから制御できないというこでしょうか?
失礼を承知で、気付いた点をご提案してみますね
掲載したソースはテンプレートファイルを割愛していますが、記入はされていますか?
ソースのゼロとオーを間違えて打っていませんか?
そんなに複雑な事はしていませんので、この通り打ち込めば動作すると思います
ちょっと情報が少なくて、これ以上はお答えできません
多くの方から動作したとのお声を頂いていますので、頑張ってください(^^)

by どろぼうひげ (2020-10-15 20:26) 

初心者

ご意見ありがとうございました。
まず先に、電飾しましょ3!の発売、おめでとうございます。
もちろん買います!当方、特にモータ制御(まだ経験ありませんが)を
PICでやろうと思っていましたので、そちらが特に楽しみです。
どろひげさんのおかげでPICを始めることができたので、
ありがたいことです。
---------------------------------------
「失礼を承知で、、、」もちろん構いません。わらをもすがる状態ですので
どんなことでも意見を頂けるのは、本当に助かります。

DFplayerの件は、先にコメントした日以降は、さわっておりません。
余裕ができたら進めようと思っています。
ご指摘の件、先のコメント前にすべて確認しておりますが、エラーは
ありませんでした。何かもっと単純なことでエラーしている気がしますので
また後日確認します。
ありがとうございます m(_ _)m
by 初心者 (2020-10-23 08:11) 

コメントを書く

お名前:[必須]
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。