정보나눔

오픈소스하드웨어 프로젝트에 대한 다양한 정보를 나누는 공간입니다.

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/blob/master/DFPlayer_Mini_Mp3/examples/DFPlayer_receive/DFPlayer_receive.ino

참고 라이브러리 : 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