Basic Tutorial for Arduino, 感測器 Sensor, 進階篇

【Arduino 進階教學】DFPlayer Mini MP3 播放模組實作:接線、SD卡檔名規範與程式碼全解析

想讓你的 Arduino 專案發出聲音嗎?無論是 語音報時、機器人對話、智慧門警警報器,還是 自製音樂播放器,DFPlayer Mini 都是性價比最高、使用最廣泛的 MP3 音頻模組。

雖然 DFPlayer Mini 功能強大且價格親民,但許多新手在初次使用時常因為 「SD 卡檔案命名不對」 或 「Serial 連線未加降壓電阻」 而導致無法播音。本篇文章將手把手帶你掌握正確的硬體接線、SD 卡目錄設置與完整的 Arduino 程式碼!

什麼是 DFPlayer Mini MP3 模組?

DFPlayer Mini 是一款小巧且功能強大的 MP3 播放模組,具備以下核心特色:

  1. 硬體解碼: 支援 MP3 與 WAV 音頻硬體解碼。

  2. 高相容性: 支援 FAT16 與 FAT32 檔案系統,最高可支援 32GB Micro SD(TF)卡。

  3. 內建功放(Amplifier): 內建 單聲道功放,可以直接連接 或 的小喇叭單體,無需額外擴音電路。

  4. 多管道控制: 支援 UART 序列埠指令控制(適用 Arduino / ESP32)以及 AD 鍵盤獨立控制(無需 MCU 即可播放)。

  5. 音質調整: 支援 30 階音量調節與 10 階 EQ 音效調整。

關鍵踩坑點:Micro SD 卡格式化與檔案命名規範

DFPlayer Mini 對 Micro SD 卡的 檔案夾與檔名架構 要求非常嚴格,若未依規範設置將無法順利播放!

1. SD 卡格式化

請使用電腦將 Micro SD 卡格式化為 FAT32 格式(請勿使用 NTFS 或 exFAT)。

2. 資料夾與 MP3 檔名命名規則(重要!)

  • 在 Micro SD 卡的 根目錄下 建立名為 mp3 的資料夾。

  • 將 MP3 音頻檔案放入 mp3 資料夾內。

  • 檔名必須開頭為 4 位數字(例如:0001.mp3、0002.mp3、0003.mp3)。

 

實驗所需硬體材料

進行本實作前,請先準備以下電子零件(點擊連結可直接前往商城選購):

  • Arduino Uno R3 開發板 x 1

  • DFPlayer Mini MP3 播放模組 x 1

  • Micro SD 卡(32GB 以下,已格式化為 FAT32)x 1

  • 小喇叭單體 x 1

  • 色碼電阻 x 1(強烈建議:用於 TX/RX 通訊降噪保護)

  • 麵包板與杜邦跳線若干

🛍️ 準備好你的硬體工具了嗎?

推薦選購:點擊連結可直接前往商城選購

▼購買Arduino MP3音樂播放套件:

Arduino MP3音樂播放器 Mini MP3 Player 學習套件 DFPlayer

 

 

Mini MP3 Player模組接腳說明:

 

序列串列埠 – 通訊格式:

透過串列埠傳送給mini mp3 player 模組的指令,必須將baud rate通訊速度設定在9600,通訊格式會有9個參數,總共有10個字節(checksum佔兩個字節),可參考以程式 execute_CMD()這段函式的內容,透過陣列方式,經由串列埠傳送10個字節給mini mp3 player 模組。

 

通訊指令CMD說明:

Arduino IDE 程式庫安裝

請先將下列函式庫下載,然後再匯入安裝。

MP3_Player函式庫 : 載點

安裝方式:在 Arduino 整合環境功能表點選 草稿碼 / 匯入程式庫 / 加入.ZIP程式庫…

 

完整 Arduino 程式碼範例

#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

int buttonPause = 3;
int buttonPrevious = 4;
int buttonNext = 5;
int buttonVolume = A0;
boolean isPlaying = false;

void setup () {
  Serial.begin(115200);
  mySoftwareSerial.begin(9600);
  delay(300);
  pinMode(buttonPause, INPUT);
  digitalWrite(buttonPause,HIGH);
  pinMode(buttonNext, INPUT);
  digitalWrite(buttonNext,HIGH);
  pinMode(buttonPrevious, INPUT);
  digitalWrite(buttonPrevious,HIGH); 

  Serial.println("Entry...");
  
  Serial.println();
  Serial.println(F("Initializing Player "));
  
  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("MP3 Player online."));
  
  myDFPlayer.setTimeOut(500); //Set serial communictaion time out 500ms
  
  myDFPlayer.setTimeOut(500); //Set serial communictaion time out 500ms
  
  myDFPlayer.volume(10);  //Set volume value (0~30).
  myDFPlayer.EQ(DFPLAYER_EQ_NORMAL);

  myDFPlayer.start();
  myDFPlayer.enableLoopAll();
  
}

void loop () { 
 if (digitalRead(buttonPause) == ACTIVATED)  //暫停播放按鍵
  {
    if(isPlaying)
    {
      myDFPlayer.pause();
      isPlaying = false;
    }else
    {
      isPlaying = true;
      myDFPlayer.start();
    }
  }

 if (digitalRead(buttonNext) == ACTIVATED) //切換下一首按鍵
  {
   
    if(isPlaying)
    {
      myDFPlayer.next();    
    }
  }

   if (digitalRead(buttonPrevious) == ACTIVATED)  //切換前一首按鍵
  {
    if(isPlaying)
    {
      myDFPlayer.previous(); 
    }
  }
  int Volume = analogRead(buttonVolume) / 34.1;
  myDFPlayer.volume(Volume);  //設定指定音量. From 0 to 30

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



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 DFPlayerUSBInserted:
      Serial.println("USB Inserted!");
      break;
    case DFPlayerUSBRemoved:
      Serial.println("USB Removed!");
      break;
    case DFPlayerPlayFinished:
      Serial.print(F("Number:"));
      Serial.print(value);
      Serial.println(F(" Play Finished!"));
      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;
  }
  
}

 

常見問題與除錯指南

注意-1:音樂檔案長度小於1秒以下是無法播放。

注意-2:所有音樂檔案一定要放在SD卡的根目錄「mp3」 資料夾裏。

注意-3:音樂檔案名稱一定要使用4 個字以上,名稱應該命名一個四位數字開始,如

  • 0001.mp3
  • 0002_Adele – Oh My God.mp3
  • 0003.mp3
  • 0004Greys Anatomy Soundtrack.mp3

注意-4:Arduino控制Mini MP3 Player模組時,喇叭若有雜音出現,則需要在Arduino TX與MP3模組的RX之間連一個1k電阻。因為MP3模塊工作電壓應該是3.3V,而主控板傳入電壓為5V,因此需要1K左右電阻分壓。

注意-5:如果您使用 Mac OS 電腦複製 mp3檔案,系統將自動添加隱藏文件,例如:“._0001.mp3”作為索引,此檔案將會被視為有效檔案被運作。 因此,您可以在終端中運行以下命令來消除這些文件。 進入

SD卡目錄

  • cd /Volumes/<SD卡 名稱>

列出目錄底下的目錄與檔案

  • ls -al

刪除「._0001.mp3 」檔案目錄

  • rm -rf ._0001.mp3

參考資料:

延伸學習與推薦教學

 

相關文章