아두이노 MP3 플레이어 MP3-TF-16P
https://smartstore.naver.com/misoparts/products/5261887281
아두이노 미니 MP3 플레이어 오디오 모듈 : 알파마이크로
[알파마이크로] 빠른배송 전자부품전문몰. 아두이노, 라즈베리파이, 모듈, 키트 등 전자부품 최저가 판매
smartstore.naver.com
참고:
https://www.youtube.com/watch?v=8obcTTYtjQM&t=216s
https://m.blog.naver.com/emperonics/222197590991
아두이노로 MP3 모듈 제어하기(DFPlayer Mini)
안녕하세요. 이번 포스팅에서는 소형 사이즈의 MP3 디코딩 모듈(재생모듈)인 DFPlayer Mini라는 모듈...
blog.naver.com
1. MCU 없이 단독으로 이용하기
2. wemos d1 mini clone (esp8266)
1) 4.8V에서 0.6V를 낮춰주는 다이오드 사용. 5V in을 다이오드 1N4004를 통해 mp3 보드에 공급. 역류 방지 및 4.2V 정도로 공급해줌으로써 mp3 보드의 안정성 추구.
2) mp3 보드의 VCC와 GND를 220uf 10V 캐퍼시터로 연결. 10V 이상 47uF 이상이면 된다고 함. 부드러운 전원 공급을 통해 탁탁거리는 잡음 잡음.
3) 가변저항(포텐션미터) 1K를 통해 볼륨 조절.
/*
시작바이트 0x7E
버전 0xff
길이 0x06
명령어 0x06 (볼륨조절)
피드백 없음 0x00
파라미터 상위바이트 없음 0x00
파라미터 하위바이트 볼륨지정값(15) 0x0f
체크섬 상위바이트,
체크섬 하위바이트
종료 바이트 0xEF
체크섬 2바이트 = 0xFFFF - (버전바이트 + 명령어길이 + CMD + 피드백여부 + 파라미터1 + 파라미터2) + 1
= 0xffff - (0xff + 0x06 + 0x06 + 0x00 + 0x00 + 0x0f) + 1
0xfee6
= 0xffff - (0xff + 0x06 + 0x03 + 0x00 + 0x00 + 0x02) + 1
= 0xfef6
0x7E 0xFF 0x06 0x06 0x00 0x00 0x0f 0xFE 0xE6 0xEF
0x7E 0xFF 0x06 0x03 0x00 0x00 0x02 0xFE 0xF6 0xEF
*/
// for wemos d1 mini clone
#include "SoftwareSerial.h"
SoftwareSerial mySerial(4, 5);
#define StartByte 0x7E
#define VersionByte 0xFF
#define CommandLength 0x06
#define EndByte 0xEF
#define Acknowledge 0x00 // 피드백 미 수신
void setup() {
Serial.begin(9600);
mySerial.begin(9600);
delay(2000);
specifyVolume(30);
specifyTrack(3);
}
void loop() {
}
void specifyVolume(byte level) {
executeCMD(0x06, 0x00, level);
}
void specifyTrack(int16_t track) {
executeCMD(0x03, highByte(track), lowByte(track));
Serial.print(highByte(track));
Serial.print("\t");
Serial.println(lowByte(track));
}
void executeCMD(byte CMD, byte Par1, byte Par2) {
int16_t checksum = 0xffff - (VersionByte + CommandLength + CMD + Acknowledge + Par1 + Par2) + 1; // 체크섬 계산
byte CommandLine[10] = { StartByte, VersionByte, CommandLength, CMD, Acknowledge, Par1, Par2, highByte(checksum), lowByte(checksum), EndByte };
for (byte k = 0; k < 10; k++) {
mySerial.write(CommandLine[k]);
}
}
#include "SoftwareSerial.h"
#include "DFRobotDFPlayerMini.h"
#define RX_PIN 4
#define TX_PIN 5
#define BUSY_PIN 2
DFRobotDFPlayerMini mp3;
SoftwareSerial *softwareSerialMP3;
void initMP3();
void setup() {
pinMode(LED_BUILTIN, OUTPUT);
Serial.begin(9600);
initMP3();
mp3.volume(30);
mp3.play(1);
/*
while (readBusyPin() == HIGH) {
// wait for the audio file to start
}
Serial.println("Audio file start playing...");
while (readBusyPin() == LOW) {
digitalWrite(LED_BUILTIN, HIGH);
delay(100);
digitalWrite(LED_BUILTIN, LOW);
}
Serial.println("Audio file finished playing.");
*/
}
void loop() {
static unsigned long timer = millis();
if (millis() - timer > 140000) {
timer = millis();
mp3.next();
}
}
int readBusyPin() {
int b = digitalRead(BUSY_PIN);
/*Serial.print("Busy pin=");
Serial.println(b);*/
return b;
}
void initMP3() {
softwareSerialMP3 = new SoftwareSerial(RX_PIN, TX_PIN);
softwareSerialMP3->begin(9600);
Serial.println("Initializing MP3 player.");
if(!mp3.begin(*softwareSerialMP3, true, false)) {
Serial.println("Unable to initialize the MP3 player.");
while(true);
}
Serial.println("MP3 player online");
}
* 반복/랜덤 재생
#include "Arduino.h"
#include "SoftwareSerial.h"
#include "DFRobotDFPlayerMini.h"
SoftwareSerial mySoftwareSerial(4,5); // RX, TX
DFRobotDFPlayerMini myDFPlayer;
void setup() {
mySoftwareSerial.begin(9600);
myDFPlayer.begin(mySoftwareSerial);
myDFPlayer.volume(30); //Set volume value. From 0 to 30
myDFPlayer.play(1);
//myDFPlayer.enableLoop(); // 한 개 반복 재생
//myDFPlayer.randomAll(); // 랜덤 재생
myDFPlayer.enableLoopAll(); // 전부 반복재생
}
void loop() {
}
* 주의사항
초기화할 때, myDFPlayer.begin(mySoftwareSerial, true, true); 옵션에 따라 동작 방식이 달라짐.
enableLoop()류 함수를 사용할 시, 앞에서 반드시 mp3 파일 하나를 플레이해야 함 like play(1);