아두이노2016. 7. 13. 18:57

먼저 글을 시작하기 전에 이 글 부터는 예전에 글을 쓰던 방식인 반말 포스팅으로 되돌아 가려고 합니다. 존댓말로 포스팅을 하니까 글이 의도하지 않게 늘어지는 경향이 있어서 다시 예전의 방식으로 돌아가려고 합니다. ^^ 


이전 글에서 DF Robot 의 MP3 모듈인 DF Player Mini 에 대해서 알아보았다. 그 때에는 단순히 전원과 스위치를 연결해서 MP3 를 플레이 해 보았는데 사실 이 모듈은 아두이노와의 시리얼 통신을 통해 프로그래밍으로 제어가 가능한 모듈이다. 그러므로 아두이노 등과의 결합을 통하면 더욱 활용범위가 넓어지는 것이다. 이번에는 어떻게 DF Player Mini MP3 모듈을 아두이노로 제어할 수 있는지 알아보고자 한다.


DF Player Mini (이하 MP3 모듈) 이다. 각 핀의 배열은 위와 같다. 


각 핀의 용도는 위와 같다. 핀들 중에서 RX, TX 를 아두이노에 연결하고 시리얼통신으로 MP3 모듈을 제어를 할 수 있는 것이다.


먼저 간단하게 MP3 파일을 제어하는 예제를 실행해 본다. 준비물은 스피커, MP3모듈, 마이크로SD카드, 브레드보드, 연결선, 1KΩ 저항 2개, 아두이노가 필요하다. 연결은 아래와 같다.


■ 연결 #1


df_player_mini_basic_test.fzz


위와 같이 연결을 한다. TX, RX 연결 시 중간에 반드시 1KΩ 저항을 연결해 주어야 한다. 그러지 않으면 아예 아두이노 스케치가 업로드 되지 않고 잡음이 많이 발생한다.


연결이 되었으면 MP3 파일이 담긴 마이크로SD카드를 준비해야 한다. 소스에서 특정 MP3 파일을 지정해서 플레이를 하려면 아래와 같이 파일의 네이밍 규칙을 맞춰서 파일을 복사해야 한다.


위와 같이 SD카드에 mp3 라는 폴더를 만들어주고 위와 같이 0001 ~ 9999 까지 번호를 원래의 MP3 파일명의 앞에 붙여주면 된다. 또는 번호만으로 네이밍을 해도 된다.



■ 소스 #1

소스의 실행을 위해서는 우선 MP3 모듈의 라이브러리가 설치되어 있어야 한다. 

DFPlayer_Mini_mp3.zip


위의 파일을 다운로드 받아서 압축을 푼 후 아두이노 IDE 설치 폴더의 libraries 폴더에 넣어주면 된다. 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <SoftwareSerial.h>
#include <DFPlayer_Mini_Mp3.h>
 
void setup () {
    Serial.begin (9600);
    mp3_set_serial (Serial);      // DFPlayer-mini mp3 module 시리얼 세팅
    delay(1);                     // 볼륨값 적용을 위한 delay
    mp3_set_volume (30);          // 볼륨조절 값 0~30
}
 
void loop () {        
    mp3_play (1);    //0001 파일 플레이
    delay (6000);
    mp3_next ();    //0002 파일 플레이 , next
    delay (6000);
    mp3_prev ();    //0001 파일 플레이 , prev
    delay (6000);
    mp3_play (4);    //0004 파일 플레이
    delay (6000);
}
cs


setup() 에서 시리얼 통신 및 볼륨을 세팅해주고 loop() 에서 mp3_play (플레이할 파일 1~9999) 값을 넣어주면 해당 파일이 플레이 된다. mp3_next() 와 mp3_prev() 각각 다음곡 이전곡을 플레이 한다. 소스를 플레이하면 재생 순서는 다음과 같이 될 것이다.  6초 간격으로 0001 -> 0002 -> 0001 -> 0004 파일이 무한반복 플레이 된다.


실행 영상이다. 위의 mp3 파일을 넣기 전에 플레이한 영상이라서 위의 리스트와 다른 노래가 나오지만 노래만 바뀌면 같은 결과이다.


그럼 그냥 전원이 연결되었을 때 그냥 순차적으로 플레이 하려면 어떻게 해야 할까?


■ 연결 #2


df_player_mini_play_all.fzz


연결 #1 에서 조금 변형을 해야 한다. MP3 모듈의 TX 를 아두이노의 D10에 연결하고 RX 를 D11에 연결하는 것으로 변경한다.  그리고 MP3 모듈의 BUSY 핀을 아두이노의 D3 에 연결을 추가한다.

 

■ 소스 #2

아래의 소스는 MP3 파일을 0001 부터 끝까지 모두 플레이 해 주는 소스이다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <SoftwareSerial.h>
#include <DFPlayer_Mini_Mp3.h>
 
SoftwareSerial mySerial(1011); // RX, TX
 
void setup () {
  Serial.begin (9600);
  mySerial.begin (9600);
  mp3_set_serial (mySerial);    //set softwareSerial for DFPlayer-mini mp3 module 
  delay(1);                     // delay 1ms to set volume
  mp3_set_volume (15);          // value 0~30
}
void loop () {
  boolean play_state = digitalRead(3);// connect Pin3 to BUSY pin of player
  if(play_state == HIGH){
    mp3_next ();
  }
}
cs

 

BUSY 포트는 MP3 파일의 플레이의 플레이가 끝날 경우 아두이노에 HIGH 값을 보내준다. 그 때 mp3_next() 를 실행하여 다음곡을 플레이하는 원리이다. 실행하면 0001 ~ 9999 까지의 파일을 순차적 플레이를 반복한다.


아래는 MP3 모듈 라이브러리의 function 들이다. 아래의 기능만 있어도 거의 모든 mp3 플레이어의 기능을 구현 가능하다. 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
   mp3_play ();     //start play
   mp3_play (5);    //play "mp3/0005.mp3"
   mp3_next ();     //play next 
   mp3_prev ();     //play previous
   mp3_set_volume (uint16_t volume);    //0~30
   mp3_set_EQ ();   //0~5
   mp3_pause ();
   mp3_stop ();
   void mp3_get_state ();   //send get state command
   void mp3_get_volume (); 
   void mp3_get_u_sum (); 
   void mp3_get_tf_sum (); 
   void mp3_get_flash_sum (); 
   void mp3_get_tf_current (); 
   void mp3_get_u_current (); 
   void mp3_get_flash_current (); 
   void mp3_single_loop (boolean state);    //set single loop 
   void mp3_DAC (boolean state); 
   void mp3_random_play (); 
cs


다음글 에서는 센서를 붙여서 테스트를 해 보려고 한다. 센서에서 값이 감지되면 해당되는 음성을 출력해 보려고 한다.

반응형
Posted by 대네브 (deneb)

댓글을 달아 주세요

  1. 앙리꼿띠

    으아아 제가 딱 찾던건데 감사합니다

    df player의 경우 국내에 판매하는 사이트가 있나요?

    네이버쪽에 검색해봐도 나오는 샵이 없네요

    2016.08.30 12:07 [ ADDR : EDIT/ DEL : REPLY ]
    • 네이버 쇼핑에서 '아두이노 mp3' 검색하니까 바로 나오네요. http://www.interpark.com/product/MallDisplay.do?_method=detail&sc.shopNo=0000100000&firpg=01&sc.prdNo=4311240598&sc.dispNo=016001&sc.dispNo=016001

      http://xdream.godo.co.kr/shop/goods/goods_view.php?goodsno=2691&inflow=naver&NaPm=ct%3Disgxyztc%7Cci%3D729922cb29366a300f447f734eb677ec03b02459%7Ctr%3Dslsl%7Csn%3D278273%7Chk%3Dff25a13cedf0303bf837391d25fc0681e31823c4

      http://item2.gmarket.co.kr/Item/detailview/Item.aspx?goodscode=824463180&GoodsSale=Y&jaehuid=200001169&NaPm=ct%3Disgxzjvk%7Cci%3D5404825331367d7bca9bdb9647094c8b50746c6e%7Ctr%3Dslsl%7Csn%3D24%7Chk%3Dfef1cc9908dc50d6c9f157033bdb9bc0c9fd898b

      2016.08.30 12:55 신고 [ ADDR : EDIT/ DEL ]
  2. 앙리꼿띠

    으허허 감사합니다! !

    2016.08.30 13:37 [ ADDR : EDIT/ DEL : REPLY ]
  3. 남서현

    안녕하세요? 많은 도움이 되었습니다. 그런데 스피커는 어느 종류를 쓰시나요?

    2017.05.26 20:51 [ ADDR : EDIT/ DEL : REPLY ]
  4. 아두이노

    안녕하세요. 먼저 알아보기 쉽게 게시물 올려주셔서 정말 감사합니다!
    dfplayer mini 검색을 하다가 게시물을 보게 되었습니다. 부품을 사기 전에 먼저 fritzing에서 시뮬레이션을 해보고싶었는데, 아무리 찾아봐도 dfplayer mini 부품이 존재하지 않는 것 같아서요...!
    어떻게 찾으셨는지 여쭤봐도 될까요?

    2017.08.02 10:27 [ ADDR : EDIT/ DEL : REPLY ]
  5. 초보 개발자

    DF-Player 사용해보려고 검색하다가 좋은 글 보고 갑니다.
    한가지 여쭙고 싶은게.
    같은 핀 구성에 같은 소스 코드와 제품을 사용했음에도 일단 트랙 재생이 안되는데 이유가 뭘까요.
    예제인 1,2,1,4 순으로 초 돌리는 소스 코드의 경우 막상 틀어보면 넥스트와 프리브 기능만 먹는지 영원히 2,1,2,1 순으로 재생됩니다.
    심지어 딜레이 건 만큼 루프가 1회 돌고 난 다음 MP3가 켜지면서 음원이 나오기도 하고...도통 알수가 없네요.
    우선 트랙 재생 기능이 안먹는다는 것.
    두번째로는 딜레이 없이 넣은 곡을 완주 시킬 방법은 없는지.
    이 두가지가 궁금합니다

    2017.08.25 04:01 [ ADDR : EDIT/ DEL : REPLY ]
  6. 비밀댓글입니다

    2018.10.03 12:27 [ ADDR : EDIT/ DEL : REPLY ]
  7. ㅁㅁㅁ

    #include <SoftwareSerial.h>
    #include <DFPlayer_Mini_Mp3.h>

    void setup () {
    Serial.begin (9600);
    mp3_set_serial (Serial); // DFPlayer-mini mp3 module 시리얼 세팅
    delay(1); // 볼륨값 적용을 위한 delay
    mp3_set_volume (30); // 볼륨조절 값 0~30
    }

    void loop () {
    mp3_play (2); //
    delay (6000);

    mp3_next (); //
    delay (30000);
    mp3_next (); //
    delay (6000);



    }
    예제코드를 썻는데 노래가 3곡이 재생된 후에 한참동안 노래가 안나오는데 어떻게 해야할까요 ..
    한 3분? 5분가까이 안나오는것같아요

    2019.11.25 23:59 [ ADDR : EDIT/ DEL : REPLY ]
  8. 비밀댓글입니다

    2020.05.07 01:59 [ ADDR : EDIT/ DEL : REPLY ]
  9. 비밀댓글입니다

    2021.05.09 17:28 [ ADDR : EDIT/ DEL : REPLY ]
  10. .

    혹시 재생 중에 다른 명령어도 작동이 가능한가요?

    2021.06.09 18:00 [ ADDR : EDIT/ DEL : REPLY ]
  11. hnnnn

    안녕하세요
    혹시 여기에 모션 센서를 연결해 사람이 지나가면 소리가 나도록 구현하는 것도 가능한가요?

    2021.09.13 21:51 [ ADDR : EDIT/ DEL : REPLY ]
  12. 어렵다..

    제가 TX와 RX 에 1k 옴이 없어서 1600썼는데 그래도 상관이 없나요?
    소리가 안들려서요...

    2021.09.17 16:16 [ ADDR : EDIT/ DEL : REPLY ]