개요
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에 넣는다던가 하면
더 적은 공간으로 사용이 가능할 것 같다.
딱 필요한 기능만 테스트 했고, 그 외의 기능은 필요할 때 또 테스트 해 보자.
'임베디드' 카테고리의 다른 글
warning: (356) implicit conversion of float to integer (1) | 2025.04.19 |
---|---|
구형 XC32 compiler 다운로드 (1) | 2024.10.30 |
STM32 fputc를 이용한 printf 사용시 BKPT 0xAB 에서 멈춤 (0) | 2024.09.11 |
STM32 fputc를 이용한 printf 사용시 BKPT 0xAB 에서 멈춤 (0) | 2024.09.09 |
Debug : Serial Wire (0) | 2024.09.09 |