Akses Modul MP3 Player YX5300 dengan Arduino

Modul MP3 Player YX5300 dengan Arduino
Akses Modul MP3 Player YX5300 dengan Arduino. Secara garis besar, fungsi dari arduino adalah untuk mengontrol/mengendalikan proses dari modul YX5300. Bagaimana cara mengontrolnya? yaitu melalui komunikasi serial. Jadi kita mengirimkan perintah byte melalui serial kemudian chip pada modul YX5300 menerjemahkan perintah tersebut kemudian mengeksekusinya. Begitu juga dengan Arduino, kita juga dapat memperoleh response saat perintah kita diterima. Dari response yang didapat bisa digunakan untuk value dalam mengendalikan sesuatu. Jadi kunci dari tutorial ini adalah komunikasi serial.

Alat dan bahan:
  • Arduino Uno / Other
  • Modul MP3 Player YX5300 
  • Micro SD Card
Wiring Diagram
File MP3 pada SD Card
Slot yang disediakan adalah microsd. Untuk microSD pastikan terlebih dahulu dalam format penyimpanan FAT32. Karena pembacaan file mp3 menggunakan metode index jadi penulisan awal harus didahului dengan nilai index. Untuk file folder adalah "01", "02" dst, sedangkan untuk file mp3nya adalah "001aaa.mp3", "001bbb.mp3" dst.
Arduino Program
Untuk memudahkan proses pemberian perintah, maka kita akan mengunakan serial monitor saja. Sementara untuk proses komunikasi antara arduino dan  YX5300 maka digunakanlah pin 5 dan 6 sebagai port UART menggunakan software serial. Untuk perintah dalam bentuk byte dapat dilihat sebagai berikut (lebih lengkap di buku manualnya)
Perintah untuk Modul MP3 Player YX5300 menggunakan 8 byte data yang sering disebut dengan Serial data protocol. Fungsi yang digunakan sebagai perintah adalah pada byte ke 4 dan selanjutnya untuk merincikan perintah maka digunakan byte ke 6 dan 7. Contoh untuk program arduinonya sebagai berikut (credit salvadorrueda)

#include <SoftwareSerial.h>
//Rx terhubung ke Tx pada modul mp3 player
//Tx terhubung ke Rx pada modul mp3 player
SoftwareSerial mp3(6,7);//Rx,Tx

static int8_t Send_buf[8] = {0}; // Buffer untuk kirim perintah. 
static uint8_t ansbuf[10] = {0}; // Buffer untuk respon.   

String mp3Answer;           // respon dari MP3.

String sanswer(void);
String sbyte2hex(uint8_t b);

/************ Command byte ************************************/
//dari tabel pada manual book
#define CMD_NEXT_SONG     0X01  // Play next song.
#define CMD_PREV_SONG     0X02  // Play previous song.
#define CMD_PLAY_W_INDEX  0X03
#define CMD_VOLUME_UP     0X04
#define CMD_VOLUME_DOWN   0X05
#define CMD_SET_VOLUME    0X06

#define CMD_SNG_CYCL_PLAY 0X08  // Single Cycle Play.
#define CMD_SEL_DEV       0X09
#define CMD_SLEEP_MODE    0X0A
#define CMD_WAKE_UP       0X0B
#define CMD_RESET         0X0C
#define CMD_PLAY          0X0D
#define CMD_PAUSE         0X0E
#define CMD_PLAY_FOLDER_FILE 0X0F

#define CMD_STOP_PLAY     0X16  // Stop playing continuously. 
#define CMD_FOLDER_CYCLE  0X17
#define CMD_SHUFFLE_PLAY  0x18 //
#define CMD_SET_SNGL_CYCL 0X19 // Set single cycle.

#define CMD_SET_DAC 0X1A
#define DAC_ON  0X00
#define DAC_OFF 0X01

#define CMD_PLAY_W_VOL    0X22
#define CMD_PLAYING_N     0x4C
#define CMD_QUERY_STATUS      0x42
#define CMD_QUERY_VOLUME      0x43
#define CMD_QUERY_FLDR_TRACKS 0x4e
#define CMD_QUERY_TOT_TRACKS  0x48
#define CMD_QUERY_FLDR_COUNT  0x4f

/************ Opitons **************************/
#define DEV_TF            0X02  

/*********************************************************************/

void setup(){
  Serial.begin(9600);
  mp3.begin(9600);
  delay(500);
  printHelp();
  sendCommand(CMD_SEL_DEV, 0, DEV_TF);
  delay(500);
  
}


void loop(){
  char c = ' ';

  // karakter yang masuk pada serial ditampung  untuk proses 
  // fungsi sendMP3Command (kirim perintah ke modul)
  if ( Serial.available() ){
    c = Serial.read();
    sendMP3Command(c);
  }

  // Check respon
  if (mp3.available()){
    Serial.println(decodeMP3Answer());
  }
  delay(100);
}

void printHelp(){
    Serial.println("HELP  ");
    Serial.println(" h = Print again this Massage");
    Serial.println(" p = Play");
    Serial.println(" P = Pause");
    Serial.println(" > = Next");
    Serial.println(" < = Previous");
    Serial.println(" s = Stop Play"); 
    Serial.println(" + = Volume UP");
    Serial.println(" - = Volume DOWN");
    Serial.println(" c = Query current file");
    Serial.println(" q = Query status");
    Serial.println(" v = Query volume");
    Serial.println(" x = Query folder count");
    Serial.println(" t = Query total file count");
    Serial.println(" f = Play folder 1.");
    Serial.println(" S = Sleep");
    Serial.println(" W = Wake up");
    Serial.println(" r = Reset");
  }
//perintah dari karakter pada serial monitor
void sendMP3Command(char c) {
  switch (c) {
    case '?':
    case 'h':
      printHelp();
      break;

    case 'p':
      Serial.println("Play ");
      sendCommand(CMD_PLAY);
      break;

    case 'P':
      Serial.println("Pause");
      sendCommand(CMD_PAUSE);
      break;

    case '>':
      Serial.println("Next");
      sendCommand(CMD_NEXT_SONG);
      sendCommand(CMD_PLAYING_N); // cek nomor file yang di play
      break;

    case '<':
      Serial.println("Previous");
      sendCommand(CMD_PREV_SONG);
      sendCommand(CMD_PLAYING_N); // cek nomor file yang di play
      break;

    case 's':
      Serial.println("Stop Play");
      sendCommand(CMD_STOP_PLAY);
      break;


    case '+':
      Serial.println("Volume Up");
      sendCommand(CMD_VOLUME_UP);
      break;

    case '-':
      Serial.println("Volume Down");
      sendCommand(CMD_VOLUME_DOWN);
      break;

    case 'c':
      Serial.println("Query current file");
      sendCommand(CMD_PLAYING_N);
      break;

    case 'q':
      Serial.println("Query status");
      sendCommand(CMD_QUERY_STATUS);
      break;

    case 'v':
      Serial.println("Query volume");
      sendCommand(CMD_QUERY_VOLUME);
      break;

    case 'x':
      Serial.println("Query folder count");
      sendCommand(CMD_QUERY_FLDR_COUNT);
      break;

    case 't':
      Serial.println("Query total file count");
      sendCommand(CMD_QUERY_TOT_TRACKS);
      break;

    case 'f':
      Serial.println("Playing folder 1");
      sendCommand(CMD_FOLDER_CYCLE, 1, 0);
      break;

    case 'S':
      Serial.println("Sleep");
      sendCommand(CMD_SLEEP_MODE);
      break;

    case 'W':
      Serial.println("Wake up");
      sendCommand(CMD_WAKE_UP);
      break;

    case 'r':
      Serial.println("Reset");
      sendCommand(CMD_RESET);
      break;
  }
}


//arti respon dari modul
String decodeMP3Answer() {
  String decodedMP3Answer = "";

  decodedMP3Answer += sanswer();

  switch (ansbuf[3]) {
    case 0x3A:
      decodedMP3Answer += " -> Memory card inserted.";
      break;

    case 0x3D:
      decodedMP3Answer += " -> Completed play num " + String(ansbuf[6], DEC);
      break;

    case 0x40:
      decodedMP3Answer += " -> Error";
      break;

    case 0x41:
      decodedMP3Answer += " -> Data recived correctly. ";
      break;

    case 0x42:
      decodedMP3Answer += " -> Status playing: " + String(ansbuf[6], DEC);
      break;

    case 0x48:
      decodedMP3Answer += " -> File count: " + String(ansbuf[6], DEC);
      break;

    case 0x4C:
      decodedMP3Answer += " -> Playing: " + String(ansbuf[6], DEC);
      break;

    case 0x4E:
      decodedMP3Answer += " -> Folder file count: " + String(ansbuf[6], DEC);
      break;

    case 0x4F:
      decodedMP3Answer += " -> Folder count: " + String(ansbuf[6], DEC);
      break;
  }

  return decodedMP3Answer;
}

//kirim perintah 
void sendCommand(byte command){
  sendCommand(command, 0, 0);
}

void sendCommand(byte command, byte dat1, byte dat2){
  delay(20);
  Send_buf[0] = 0x7E;    //
  Send_buf[1] = 0xFF;    //
  Send_buf[2] = 0x06;    // Len
  Send_buf[3] = command; //
  Send_buf[4] = 0x01;    // 0x00 tanpa respon, 0x01 ada respon
  Send_buf[5] = dat1;    // data1
  Send_buf[6] = dat2;    // data2
  Send_buf[7] = 0xEF;    //
  Serial.print("Sending: ");
  for (uint8_t i = 0; i < 8; i++){
    mp3.write(Send_buf[i]) ;
    Serial.print(sbyte2hex(Send_buf[i]));
  }
  Serial.println();
}


//konversi byte ke hex
String sbyte2hex(uint8_t b){
  String shex;

  shex = "0X";

  if (b < 16) shex += "0";
  shex += String(b, HEX);
  shex += " ";
  return shex;
}


//konversi hex ke interger
int shex2int(char *s, int n){
  int r = 0;
  for (int i=0; i<n; i++){
     if(s[i]>='0' && s[i]<='9'){
      r *= 16; 
      r +=s[i]-'0';
     }else if(s[i]>='A' && s[i]<='F'){
      r *= 16;
      r += (s[i] - 'A') + 10;
     }
  }
  return r;
}


/********************************************************************************/
/*Function: sanswer. Returns a String answer from mp3 UART module.          */
/*Parameter:- uint8_t b. void.                                                  */
/*Return: String. If the answer is well formated answer.                        */

String sanswer(void){
  uint8_t i = 0;
  String mp3answer = "";

  // Get only 10 Bytes
  while (mp3.available() && (i < 10)){
    uint8_t b = mp3.read();
    ansbuf[i] = b;
    i++;

    mp3answer += sbyte2hex(b);
  }

  // if the answer format is correct.
  if ((ansbuf[0] == 0x7E) && (ansbuf[9] == 0xEF)){
    return mp3answer;
  }

  return "???: " + mp3answer;
}
Setelah upload program diatas, masukkan microsd dan buka serial monitor. Nah setelah itu tinggal dicoba dengan memasukkan  perintah yang sudah disiapkan.
Ok, itulah step-step secara sederhananya. Untuk aplikasi lebih lanjut tinggal tergantung dari kreasi kita masing-masing. Selamat mencoba!

Pencarian Terkait:
  1. MP3 Player YX5300 dengan Arduino
  2. Arduino MP3 Player
  3. Arduino serial mp3 player catalex YX5300
  4. Membuat MP3 Player dengan arduino