OGIMOノート ~家族のためのモノづくり~

8歳の娘と、6歳の息子(脳性麻痺)を持った父親エンジニアの備忘録。自作の電子工作おもちゃ/リハビリ器具/ロボット関係の製作記録、勉強記録を残していきます

簡単にスピーカ再生機能を追加! DFPlayer MiniでMP3音源再生!

はじめに

アレコレとモノを作るのに熱中しているとブログ更新をしなくなってしまいますね(-.-)
「作ったモノの情報をしっかり整理して書き残そう」と考えると、
ついつち後回しになって記事が進まない。。。

なので、改めて初心に戻り、「自分の技術メモ+備忘録を気軽に残す」事を目的として、簡単に試してみたデバイスの記録メモや試行錯誤の履歴も一緒に残していきたいと思います。
(需要なかったらスイマセン)

今回試してみたのは、『簡単にスピーカ再生できるデバイスです。
子供のおもちゃ等を作る際に、とりあえず簡単に音を鳴らしたい!」というニーズ、色々とありますよね。

私が作った工作モノでも音の鳴る機器はいくつかありますが、その実現手段は大きく2つ。

ArduinoにSDカードをSPI接続して無理やりSDカード上のWAVファイルを再生
実施例:【電子工作(Arduino)】歩くと効果音の鳴るメロディ靴 - OGIMOノート

② M5StackでSDカード上のMP3ファイル再生
実施例:M5Stack(ESP32)を使い始めてみた - OGIMOノート

最近は、もっぱら②を使用。
②のM5stackはとにかくお手軽だしラピットプロトにはすごく便利なのですが、
 ・液晶表示がいらない場合、音声再生のみの用途には高価 (約5000円)
 ・MP3再生はそれなりに処理量をくうので、他処理(例えばLEDイルミネーション)を並行実行させるには厳しい
  (音かイルミネーションのどちらかが処理が追い付かず、不連続になってかっこ悪くなる)
というデメリットもある訳ですね。やっぱりお値段は重要。

そんな中、最近見つけた3つ目の手段を紹介!!

f:id:motokiinfinity8:20190124015146j:plain
Arduinoマイコン/ESP32 にMP3再生モジュール『DFPlayer Mini』を接続
です!

他の①②に比べて、
[メリット1] 導入が簡単!
  モジュールにマイクロSDカードを指して、Host機器(Arduino UnoやESP32)とUARTで接続するだけ。
  ライブラリを使えばマイクロSDカード内の任意のファイルを再生可。
[メリット2] 安い!
 Amazonでは2個で900円程度で売ってます。
www.amazon.co.jp

特に値段の観点は重要!
ESP32モジュール(1500円程度)+DFPlayer Mini(450円)+スピーカ(300円程度) = 2250円なので、
M5stack半額以下で「無線対応 簡易音声再生デバイス」が出来る
ので、素敵です!
ぬいぐるみをしゃべらせたり、玄関で音を鳴らしたり、と、『お手軽おしゃべり機器』が作れてしまう!!

モジュールの説明は、こちらのサイトが詳しそうです。
https://www.dfrobot.com/wiki/index.php/DFPlayer_Mini_SKU:DFR0299

なお、モジュールのピン配置はこちら
f:id:motokiinfinity8:20190124013245p:plain

ハードウェア構成図

Arduino Uno Rev.3(5V I/O)と接続する際の回路構成はこちら。
f:id:motokiinfinity8:20190124012719j:plain

モジュール側のI/Oは3.3Vとの事ですので、電圧5VのArduinoと接続するときは1kΩの抵抗を間に挟むことが推奨されているとの事。UARTは、ArduinoのRxとDFPlayerのTx、ArduinoのTxとDFPlayerのRxを繋ぎます。
電源は 5V/3.3VのどちらをつないでもOKですが、ここの電源ノイズが音質に直接影響してくるため、コンデンサ等の配慮が必要です。私の場合、子供おもちゃ用は音声ボリュームが必要なので、駆動電圧の高い5Vを使いました。

スピーカは3Ωまで対応。アンプ不要で、ダイレクトにDFPlayerに繋げるため、とても楽ですね。
なお、私は100均ショップで買ってきた安いスピーカ機器を分解してスピーカユニットのみ取り出すのが一番コスト安くすみます。

SDカードはFAT形式でフォーマットして、順番に再生音源を書き込んでいきます。
どうやらFATエントリ順(平たく言えば書き込んだ順)でindex番号が1,2…と割り振られていく様です。
(他ブログでは"0001.mp3""0002.mp3"と書く事を推奨されていますが、おそらく結果としてFATエントリー順に並ぶから、だと思われます)

なお、実際のDF Player miniの接続写真はこちら
f:id:motokiinfinity8:20190124003218j:plain


ソフトウェア

本体部とは UARTで通信します。
ボーレートは 9600kbps限定の様なので注意。
ライブラリは、”DFPlayer-Mini-mp3”と"DFRobotDFPlayerMini"の2種類がある様子。Web検索する限りでは、前者が多そうですが、どうやらこちらは現在非推奨になっている様なので、私は後者の"DFRobotDFPlayerMini"を使いました。

github.com





上記の情報を参考に。

これを使って、簡単に娘とじゃんけんをするジャンケンロボットを作ってみました。
(ボタンを長押しする時間に応じてグー/チョキ/パーを変える & 音声
今回は参考までに、ボタン押す時間に応じて、グー/チョキ/パーの再生音声を変えるサンプルコードを作ってみました。

>|c|
#include "SoftwareSerial.h"
#include "DFRobotDFPlayerMini.h"

#define BUTTON_PIN 3
#define SW_RX_PIN 10
#define SW_TX_PIN 11

SoftwareSerial mySoftwareSerial(SW_RX_PIN, SW_TX_PIN);
DFRobotDFPlayerMini myDFPlayer;

bool buttonState = LOW;
bool buttonStete_old = LOW;

uint32_t pushStart_time = 0;
uint32_t push_time = 0;

void setup() {
Serial.begin(115200);
mySoftwareSerial.begin(9600);

pinMode(BUTTON_PIN, INPUT_PULLUP);
attachInterrupt(1, interruptsw, CHANGE); // Pin3をスイッチ割込みとして使用

//スピーカ出力開始
myDFPlayer.begin(mySoftwareSerial);
delay(100); //設定待ち時間は仮置き

myDFPlayer.volume(30); //Set volume value. From 0 to 30
}

void loop() {
if(jyanken_start == true){
myDFPlayer.play(1); //Play the first mp3 (0001:じゃんけん合図)
delay(1500);

// ③じゃんけんの手(グー/チョキ/パー)を出す
// (1) ボタン長押し時間が1000ms以下ならグー
if(push_time < 1000){
myDFPlayer.play(3); //Play the first mp3 (0003:グー)
// (2) ボタン長押し時間が2000ms以下ならチョキー
}else if(push_time < 2000){
myDFPlayer.play(4); //Play the first mp3 (0004:チョキ)
// (3) ボタン長押し時間が2000ms以上ならパー
}else{
myDFPlayer.play(5); //Play the first mp3 (0005:パー)
Serial.println("pa");
}
}



// スイッチボタンの割り込み処理
void interruptsw(){

delay(10); // 5ms待ち (チャタリング対策)
buttonState = digitalRead(BUTTON_PIN);

//ボタン押し判定 (押し時間の測定開始)
if(buttonState == LOW && buttonStete_old == HIGH){
pushStart_time = millis();
jyanken_start = true;
//ボタン離し判定 (押し続けた時間を測定)
}else if(buttonState == HIGH && buttonStete_old == LOW){
push_time = millis() - pushStart_time;
}
buttonStete_old = buttonState;
}
|


終わりに

使ってみて今後も使えそうな 音源再生モジュール DF Player Miniのメモを記載しました。
今回は、仮としてArduino UNO rev3+DF Player Miniとしましたが、最終的には ESP32+DF Player Miniとして使う想定で進めていく予定です。
また、今回上記で記載した「ジャンケン読み上げ機」ですが、なぜジャンケンなのか等については、次回ブログで取り上げたいと思います。ありがとうございました。