実験室 » Arduino » この記事

DFPlayerMiniでMP3を鳴らしてみた

中身(左)と100均タッパーのケース

 お正月休みに、ネットで検索すると色々でてくるMP3プレーヤーを自分も作ってみました。

 作ってて気付いたことなどを備忘録として書いてみました。今回はお手軽に作りたかったので、Aitendなどで売っている小さいブレッドボードを2つ並べて回路を組みました。ケースはセリアで100円で売っているタッパーに穴をあけて加工したものにブレッドボードを収納(割とぴったりはまりました)した簡便な構成にしました。

 回路は、以下のメーカーサイトや参考ブログ様の例を参考に作りました。

https://wiki.dfrobot.com/DFPlayer_Mini_SKU_DFR0299

回路
蓋部(スピーカーと制御用タクトスイッチ)

 コード無しで持ち運びしたかったので、電源は3.7Vのリチウムポリマー電池にしました。DFPlayerMiniには、このまま3.7Vで送り込んでいますが、ArduinoNanoに対しては電圧が足りませんでしたので、写真右側に斜めに配置してある昇圧回路(7Vに調整)を介して送り込んでいます。

(Memo) 蓋の裏にスピーカーを接着していますが、セメダインやグルーガンで接着しても電池の充電時などで蓋をめくった際に、脱落してしまいました。最終的にちょっと見た目は悪いのですが、ホームセンターなどで売っている外壁補修用の目地材を使って固定しました。今の所脱落はその後ありません。また、タクトスイッチの固定にダイソーで買った100円セメダインで固定させようとしましたが、あんまり良くないですね。付きもいまいちだし、タッパー(アクリルなのかな)が部分的に白く変色したりしましたので、何か別の方法で固定させたほうがいいと思いました。

Arduinoに書き込んだコードです。参考サイトのコードをもとにしてちょっとだけアレンジしています。ボリュームとPrev・Nextがあればとりあえず良かったので。何もしなければ、SDカードの連番どおりに再生をしていきますね。

/*
 * ▼ベースは、下記の公式チュートリアル
 * https://wiki.dfrobot.com/DFPlayer_Mini_SKU_DFR0299
 * 
 * それに、タクトスイッチによる制御を追加。以下のアドレスのものを改造
 * https://www.electronics-lab.com/project/mp3-player-using-arduino-dfplayer-mini/
 * 
 * コマンド群(関数)の説明はこちらのサイトから
 * https://www.wwwmaplesyrup-cs6.work/entry/2019/02/10/152415
 */


/***************************************************
DFPlayer - A Mini MP3 Player For Arduino
 <https://www.dfrobot.com/index.php?route=product/product&amp;product_id=1121>

 ***************************************************
 This example shows the basic function of library for DFPlayer.

 Created 2016-12-07
 By [Angelo qiao](Angelo.qiao@dfrobot.com)

 GNU Lesser General Public License.
 See <http://www.gnu.org/licenses/> for details.
 All above must be included in any redistribution
 ****************************************************/

/***********Notice and Trouble shooting***************
 1.Connection and Diagram can be found here
 <https://www.dfrobot.com/wiki/index.php/DFPlayer_Mini_SKU:DFR0299#Connection_Diagram>
 2.This code is tested on Arduino Uno, Leonardo, Mega boards.
 ****************************************************/

#include "Arduino.h"
#include "SoftwareSerial.h"
#include "DFRobotDFPlayerMini.h"

SoftwareSerial mySoftwareSerial(10, 11); // RX, TX
DFRobotDFPlayerMini myDFPlayer;
void printDetail(uint8_t type, int value);

/* 追加分 */
# define ACTIVATED LOW   // ※pinModeを設定後、セットアップでHIGHにする。
int buttonNext = 4;
int buttonPause = 6;
int buttonPrevious = 5;
int buttonVup = 3;
int buttonVdown = 2;
boolean isPlaying = false;


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

  Serial.println();
  Serial.println(F("DFRobot DFPlayer Mini Demo"));
  Serial.println(F("Initializing DFPlayer ... (May take 3~5 seconds)"));

  if (!myDFPlayer.begin(mySoftwareSerial)) {  //Use softwareSerial to communicate with mp3.
    Serial.println(F("Unable to begin:"));
    Serial.println(F("1.Please recheck the connection!"));
    Serial.println(F("2.Please insert the SD card!"));
    while(true);
  }
  Serial.println(F("DFPlayer Mini online."));

  myDFPlayer.volume(20);  //Set volume value. From 0 to 30
  
  myDFPlayer.enableLoopAll(); //loop all mp3 files.
 
/* 追加分 */
  pinMode(buttonPause, INPUT);
  digitalWrite(buttonPause,HIGH);
  pinMode(buttonNext, INPUT);
  digitalWrite(buttonNext,HIGH);
  pinMode(buttonPrevious, INPUT);
  digitalWrite(buttonPrevious,HIGH);
  pinMode(buttonVup, INPUT);
  digitalWrite(buttonVup,HIGH);
  pinMode(buttonVdown, INPUT);
  digitalWrite(buttonVdown,HIGH);

  isPlaying = true;
}

void loop()
{

// 一時停止
 if (digitalRead(buttonPause) == ACTIVATED)
  {
    if(isPlaying)
    {
      myDFPlayer.pause();
      isPlaying = false;
      delay(1000);    // ※処理が早すぎて、delayを入れないと指が離れる前に、次の判定が来てフラグを立ててもすぐ倒してしまう。
    }else
    {
      myDFPlayer.start();   //start the mp3 from the pause
      isPlaying = true;
      delay(1000);    // ※処理が早すぎて、delayを入れないと指が離れる前に、次の判定が来てフラグを立ててもすぐ倒してしまう。
    }
  }

// 次へ
 if (digitalRead(buttonNext) == ACTIVATED)
  {
    if(isPlaying)
    {
      myDFPlayer.next();
      delay(1000);  
    }
  }

// 前へ
   if (digitalRead(buttonPrevious) == ACTIVATED)
  {
    if(isPlaying)
    {
      myDFPlayer.previous();
      delay(1000);
    }
  }

// 音量増大
   if (digitalRead(buttonVup) == ACTIVATED)
  {
    if(isPlaying)
    {
      myDFPlayer.volumeUp();
      delay(1000);
    }
  }

// 音量増大
   if (digitalRead(buttonVdown) == ACTIVATED)
  {
    if(isPlaying)
    {
      myDFPlayer.volumeDown();
      delay(1000);
    }
  }

  if (myDFPlayer.available()) {
    printDetail(myDFPlayer.readType(), myDFPlayer.read()); //Print the detail message from DFPlayer to handle different errors and states.
  }
}

void printDetail(uint8_t type, int value){
  switch (type) {
    case TimeOut:
      Serial.println(F("Time Out!"));
      break;
    case WrongStack:
      Serial.println(F("Stack Wrong!"));
      break;
    case DFPlayerCardInserted:
      Serial.println(F("Card Inserted!"));
      break;
    case DFPlayerCardRemoved:
      Serial.println(F("Card Removed!"));
      break;
    case DFPlayerCardOnline:
      Serial.println(F("Card Online!"));
      break;
    case DFPlayerPlayFinished:
      Serial.print(F("Number:"));
      Serial.print(value);
      Serial.println(F(" Play Finished!"));

      // ※次へボタンを押すと、演奏終了後に停止してループが終了してしまうので。
      myDFPlayer.next();
      delay(1000);  
      
      break;
    case DFPlayerError:
      Serial.print(F("DFPlayerError:"));
      switch (value) {
        case Busy:
          Serial.println(F("Card not found"));
          break;
        case Sleeping:
          Serial.println(F("Sleeping"));
          break;
        case SerialWrongStack:
          Serial.println(F("Get Wrong Stack"));
          break;
        case CheckSumNotMatch:
          Serial.println(F("Check Sum Not Match"));
          break;
        case FileIndexOut:
          Serial.println(F("File Index Out of Bound"));
          break;
        case FileMismatch:
          Serial.println(F("Cannot Find File"));
          break;
        case Advertise:
          Serial.println(F("In Advertise"));
          break;
        default:
          break;
      }
      break;
    default:
      break;
  }
}

(Memo) 参考元にあったシリアルモニタにメッセージを書き出すコードが残ってます。最後の曲の演奏終了を通知するメッセージには、手を加えててまた先頭に戻る様にしています。Nextボタンを連打して最後の曲まで進めると演奏終了になってしまったのでそうしたような記憶があります。あと一時停止のコードも残っていますね。最初は入れてあったけど、後にいらなくなったのでなにもさせていません。

 再生した感じでは、スピーカーのせいなのでしょうか何というか、安っぽい音が(。・_・。)なんとも表現しにくいんですが、スコスコと抜けてしまうような音がしますね。好きじゃない。

(Memo) 蓋のスピーカーからの音が出てくる穴の上を覆いかぶせるように、コルクを載せてみたりすると音の感じがちょっと変わってきますね。手作りスピーカーのサイトなどを調べれば音の反響のさせ方など載っているみたいですが、難しそう。現状は秋月で買ったスピーカーの入っていた空のプラスチック箱を蓋の上に載っけるとなんかいい感じの音に変化したのでそれでよしとしています。ごく軽い中空の箱だからいいのかな。

リチウムポリマー電池

 リチウムポリマー電池ですが、アマゾンで買った2個セットで1150円のものは、充電器のコネクタの形状がちょっと変わってて、よく見る中華タイプのものは挿せません。650mAhのもので、何回か充電した後は1回の充電で現在1~2時間は再生できています。

 最後に材料費の一覧を載せておきます。大体の値段です。それと送料とか税は入っていません。主要な部品はAmazonで購入しています。2個セットでしか販売してないとかの理由でなんだかんだで出費がかさんで5000円ぐらいかかっているのかもしれませんね。

品名金額備考・その他
HiLetgo® 3個セット Nano V3.0 ATmega328P 5V 16M CH340 Arduinoと互換 Nano V3.0 [並行輸入品] 4503個セット1350円
2個セット 650mAh 3.7V Lipoバッテリー SYMA X5SW X5用リポバッテリー USB充電器付き リチウム バッテリー [並行輸入品] 5752個セット1150円
KKHMF 2A DC-DC ブーストステップアップ 転換モジュール Micro USB 2V-24V に 5V-28V 9V 12V 24V653個セット195円
KKHMF TFカード Uディスクミニ MP3プレーヤー オーディオ 音声 モジュールボード Arduino DFPlayに対応400300~400円程度。
グリーンハウス microSDHCカード 32GB Class10 UHS-I対応 GH-SDMRHCUB32G 763 
ケース100セリアで売ってる100円タッパ
ブレッドボード360Aitend
8Ω・0.4Wスピーカー 50mm100秋月等
セメダイン100ダイソーで売ってる安いやつ
パテ200ホームセンターなどで売っている目地用のもの
合計3113 

 部品の中には、年末にはまだ在庫のあったもののこの1月末では在庫がなくなっちゃってるものも結構あるようです。代替品も似たような値段でありますのでそれで計算してみてください。

できたけど…。

 艦これの秋イベントやっとクリアしてアトランタもらいました。一応今回のイベントはこれでいいので、あとはイベント終了まで拾いこぼしをぽちぽち集めたいところ。

 正月イラストできたけど、既に8日とか。これは来年用に置いといて改めて冬用の扉絵をつくりましょう。…あははは。

あけましておめでとうございます。

あけましておめでとうございます。本年もよろしくお願いいたします。

年度も改まって少しやる気がでてきたかもしれないので、サイトの不具合をこの際ですので手直しました。以下の2箇所を手直し。

1・Pixiv窓とTinami窓の削除。サービス終了したの随分前だったような気が…(;´Д`)しますが、ほったらかしにしてあったのを手直ししました。

2・トップページに戻るボタンが機能していないのを直しました。長い間これもほったらかしにしててゴメンナサイ。

とっ、とりあえずまずはこれでいいのかな?