ARDUINO, 感測器 Sensor, 進階篇

【Arduino進階教學課程】自造Arduino MP3音樂播放器 DFPlayer Mini

實驗說明:

米羅手把手帶各位打造一個Arduino MP3 Player 音樂播放器。Arduino MP3 播放模組(DFPlayer Mini),是一款小巧且價格低廉的MP3模組,可以經由Arduino通過序列埠控制,通過簡單的序列埠指令即可完成播放指定的音樂,以及如何播放音樂等功能,無需繁瑣的底層作業,使用簡單方便,穩定可靠。

 

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

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

 

材料:

  • Arduino Uno R3
  • USB 傳輸線
  • Mini MP3 Player模組
  • 麵包板
  • 微動開關
  • 可變電阻
  • 1K歐姆電阻
  • 小喇叭
  • Micro SD卡
  • 杜邦線

 

Mini MP3 Player模組接腳說明:

 

序列串列埠 – 通訊格式:

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

 

通訊指令CMD說明:

安裝程式庫:

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

MP3_Player函式庫 : 載點

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

 

程式:

#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;
  }
  
}

 

Troubleshooting:

注意-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

 

 

參考資料:

 

 

相關文章