Mini MP3 Module
개요
MP3, WAV 파일을 Play 할 수 있는 YX5200(or 동등한 IC) IC Module을 제어해 본다.
아두이노, 마이크로프로세서 등에서 간단하가 Sound를 플레이할 수 있다. 두 제품에 적용해 봤는데 적정 성능을 보여주고 있다.
부저만 사용하던 제품에 MP3나 WAV와 같은 미디어 파일을 적용할 수 있게 되어 MCU보드의 부담과 개발에 따른 부담을 덜어줄 수 있다.
Ⅰ. Keyes Player Mini Module
사용할 Sound Play Module은 Devicemart에서 구매한 Keyes Player Mini Module이다. 모듈 단가는 약 5,000원+ 정도 하고, IC는 약 2,000원+ 정도 한다.

사진 설명을 입력하세요.
매뉴얼 상의 예제로는 아두이노를 이용한 동작을 보여주고 있다.

사진 설명을 입력하세요.
그러나 ADSTAR 보드에 연결시켜야 하므로 IC를 직접 제어하는 방법을 확인해 본다.
Ⅱ. 통신 방식
9600 bps(default)
1 stop bit, none parity, 8bit 데이터일 것이다. 데이터 시트에는 제대로 표기가 안되어 있다.
Ⅲ. 데이터 포맷
- 0열 선택0열 다음에 열 추가
 - 1열 선택1열 다음에 열 추가
 - 2열 선택2열 다음에 열 추가
 - 3열 선택3열 다음에 열 추가
 - 4열 선택4열 다음에 열 추가
 - 5열 선택5열 다음에 열 추가
 - 6열 선택6열 다음에 열 추가
 - 7열 선택7열 다음에 열 추가
 - 8열 선택8열 다음에 열 추가
 - 9열 선택9열 다음에 열 추가
 
- 0행 선택0행 다음에 행 추가
 
| 
 $S 
 | 
 VER 
 | 
 Len 
 | 
 CMD 
 | 
 FB 
 | 
 Para1 
 | 
 Para2 
 | 
 CHK 
 | 
 $O 
 | 
 | 
- 셀 병합
 - 행 분할
 - 열 분할
 - 너비 맞춤
 - 삭제
 
$S : start bit 0x7E, 각 프레임은 STX
VER : 버전정보, 현재는 0xFF이다.
Len : 데이터 길이, 체크섬은 안들어간다.
CMD : 명령어, 동작, 멈춤 등
FeedBack : 명령어 FeedBack, 0이아니다. 뭐지?
para1 : 파라미터1, 노래 번호와 같은 설정 데이터의 상위 바이트
para2 : 파라미터2, 노래 번호와 같은 설정 데이터의 하위 바이트
checksum : 2바이트이고, STX를 포함한다.
$O : ETX, 0xEF
checksum = (0xFFFF – (VER+Len+CMD+FB+Para1+Para2))+1
Ⅳ. Base Board 설계

사진 설명을 입력하세요.
< Mini Module의 핀맵과 전원 LED >

사진 설명을 입력하세요.
< 출력 오디오 잭 >
출력은 2갸지로 DAC와 Speaker가 있다. Speaker는 따로 2핀 짜리 커넥터를 만들어 두었다.

사진 설명을 입력하세요.
< Key >
키 입력을 받아서 처리할 수 있도록 프로그래밍 되어 있다. 실제 개인적으로는 사용하지 않으므로 미삽 처리하였다.

사진 설명을 입력하세요.
< TTL 232 통신 >
통신 방법 중 232를 사용하는데 위 커넥터는 TTL 레벨의 232 통신을 사용할 때 적용한다.
이 IC가 3.3V 짜리라서 컨트롤 프로세서가 5V짜리라면 R8과 R6을 이용해서 UART0_RX 핀에 3.3V 레벨의 신호가 입력되도록 만들어 줘야한다. 5V 신호를 입력하니까 인식하지 못한다.

사진 설명을 입력하세요.
< RS2332 Part >
RS232 Level로 통신을 할 경우에 사용한다. 가능하면 이 기능을 사용하는 것이 편할 것 같다. 그래야 제어 보드의 레벨이 어느 정도이든 큰 신경 안쓰고 적용이 가능할 듯 싶다.
Ⅴ. Base Board PCB 설계

사진 설명을 입력하세요.
Ⅵ. 제어 커맨드
- 0열 선택0열 다음에 열 추가
 - 1열 선택1열 다음에 열 추가
 - 2열 선택2열 다음에 열 추가
 
- 0행 선택0행 다음에 행 추가
 - 1행 선택1행 다음에 행 추가
 - 2행 선택2행 다음에 행 추가
 - 3행 선택3행 다음에 행 추가
 - 4행 선택4행 다음에 행 추가
 - 5행 선택5행 다음에 행 추가
 - 6행 선택6행 다음에 행 추가
 - 7행 선택7행 다음에 행 추가
 - 8행 선택8행 다음에 행 추가
 - 9행 선택9행 다음에 행 추가
 - 10행 선택10행 다음에 행 추가
 - 11행 선택11행 다음에 행 추가
 - 12행 선택12행 다음에 행 추가
 - 13행 선택13행 다음에 행 추가
 - 14행 선택14행 다음에 행 추가
 - 15행 선택15행 다음에 행 추가
 - 16행 선택16행 다음에 행 추가
 - 17행 선택17행 다음에 행 추가
 - 18행 선택18행 다음에 행 추가
 - 19행 선택19행 다음에 행 추가
 - 20행 선택20행 다음에 행 추가
 - 21행 선택21행 다음에 행 추가
 - 22행 선택22행 다음에 행 추가
 - 23행 선택23행 다음에 행 추가
 - 24행 선택24행 다음에 행 추가
 - 25행 선택25행 다음에 행 추가
 - 26행 선택26행 다음에 행 추가
 - 27행 선택27행 다음에 행 추가
 - 28행 선택28행 다음에 행 추가
 - 29행 선택29행 다음에 행 추가
 - 30행 선택30행 다음에 행 추가
 - 31행 선택31행 다음에 행 추가
 - 32행 선택32행 다음에 행 추가
 - 33행 선택33행 다음에 행 추가
 - 34행 선택34행 다음에 행 추가
 - 35행 선택35행 다음에 행 추가
 - 36행 선택36행 다음에 행 추가
 - 37행 선택37행 다음에 행 추가
 - 38행 선택38행 다음에 행 추가
 - 39행 선택39행 다음에 행 추가
 - 40행 선택40행 다음에 행 추가
 
| 
 CMD 
 | 
 command (instruction) 
 | 
 The corresponding function Parameters (16) 
 | 
| 
 0x01 
 | 
 next track 
 | 
 | 
| 
 0x02 
 | 
 previous piece 
 | 
 | 
| 
 0x03 
 | 
 Specify the track(NUM)  
 | 
 1-2999 
 | 
| 
 0x04 
 | 
 Volume + 
 | 
 | 
| 
 0x05 
 | 
 volume- 
 | 
 | 
| 
 0x06 
 | 
 Specifies the volume 
 | 
 0-30 
 | 
| 
 0x07 
 | 
 Specifies EQ 0/1/2/3/4/5 
 | 
 Normal/ Pop / Rock / Jazz / Classic / Bass 
 | 
| 
 0x08 
 | 
 Single cycle specified track play 
 | 
 0-2999 
 | 
| 
 0x09 
 | 
 Specify the play set 1/2/3/4/5 
 | 
  U / SD / AUX / SLEEP / FLASH 
 | 
| 
 0x0A 
 | 
 Goes to sleep - Low power consumption 
 | 
 | 
| 
 0x0B 
 | 
 Retention 
 | 
 | 
| 
 0x0C 
 | 
 Module reset 
 | 
 | 
| 
 0x0D 
 | 
 Broadcast 
 | 
 | 
| 
 0x0E 
 | 
 time out 
 | 
 | 
| 
 0x0F 
 | 
 Specified folder player 
 | 
 1-10 (needs its own set) 
 | 
| 
 0x10 
 | 
 PA set (no) 
 | 
  [DH = 1: open PA] [DL: setting the gain 0-31] 
 | 
| 
 0x11 
 | 
 Repeat All Tracks 
 | 
 [1: looping] [0: Stop looping] 
 | 
| 
 0x12 
 | 
 MP3 tracks specified folder 
 | 
 0--9999 
 | 
| 
 0x13 
 | 
 Commercials 
 | 
 0--9999 
 | 
| 
 0x14 
 | 
 It supports 15 folders See below for details 
 | 
 | 
| 
 0x15 
 | 
 Stop spots, play background 
 | 
 | 
| 
 0x16 
 | 
 Stop play 
 | 
 | 
| 
 0x3C 
 | 
 STAY 
 | 
 | 
| 
 0x3D 
 | 
 STAY 
 | 
 | 
| 
 0x3E 
 | 
 STAY 
 | 
 | 
| 
 0x3F 
 | 
 Send initialization parameters 
 | 
 0 - 0x0F (the lower four bits each represent a device) 
 | 
| 
 0x40 
 | 
 Returns an error, a retransmission request 
 | 
 | 
| 
 0x41 
 | 
 answer 
 | 
 | 
| 
 0x42 
 | 
 Query the current status 
 | 
 | 
| 
 0x43 
 | 
 Query current volume 
 | 
 | 
| 
 0x44 
 | 
 Query the current EQ 
 | 
 | 
| 
 0x45 
 | 
 Query current play mode 
 | 
 This version retains this feature 
 | 
| 
 0x46 
 | 
 Query the current software version 
 | 
 This version retains this feature 
 | 
| 
 0x47 
 | 
 The total number of file queries UDISK 
 | 
 | 
| 
 0x48 
 | 
 The total number of file queries TF card 
 | 
 | 
| 
 0x49 
 | 
 The total number of file queries FLASH 
 | 
 | 
| 
 0x4A 
 | 
 Retention 
 | 
 | 
| 
 0x4B 
 | 
 Query of the current track UDISK 
 | 
 | 
| 
 0x4C 
 | 
 Queries TF card of the current track 
 | 
 | 
| 
 0x4D 
 | 
 FLASH query of the current track 
 | 
 | 
- 셀 병합
 - 행 분할
 - 열 분할
 - 너비 맞춤
 - 삭제
 
예)
static U8 SND_BOOT[10] = {0x7E, 0xFF, 0x06, 0x12, 0x00, 0x00, 0x01, 0xFE, 0xE8, 0xEF};
static U8 SND_GTSLEEP[10] = {0x7E, 0xFF, 0x06, 0x12, 0x00, 0x00, 0x02, 0xFE, 0xE7, 0xEF};
static U8 SND_GTWAIT[10] = {0x7E, 0xFF, 0x06, 0x12, 0x00, 0x00, 0x03, 0xFE, 0xE6, 0xEF};
static U8 SND_START[10] = {0x7E, 0xFF, 0x06, 0x12, 0x00, 0x00, 0x04, 0xFE, 0xE5, 0xEF};
static U8 SND_END[10] = {0x7E, 0xFF, 0x06, 0x12, 0x00, 0x00, 0x05, 0xFE, 0xE4, 0xEF};
static U8 SND_WAIT[10] = {0x7E, 0xFF, 0x06, 0x12, 0x00, 0x00, 0x06, 0xFE, 0xE3, 0xEF};
static U8 SND_STOP[10] = {0x7E, 0xFF, 0x06, 0x12, 0x00, 0x00, 0x07, 0xFE, 0xE2, 0xEF};
static U8 SND_ERROR[10] = {0x7E, 0xFF, 0x06, 0x12, 0x00, 0x00, 0x08, 0xFE, 0xE1, 0xEF};
static U8 SND_BUTTON[10] = {0x7E, 0xFF, 0x06, 0x12, 0x00, 0x00, 0x09, 0xFE, 0xE0, 0xEF};
static U8 SND_RETRY[10] = {0x7E, 0xFF, 0x06, 0x12, 0x00, 0x00, 0x0A, 0xFE, 0xDF, 0xEF};
/* hl2xgw 9.Apr.2025 */
static U8 CurLoopStart[10] = {0x7E, 0xFF, 0x06, 0x19, 0x00, 0x00, 0x00, 0xFE, 0xE2, 0xEF};
static U8 CurLoopEnd[10] = {0x7E, 0xFF, 0x06, 0x19, 0x00, 0x00, 0x00, 0xFE, 0xE2, 0xEF};
static U8 StopCurrent[10] = {0x7E, 0xFF, 0x06, 0x16, 0x00, 0x00, 0x00, 0xFE, 0xE5, 0xEF};
static U8 VolumeLevel0[10] = {0x7E, 0xFF, 0x06, 0x06, 0x00, 0x00, 0x00, 0xFE, 0xF5, 0xEF};
static U8 VolumeLevel1[10] = {0x7E, 0xFF, 0x06, 0x06, 0x00, 0x00, 0x16, 0xFE, 0xDF, 0xEF};
static U8 VolumeLevel2[10] = {0x7E, 0xFF, 0x06, 0x06, 0x00, 0x00, 0x18, 0xFE, 0xDD, 0xEF};
static U8 VolumeLevel3[10] = {0x7E, 0xFF, 0x06, 0x06, 0x00, 0x00, 0x1A, 0xFE, 0xDB, 0xEF};
static U8 VolumeLevel4[10] = {0x7E, 0xFF, 0x06, 0x06, 0x00, 0x00, 0x1C, 0xFE, 0xD9, 0xEF};
static U8 VolumeLevel5[10] = {0x7E, 0xFF, 0x06, 0x06, 0x00, 0x00, 0x1E, 0xFE, 0xD7, 0xEF};
Volume Level은 30까지임.
Ⅶ. 결론
재미있는 아이템이다. 이걸 이용하면 8비트 마이컴에서도 시리얼만 동작 시켜서 사운드를 플레이 시킬 수 있다.
유용하게 써 봐야겠다.
가격도 저렴하다.
나는 베이스 보드를 만들어서 사용했지만, 프로젝트 PCB에 직접 넣는다던가 이 회로를 PCB에 넣는다던가 하면
더 적은 공간으로 사용이 가능할 것 같다.
딱 필요한 기능만 테스트 했고, 그 외의 기능은 필요할 때 또 테스트 해 보자.