本文素材包括本视频演示所用到的所有素材,包括STM32代码、Qt工程代码、mp3模块资料。
以后演示及教学视频都发布在视频号中,欢迎大家关注我的视频号【嵌入式从0到1】。
原创不易,赏我一个小心心吧。
该模块是一个基于高音质MP3音乐芯片的MP3音乐播放器模块。支持采样率是8KHz ~ 48KHz的MP3、WAV格式文件。
板载Micro SD(TF:Trans-flash Card)卡座,可插上存了音乐文件的Micro SD卡。
单片机可以通过串口发送命令进行切换音乐、调节音量、播放模式等操作。
用户也可以通过USB转串口模块对该模块进行调试。模块与UNO/AVR/ARM/PIC等单片机系统兼容。
模块支持组合播放功能,所以可以实现报时、报温度,在一定程度上可以替代一些昂贵的 TTS 方案,具体的应用场景如下:
发送的指令,去掉起始和结束。将中间的 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
注意:发送数据包的时候其实是可以省略校验位的。
#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<len; i++)
{
xorsum = xorsum + Str[i];
}
xorsum = 0 - xorsum;
*(Str + i) = (unit8)(xorsum >> 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;
}
控制指令 | 对应的功能 |
---|---|
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 文件] |
TTS方案我们之前介绍过下面的网文:
让机器能够说话,语音播报功能的实现
如果发送 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[其中一段语音,由两个参数组成,即“文件夹编号”和“文件名编号”]
注意:观察一下这帧数据,可以发现这帧数据跟介绍的协议不一样,里面没有命令反馈和校验位。
许多应用场景需要用到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卡中预置素材内容如下:
如果我们播放的内容为:“欢迎光临,现在时间是 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
还可以设置上一首、下一首、音量加减、随机播放、循环播放等工作模式,这些就由各位根据需要自己开发吧。
原创不易,欢迎转发、留言、点赞、分享给你的朋友,感谢您的支持!
长按识别二维码关注获取更多内容
让我知道你在看