ARDUINO, 感測器 Sensor, 進階篇

【Arduino進階教學課程】輕鬆打造Arduino MP3音樂播放器 | Mini MP3 Player

實驗說明:

米羅手把手帶各位打造一個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說明:

將CMD命令代入execute_CMD()函式來執行其功能, 如:

  • execute_CMD(0x01,0,1);  //0x01  播放下一首
  • execute_CMD(0x02,0,1);  //0x02  播放前一首
  • execute_CMD(0x0E,0,0);  //0x0E  暫停播放
  • execute_CMD(0x0D,0,1);  //0x0D  播放音樂
  • execute_CMD(0x06, 0, volume);  //0x06 指定音量 Set the volume (0x00~0x30)

 

 

程式:

#include <SoftwareSerial.h> 

SoftwareSerial mySerial(10, 11);

//序列串列埠 - 定義通訊格式資料
# define Start_Byte 0x7E
# define Version_Byte 0xFF
# define Command_Length 0x06
# define End_Byte 0xEF
# define Acknowledge 0x00

# define ACTIVATED LOW

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

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

  Serial.println("Entry...");
  mySerial.begin (9600); //透過串列埠傳送給mini mp3 player 模組的指令,必須將baud rate通訊速度設定在9600
  delay(1000);
  playFirst(); //初始化 Mini MP3 Player模組
  isPlaying = false;
}

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

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

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

void playFirst()
{
  execute_CMD(0x3F, 0, 0);
  delay(500);
  setVolume(20);
  delay(500);
  execute_CMD(0x11,0,1); 
  delay(500);
}

void pause()
{
  execute_CMD(0x0E,0,0);  //執行暫停播放命令
}

void play()
{
  execute_CMD(0x0D,0,1);  //執行播放音樂命令
  delay(100);
  execute_CMD(0x11,0,1); 
  delay(100);
}

void playNext()
{
  execute_CMD(0x01,0,1);  //執行播放下一首命令
  delay(100);
  execute_CMD(0x11,0,1); 
  delay(100);
}

void playPrevious()
{
  execute_CMD(0x02,0,1);  //執行播放前一首命令
  delay(100);
  execute_CMD(0x11,0,1); 
  delay(100);
}

void setVolume(int volume)
{
  execute_CMD(0x06, 0, volume); // 設定指定音量 (0x00~0x30)
}

// 執行命令和傳入的參數
void execute_CMD(byte CMD, byte Par1, byte Par2) {
  
  // 計算checksum (2 bytes)
  word checksum = -(Version_Byte + Command_Length + CMD + Acknowledge + Par1 + Par2);

  // 建立命令
  byte Command_line[10] = { Start_Byte, Version_Byte, Command_Length, CMD, Acknowledge,
  Par1, Par2, highByte(checksum), lowByte(checksum), End_Byte};

  //送出命令給模組
  for (byte k=0; k<10; k++){
    mySerial.write( Command_line[k]);
  }
}

 

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

 

 

參考資料:

 

 

相關文章