电子工程师技术服务社区
公告
登录
|
注册
首页
技术问答
厂商活动
正点原子
板卡试用
资源库
下载
文章
社区首页
文章
自己DIY一个mp3播放器
分 享
扫描二维码分享
自己DIY一个mp3播放器
MP3模块
串口通信
STM32
嵌入式从0到1
关注
发布时间: 2021-03-01
丨
阅读: 973
### 实现目标 * 实现播放指定歌曲文件 * 利用组合播报功能,实现当前系统时间的播报 ### 所需工具及环境 * 所用模块 ![MP3模块](https://img-blog.csdnimg.cn/20210208213130955.png) ![小功放音响](https://img-blog.csdnimg.cn/20210208213142865.png) * Keil 5 * STM32F103RET6核心板(本平台自制专用核心板) ### 模块简介 该模块是一个基于高音质MP3音乐芯片的MP3音乐播放器模块。支持采样率是8KHz ~ 48KHz的MP3、WAV格式文件。 板载Micro SD(TF:Trans-flash Card)卡座,可插上存了音乐文件的Micro SD卡。 单片机可以通过串口发送命令进行切换音乐、调节音量、播放模式等操作。 用户也可以通过USB转串口模块对该模块进行调试。模块与UNO/AVR/ARM/PIC等单片机系统兼容。 ##### 模块特点如下: 1. 支持采样率(KHz):8/11.025/12/16/22.05/24/32/44.1/48 2. 支持文件格式:MP3 / WAV 3. 支持Micro SD卡、Micro SDHC卡 4. 30 级音量可调 5. UART TTL串口控制播放模式,串口波特率为**9600bps** 6. 供电电源可为3.2 ~ 5.2V ### 模块应用场景 模块支持组合播放功能,所以可以实现报时、报温度,在一定程度上可以替代一些昂贵的 TTS 方案,具体的应用场景如下: 1. 车载导航语音播报 2. 公路运输稽查、收费站语音提示 3. 火车站、汽车站安全检查语音提示 4. 电力、通信、金融营业厅语音提示 5. 车辆进、出通道验证语音提示 6. 公安边防检查通道语音提示 7. 电动观光车安全行驶语音告示 8. 机电设备故障自动报警 9. 消防语音报警提示 10. 娱乐性mp3播放 ### 基本参数 * UART接口,标准串口,TTL电平,波特率可设【默认9600,用户不可更改】 * 输入电压:3.3V-5V * 主芯片型号:YX6300-24SS[SSOP24] ![YX6300芯片](https://img-blog.csdnimg.cn/20210208213240749.png) ### 通讯协议 ![](https://img-blog.csdnimg.cn/20210208213316522.png) ### 手动计算校验位 发送的指令,去掉起始和结束。将中间的 6 个字节进行累加,最后取反再+1 即得到校验码。 ##### 举例说明: 例如播放指定01文件夹001曲目,就需要发送:7E **FF 06 0F 00 01 01** FE EA EF 数据长度为 6 ,这 6 个字节是[**FF 06 0F 00 01 01**] 。 不计算起始、结束、和校验。 校验字节为 FE EA。 ##### 校验码的计算过程: checksum=0xFF+0x06+0x0F+0x00+0x01+0x01=0x0116=0b0000 0001 0001 0110 取反+1 0-checksum = 0b1111 1110 1110 1001 + 1 = 0xFEE9+1 = 0xFEEA **注意**:发送数据包的时候其实是可以省略校验位的。 ### 程序计算校验位 ```C #include "stdafx.h" #define unit8 unsigned char #define unit unsigned int unit8 Send_buf[8] = {}; void DoSum(unit8 *Str, unit8 len) { unit xorsum = 0; unit8 i; for (i = 0; i
> 8); //得到高字节 *(Str + i + 1) = (unit8)(xorsum & 0x00ff); //得到低字节 } void Uart_SendCMD(unit8 CMD, unit8 feedback, unit dat) { Send_buf[0] = 0xff; //保留字节 Send_buf[1] = 0x06; //长度 Send_buf[2] = CMD; //控制指令 Send_buf[3] = feedback; //是否需要反馈 Send_buf[4] = (unit8)(dat >> 8); //datah Send_buf[5] = (unit8)(dat); //datal DoSum(&Send_buf[0], 6); //校验 } int main() { Uart_SendCMD(0x0D, 0x00, 0x0000); printf("Send_buf数组内容:"); printf(" %02X ", 0x7E); for (int i = 0; i < 8; i++) { printf(" %02X ", Send_buf[i]); } printf(" %02X ", 0xEF); printf("\n"); return 0; } ``` ![](https://img-blog.csdnimg.cn/20210208213336855.png) ### 常用指令表 #### 控制指令 | 控制指令 | 对应的功能 | | :---: | --- | | 0x01 | 下一曲 | | 0x02 | 上一曲 | | 0x04 | 音量+ | | 0x05 | 音量- | | 0x06 | 指定音量 | | 0x08 | 单曲循环指定曲目播放 | | 0x0A | 进入睡眠 | | 0x0B | 唤醒睡眠 | | 0x0C | 芯片复位 任何状态有效 | | 0x0D | 播放 | | 0x0E | 暂停 | | 0x0F | 指定文件夹文件名播放 | | 0x16 | 停止 | | 0x17 | 指定文件夹循环播放 | | 0x18 | 指定根目录随机播放 | | 0x19 | 对当前播放的曲目设置为循环播放 | | 0x21 | 组合播放 | | 0x22 | 指定音量同时指定文件播放 | #### 状态查询 | 查询指令 | 对应的功能 参数(16位) | :---: | --- | | 0x3F | 查询在线的设备 详见3.5.1 | | 0x40 | 返回错误,请求重发 | | 0x41 | 应答 | | 0x42 | 查询当前状态 详见3.4.10 | | 0x43 | 查询当前音量 | | 0x44 | 查询当前 EQ 保留 | | 0x47 | 查询 UDISK 文件总数 U 盘内部的总文件数[MP3/WAV 文件] | | 0x48 | 查询 TF 文件总数 TF 卡内部的总文件数[MP3/WAV 文件] | | 0x49 | 查询 FLASH 的总文件数 FLASH 内部总文件数[MP3/WAV 文件] | | 0x4B | 查询 UDISK 的当前曲目 物理顺序 | | 0x4C | 查询 TF 的当前曲目 物理顺序 | | 0x4D | 查询 FLASH 的当前曲目 物理顺序 | | 0x4E | 查询指定文件夹的曲目总数 | | 0x4F | 查询当前设备的总文件夹数 | | 0x47 | 查询 UDISK 文件总数 U 盘内部的总文件数[MP3/WAV 文件] | ### 语音合成方式 * 不同时间播放不同音,间隔一定时间,500ms? * 不断查询状态,没有音播放时,播放下一个音 * 收到播放结束标志时,播放下一个音 * 组合播报功能 使用组合播报功能实现连续播放语音,可以实现报时,报温度,在一定程度上可以替代一些昂贵的TTS方案。 TTS方案我们之前介绍过下面的网文。 [让机器能够说话,语音播报功能的实现](https://mp.weixin.qq.com/s/t1InBKESJKSeun4LCrdV_w) #### 组合播放功能指令 如果发送 7E **FF 15 21 01 02 02 03 01 04 01 05 01 06 01 07 02 08 03 04 03 02** EF 这一帧数据,我们分析一下 CMD= 0x21 --- 组合播报指令码 Len = 0x15 = 21 个字节 ---FF 15 21 **01 02** 02 03 **01 04** 01 05 **01 06** 01 07 **02 08** 03 04 **03 02** [其中一段语音,由两个参数组成,即“文件夹编号”和“文件名编号”] **注意**:观察一下这帧数据,可以发现这帧数据跟介绍的协议不一样,里面没有**命令反馈**和**校验位**。 ### 资源文件命名规则 * TF卡根目录文件夹以两位数字命名,最多支持99个文件夹,命名方式类似"01","11"等等; * 文件夹内的歌曲以"**数字+歌曲名.mp3**"的格式命名,比如音频素材的文件名为:"001 Yesterday Once More","001 零"等等; * 文件夹下曲目的最多255首,即一个字节数字代表的范围0x01~0xFF。 ![](https://img-blog.csdnimg.cn/20210208213358121.png) ### 组合播报功能 许多应用场景需要用到TTS的功能,比如报时、报温度、报金额等应用。 这种需求我们可以使用模块的组合播报功能来模拟TTS,此模块可以指定播报15个语音,按照串口发送的顺序依次播放。 比如: 7E FF 15 21 **01 02** 02 03 **01 04** 01 05 **01 06** 01 07 **02 08** 03 04 **03 02** EF LEN=0x15=21个字节 CMD=0x21 后面的 **01 02 02 03 01 04 01 05 01 06 01 07 02 08 03 04 03 02** 两两组成一个参数,两个数字分别代表"**文件夹编号**"和"**文件名编号**"。 我们TF卡中预置素材内容如下: ![](https://img-blog.csdnimg.cn/20210208213409315.png) 如果我们播放的内容为: “**欢迎光临,现在时间是 21 年 2 月 8 日**”,可以发送如下指令(23字节): 7E FF 15 21 **02 21** 02 16 **02 03** 02 02 **02 10** 02 03 **02 11** 02 09 **02 12** EF ### 其他 还可以设置上一首、下一首、音量加减、随机播放、循环播放等工作模式,这些就由各位根据需要自己开发吧。 ### 欢迎关注 专注于嵌入式知识分享,让你学习路上不迷路,更多技术干货,请关注【嵌入式从0到1】。
原创作品,未经权利人授权禁止转载。详情见
转载须知
。
举报文章
点赞
(
0
)
嵌入式从0到1
关注
评论
(0)
登录后可评论,请
登录
或
注册
相关文章推荐
MK-米客方德推出工业级存储卡
Beetle ESP32 C3 蓝牙数据收发
Beetle ESP32 C3 wifi联网获取实时天气信息
开箱测评Beetle ESP32-C3 (RISC-V芯片)模块
正点原子数控电源DP100测评
DP100试用评测-----开箱+初体验
Beetle ESP32 C3环境搭建
【花雕体验】16 使用Beetle ESP32 C3控制8X32位WS2812硬屏之二
X
你的打赏是对原创作者最大的认可
请选择打赏IC币的数量,一经提交无法退回 !
100IC币
500IC币
1000IC币
自定义
IC币
确定
X
提交成功 ! 谢谢您的支持
返回
我要举报该内容理由
×
广告及垃圾信息
抄袭或未经授权
其它举报理由
请输入您举报的理由(50字以内)
取消
提交