본문 바로가기
모두의 아두이노

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

by 로니킴 2021. 12. 14.


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

 

목차

     

     

     


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

    DFPlayer Mini MP3 모듈은 소형 저비용 MP3 플레이어로, 직렬 통신을 통해 아두이노와 같은 마이크로컨트롤러와 쉽게 통합할 수 있습니다. 이 모듈은 TF 카드나 USB 드라이브에 저장된 MP3, WAV, WMA 파일을 재생하며, 최대 32GB의 저장 용량을 지원합니다. 24비트 DAC 출력과 최대 48kHz의 샘플링 속도를 제공하여 고품질 오디오 재생이 가능하고, FAT16 및 FAT32 파일 시스템을 완벽히 지원합니다. 다양한 제어 모드(직렬 통신, I/O 제어, AD 버튼)를 통해 다용도로 활용할 수 있습니다. 이 모듈은 음성 안내 시스템, 음악 재생 장치, 경보 시스템 등 다양한 프로젝트에 유용합니다

     


    DFPlayer Mini 란?

    DFPlayer Mini 모듈은 SD카드에 저장된 MP3 파일을 디코딩하여 직접 스피커로 재생할 수 있는 MP3 디코딩 모듈입니다. 이 모듈은 작은 크기와 저렴한 비용으로, 다양한 음악 관련 프로젝트에 활용될 수 있습니다.

     

    주요 특징

    - 독립 사용 가능: 배터리, 스피커, 키패드를 연결하면 모듈 단독으로도 사용이 가능합니다.

    - 시리얼 통신 지원: 아두이노와 같은 마이크로컨트롤러와 연결하여 다양한 제어가 가능합니다. 이는 다양한 음악 프로젝트와 자동화 시스템에 유용합니다.

    - 간편한 제어: 직렬 통신을 통해 쉽게 제어할 수 있어 초보자도 쉽게 다룰 수 있습니다.

     

    응용 분야
    DFPlayer Mini는 다양한 응용 분야에서 사용될 수 있습니다:

    - 자동차 내비게이션: 음성 안내 시스템

    - 공공 교통 시스템: 철도역 및 버스의 안전 검사 음성 안내

    - 전자 장비: 고장 알람 시스템

    - 화재 경보: 음성 안내 시스템

     

    이 모듈은 작고 저렴하며, 직렬 통신을 통해 간편하게 제어할 수 있어 다양한 프로젝트에 활용할 수 있습니다. 배터리, 스피커, 푸시 버튼을 연결하여 독립적으로 사용하거나 아두이노와 같은 마이크로컨트롤러와 함께 사용할 수 있습니다. 다양한 응용 분야에서의 사용 가능성으로 인해 매우 유용한 모듈입니다.

     


     

    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는 TF 카드(최대 32GB) 또는 USB 드라이브에 저장된 MP3, WAV, WMA 파일을 재생할 수 있습니다.

     

     

    모듈은 FAT16 및 FAT32 파일 시스템을 완벽히 지원하며, 24비트 DAC 출력과 최대 48kHz의 샘플링 속도를 제공합니다. 제어는 직렬 통신, I/O 제어 모드, AD 버튼 제어 모드 등 다양한 방식으로 가능합니다. 또한, 폴더를 사용하여 최대 100개의 폴더와 각 폴더당 최대 255개의 노래를 관리할 수 있습니다

     

     

     

     

     

    spe033.pdf
    0.41MB

     

     

     


    DFPlayer Mini 구입하기

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

     

     

     

    MP3(DFPlayer Mini) 모듈을 사려고 할 때 몇 가지 중요한 것들을 고려해야 합니다. 이 모듈은 소형 MP3 플레이어 모듈로, 개인 프로젝트나 전자 제품에서 유용하게 쓰입니다. 여러분이 어디서 구입할지에 따라 조금씩 차이가 있을 수 있습니다.

     

    예를 들어 알리익스프레스에서는 가격이 정말 경쟁력이 있어서 다양한 제조사의 제품을 저렴한 가격에 찾아볼 수 있습니다. 하지만 배송 시간이 길 수 있고, 때로는 제품의 질이 일정하지 않을 수 있으니 판매자 평가나 사용자 리뷰를 잘 확인해야 합니다.

    반면, 네이버 쇼핑몰에서는 빠른 배송을 기대할 수 있고, 한국어 서비스의 이점도 있습니다. 가격은 알리익스프레스보다 조금 더 비쌀 수 있지만, 소비자 보호와 반품 정책이 더 확실하다는 장점이 있습니다.

     

    구입할 때는 성능 대비 가격, 사용자 리뷰, 제품 보증을 꼭 체크하세요. 성능은 기본적으로 비슷할 수 있지만, 저렴한 모델을 선택할 때는 내구성이나 안정성이 떨어질 수 있습니다. 사용자 리뷰는 제품의 실제 성능과 품질을 파악하는 데 큰 도움이 되며, 문제가 자주 보고된 제품은 피하는 게 좋습니다. 그리고 제품 보증이 포함되어 있는지 확인하고, 문제 발생 시 교환 또는 환불을 받을 수 있는지도 알아보세요. 

     

    이런 팁들을 참고해서 여러분의 프로젝트에 가장 적합한 MP3(DFPlayer Mini) 모듈을 선택하길 바라며, 구매 과정에서 조금 더 신중을 기해 효율적이고 경제적인 결정을 내리시길 바랍니다.
     

     


     

    DFPlayer Mini 하드웨어 연결

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

     

     

    MP3 모듈을 Arduino에 연결하는 과정은 비교적 간단합니다. 다음은 기본적인 연결 단계입니다:

    1. 전원 연결

       - DFPlayer Mini 모듈은 3.3볼트 또는 5볼트에서 동작할 수 있습니다. Arduino의 5볼트 핀을 DFPlayer Mini의 VCC 핀에 연결합니다.

     

    2. GND 연결
       - Arduino의 GND 핀을 DFPlayer Mini의 GND 핀에 연결합니다.

     

    3. 시리얼 연결

       - DFPlayer Mini는 시리얼 통신(UART)을 사용합니다. Arduino의 TX(송신) 핀을 DFPlayer Mini의 RX(수신) 핀에, Arduino의 RX(수신) 핀을 DFPlayer Mini의 TX(송신) 핀에 연결합니다. 일반적으로, 소프트웨어 시리얼 라이브러리를 사용하여 Arduino의 디지털 핀(예: 10번 핀과 11번 핀)을 시리얼 통신용으로 설정합니다.

     

    4. 스피커 연결

       - DFPlayer Mini의 SPK_1과 SPK_2 핀에 스피커를 연결합니다. DFPlayer Mini에는 내장 앰프가 있어 작은 스피커를 직접 연결할 수 있습니다.

     

    5. SD 카드 삽입
       - MP3 파일이 저장된 microSD 카드를 DFPlayer Mini의 SD 카드 슬롯에 삽입합니다.

    연결이 완료되면, Arduino와 DFPlayer Mini 간의 하드웨어 설정이 끝납니다.

     


     

    DFPlayer Mini 소프트웨어 코딩

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

     

    샘플 코드는 다음과 같습니다. 

     

     

    dfplayer.ino
    0.00MB

    #include "Arduino.h" // 아두이노 라이브러리 포함
    #include "SoftwareSerial.h" // 소프트웨어 시리얼 통신 라이브러리 포함
    #include "DFRobotDFPlayerMini.h" // DFRobot DFPlayer Mini 라이브러리 포함
    
    SoftwareSerial mySoftwareSerial(10, 11); // 소프트웨어 시리얼 객체 생성 (RX: 10번 핀, TX: 11번 핀)
    DFRobotDFPlayerMini myDFPlayer; // DFPlayer Mini 객체 생성
    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)")); // DFPlayer 초기화 메시지 출력
      
      if (!myDFPlayer.begin(mySoftwareSerial)) {  // DFPlayer 초기화 시도
        Serial.println(F("Unable to begin:")); // 초기화 실패 메시지 출력
        Serial.println(F("1.Please recheck the connection!")); // 연결 확인 요청 메시지 출력
        Serial.println(F("2.Please insert the SD card!")); // SD 카드 삽입 요청 메시지 출력
        while(true){
          delay(0); // ESP8266 호환성을 위한 무한 대기
        }
      }
      Serial.println(F("DFPlayer Mini online.")); // DFPlayer가 온라인 상태임을 알림
      
      myDFPlayer.volume(20);  // 볼륨 설정 (0부터 30까지 가능)
      myDFPlayer.play(1);  // 첫 번째 MP3 파일 재생
    }
    
    void loop() {
      static unsigned long timer = millis(); // 타이머 변수 초기화
      
      if (millis() - timer > 30000) { // 30초마다 실행
        timer = millis(); // 타이머 초기화
        myDFPlayer.next();  // 다음 MP3 파일 재생
      }
      
      if (myDFPlayer.available()) { // DFPlayer에서 데이터가 있으면
        printDetail(myDFPlayer.readType(), myDFPlayer.read()); // DFPlayer의 세부 정보를 출력
      }
    }
    
    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!"); // USB 삽입됨
          break;
        case DFPlayerUSBRemoved:
          Serial.println("USB Removed!"); // USB 제거됨
          break;
        case DFPlayerPlayFinished:
          Serial.print(F("Number:")); // 파일 번호 출력
          Serial.print(value); // 재생 완료된 파일 번호 출력
          Serial.println(F(" Play Finished!")); // 재생 완료 메시지 출력
          break;
        case DFPlayerError:
          Serial.print(F("DFPlayerError:")); // DFPlayer 오류 메시지 출력
          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;
      }
    }

     

     

     

     

    이 코드는 Arduino를 사용하여 DFRobot의 DFPlayer Mini MP3 플레이어 모듈을 제어하는 프로그램입니다. 주요 기능은 MP3 파일을 재생하고, 오류 및 상태 메시지를 시리얼 모니터에 출력하는 것입니다.

    1. 라이브러리 포함: 
       - Arduino 기본 라이브러리, 소프트웨어 시리얼 통신 라이브러리, DFPlayer Mini 라이브러리를 포함합니다.

    2. 객체 생성: 

       - 소프트웨어 시리얼 객체 mySoftwareSerial을 핀 10과 11에 대해 생성합니다.
       - DFPlayer Mini 객체 myDFPlayer를 생성합니다.

     

    3. 함수 선언: 
       - 세부 정보를 출력하는 printDetail 함수를 선언합니다.

    4. setup() 함수:
       - mySoftwareSerial과 기본 시리얼 통신을 초기화합니다.
       - DFPlayer Mini를 초기화하고, 초기화 실패 시 오류 메시지를 출력하고 무한 대기합니다.
       - DFPlayer Mini의 볼륨을 설정하고 첫 번째 MP3 파일을 재생합니다.

    5. loop() 함수:
       - 타이머를 사용하여 30초마다 다음 MP3 파일을 재생합니다.
       - DFPlayer에서 데이터를 읽고, 데이터가 있을 경우 printDetail 함수를 통해 세부 정보를 출력합니다.

    6. printDetail() 함수:
       - DFPlayer에서 발생하는 다양한 이벤트(타임아웃, 카드 삽입/제거, USB 삽입/제거, 재생 완료, 오류 등)에 대해 시리얼 모니터에 메시지를 출력합니다.

    이 코드는 주기적으로 MP3 파일을 재생하고 DFPlayer의 상태 변화를 모니터링하여 사용자에게 알리는 역할을 합니다. DFPlayer의 상태나 오류를 상세히 출력하여 디버깅을 용이하게 합니다.

     


     

    [동작확인]

    ------------------------------------------------------ 
    개발환경 : WINDOWS 11
    아두이노 IDE : 2.3.2
    ------------------------------------------------------ 
    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 11 
    아두이노 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 센서 연결하고, 간단한 코딩으로 를 쉽게 실습할 수 있다.   하드웨어와 소프트웨어 설정이 완료되면, DFPlayer Mini의 동작을 확인할 수 있습니다. SD 카드에 저장된 MP3 파일이 재생되며, 직렬 모니터를 통해 현재 재생 중인 트랙 정보 및 오류 메시지를 확인할 수 있습니다. 이는 모듈의 초기화 여부, SD 카드의 상태 등을 점검하는 데 유용합니다.

    DFPlayer Mini MP3 모듈은 소형이면서도 강력한 기능을 제공하여 다양한 DIY 프로젝트에 유용하게 사용될 수 있습니다. 이 모듈을 통해 음성 안내 시스템, 음악 재생 장치 등을 손쉽게 구현할 수 있으며, 아두이노와의 호환성을 통해 다양한 응용 분야에서 활용할 수 있습니다. 프로젝트의 요구에 맞게 하드웨어 및 소프트웨어 설정을 조정하여 최적의 성능을 발휘하도록 구성해 보세요

     

     

     

     

     

     

     

    반응형


    댓글