본문 바로가기
모두의 아두이노/아두이노 인터페이스

[아두이노] MP3 모듈 제어하기(DFPlayer Mini)

by 로니킴 2021. 12. 14.


본 절은 DFPlayer Mini 를 사용하기 위해 알아야 할 내용과 실습 방법에 대해 설명한다. DFPlayer Mini 특징, 동작원리, 사양, 연결 핀 배열, 출력 값, 주의사항을 알아본다. DFPlayer Mini를 연결하고, 간단한 코딩으로 쉽게 실습할 수 있다. 

 

목차

     

     

     


    [아두이노]  MP3 모듈 제어하기(DFPlayer Mini)

     

     

     

     

     

     


    DFPlayer Mini 란?

    DFPlyaer Mini 모듈은 SD카드에 저장된 MP3 파일을 디코딩해서 바로 스피커로 재생할 수 있는 Mp3 디코딩 모듈이다. 배터리, 스피커, 키패드만 있으면 모듈단독으로도 사용할 수 있지만 시리얼통신을 통해 다양한 제어가 가능하기 때문에 아두이노와 같은 마이크로 컨트롤러를 사용하면 다양한 음악관련 프로젝트에 활용할 수 있다.

     

     


     

    DFPlayer Mini 특징

    DFPlayer Mini 특징은 다음과 같다. MP3, WAV, WMA 파일을 디코딩할 수 있으며 FAT16, FAT32파일 포맷을 지원한다. 시리얼 통신을 통해 음악재생, 랜덤재생, 정지, 볼륨업, 볼륨다운, 폴더재생 등 다양한 기능을 지원한다.

     

     

    • 샘플링 속도(KHz): 8 / 11.025 / 12/16 / 22.05 / 24/32 / 44.1 / 48
    • 24-bit DAC 출력, dynamic range support: 90dB, SNR support: 85dB
    • FAT16, FAT32 파일 시스템지원, 최대 32G TF 카드, U disk to 32G까지 지원, 64M bytes of NORFLASH 지원
    • IO 제어모드, 시리얼 모드, AD 키패드 제어 모드 등 다양한 제어 모드 지원
    • 폴더별 음악재생지원(100개폴더까지, 폴더별 최대 255개 트랙 가능)
    • 30단계 볼륨조절 가능, EQ모드 6가지 지원

     


    DFPlayer Mini 동작 원리

    DFPlayer Mini  원리는 다음과 같다. 

     

     

     

     

     


    DFPlayer Mini 구입하기

    [DFPlayer Mini ]는 알리익스프레스, 네이버 쇼핑몰, 아마존 등에서 센서를 구입할 수 있다

     

     

     

     

     


     

    DFPlayer Mini 하드웨어 연결

    다음과 같이 DFPlayer Mini를 연결할 수 있다. 

     

     

     

     

     


     

    DFPlayer Mini 소프트웨어 코딩

    하드웨어 연결이 완료되면, 아두이노 IDE를 이용해 아두이노 소스코드를 코딩할 수 있다. 

     

    샘플 코드는 다음과 같다. 

     

     

    dfplayer.ino
    0.00MB

    #include "Arduino.h"
    #include "SoftwareSerial.h"
    #include "DFRobotDFPlayerMini.h"
     
    SoftwareSerial mySoftwareSerial(10, 11); // RX, TX
    DFRobotDFPlayerMini myDFPlayer;
    void printDetail(uint8_t type, int value);
     
    void setup()
    {
      mySoftwareSerial.begin(9600);
      Serial.begin(115200);
      
      Serial.println();
      Serial.println(F("DFRobot DFPlayer Mini Demo"));
      Serial.println(F("Initializing DFPlayer ... (May take 3~5 seconds)"));
      
      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){
          delay(0); // Code to compatible with ESP8266 watch dog.
        }
      }
      Serial.println(F("DFPlayer Mini online."));
      
      myDFPlayer.volume(20);  //Set volume value. From 0 to 30
      myDFPlayer.play(1);  //Play the first mp3
    }
     
    void loop()
    {
      static unsigned long timer = millis();
      
      if (millis() - timer > 30000) {
        timer = millis();
        myDFPlayer.next();  //Play next mp3 every 30 second.
      }
      
      if (myDFPlayer.available()) {
        printDetail(myDFPlayer.readType(), myDFPlayer.read()); //Print the detail message from DFPlayer to handle different errors and states.
      }
    }
     
    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;
      }
      
    }

     

    ------------------------------------------------------ 
    개발환경 : WINDOWS 10 
    아두이노 IDE : 1.8.13 
    ------------------------------------------------------ 
    01 연결
     - 아두이노와 PC 연결 
     - 아두이노 IDE 실행 
     - 메뉴 → 툴 → 보드:아두이노 UNO 확인 
      - 메뉴 → 스케치 → 확인/컴파일 

    02 컴파일 확인 

    스케치>확인/컴파일(CTRL+R) 를 선택해서 컴파일을 진행한다.


    03 아두이노 업로드 

    컴파일이 이상없이 완료되면 스케치>업로드(CTRL+U) 를 선택해서 컴파일 파일을 업로드 한다. 


    04 동작 확인

    다음과 같이 동작을 확인할 수 있다. 

     

     

     

     

     

    '모두의 메이커'에서 업로드한 동영상

     

    makerspace.steamedu123.com

     

     

     

     

     

     

     


     

    DFPlayer Mini 소프트웨어 코딩- 프로토콜 만들기

    하드웨어 연결이 완료되면, 아두이노 IDE를 이용해 아두이노 소스코드를 코딩할 수 있다. 

    명령을 전송할 때 시리얼로 프로토콜을 만들어서 전송할 수 있다. 

    dfplayer2.ino
    0.00MB

    #include "Arduino.h"
    #include "SoftwareSerial.h"
    #include "DFRobotDFPlayerMini.h"
    
    SoftwareSerial mySoftwareSerial(10, 11); // RX, TX
    DFRobotDFPlayerMini myDFPlayer;
    void printDetail(uint8_t type, int value);
    
    void setup()
    {
      mySoftwareSerial.begin(9600);
      Serial.begin(9600);
    
      Serial.println();
      Serial.println(F("DFRobot DFPlayer Mini Demo"));
      Serial.println(F("Initializing DFPlayer ... (May take 3~5 seconds)"));
    
      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) {
        //      delay(0); // Code to compatible with ESP8266 watch dog.
        //    }
      }
      Serial.println(F("DFPlayer Mini online."));
    }
    
    String rxData = "";
    boolean bStart = false;
    
    void loop()
    {
      if (Serial.available() > 0) {
        char data = Serial.read();
    
        if (bStart) {
          if (data == '*') {
            //Serial.println(rxData);
            parseData(rxData);
            bStart = false;
            rxData = "";
          } else {
            rxData += data;
          }
        } else {
          if (data == '#') bStart = true;
        }
      }
    
      if (myDFPlayer.available()) {
        printDetail(myDFPlayer.readType(), myDFPlayer.read()); //Print the detail message from DFPlayer to handle different errors and states.
      }
    }
    
    
    void parseData(String rxStr) {
      String cmd = rxStr.substring(0, rxStr.indexOf(','));
      String data = rxStr.substring(rxStr.indexOf(',')+1);
      Serial.print(F("parseData:"));
      Serial.println(data);
    
      if (cmd == "MP3") {
        int index1 = data.indexOf(',');
        int index2 = data.length();
        String inString1 = data.substring(0, index1);
        String inString2 = data.substring(index1 + 1, index2);
        int mp3Index = inString1.toInt();
        int mp3Volume = inString2.toInt();
    
        Serial.print(F("MP3 Index:"));
        Serial.print(mp3Index);
        Serial.print(F("Volume:"));
        Serial.println(mp3Volume);
    
        myDFPlayer.play(mp3Index); 
        myDFPlayer.volume(mp3Volume);
    
      } else {
        Serial.println(F("No Commannd"));
      }
    }
    
    
    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;
      }
    
    }

     

    ------------------------------------------------------ 
    개발환경 : WINDOWS 10 
    아두이노 IDE : 1.8.13 
    ------------------------------------------------------ 
    01 연결
     - 아두이노와 PC 연결 
     - 아두이노 IDE 실행 
     - 메뉴 → 툴 → 보드:아두이노 UNO 확인 
      - 메뉴 → 스케치 → 확인/컴파일 

    02 컴파일 확인 

    스케치>확인/컴파일(CTRL+R) 를 선택해서 컴파일을 진행한다.


    03 아두이노 업로드 

    컴파일이 이상없이 완료되면 스케치>업로드(CTRL+U) 를 선택해서 컴파일 파일을 업로드 한다. 

     


    04 동작 확인

    다음과 같이 동작을 확인할 수 있다. 

     

    #MP3,1,20*  // # 시작 플래그,

                    // MP3 카테고리

                   // 1 : SD 카드에 저장된 첫번째 파일

                   // 20 : 볼륨 20 

                  // * 종료 플래그

     

     

     

     

     

     

     

     


     

    마무리

     DFPlayer Mini 센서 연결하고, 간단한 코딩으로 를 쉽게 실습할 수 있다. 

     

     

     

     

     

     

     

     


     

    모두의 아두이노 환경 센서 책

    [모두의 아두이노 환경 센서] 책은 예스24, 인터넷 교보문고, 알라딘, 인터파크도서, 영풍문고, 반디앤루니스 , 도서11번가 등에서 구입할 수 있다. 이 책에서는 PMS7003, GP2Y1010AU0F, PPD42NS, SDS011 미세먼지 센서, DHT22 온습도 센서, MH-Z19B 이산화탄소 센서, ZE08-CH2O 포름알데히드 센서, CCS811 총휘발성유기화합물 TVOC, GDK101 방사선(감마선) 센서, MQ-131 오존(O3) 센서, MQ-7 일산화탄소, MICS-4514 이산화질소 센서, MICS-6814 암모니아 센서, DGS-SO2 아황산가스(SO2) 센서, BME280 기압 센서, GUVA-S12SD 자외선(UV) 센서, MD0550 기류 센서, QS-FS01 풍속 센서(Wind speed) 를 사용한다.  

     

    모두의 아두이노 환경 센서

    아두이노와 센서로 내 건강을 지킬 수 있다!다양한 환경 센서를 실생활 프로젝트에 응용해보자!시중에 판매되고 있는 간이측정기도 센서로 값을 측정합니다. 똑같은 센서를 아두이노에 연결하

    book.naver.com

     

    반응형


    댓글