为了听歌,我自己动手做了一个mp3播放器

小麦大叔 2021-04-27 00:00
实现目标
  • 实现播放指定歌曲文件
  • 利用组合播报功能,实现当前系统时间的播报

所需工具及环境

  • 所用模块

  • Keil 5
  • STM32F103RET6核心板(本平台自制专用核心板)

本文素材

视频中 获取素材获取途径。

本文素材包括本视频演示所用到的所有素材,包括STM32代码、Qt工程代码、mp3模块资料。

以后演示及教学视频都发布在视频号中,欢迎大家关注我的视频号嵌入式从0到1】。

原创不易,赏我一个小心心

模块简介

该模块是一个基于高音质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芯片

通讯协议

手动计算校验位

发送的指令,去掉起始和结束。将中间的 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(0x0D0x000x0000);

 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 文件]

语音合成方式

  • 不同时间播放不同音,间隔一定时间,500ms?
  • 不断查询状态,没有音播放时,播放下一个音
  • 收到播放结束标志时,播放下一个音
  • 组合播报功能,使用组合播报功能实现连续播放语音,可以实现报时,报温度,在一定程度上可以替代一些昂贵的TTS方案。

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[其中一段语音,由两个参数组成,即“文件夹编号”和“文件名编号”]

注意:观察一下这帧数据,可以发现这帧数据跟介绍的协议不一样,里面没有命令反馈校验位

资源文件命名规则

  • TF卡根目录文件夹以两位数字命名,最多支持99个文件夹,命名方式类似"01","11"等等;
  • 文件夹内的歌曲以" 数字+歌曲名.mp3"的格式命名,比如音频素材的文件名为:"001 Yesterday Once More","001 零"等等;
  • 文件夹下曲目的最多255首,即一个字节数字代表的范围0x01~0xFF。

组合播报功能

许多应用场景需要用到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

其他

还可以设置上一首、下一首、音量加减、随机播放、循环播放等工作模式,这些就由各位根据需要自己开发吧。

—— The End —

推荐好文   点击蓝色字体即可跳转
 字符串匹配算法详解
 这个项目差点就烂尾了...
 前几天哪位老哥让我推荐C语言书籍来着?
 被坑10万!竞业协议到底有多少坑?
 写了这么多年代码,开源协议你确定自己真的知道吗?

原创不易,欢迎转发、留言、点赞、分享给你的朋友,感谢您的支持!


长按识别二维码关注获取更多内容


让我知道你在看


小麦大叔 一位热衷技术的攻城狮,懂点技术,会讲故事,交个朋友?
评论
  • 作为优秀工程师的你,已身经百战、阅板无数!请先醒醒,新的项目来了,这是一个既要、又要、还要的产品需求,ARM核心板中一个处理器怎么能实现这么丰富的外围接口?踌躇之际,你偶阅此文。于是,“潘多拉”的魔盒打开了!没错,USB资源就是你打开新世界得钥匙,它能做哪些扩展呢?1.1  USB扩网口通用ARM处理器大多带两路网口,如果项目中有多路网路接口的需求,一般会选择在主板外部加交换机/路由器。当然,出于成本考虑,也可以将Switch芯片集成到ARM核心板或底板上,如KSZ9897、
    万象奥科 2024-12-03 10:24 78浏览
  • TOF多区传感器: ND06   ND06是一款微型多区高集成度ToF测距传感器,其支持24个区域(6 x 4)同步测距,测距范围远达5m,具有测距范围广、精度高、测距稳定等特点。适用于投影仪的无感自动对焦和梯形校正、AIoT、手势识别、智能面板和智能灯具等多种场景。                 如果用ND06进行手势识别,只需要经过三个步骤: 第一步&
    esad0 2024-12-04 11:20 68浏览
  • 光伏逆变器是一种高效的能量转换设备,它能够将光伏太阳能板(PV)产生的不稳定的直流电压转换成与市电频率同步的交流电。这种转换后的电能不仅可以回馈至商用输电网络,还能供独立电网系统使用。光伏逆变器在商业光伏储能电站和家庭独立储能系统等应用领域中得到了广泛的应用。光耦合器,以其高速信号传输、出色的共模抑制比以及单向信号传输和光电隔离的特性,在光伏逆变器中扮演着至关重要的角色。它确保了系统的安全隔离、干扰的有效隔离以及通信信号的精准传输。光耦合器的使用不仅提高了系统的稳定性和安全性,而且由于其低功耗的
    晶台光耦 2024-12-02 10:40 130浏览
  • 当前,智能汽车产业迎来重大变局,随着人工智能、5G、大数据等新一代信息技术的迅猛发展,智能网联汽车正呈现强劲发展势头。11月26日,在2024紫光展锐全球合作伙伴大会汽车电子生态论坛上,紫光展锐与上汽海外出行联合发布搭载紫光展锐A7870的上汽海外MG量产车型,并发布A7710系列UWB数字钥匙解决方案平台,可应用于数字钥匙、活体检测、脚踢雷达、自动泊车等多种智能汽车场景。 联合发布量产车型,推动汽车智能化出海紫光展锐与上汽海外出行达成战略合作,联合发布搭载紫光展锐A7870的量产车型
    紫光展锐 2024-12-03 11:38 112浏览
  • 最近几年,新能源汽车愈发受到消费者的青睐,其销量也是一路走高。据中汽协公布的数据显示,2024年10月,新能源汽车产销分别完成146.3万辆和143万辆,同比分别增长48%和49.6%。而结合各家新能源车企所公布的销量数据来看,比亚迪再度夺得了销冠宝座,其10月新能源汽车销量达到了502657辆,同比增长66.53%。众所周知,比亚迪是新能源汽车领域的重要参与者,其一举一动向来为外界所关注。日前,比亚迪汽车旗下品牌方程豹汽车推出了新车方程豹豹8,该款车型一上市就迅速吸引了消费者的目光,成为SUV
    刘旷 2024-12-02 09:32 123浏览
  • 概述 说明(三)探讨的是比较器一般带有滞回(Hysteresis)功能,为了解决输入信号转换速率不够的问题。前文还提到,即便使能滞回(Hysteresis)功能,还是无法解决SiPM读出测试系统需要解决的问题。本文在说明(三)的基础上,继续探讨为SiPM读出测试系统寻求合适的模拟脉冲检出方案。前四代SiPM使用的高速比较器指标缺陷 由于前端模拟信号属于典型的指数脉冲,所以下降沿转换速率(Slew Rate)过慢,导致比较器检出出现不必要的问题。尽管比较器可以使能滞回(Hysteresis)模块功
    coyoo 2024-12-03 12:20 131浏览
  • 遇到部分串口工具不支持1500000波特率,这时候就需要进行修改,本文以触觉智能RK3562开发板修改系统波特率为115200为例,介绍瑞芯微方案主板Linux修改系统串口波特率教程。温馨提示:瑞芯微方案主板/开发板串口波特率只支持115200或1500000。修改Loader打印波特率查看对应芯片的MINIALL.ini确定要修改的bin文件#查看对应芯片的MINIALL.ini cat rkbin/RKBOOT/RK3562MINIALL.ini修改uart baudrate参数修改以下目
    Industio_触觉智能 2024-12-03 11:28 95浏览
  • RDDI-DAP错误通常与调试接口相关,特别是在使用CMSIS-DAP协议进行嵌入式系统开发时。以下是一些可能的原因和解决方法: 1. 硬件连接问题:     检查调试器(如ST-Link)与目标板之间的连接是否牢固。     确保所有必要的引脚都已正确连接,没有松动或短路。 2. 电源问题:     确保目标板和调试器都有足够的电源供应。     检查电源电压是否符合目标板的规格要求。 3. 固件问题: &n
    丙丁先生 2024-12-01 17:37 102浏览
  •         温度传感器的精度受哪些因素影响,要先看所用的温度传感器输出哪种信号,不同信号输出的温度传感器影响精度的因素也不同。        现在常用的温度传感器输出信号有以下几种:电阻信号、电流信号、电压信号、数字信号等。以输出电阻信号的温度传感器为例,还细分为正温度系数温度传感器和负温度系数温度传感器,常用的铂电阻PT100/1000温度传感器就是正温度系数,就是说随着温度的升高,输出的电阻值会增大。对于输出
    锦正茂科技 2024-12-03 11:50 123浏览
  • 11-29学习笔记11-29学习笔记习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习笔记&记录学习习笔记&记学习学习笔记&记录学习学习笔记&记录学习习笔记&记录学习学习笔记&记录学习学习笔记记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&学习学习笔记&记录学习学习笔记&记录学习学习笔记&记
    youyeye 2024-12-02 23:58 81浏览
我要评论
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦