본 절은 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를 이용해 아두이노 소스코드를 코딩할 수 있다.
샘플 코드는 다음과 같다.
#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 동작 확인
다음과 같이 동작을 확인할 수 있다.
DFPlayer Mini 소프트웨어 코딩- 프로토콜 만들기
하드웨어 연결이 완료되면, 아두이노 IDE를 이용해 아두이노 소스코드를 코딩할 수 있다.
명령을 전송할 때 시리얼로 프로토콜을 만들어서 전송할 수 있다.
#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) 를 사용한다.
'모두의 아두이노 > 아두이노 인터페이스' 카테고리의 다른 글
[아두이노] 적외선 IR 리모콘 사용하기 (0) | 2021.12.08 |
---|---|
[아두이노] HC-06 블루투스 사용하기 (0) | 2021.12.02 |
댓글