

本文素材包括本視頻演示所用到的所有素材,包括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
還可以設置上一首、下一首、音量加減、隨機播放、循環播放等工作模式,這些就由各位根據需要自己開發吧。
一個專注于嵌入式知識分享,學習路上不迷路的公眾號,歡迎關注。
想加技術交流群的,可以加我微信:chengxuyuanxiaoha,讓我拉你進群。
