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.mp30002.mp30003.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

參考資料:

延伸學習與推薦教學

 

相關文章