0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

雷龙LSYT201B语言模块结合STM32使用(噪声环境也能高精度)

jim ? 来源:雷龙发展 ? 作者:雷龙发展 ? 2024-09-10 17:04 ? 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

雷龙LSYT201B语音模块配合STM32使用视频示例:https://www.bilibili.com/video/BV1SZ421M7oE?t=2.9

前言

基于YT2228芯片开发的一款面向智能家居控制的离线语音控制模组,离线语音模块,集成蓝牙功能,可适配各种不同的应用场景,方便使用,减少开发周期。模块通过麦克风对语音进行采集,然后由语音芯片进行识别处理,识别成功的结果可通过语音进行播报和通过串口下发指令给整机控制板。

一、LSYT201B

一、产品简介

YT2228 是根据智能语音交互市场需求及思必驰算法的发展方向定义开发的 “芯片+算法”人工智能人机语音交互解决方案,具有高性能、低功耗等特点。

该芯片通过软硬融合的方法,具备快速赋予各类设备语音交互的能力,极大的提高了用户体验和产品灵活性。该芯片支持家居5m交互,本地最多可识别150词,具备多轮交互能力。

二、产品特征

2.1 处理器

? 32位处理器,支持FPU(Hardware Float Point Unit)

? 运行频率:240MHz

? 内置 2MB FLASH

? 64中断向量

? 4级别中断优先级

2.2 外设

? USB1.1

? 4个多功能16位定时器,支持捕获和PWM模式

? 3个16位PWM发生器,可用于驱动电机

? 2个SPI

? 所有GPIO支持外部中断

2.3 音频

? 两通道 16 位 DAC,SNR> = 95dB

? 单通道 16 位 ADC,SNR> = 90dB

? 采样率支持 8KHz / 11.025KHz / 16KHz / 22.05KHz / 24KHz

/32KHz / 44.1KHz / 48KHz

2.4 蓝牙

? 符合蓝牙 V5.1 + BR + EDR + BLE 规范

? 满足 Class1 class2 和 class3 传输功耗需求

? 支持 GFSK 和 π/ 4 DQPSK 所有包装类型

? 最大+ 6dbm 发射功率

? 接收器最小灵敏度

2.5 电源

? VBAT供电DC: 3.0V - 5.5V

? VDDIO可输出50mA@2.2-3.6V

? 模组功耗:50mA

2.6 封装

? VSSOP28(0.635)/QSOP28

2.7 温度

? 工作温度:-40℃ to +85℃

? 存储温度:-65℃ to +150℃

2.8 应用领域

? 智能家电(生活电器、厨房家电等)

? 智能卫浴、智能照明、智能家居

? 智能玩具

? 空调伴侣

二、使用步骤

现在也已经大致了解了这个模块的功能,那么能不能结合单片机来使用呢。

1.UART 控制协议

先来看一下他的通信协议

采用标准 UART 异步串口接口, 3.3V TTL 电平。通讯格式

波特率9600、数据位8 位、停止位1 位、奇偶校验位无、流控无。

wKgZombgC7KAZwKdAABX02j1KsU015.pngwKgaombgC7SAbiHHAAFt00Hq9Qw683.png

有了这些东西去对他进行开发还不是轻轻松松,关键效果怎么样呢(太强了,从视频里就能看出)

2.代码

废话不多说直接贴代码。由于STM32接收的是ASII码,我们先将他转十六进制字符串,然后用strcmp来对字符串作比较。

代码如下:

#include "sys.h"

#include "usart.h"

#include "led.h"

#include "string.h"

//

//如果使用ucos,则包括下面的头文件即可.

#if SYSTEM_SUPPORT_OS

#include "includes.h" //ucos 使用

#endif

#if 1

#pragma import(__use_no_semihosting)

//标准库需要的支持函数

struct __FILE

{

int handle;

};

FILE __stdout;

//定义_sys_exit()以避免使用半主机模式

_sys_exit(int x)

{

x = x;

}

//重定义fputc函数

int fputc(int ch, FILE *f)

{

while((USART2->SR&0X40)==0);//循环发送,直到发送完毕

USART2->DR = (u8) ch;

return ch;

}

#endif

/*使用microLib的方法*/

/*

int fputc(int ch, FILE *f)

{

USART_SendData(USART1, (uint8_t) ch);

while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET) {}

return ch;

}

int GetKey (void) {

while (!(USART1->SR & USART_FLAG_RXNE));

return ((int)(USART1->DR & 0x1FF));

}

*/

#if EN_USART1_RX //如果使能了接收

//串口1中断服务程序

//注意,读取USARTx->SR能避免莫名其妙的错误

u8 USART_RX_BUF[USART_REC_LEN]; //接收缓冲,最大USART_REC_LEN个字节.

//接收状态

//bit15, 接收完成标志

//bit14, 接收到0x0d

//bit13~0, 接收到的有效字节数目

u16 USART_RX_STA=0; //接收状态标记

u8 USART2_RX_BUF[USART_REC_LEN]; //接收缓冲,最大USART_REC_LEN个字节.

//接收状态

//bit15, 接收完成标志

//bit14, 接收到0x0d

//bit13~0, 接收到的有效字节数目

u16 USART2_RX_STA=0; //接收状态标记

void uart_init(u32 bound){

//GPIO端口设置

GPIO_InitTypeDef GPIO_InitStructure;

USART_InitTypeDef USART_InitStructure;

NVIC_InitTypeDef NVIC_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE); //使能USART1,GPIOA时钟

//USART1_TX GPIOA.9

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出

GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.9

//USART1_RX GPIOA.10初始化

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入

GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.10

//Usart1 NVIC 配置

NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //子优先级3

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能

NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器

//USART 初始化设置

USART_InitStructure.USART_BaudRate = bound;//串口波特率

USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式

USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位

USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位

USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制

USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //收发模式

USART_Init(USART1, &USART_InitStructure); //初始化串口1

USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启串口接受中断

USART_Cmd(USART1, ENABLE); //使能串口1

}

void uart2_init(u32 bound){

//GPIO端口设置

//GPIO端口设置

GPIO_InitTypeDef GPIO_InitStructure;

USART_InitTypeDef USART_InitStructure;

NVIC_InitTypeDef NVIC_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能GPIOA时钟

RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE); //使能USART2

//USART2_TX GPIOA.2

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //PA.2

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出

GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.2

//USART1_RX GPIOA.3初始化

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;//PA3

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入

GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.3

//Usart2 NVIC 配置

NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; //子优先级3

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能

NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器

//USART 初始化设置

USART_InitStructure.USART_BaudRate = bound;//串口波特率

USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式

USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位

USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位

USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制

USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //收发模式

USART_Init(USART2, &USART_InitStructure); //初始化串口2

USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);//开启串口接受和发送中断

USART_Cmd(USART2, ENABLE);

}

void USART2_IRQHandler(void) //??2??????

{

u8 Res,t;

/

if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET) //接收中断(接收到的数据必须是0x0d 0x0a结尾)

{

Res =USART_ReceiveData(USART2); //读取接收到的数据

if((USART2_RX_STA&0x8000)==0)//接收未完成

{

if(USART2_RX_STA&0x4000)//接收到了0x0d

{

if(Res!=0x0a)USART2_RX_STA=0;//接收错误,重新开始

else USART2_RX_STA|=0x8000; //接收完成了

}

else //还没收到0X0D

{

if(Res==0x0d)USART2_RX_STA|=0x4000;

else

{

USART2_RX_BUF[USART2_RX_STA&0X3FFF]=Res ;

USART2_RX_STA++;

if(USART2_RX_STA>(USART2_REC_LEN-1))USART2_RX_STA=0;//接收数据错误,重新开始接收

}

}

}

}

}

void USART1_IRQHandler(void) //串口1中断服务程序

{

u8 Res;

char result[100];

char hex_string[30];

#if SYSTEM_SUPPORT_OS //如果SYSTEM_SUPPORT_OS为真,则需要支持OS.

OSIntEnter();

#endif

if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //接收中断(接收到的数据必须是0x0d 0x0a结尾)

{

Res =USART_ReceiveData(USART1); //读取接收到的数据

sprintf(hex_string,"%02X", Res);

//printf("%srn",hex_string);

sscanf(hex_string + 5, "%s", hex_string);

if(!strcmp(hex_string,"03"))

{

GPIO_ResetBits(GPIOB,GPIO_Pin_5);

GPIO_ResetBits(GPIOE,GPIO_Pin_5);

}

if(!strcmp(hex_string,"04"))

{

GPIO_SetBits(GPIOB,GPIO_Pin_5);

GPIO_SetBits(GPIOE,GPIO_Pin_5);

}

if((USART_RX_STA&0x8000)==0)//接收未完成

{

if(USART_RX_STA&0x4000)//接收到了0x0d

{

if(Res!=0x0a)USART_RX_STA=0;//接收错误,重新开始

else USART_RX_STA|=0x8000; //接收完成了

}

else //还没收到0X0D

{

if(Res==0x0d)USART_RX_STA|=0x4000;

else

{

USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;

USART_RX_STA++;

if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收数据错误,重新开始接收

}

}

}

}

#if SYSTEM_SUPPORT_OS //如果SYSTEM_SUPPORT_OS为真,则需要支持OS.

OSIntExit();

#endif

}

#endif

总结

兄弟们,太强了,25块钱能够抗噪声的语音识别播报一体模块,还要什么自行车。就是唤醒词不能自己定制,需要联系技术人员帮你定制。(可以远程)

————————————————

雷龙发展公司致力于为客户提供一站式的离线语音解决方案。我们的服务涵盖了多个领域,包括家电、医疗器械、安防报警、汽车电子、多媒体、通信、电话录音、工业自动化控制、玩具及互动消费类产品等。通过我们的专业知识和经验,我们能够满足各类产品的语音交互需求,让用户享受更加智能、便捷的使用体验。

审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • STM32
    +关注

    关注

    2296

    文章

    11038

    浏览量

    366699
  • 智能家居
    +关注

    关注

    1934

    文章

    9837

    浏览量

    191226
  • 人机语音
    +关注

    关注

    0

    文章

    3

    浏览量

    7219
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    ?LM4140高精度噪声低压差电压参考芯片技术文档总结

    LM4140 系列精密基准电压源旨在结合高精度、低 漂移和噪声,在小封装中具有低功耗。 LM4140 是业界首款输出电压选项低于 带隙电压。 LM4140 性能提升的关键是使用 EEPROM 寄存器和 CMOS 用于
    的头像 发表于 08-15 10:25 ?170次阅读
    ?LM4140<b class='flag-5'>高精度</b>低<b class='flag-5'>噪声</b>低压差电压参考芯片技术文档总结

    大容量高精度电子工牌智慧工厂之应用

    、环”全要素的实时数字化管控。一、核心功能与优势功能模块技术参数应用场景室内外高精度定位:室内环境基于UWB技术,定位精度达5cm,抗工业干扰能力强,人员实时轨迹追踪、电子围栏越界报警
    的头像 发表于 08-14 12:19 ?62次阅读
    大容量<b class='flag-5'>高精度</b>电子工牌智慧工厂之应用

    REF54EVM高精度电压参考评估模块技术解析

    Texas Instruments REF54EVM评估模块演示REF54高精度参考器件的性能。REF54系列在 260 μA 电流下提供 0.5ppm/ °C低温漂移系数和 ± 0.02%高精度
    的头像 发表于 08-07 14:51 ?203次阅读
    REF54EVM<b class='flag-5'>高精度</b>电压参考评估<b class='flag-5'>模块</b>技术解析

    单天线高精度导航?组合导航如何做到低成本与高性能兼得?

    在无人机、自动驾驶和航空导航领域,高精度组合导航系统是核心需求,但传统双天线方案的高成本和复杂结构让许多用户望而却步。ER-GNSS/MINS-07?应运而生,它采用单天线全系统双频GNSS模块
    的头像 发表于 07-24 15:06 ?170次阅读
    单天线<b class='flag-5'>也</b><b class='flag-5'>能</b><b class='flag-5'>高精度</b>导航?组合导航如何做到低成本与高性能兼得?

    芯资讯|唯创电子WTU201F2 B004 红外接近模块:开启卫生间冲水箱智能洁净新时代

    在现代卫生间设施的智能化浪潮中,广州唯创电子推出的WTU201F2B004红外接近感应模块,正以其卓越性能重新定义冲水箱的运作方式。这款集高精度检测、超低功耗与智能调距于一体的核心组件,为智能卫浴
    的头像 发表于 06-09 08:43 ?227次阅读
    芯资讯|唯创电子WTU<b class='flag-5'>201</b>F2 <b class='flag-5'>B</b>004 红外接近<b class='flag-5'>模块</b>:开启卫生间冲水箱智能洁净新时代

    高精度组合导航系统:技术与应用的革新者

    组合导航系统集成了MEMS?惯性导航与多频点双天线?GNSS?,凭借其高精度、高可靠性和强适应性,成为航空、陆地及航海复杂场景下的理想选择。ER-GNSS/MINS-03结合智能算法,提供连续、稳定的定位、姿态和速度信息,在卫
    的头像 发表于 05-09 16:13 ?269次阅读

    云翎智能单北斗可定制RTK高精度记录仪如何赋铁路巡检安全

    执法记录仪技术革新:破解复杂环境定位难题厘米级高精度定位:依托北斗三号全球卫星导航系统,结合RTK技术,实现水平定位精度±1cm,高程精度±
    的头像 发表于 04-16 14:06 ?431次阅读
    云翎智能单北斗可定制RTK<b class='flag-5'>高精度</b>记录仪如何赋<b class='flag-5'>能</b>铁路巡检安全

    高精度交流充电桩负载方案

    的电能计量精度,同时满足复杂工况模拟与效分析需求。本文从核心技术维度解析新一代高精度测试方案的设计要点。 一、多模态电能重构技术 系统采用模块化功率单元堆叠架构,每个7kW单元内置碳
    发表于 04-15 11:07

    高精度模拟量采集模块

    高精度模拟量采集模块是工业自动化和信息采集领域中的关键组件,其作用至关重要且功能多样。 模拟量信号通常来源于各种传感器和执行器,如温度传感器的电压输出、压力传感器的电流输出等。高精度模拟量采集
    的头像 发表于 02-08 15:31 ?490次阅读

    雷龙SD NAND测试报告

    本帖最后由 xxkj2010 于 2025-2-8 14:23 编辑 雷龙SD NAND测试报告一次偶然的机会,很幸运得到深圳市雷龙发展有限公司的芯片赠送,今天收到了芯片和测试板。雷龙
    发表于 02-08 14:12

    物联网系统中高精度RTK定位方案的实现_高精度定位模块

    物联网系统中为什么要使用高精度定位模块 物联网系统中使用高精度定位模块的原因主要体现在以下几个方面: 提高定位精度 厘米级
    的头像 发表于 09-26 17:53 ?3298次阅读
    物联网系统中<b class='flag-5'>高精度</b>RTK定位方案的实现_<b class='flag-5'>高精度</b>定位<b class='flag-5'>模块</b>

    北斗高精度智能安全帽|厘米级高精度定位|云端一体化|智能全能

    关于安全,深圳鼎信小编有话说! 传统安全帽通常只提供基本的防护作用,如防止物体打击、减轻环境噪声等。它们通常不具备定位、监测和智能化管理等功能。因此,在某些高精度、高安全性的作业环境中,传统安全帽
    的头像 发表于 09-24 11:31 ?759次阅读

    语音模块——LSYT201B模组(超详细)

    /1Ck7KPaw-wXAdCluQfvTu4A   提取码:1022   总结:本节我们对深圳雷龙语音模块——LSYT201B模组进行了详细的介绍,并且利用模块完成了相关的实验测试,
    发表于 09-20 18:37

    18V_3ppm-8ppm低噪声低漂移高精度基准电压源高输出电流±10mA

    漂(3ppm/℃) 和高精度 (0.05%)。这些特性与极低噪声结合,使 PC40XX 系列成为高精度数据采集系统的理想选择。每种基准电压都有高等级和标准等级之分,提供SOP8L
    发表于 09-06 15:24

    AT372-6P单频高精度定位模块datasheet

    单频RTK模块是一种基于全球卫星导航系统(GNSS)的高精度定位技术模块,主要运用单频接收器接收卫星信号,并结合基准站数据进行差分计算,以实现高精度
    的头像 发表于 08-25 15:04 ?784次阅读
    AT372-6P单频<b class='flag-5'>高精度</b>定位<b class='flag-5'>模块</b>datasheet