1. 라즈베리파이에서 소리 재생방법
각종 전자기기를 사용하다 보면, 대로는 소리로 정보를 전달할 필요를 느낄 때가 꽤 많이 있다. 아마도 대표적인 사례는 전기밥솥에서 밥이 완료되었을 때 취사가 완료되었다고 말로 안내해 준다든지, 음악을 들려주다든지, 또는 위험구역에 사람이 접근했을 때 위험 안내를 한다든가 하는 경우이다.
이럴 때 소리를 내는 방법으로는 주파수변조에 이해 소리를 내는 방법과, MP3를 이용해 소리를 재생하는 방법 등이 알려져 있는데, 아무래도 MP3 형식으로 미리 녹음된 소리를 들려주는 것이 재생 가능한 소리의 종류나, 자연스러움 측면에서 더 바람직하다.
라즈베리 파이에서는 PWM 방식을 이용하여서도 MP3 파일을 재생할 수 있는 것으로 알려져 있기는 하나, PWM을 이용하는 경우에는 무엇보다 음질에 대한 논란이 있기도 하고, 이 경우 역시 피코보드에서 나온 출력을 그대로 스피커에 연결하기엔 너무 소리가 작아 앰프를 사용해야 하는 문제가 있다. 그렇기 때문에 과거 아두이노에서는 PWM 대신 DF Player를 이용하여 MP3를 재생하는 방법이 꽤 알려져 있었다.
마침 서랍을 뒤지다 보니, 오래전에 구입해 두었던 DFPlayer 모듈이 2-3개 눈에 띄어서, 이를 이용하여 라즈베리파이 피코보드에서 MP3를 재생하는 방법을 시도해 보았다.
2. DFPlayer mini module
먼저 DFPlayer mini 모듈은 다음과 같은 외형을 가졌다. 크기는 대략 2.0 x 2.0 cm의 크기이다. 모듈 한쪽으로 SD 또는 TF 카드형 메모리를 꼽을 수 있게 되어 있다. 가격은 수년 전에 개당 2-3천 원 정도에 구매했던 것으로 기억한다.
뒷면의 모습은 다음과 같다.
그리고 가장 중요한 핀맵은 다음과 같은데, 보다 세부적인 내용은 다음 링크로 연결되는 Datasheet을 참고하기 바란다.( https://picaxe.com/docs/spe033.pdf ). Datasheet에 의하면 동작전압 Vcc 는 3.2~5V로 기재되어 있다.
이 DFPlayer는 직렬 통신으로 피코보드와 통신하기 때문에 가장 중요한 핀은 RX와 TX 핀이라고 할 수 있다.
3. DFPlayer Library 추가
DFPlayer mini 모듈을 사용하려면 피코보드에 MP3 재생을 위한 별도의 라이브러리 추가가 필요하다. Github에 여러 가지 라이브러리가 공개되어 있기는 한데, 막상 찾아보면 가장 대표적인 것은 다음 파일이다.
https://github.com/mannbro/PicoDFPlayer (by Mannbro)
해당 링크를 통해 다음과 같은 화면에 도달하면, 다음 파일을 열어 해당 내용을 Thonny IDE에 복사하고, 피코보드가 연결된 상태에서, 이 파일을 피코보드에 동일한 파일이름(PicoDFPlayer.py)으로 저장해 주면 된다.
4. 배선 및 회로 구성
DFPlayer를 다음과 같이 회로를 구성했다.
소리 재생을 위한 스피커가 마침 적당하지 않아, 못쓰게 된 된 내비게이션에 내장되었던 작은 소형의 스피커 모듈을 임시로 연결했다.
5. Coding 방법
이제 MP3를 재생하려면
먼저 라이브러리 사용 선언을 해주어야 한다.
import machine
from picodfplayer import DFPlayer
그리고 DFPlayer의 통신을 위해 다음과 같은 선언이 필요하다
UART_INSTANCE=0
TX_PIN = 16 피코 보드에서 TX 용도로 이용하는 GP 번호로 DFPlayer의 RX에 연결
RX_PIN=17 피코 보드에서 RX 용도로 이용하는 GP 번호로 DFPlayer의 TX에 연결
BUSY_PIN=6 DFPlayer가 현재 상태 신호를 입력받을 GP 번호이다.
player=DFPlayer(UART_INSTANCE, TX_PIN, RX_PIN, BUSY_PIN)
이렇게 하면, DFPlayer 모듈을 사용하기 위한 기본적 선언이 마무리된다. 참고로 아두이노에서는 BAUD Rate도 별도로 지정해야 했는데, 라즈베리파이 피코의 경우에는 추가해 준 라이브러리에서 이 속도를 9600으로 지정해 놓았기 때문에 별도 지정이 필요하지 않다. 이후, 각종 명령어들을 이용하여 MP3 파일을 재생하거나 각종 제어를 하면 된다.
사용 가능한 주요 명령어들은 다음과 같다.
각 명령어들의 의미는 별도 설명이 필요하지 않을 만큼 이름에서 명확히 알 수 있다.
player.playTrack(folder, file) 파일은 1부터 시작하는 순서, 폴더명은 01,02,03.. 형태로 부여
player.pause()
player.resume()
player.nextTrack()
player.prevTrack()
player.increaseVolume()
player.decreaseVolume()
player.setVolume(0-30)
player.reset()
player.queryBusy( )
player.setEQ(0-5) (0=기본l, 1=Pop, 2=Rock,3=Jazz, 4=Classic,5=Base)
player.setPlaybackMode(0-3) (0=Repeat, 1=Folder반복, 2=단독반복, 3=무작위반복)
6. Coding 시 주의사항
SD카드에 MP3 파일을 저장할 때는 반드시 01, 02, 03 등의 숫자화된 폴더를 만들어 넣어야 하고, 파일 이름은 반드시 숫자로 001, 002, 003 또는 1, 2,3 등으로 시작해야 한다. 루트 디렉터리에 있는 MP3 파일들은 재생이 되지 않는다.
또한 player.playTrack(folder, file) 명령을 사용할 때는, 폴더 부분에 01 또는 1 등의 (순서를 나타내는) 번호 형태로 기재해야 하고, 파일 부분 역시 일련번호(순서를 나타내는)를 나타내는 번호로 기재해야 한다.
7. 동작 예제
위에 소개한 다양한 동작 명령들이 어떻게 기능하는지를 보여주기 위해, 다음의 예제 Code를 만들었다.
#SD 카드내에 01, 02, 03 형식으로 펄더를 만들어야 함
# 각 폴더내 MP3파일은 001, 002,003 Ehsms 1,2,3, 등의 숫자를 이름을 부여해야 함
import machine
import utime
from picodfplayer import DFPlayer
UART_INSTANCE=0
TX_PIN =16
RX_PIN=17
BUSY_PIN=18
player=DFPlayer(UART_INSTANCE, TX_PIN, RX_PIN, BUSY_PIN)
player.reset()
player.standby()
print('Set EQ to POP mode, in 0-5(#0=Normal, #1=Pop, #2=Rock,#3=Jazz, #4=Classic,#5=Base)')
player.setEQ(1) # 0-5(#0=Normal, #1=Pop, #2=Rock,#3=Jazz, #4=Classic,#5=Base)
print('Set Volume in 0-30')
player.setVolume(30) # 0-30
for k in range(5):
player.playTrack(01,k+1)
print('Playing....Folder 01, File', k+1," ", player.queryBusy())
utime.sleep(5)
print(' ')
print('Decrease Volume')
for k in range(5):
player.decreaseVolume()
utime.sleep(2)
print(' ')
print('Increase Volume')
for k in range(5):
player.increaseVolume()
utime.sleep(2)
print('Move to next track & Play')
player.nextTrack()
print()
print('Move back to Next track & Playing ?', player.queryBusy())
utime.sleep(5)
player.setVolume(30) # 0-30
player.prevTrack()
print()
print('Move back to previous track & Playing ?', player.queryBusy())
utime.sleep(5)
print('Pause playing')
player.pause()
print()
print('Status of player...Playing?', player.queryBusy())
utime.sleep(5)
print('Resume playing')
player.resume()
print()
print('Status of player...Playing?', player.queryBusy())
utime.sleep(5)
동작 모습은 다음과 같다.
소리의 재생과 더불어 각종 명령어의 동작을 스크린에 함께 표시하였다.


