概述
ESP32+MY1680U实现语音播报
文章目录
- ESP32+MY1680U实现语音播报
- 前言
- 一、MY1680U-12P 语音模块
- 1、概述
- 2、参数说明
- 二、代码实现
- 1.MY1690.c
- 2.MY1690.h
- 3.main.c
- 总结
前言
在这一章将实现MY1680U语音模块播放MP3,语音播报存入的语句。
需要用到的资料 提取码:lwm2
一、MY1680U-12P 语音模块
1、概述
MY1680U-12P 是深圳市迈优科技有限公司自主研发的一款小巧的集成MP3模块。采用MY1680U-16S MP3主控芯 片,支持MP3、WAV格式双解码,模拟U盘下载。模块内置FLASH存储芯片,1-16M容量可选;也可外接U盘或USB数据线连接电脑更换FLASH的音频文件。该模块内置3W功放,可以直接驱动3W的喇叭,使用更方便。
产品特性
- 支持 MP3 、WAV 高品质音频格式文件,声音优美。
- 24 位 DAC 输出,动态范围支持 93dB,信噪比支持 85dB。
- 完全支持 FAT16、FAT32 文件系统,最大支持 16M FLASH,32G 的 U 盘。
- 支持 UART 异步串口控制:支持播放、暂停、上下曲、音量加减、选曲播放、插播等。
- ADKEY 功能,通过电阻选择可实现标准 MP3 功能的 5 按键控制和其他功能。
- 内置音量、曲目掉电记忆功能。 支持 USB 连接电脑下载声音。
- 自带 3W 的功放,直接外接喇叭即可完成播放;音量不够客户也可外接功放。
- MY1690-12P 插 SD 卡模块与这款管脚兼容,需要升级大存储空间方便更换
2、参数说明
MY1680U-12P内置标准UART异步串口接口,为3.3V TTL电平接口,波特率9600。可通过MAX3232芯片转换成RS232电平或者通过 USB转TTL模块与PC通讯进行调试。通讯数据格式是:
起始位:1位;数据位:8位;奇偶位:无;停止位:1位。
向语音模块里面传入音频文件可以通过USB连接电脑传输也可以通过USB转TTL模块,使用电脑串口调试助手,传输音频文件
USB转TTL模块与MY1680U-12P的连接图
这里是串口调试助手的下载地址 提取码:lwm2
使用普通安卓手机数据线连接模块,第一次连接会自动安装驱动。安装成功后电脑弹出可移动磁盘,直接将声音命名好然后拖进磁盘内便可
照歌曲命名规则
- 存根目录时按以下方式命名,四位数字开头命名,后面可以带中文也可以不带。
- 建文件夹时按以下方式命名,文件夹以两位数字开头命名,文件夹内歌曲以三位数字命名后面可以带中文也可以不带。
朗读女 提取码:lwm2
这个软件可以把你输入的文本合成语音生成音频文件
二、代码实现
1.MY1690.c
代码如下:
#include "MY1690.h"
VOICE_DEV voice1={.frame_head = 0x7E,.frame_end = 0xEF};
//0 1 2 3 4 5 6 7 8 9 10 100 1000 10000
u8 Voice_Table[] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21};
//MY1690通信接口初始化
void MY1690_UARTConfig(u32 brr)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
//开时钟
RCC_APB2PeriphClockCmd(MY1690_TX_CLK | MY1690_RX_CLK, ENABLE);
MY1690_UART_CLKCMD(MY1690_UART_CLK, ENABLE);
//结构体赋值
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Pin = MY1690_TX_PIN;
GPIO_Init(MY1690_TX_PORT, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Pin = MY1690_RX_PIN;
GPIO_Init(MY1690_RX_PORT, &GPIO_InitStructure);
//初始化USART 波特率brr 打开发送和接收器 无奇偶校验 一个停止位 8个数据位
USART_InitStructure.USART_BaudRate = brr;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_Init(MY1690_USART, &USART_InitStructure);
USART_Cmd(MY1690_USART,ENABLE);//使能USART
}
//MY1690发送数据函数
void MY1690_SendString(u8 *str,u8 lenth)
{
for(u8 i=0; i<lenth; i++)
{
while(USART_GetFlagStatus(MY1690_USART,USART_FLAG_TC) == RESET);
USART_SendData(MY1690_USART, str[i]);
}
}
/********************************************************
函数名称:MY1690_Init
函数功能:MY1690初始化
函数传参:无
函数返回值:无
*******************************************************/
void MY1690_Init(void)
{
//BUSY管脚初始化
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(MY1690_BUSY_CLK, ENABLE);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Pin = MY1690_BUSY_PIN;
GPIO_Init(MY1690_BUSY_PORT, &GPIO_InitStructure);
//USART初始化
MY1690_UARTConfig(9600);
Voice_SendCmd(0x38,0x01,0x00,1);
}
/********************************************************
*函数名称:Voice_XorCheck
*函数功能:^检测
*函数传参:
* *pdata -- 校准参数
* lenth -- 参数的个数
*函数返回值:^后的数
********************************************************/
u8 Voice_XorCheck(u8 *pdata,u8 lenth)
{
u8 r_value = *pdata;
u8 i = 0;
for(i=1;i<lenth;i++)
{
r_value ^= pdata[i];
}
return r_value;
}
/**********************************************************
*函数名称:Voice_SendCmd
*函数功能:发送命令
*函数传参:
* cmd -- 命令
* arg1 -- 第一个参数
* arg2 -- 第二个参数
* arg_lenth -- 参数个数
*函数返回值:无
**********************************************************/
void Voice_SendCmd(u8 cmd,u8 arg1,u8 arg2,u8 arg_lenth)
{
//给voice1传递参数
//命令填充
voice1.cmd = cmd;
//参数填充
voice1.arg[0] = arg1;
voice1.arg[1] = arg2;
voice1.arg[2] = arg_lenth;
//长度填充
voice1.lenth = 3+arg_lenth;//长度 + cmd + xor + 参数长度
voice1.xorcheck = Voice_XorCheck(&voice1.lenth,2+arg_lenth);//lenth+cmd + 参数
//发送
MY1690_SendString(&voice1.frame_head,3);//帧起始+长度+命令
MY1690_SendString(voice1.arg,arg_lenth);//发送参数
MY1690_SendString(&voice1.xorcheck,2);//异或值+帧尾
}
//播放指定目录文件下的音乐
//directorynum:目录编号
//musicnum:音乐编号
void Voice_PlayDirectoryMusic(u8 directorynum, u8 musicnum)
{
while(VoicePlay_Busy);
Voice_SendCmd(CMD_CHOOSE_MUSIC,directorynum,musicnum,2);
}
2.MY1690.h
代码如下:
#ifndef _MY1690_H_
#define _MY1690_H_
#include "stm32f10x.h"
#include "stdio.h"
/*********************MY1690底层接口宏定义************************************/
#define MY1690_USART USART2
#define MY1690_UART_CLKCMD RCC_APB1PeriphClockCmd
#define MY1690_UART_CLK RCC_APB1Periph_USART2
#define MY1690_TX_CLK RCC_APB2Periph_GPIOA
#define MY1690_TX_PORT GPIOA
#define MY1690_TX_PIN GPIO_Pin_2
#define MY1690_RX_CLK RCC_APB2Periph_GPIOA
#define MY1690_RX_PORT GPIOA
#define MY1690_RX_PIN GPIO_Pin_3
#define MY1690_BUSY_CLK RCC_APB2Periph_GPIOB
#define MY1690_BUSY_PORT GPIOB
#define MY1690_BUSY_PIN GPIO_Pin_6
/**********************MY1690命令宏定义*******************************/
#define CMD_PLAY 0x11 //播放
#define CMD_STOP 0x12 //暂停
#define CMD_NEXT 0x13 //下一曲
#define CMD_PREV 0x14 //上一曲
#define CMD_VOICEADD 0x15 //音量加
#define CMD_VOICESUB 0x16 //音量减
#define CMD_RESET 0x19 //复位
#define CMD_SPEED 0x1A //快进
#define CMD_SLOW 0x1B //快退
#define CMD_STARTorSTOP 0x1C //播放/暂停
#define CMD_END 0x1E //停止
#define CMD_ROOTCHO_MUSIC 0x41 //根目录选择歌曲
#define CMD_CHOOSE_MUSIC 0x42 //任意目录选择歌曲
//数据帧结构体
typedef struct
{
u8 frame_head;//帧头
u8 lenth; //数据长度
u8 cmd; //命令
u8 arg[3]; //参数个数0 1 2 arg[2] -- 参数的个数 arg[0] -- 第一个参数 arg[1] -- 第二个参数
u8 xorcheck; //校验码
u8 frame_end; //帧尾
}VOICE_DEV;
//忙状态检测
#define VoicePlay_Busy GPIO_ReadInputDataBit(MY1690_BUSY_PORT, MY1690_BUSY_PIN)
/************************语音播报表下标宏定义************************/
#define POS_SHI 10
#define POS_HUNDRED 11 //百
#define POS_THOUSAND 12 //千
#define POS_WAN 13 //万
#define POS_START 14 //开始测量
#define POS_RESULT 15 //酒精浓度
#define POS_OK 16 //测量完成
#define POS_ERR 17 //测量未完成
#define POS_NODRINK 18 //没有喝酒
#define POS_DRINK 19 //酒驾
#define POS_WELCOME 20 //欢迎
extern u8 Voice_Table[];
void MY1690_UARTConfig(u32 brr);
void MY1690_Init(void);
void MY1690_SendString(u8 *str,u8 lenth);
u8 Voice_XorCheck(u8 *pdata,u8 lenth);
void Voice_SendCmd(u8 cmd,u8 arg1,u8 arg2,u8 arg_lenth);
void Voice_PlayDirectoryMusic(u8 directorynum, u8 musicnum);
void Voice_PlayNumber(u16 number);
#endif
3.main.c
#include "main.h"
#include "delay.h"
#include "led.h"
#include "key.h"
#include "beep.h"
#include "lcd.h"
#include "rose.h"
#include "leaf.h"
#include "bridge.h"
#include "MY1690.h"
int main(void)
{
JTAG_SWD_Config();
SysTick_Init(72000);//系统定时器初始化 1ms
Led_Config();//led初始化
Beep_Config();
Key_Config();
LCD_Init();
MY1690_Init();
Voice_PlayDirectoryMusic(03,010);//播放歌曲
while(1)
{
}
}
用到的音频文件 提取码:lwm2
总结
MY1680U语音模块播放歌曲差不多哦就这么多内容。
最后
以上就是默默刺猬为你收集整理的ESP32+TFTLCD实现WiFi天气语音播报(六)ESP32+MY1680U实现语音播报前言一、MY1680U-12P 语音模块二、代码实现总结的全部内容,希望文章能够帮你解决ESP32+TFTLCD实现WiFi天气语音播报(六)ESP32+MY1680U实现语音播报前言一、MY1680U-12P 语音模块二、代码实现总结所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复