2020.5.1 DFPlayer Mini ATtiny13a ライブラリ紹介



2018.12.27付けのスタッフブログにて、ATtiny13aにて、振動センサーを利用したDFPlayer Miniの再生環境を紹介しました。記事は、こちら。

また、動作状況の紹介をYouTubeにもアップしていますが、とある方からライブラリについての質問をうけましたので、今回は、使用しているライブラリを紹介したいと思います。

以前のスタッフブログの記事を参照していただき、その中で紹介をしましたソースコードで使用している、”DFPlayer_Mini_ATtiny13a.h“のライブラリについて説明します。

構築環境の前提条件

ATtiny13aの前提条件は、fuseビットの設定は、デフォルトで使用しますので、1.2Mhzでの動作とします。また、ソフトウェアシリアル環境を構築しますので、タイマー精度を確保するため、適切なOSCCALの値は、使用環境で調べておきます。こちらの記事を参考にOSCCALの値を割り出しておきます。

Bau rateは、9600bpsで使用しますが、DFPlayer Mini向けにシリアルコマンドの送出のみとしますので、DFPlayer Miniからの受信環境については、一切手を触れません。以上が、構築環境の前提条件となります。

DFPlayer Mini ライブラリ

DFPlayer Mini向けのライブラリは、Arduino向けには、Arduino IDE経由にてライブラリ配布されておりますが、ATtiny向けとなると、そのままArduinoのライブラリが流用できたりできなかったりといろいろ自己解決しなければならないことが多いです。

特に、ATtiny13a向けとなると、ほぼ100%自身で解決することが多く、今回のDFPlayer Mini向けにもネット上で紹介されている他の記事を参考に自作を行いました。それが、”DFPlayer_Mini_ATtiny13a.h“のライブラリとなります。DFPlayer Miniを制御するライブラリとして、ATtiny13a用のソフトウェアシリアルを自作しincludeしてDFPlayer Miniへシリアルコマンドを送出するという代物となります。

ATtiny85では、Arduinoの”SoftwareSerial.h”が、そのまま利用できるので、巷にあるDFPlayer MiniとSoftwareSeriaiで難無くコンパイルも成功するのですが、ATtiny13aでは、コンパイルエラーを起こしますので、自己解決しなければなりません。というか、Attiny13aだと、SoftwareSerialそのままだとプログラムの容量的に無理でしょう。

インターネットでいろいろ調べてみると、Nerd Ralph氏による1pinを利用した双方向のシリアル環境がATTiny14a用として紹介をされております。ホームページは、こちら。私も、Nerd Ralph氏のライブラリを基に環境を構築することにしました。ライブラリのダウンロードは、こちら。

次にDFPlayer Miniのライブラリは、Arduino IDEライブラリでインストールできるライブラリでも良いのですが、起動時のポップ音など作りこみの点でいろいろありましたので、Githubで公開されているライブラリを基に自身で作りこむことにしました。基にしたライブラリは、こちら。

以上まとめると、以下のライブラリを改良し自身のDFPlayer Mini ATtiny13a環境を構築するためベース改造します。

  1. Nerd Ralph氏のBasicSerial3環境
  2. GithubのDFPlayer-Mini-mp3環境

それらは、まとめて”DFPlayer_Mini_ATtiny13a.h”ライブラリとして利用します。では、必要なファイルを列挙します。librariesフォルダ配下で作業します。

  1. ダウンロードしたNerd Ralph氏のライブラリBasicSerial3フォルダをlibrariesフォルダ配下へ展開します。
  2. 展開したBasicSerial3フォルダをATtiny13a_Serialフォルダとしてlibrariesフォルダ配下コピーします。
  3. 同じように、GithubからダウンロードしたDFPlayer-Mini-mp3-masterをlibrariesフォルダ配下へ展開します。
  4. 展開したDFPlayer-Mini-mp3-masterフォルダをDFPlayer_Mini_ATtiny13aフォルダとしてlibrariesフォルダ配下コピーします。

次にフォルダ内のファイルを以降専用ライブラリとしますので、リネームします。

DFPlayer_Mini_ATtiny13aフォルダでは、以下をリネームします。

  1. DFPlayer_Mini_Mp3.cpp →DFPlayer_Mini_ATtiny13a.cpp
  2. DFPlayer_Mini_Mp3.h →DFPlayer_Mini_ATtiny13a.h

ATtiny13a_Serialフォルダでは、以下リネームします。

  1. BasicSerial3.h → ATtiny13a_Serial.h
  2. BasicSerial3.S → ATtiny13a_Serial.S

ここまで、下準備ができました。以下のようなツリー構成になっているかと思います。

ライブラリのツリー構造

では、次にそれぞれの編集内容を紹介します。

まずは、ソフトウエアシリアル環境からです。

ATtiny13a_Serial.h

編集箇所の説明です。

1, 2, 4行目は、おまじない的に必要なので宣言をしておきます。

5行目ですが、先の前提条件の通り、ATtiny13aを9600bpsで使用しますので、Bau rateを8倍の76800bpsにしておきます。デフォルトでは、Fuse bitでCPUクロックが、8逓倍されますので、ご注意ください。

また、オリジナルにあった、RXROUND > 127のif分は、丸ごと削除します。オリジナルのコメントには、低いBau rateはサポートしませんとのことなのですが、今回がシリアルの受信は行わないため削除してしまいます。といいながら、18行目でRxByteをexternや、24行目のRxTimebyteは、ご愛嬌ということで。^^;

17行目のTxByteのexternは、DFPlayer Mini向けにそのまま利用しますので、ここでexternしておきます。

23行目、24行目の第一引数ですが、オリジナルは、charで宣言されていますが、今回は、シリアルのコマンドを整数で渡しますので、uint8_tに変更しておきます。

ATtiny13a_Serial.S

次にシリアルコマンド関数のアセンブラの説明です。

ほぼオリジナルのままです。不要なコメント欄は削除をして、7行目と8行目に使用するATtiny13aのピン番号を設定しておきます。

以上、TxByte関数でシリアルのコマンド8bit分の送出が可能になりました。

では次にDXPlayer Miniのライブラリの編集について説明します。

DFPlayer_Mini_Mp3.cpp

DFPlayer_Mini_Mp3.cppでは、大幅に中身の整理と整頓をします。構築環境で使用する関数のみを残し一部追加を行いました。回数の追加については、こちらのデータシートこちらのデータシートを参考に追加ください。

ただしかしですが、非常にわかりずらい。英語というわけではなく、情報が少ないということです。DFPlayer Miniで使用されているIC KT403Aのデータシートを翻訳されている資料もありますので、こちらも参照しました。

2行目で先のTxByteのライブラリをincludeしておきます。全体的に必要最低限のコマンドに絞り修正をしました。オリジナルでは、send_func()関数を使用してSoftwareSerialに渡しておりましたが、関連する全ての関数を取り払い、mp3_send_cmd関数で一元管理することにします。44行目から46行目の通り、send_buf配列内のコマンドを順次TxByteにて送出させるよう書き換えておきます。他に必要な関数があれば、追加ください。

DFPlayer_Mini_Mp3.h

次にDFPlayer_Mini_Mp3.hですが、ここも必要最低限の関数にのみ絞っておきます。

以上が、DFPlayer MiniをATtiny13aで動作させるためのライブラリの説明となります。

今回は、コマンドの送出のみに絞った開発でしたが、受信もこうすればできるよとか、もっと簡単にできるとか、誤記とかもありましたら、お問い合わせのその他からお知らせ頂けると嬉しいです。