코코아팹은 누구나 창의적 아이디어를 현실로 만들어 낼 수 있도록
만들고, 공유하고, 배울 수 있는 터전이
되고자 합니다.
아이디와 비밀번호를 잊으셨나요?아이디 / 비밀번호 찾기
코코아팹 회원이 아니신가요? 회원가입
df_player_mini 라이브러리 오류 관련 질문
Mazik | 2020-03-31
|
|
---|---|
1. 보드 : 아두이노 우노 2. 프로그램명 : Arduino IDE 3. 사용한 센서명 : DF Player Mini 4. 회로도 5. 소스코드 #include <Wire.h> #include <SoftwareSerial.h> #include "DFPlayer_Mini_Mp3.h" SoftwareSerial dfp(10,11);
#define CMD_NULL 0 #define CMD_MUSIC_PLAY 80 // ASCII 'P' #define CMD_MUSIC_STOP 83 // ASCII 'S' #define CMD_MUSIC_VOLUME_UP 85 // ASCII 'U' #define CMD_MUSIC_VOLUME_DOWN 68 // ASCII 'D'
boolean ps; int tracks = 0; // tracks in microSD
uint8_t device_addr = 0x10; uint8_t sub_addr; uint8_t data[] = {device_addr, 1, CMD_NULL, (CMD_NULL & 0xFF), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 20}; // data[0] = 슬레이브 주소, data[1] = 마스터로 전송할 데이터 개수 (읽기 명령용) // data[2], ~ , data[11] = write_command, write_data_1, ~ , write_data_9 // data[12], ~ ,data[31] = read_data_1, ~ , read_data_20
uint8_t player_status = 0; // 1 = 음악 재생 중, 0 = 정지 uint8_t current_music = 15; // 현재 재생중인 음악 번호 uint8_t current_volume = 15; // 현재 볼륨
void i2c_init(void); void receiveEvent(void); void requestEvent(void);
// Write Command Table // 쓰기 명령 이름: 명령 번호, 명령 관련 데이터, (255 – 명령 번호) = 통신 오류 확인용 // music_play : CMD_MUSIC_PLAY, FORWARD or BACKWARD or LEFT or RIGHT, VELOCITY, ANGLE[15~8], ANGLE[7~0], CHECKSUM // music_stop : CMD_MUSIC_STOP, CHECKSUM // CHECKSUM = (CMD + DATA) & 0xFF
// Read Data Table // data[12] : 1 = 음악 재생 중, 0 = 정지 // data[13] : 현재 재생중인 음악 번호 // data[14] : 현재 볼륨
void vf_player_init(void); void music_play(uint8_t music_number); void music_stop(void); void music_volume_up(void); void music_volume_down(void);
void setup() { //cli(); i2c_init(); vf_player_init(); //sei(); }
void loop(){
}
void i2c_init(void) { Wire.begin(device_addr); //Wire.setClock(100000); Wire.onReceive(receiveEvent); Wire.onRequest(requestEvent); }
void receiveEvent(int h){ ps = digitalRead(3);
while(Wire.available()) { sub_addr = Wire.read(); // 연속적으로 받은 데이터 중 1번째는 시작 레지스터 주소 uint8_t temp = sub_addr; while(Wire.available()) { data[temp] = Wire.read(); // 연속적으로 받은 나머지 데이터들은 시작 레지스터 주소에서 시작하여 차례대로 입력된다. temp = temp + 1; } }
if(data[0x02] != CMD_NULL) // 새로운 명령이 감지되면 { switch(data[0x02]) // 명령에 따라 함수 실행 { case CMD_MUSIC_PLAY: if(((data[0x02] + data[0x03]) & 0xFF) == data[0x04]) // I2C 통신 에러 확인 music_play(data[0x03]); break; case CMD_MUSIC_STOP: if(((data[0x02]) & 0xFF) == data[0x03]) // I2C 통신 에러 확인 music_stop(); break; case CMD_MUSIC_VOLUME_UP: if(((data[0x02]) & 0xFF) == data[0x03]) // I2C 통신 에러 확인 music_volume_up(); break; case CMD_MUSIC_VOLUME_DOWN: if(((data[0x02]) & 0xFF) == data[0x03]) // I2C 통신 에러 확인 music_volume_down(); break; default: break; } data[0x02] = CMD_NULL; // 명령 레지스터 초기화 } }
void requestEvent(void) { for(uint8_t i = sub_addr ; i < (sub_addr + data[0x01]) ; i++) Wire.write(data[i]); data[0x01] = 1; // 마스터로 전송할 데이터 개수 (읽기 명령용) 초기화 }
void vf_player_init(void) { data[12] = player_status; data[13] = current_music; data[14] = current_volume;
Serial.begin(9600); dfp.begin(9600); while (!Serial);
// Set Serial for DFPlayer-mini mp3 module mp3_set_serial(dfp); // Set logging Serial mp3_set_debug_serial(Serial); // Set volume (value 0~30) mp3_set_volume(data[14]); // Set device to microSD mp3_set_device(2);
for (int i=0; i < 1; i++) { // Query the total number of microSD card files mp3_get_folder_sum(i + 1); tracks = mp3_wait_folder_sum();
Serial.print("Find "); Serial.print(tracks); Serial.print(" tracks in folder 0"); Serial.print(i+1); Serial.println("."); }
Serial.print("Current Volume is "); Serial.println(data[14]); Serial.println("====================================="); }
void music_play(uint8_t music_number) { current_music = music_number; player_status = 1;
data[12] = player_status; data[13] = current_music;
mp3_play(data[13]); Serial.print("Play track "); Serial.println(data[13]); }
void music_stop(void) { player_status = 0; data[12] = player_status;
mp3_stop(); Serial.println("Stop the music"); }
void music_volume_up(void) { //current_volume = current_volume + 1; //data[14] = current_volume;
volume_up();
if(current_volume >= 30) current_volume = 30; else current_volume = current_volume + 1; data[14] = current_volume;
Serial.println("Volume up"); Serial.print("Current Volume is "); Serial.println(data[14]); } void music_volume_down(void) { //current_volume = current_volume - 1; //data[14] = current_volume;
volume_down();
if(current_volume <= 0) current_volume = 0; else current_volume = current_volume - 1; data[14] = current_volume;
Serial.println("Volume down"); Serial.print("Current Volume is "); Serial.println(data[14]); }
6. 분명히 이전까지 잘 되었던 코드입닏나 하지만 어느순간부터 오류가 뜨는 데 이런식으로 오류가 뜨게 됩니다 이에 대한 해결 방안을 알 수 있을 까요???
참고 라이브러리 : https://github.com/DFRobot/DFPlayer-Mini-mp3
****코드에 보면 volume_up(), volume_down()이 있는 데 이에 대한 선언은 저 참고 라이브러리 링크에 있는 cpp 파일에
void volume_up() {
mp3_send_cmd(0x04);
}
void volume_down() {
mp3_send_cmd(0x05);
}
추가해주시고 헤더파일에 함수 선언해주시면 됩니다
|
|
이전글 | 아두이노 코딩 html css java | 2020-03-27 |
다음글 | 서보 모터가 이상합니다. | 2020-04-03 |