앞선 포스트에서 DFplayer 모듈을 제어하는 방법에 대해 다루었었다. 통신을 통해 사운드 트랙을 제어하기 위한것이라면 mp3 플레이어 환경에서 DFplayer를 제어 할 수 있도록 프로그램된 DFcontroller를 이용하면 DFplayer 라이브러리 없이도 제어 할 수 있고 아두이노 스케치상 코드의 양을 줄일수 있게된다.
DFcontroller - DFPlayer mini 원격제어 안드로이드 앱 버전 2.2 다운로드
(*** 상기앱의 와이파이 연결은 안드로이드8 [갤럭시S7]이하 버전에서만 작동합니다 ***)
(*** 상기앱의 블루투스 연결은 안드로이드10 이하 버전에서만 작동합니다 ***)
1. SD카드에 사운드 파일 저장 방법
A. 저장방식 1
폴더명: 01 ~ 99까지 각 폴더별 파일갯수 1 ~ 255
파일명: 숫자 3자리 001 ~ 255 반드시 포함하는 파일명으로, 최대 파일갯수 255개 까지 각 폴더에 저장된 파일 인식
예) 폴더 파일명
01 / 001.mp3, 002.wav, 003 시크릿a.mp3,,,,,, 255 yayayat.mp3
02 / 001.mp3, 002.wav, 003 시크릿a.mp3,,,,,, 255 yayayat.mp3
B. 저장방식 2 (저장방식 1에 추가로 ADVERT 폴더 사용)
폴더명: 01 ~ 99까지 각 폴더별 파일갯수 1 ~ 255
파일명: 숫자 3자리 001 ~ 255 반드시 포함하는 파일명으로, 최대 파일갯수 255개 까지 각 폴더에 저장된 파일 인식
ADVERT 폴더: mp3 또는 wave파일의 이름은 4자리 이하 숫자로만 저장되어야만 한다. 1 ~ 3000
예) 폴더 파일명
01 / 001.mp3, 002.wav, 003 시크릿a.mp3,,,,,, 255 yayayat.mp3
02 / 001.mp3, 002.wav, 003 시크릿a.mp3,,,,,, 255 yayayat.mp3
ADVERT / 0001.mp3/wav, 0002.mp3/wav, 0003 시크릿a.mp3/wav, .......3000.mp3/wav.
※ 블루투스 연결 옵션에서 ADVERT 체크항목에 체크를 하고 연결해야 한다.
2. DFplayer 연결 및 코드
DFplayer에 블루투스 직접 연결
특별한 설정 없이 DFcontroller에서 블루투스에 연결하면 SD카드의 데이터를 받아 초기화를 시작하고, 저장된 SD카드의 폴더 및 트랙 정보를 이용하여 dfplayer를 제어 할 수 있다.
아두이노의 software Serial을 이용하여 dfplayer 연결
상기의 경우 아래 코드를 아두이노에 업로드 해야한다.
#include <SoftwareSerial.h>
#define DF_rxPin 2 // DFplayer RX -> arduino 2
#define DF_txPin 3 // DFplayer TX -> arduino 3
SoftwareSerial dfSerial(DF_txPin, DF_rxPin); // (RX, TX)
bool send_df = false;
void setup() {
Serial.begin(9600); // bluetooth Serial
dfSerial.begin(9600); // DFplayer Serial
}
void loop() {
if (dfSerial.available()) {
Serial.write(dfSerial.read()); // send to android via bluetooth
}
if (Serial.available()) {
if (Serial.peek() == 0x7E) send_df = true;
if (send_df == true) {
uint8_t temp = Serial.read();
if (temp == 0xEF) send_df = false;
dfSerial.write(temp); // send to DFplayer
}
}
}
dfplayer와 아두이노 핀 및 RGB LED 동시 제어
아래의 코드를 아두이노에 업로드 해야한다.
#include <SoftwareSerial.h>
#define DF_rxPin 2 // DFplayer RX -> arduino 2
#define DF_txPin 3 // DFplayer TX -> arduino 3
SoftwareSerial dfSerial(DF_txPin, DF_rxPin); // (RX, TX)
#define ledPin 13
#define Red 9
#define Green 10
#define Blue 11
// 블루투스 앱 디지털 핀 제어용 변수
bool get_pin_val = false;
uint8_t pin_count = 0;
uint8_t pin_a[3] = {0, };
uint8_t pin_val;
// 블루투스 앱 PWM 제어용 변수
bool get_pwm_val = false;
uint8_t pwm_count = 0;
uint8_t pwm_a[5] = {0, };
uint16_t pwm1 = 0;
uint16_t pwm2 = 0;
uint16_t pwm3 = 0;
bool send_df = false;
void setup() {
Serial.begin(9600); // bluetooth Serial
dfSerial.begin(9600); // DFplayer Serial
pinMode(ledPin, OUTPUT);
pinMode(Red, OUTPUT);
pinMode(Green, OUTPUT);
pinMode(Blue, OUTPUT);
}
void loop() {
if (dfSerial.available()) {
Serial.write(dfSerial.read()); // send to android via bluetooth
}
if (Serial.available()) {
if (Serial.peek() == 0x7E) send_df = true;
else if (Serial.peek() == 0xF3) get_pwm_val = true;
else if (Serial.peek() == 0xF0) get_pin_val = true;
if (send_df == true) {
uint8_t temp = Serial.read();
if (temp == 0xEF) send_df = false;
dfSerial.write(temp); // send to DFplayer
}
else if (get_pwm_val == true ) { // pwm 제어값 수신
uint8_t temp = Serial.read();
pwm_a[pwm_count] = temp;
pwm_count++;
if (temp == 0xF1) {
get_pwm_val = false;
pwm_count = 0;
pwm_control();
}
}
else if (get_pin_val == true) { // 디지털 핀 제어값 수신
uint8_t temp = Serial.read();
pin_a[pin_count] = temp;
pin_count++;
if (temp == 0xF1) {
get_pin_val = false;
pin_count = 0;
pin_control();
}
}
else {
if (Serial.peek() == 0xF8) {
String temp = Serial.readStringUntil('\n');
Serial.println(temp);
}
else if (Serial.peek() == 0xF9) {
String temp = Serial.readStringUntil('\n');
Serial.println(temp);
}
else {
char text = Serial.read(); // text value for some purpose.
if (text > 0 && text != 0x7E) Serial.write(text); // print text to Serial Monitor
}
}
}
}
void pin_control() {
pin_val = pin_a[1];
if (pin_val != 0) {
switch (pin_val) {
case 11: digitalWrite(ledPin, true); // button 1 : on
Serial.println("LED ON");
break;
case 10: digitalWrite(ledPin, false); // button 1 : off
Serial.println("LED OFF");
break;
}
pin_val = 0;
}
}
void pwm_control() {
uint16_t temp = pwm_a[3];
temp = temp << 8 | pwm_a[2];
if (pwm_a[1] == 1) { // 슬라이드 1번
pwm1 = temp;
analogWrite(Red, pwm1);
}
else if (pwm_a[1] == 2) { // 슬라이드 2번
pwm2 = temp;
analogWrite(Green, pwm2);
}
else if (pwm_a[1] == 3) { // 슬라이드 3번
pwm3 = temp;
analogWrite(Blue, pwm3);
}
}
관련 글
[arduino] - DFplayer - 아두이노 사운드 모듈
[arduino] - NodeMcu(ESP8266)에서 DFplayer를 제어하는 코드
[arduino] - ESP32(DevKit)로 DFplayer 제어하기
[arduino] - 안드로이드 앱 DFcontroller를 이용하여 DFplayer 제어
[arduino] - 아두이노시계 예제, ESP01 WiFi 이용 시간 동기화 하기
[arduino] - 아두이노 말하는알람시계 예제 - DFPlayer
[arduino] - 말하는알람시계 - 블루투스 연결 및 시간 동기화, DFPlayer 제어
[arduino] - NodeMcu - 말하는 알람시계, wifi이용 시간 동기화 및 DFPlayer 원격제어
DFcontroller - DFPlayer mini 원격제어 안드로이드 앱 버전 2.2 다운로드
'Arduino' 카테고리의 다른 글
아두이노 - DFPlayer DAC_R, DAC_L 단자 노이즈 제거 방법 (0) | 2019.09.01 |
---|---|
아두이노 말하는알람시계 예제 - DFPlayer (4) | 2019.08.28 |
아두이노시계 예제, ESP01 WiFi 이용 시간 동기화 하기 (2) | 2019.08.25 |
사운드 파일에 일련번호 추가방법 (0) | 2019.08.20 |
ESP32(DevKit)로 DFplayer 제어하기 (0) | 2019.08.14 |
ESP32 Serial 통신 라이브러리, software Serial? (0) | 2019.08.14 |
NodeMcu(ESP8266)에서 DFplayer를 제어하는 코드 (0) | 2019.08.14 |
DFplayer - 아두이노 사운드 모듈 (10) | 2019.06.13 |