当前位置:首页 > > TopSemic嵌入式
[导读]成就一番伟业的唯一途径就是热爱自己的事业。如果你还没能找到让自己热爱的事业,继续寻找,不要放弃。跟随自己的心,总有一天你会找到的。——乔布斯  你去关灯,你去,你去,。。我去。。小伙伴们有没有在天气寒冷时候,想去关灯,却离不开心爱的被窝的经历呢,有的话,跟着小飞哥一起来DIY一个...


成就一番伟业的唯一途径就是热爱自己的事业。如果你还没能找到让自己热爱的事业,继续寻找,不要放弃。跟随自己的 心,总有一天你会找到的。——乔布斯

  

你去关灯,你去,你去,。。我去。。小伙伴们有没有在天气寒冷时候,想去关灯,却离不开心爱的被窝的经历呢,有的话,跟着小飞哥一起来DIY一个离线语音控制器,有了它,我们就可以安稳的卧在暖和的被窝了,来,干!


        先看看演示视频:


完成目标

  • HAL库串口使用
  • 常用串口接收及数据协议解析
  • 接收离线语音控制模块数据、解析,实现相应的控制

硬件环境

  • STM32F407ZGT6(或其他主控板)
  • 海凌科HLK-V20离线语音控制模块
海凌科HLK-V20离线语音控制模块
  • 电容式驻极体话筒(咪头)
  • 杜邦线,LED灯,实验用到3个LED灯,面包板(非必备)

软件环境

  • keil5
  • cubemx

1 离线语音模块控制器

1.1 模块简介

  在某宝购买的,只需要9.9元,语音识别固定,支持57条语音,基本的是够用了,基本的风扇控制、灯控制、电饭煲控制、温度控制等都具备,基本上比较全面。

1.2 模块特性

处理内核:

  • 32bit RISC 内核, 运行频率 240M
  • 支持 DSP 指令集以及 FPU 浮点运算单元
  • FFT 加速器:最大支持 1024 点复数 FFT/IFFT 运算或者是2048 点的实数 FFT/IFFT 运算
  • 定制化语音算法算子

存储:

  • 内置高速 SRAM
  • 内置 2MB FLASH

音频输入输出:

  • 支持 1 路模拟 Mic 输入
  • 支持双声道 DAC 输出
  • 持 I2S input/output

供电和时钟:

  • 内置 5V 转 3.3V, 3.3V 转 1.2V LDO 为芯片供电
  • RC 12MHz 时钟源和 PLL 锁相环时钟源
  • 置 POR(Power on Reset) , 低电压检测和看门狗

系统功能框图:

系统功能框图

引脚介绍:

  模块有 16 个引脚, 包括功放输出、 差分输入与串口。具体定义说明见下表。

引脚介绍
引脚介绍

机械尺寸:

机械尺寸

功能描述

  HLK-V20模块是可以控制自身IO的,有几个IO可以通过语音控制使用,实现基本的控制功能,具体使用如下:

  • 模块唤醒后, 使用命令词” 打开空调” ,对应模块上 B7 引脚, 使用命令词” 关闭空调” ,B7 输出对应电平
  • 使用命令词” 打开灯光” , 对应模块上 B6 引脚, 使用命令词” 关闭灯光” , B6 输出对应电平
  • 使用命令词” 打开开关” ,对应模块上 B2 引脚, 使用命令词” 关闭开关” , B2 输出对应电平
  为了方便后续扩展功能,本次小飞哥使用的是外接MCU,通过读取HLK-V20模块串口输出数据,解析进行相应的控制,此办法在后续的扩展功能中比较方便,建议大家有条件的可以采用这种办法应用实例如下:

  模块可作为主控, 运用在语音控制 LED 灯, 语音控制继电器等场景。模块可以应用在以下场景:声控吊灯、 声控壁灯、 声控浴霸、 声控开关、 声控射灯、 声控 吸顶灯、 声控台灯、 墙壁开关、 酒店控制面板、 LED 台灯、 面板、 晾衣机、 电动窗帘、 风扇、 智能门锁、 扫地机、 智能台灯、 智能空调、 智能茶壶、 故事机、 智能窗帘、 智能风扇、 音控音 箱、 车载音控。

1.3 模块输出数据协议格式分析

  采用外接MCU的控制方法,那就必须首先对模块输出的数据协议格式进行分析,正确解析数据之后才能实现我们的功能,厂家出厂是有一套固定协议的,如果需要更改为自己的协议,需要厂家定制,估计走量的,暂时用厂家的就可以啦。协议格式说明:

  Payload 为唤醒与命令词对应的 action 标识, 唤醒对应的 action 为 wakeup_uni, 命令词对应的 action 详见后面介绍,对于我们来说,最重要的是解析出来action数据,根据action数据内容具体来定制我们要控制的设备。  下图为语音唤醒与命令词对应的串口数据(hex 格式), 8 条数据分别表示为唤醒、 打开台灯、 关闭台灯、 打开空调、 关闭空调、 打开浴霸、 关闭浴霸、 退出识别状态


  关于提到的action字段,参考厂家提供的离线命令词与播报答复列表,简单列举一些:

  红框里面是模块收到语音控制命令之后,串口输出的数据,我们只需要把这部分数据解析出来,知道当前是什么指令,然后控制相应的设备即可。

2 软件实现

  主要用到串口1、串口3,定时器7、定时器3,串口1用于调试信息打印,定时器3用于PWM控制灯光亮度,实现调光功能,串口3用于接收模块串口输出数据、解析数据,定时7用于控制串口数据接收超时,下面来小飞哥来一步步介绍实现过程。

2.1 cubemx配置

  时钟配置,参考上us延时3种实现方法一文,就不再做详细介绍了。

串口配置:

  串口1配置,主要配置下图红框中的几项即可,开启接收中断,中断优先级可以选择默认的即可,波特率115200。

  串口2配置,基本同串口1配置,也是主要配置下图红框中的几项即可,开启接收中断,中断优先级可以选择默认的即可,波特率115200。

串口2配置

定时器配置:

  定时器3配置,定时器3时钟为 84M/84=1Mhz,重装载值 500,所以 PWM 频率为 1M/500=2Khz。  定时器7配置,定时7配置为1ms周期,后面串口超时时间具体在配置。

定时器7配置
  配置完之后的中断开启情况如下图:

  配置完之后的IO使用情况如下图:

2.2 PWM简介

  脉冲宽度调制(PWM),是英文“Pulse Width Modulation” 的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。简单一点,就是对脉冲宽度的控制,PWM 原理如图 所示:

  上图就是一个简单的 PWM 原理示意图。图中,我们假定定时器工作在向上计数 PWM模式,且当 CNT=CCRx 时输出 1。那么就可以得到如上的 PWM示意图:当 CNT 值小于 CCRx 的时候, IO 输出低电平(0),当 CNT 值大于等于 CCRx 的时候,IO 输出高电平(1),当 CNT 达到 ARR 值的时候,重新归零,然后重新向上计数,依次循环。改变 CCRx 的值,就可以改变 PWM 输出的占空比,改变 ARR 的值,就可以改变 PWM 输出的频率,这就是 PWM 输出的原理,后面调光用到的就是这个原理,玩过PWM呼吸灯的小伙伴肯定就比较熟悉了,正点原子讲的也比较详细了,小飞哥就不啰嗦了。

2.3 代码编写

硬件连接

  • 主控MCU与HLK-V20连接
STM32HLK-V20
VCC-5VVCC
GNDGND
RX(PA3)TX
  • HLK-V20yu 扬声器连接
扬声器HLK-V20
任意端SP
任意端SP-
  • 主控MCU与受控设备连接
STM32受控设备
PB0(TIM3-CH3)台灯LED正极
GND台灯LED负极
PF9开灯LED正极
GND开灯LED负极
PB5红灯LED正极
GND红灯LED负极
  以上接法仅仅是演示使用,实际使用还是配合继电器使用,能达到实际使用需求,无奈小飞哥手里就一个几年前买的继电器,还坏掉了,这次只能演示用了,后续会画板子开源出来,希望大家多多关注小飞哥公众号。

串口2代码编写

  初始化部分由cubemx配置完成,就不啰嗦了,配置的正确,就不会有问题。

typedef struct {
 char Rxbuff[100];
 uint8_t RxData;
 uint8_t RxCnt;
 uint8_t RxTimCnt;
 uint8_t RxRecFlag;
 uint8_t RxEndFlag;
}uart2_para;
uart2_para Voice_RevPara;

/**
  * @brief  串口中断回调函数
  *         
  * @param  
  * @param  
  * @retval none
  */

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
 if(huart->Instance==USART1)
 {
   Voice_RecUartCallBack();
 }
 else if(huart->Instance==USART2)
 {
   Voice_RecUartCallBack();
 }
}

/**
  * @brief  语音模块串口中断回调函数
  *         
  * @param  none
  * @param  none
  * @retval none
  */

void Voice_RecUartCallBack(void) 
{
  Voice_RevPara.RxTimCnt = 0;
  Voice_RevPara.RxRecFlag = 1;     
  Voice_RevPara.Rxbuff[Voice_RevPara.RxCnt] = Voice_RevPara.RxData;
  Voice_RevPara.RxCnt ;
  if(Voice_RevPara.RxCnt>=100){
   Voice_RevPara.RxCnt=0;
  }
  HAL_UART_Receive_IT(
本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: 驱动电源

在工业自动化蓬勃发展的当下,工业电机作为核心动力设备,其驱动电源的性能直接关系到整个系统的稳定性和可靠性。其中,反电动势抑制与过流保护是驱动电源设计中至关重要的两个环节,集成化方案的设计成为提升电机驱动性能的关键。

关键字: 工业电机 驱动电源

LED 驱动电源作为 LED 照明系统的 “心脏”,其稳定性直接决定了整个照明设备的使用寿命。然而,在实际应用中,LED 驱动电源易损坏的问题却十分常见,不仅增加了维护成本,还影响了用户体验。要解决这一问题,需从设计、生...

关键字: 驱动电源 照明系统 散热

根据LED驱动电源的公式,电感内电流波动大小和电感值成反比,输出纹波和输出电容值成反比。所以加大电感值和输出电容值可以减小纹波。

关键字: LED 设计 驱动电源

电动汽车(EV)作为新能源汽车的重要代表,正逐渐成为全球汽车产业的重要发展方向。电动汽车的核心技术之一是电机驱动控制系统,而绝缘栅双极型晶体管(IGBT)作为电机驱动系统中的关键元件,其性能直接影响到电动汽车的动力性能和...

关键字: 电动汽车 新能源 驱动电源

在现代城市建设中,街道及停车场照明作为基础设施的重要组成部分,其质量和效率直接关系到城市的公共安全、居民生活质量和能源利用效率。随着科技的进步,高亮度白光发光二极管(LED)因其独特的优势逐渐取代传统光源,成为大功率区域...

关键字: 发光二极管 驱动电源 LED

LED通用照明设计工程师会遇到许多挑战,如功率密度、功率因数校正(PFC)、空间受限和可靠性等。

关键字: LED 驱动电源 功率因数校正

在LED照明技术日益普及的今天,LED驱动电源的电磁干扰(EMI)问题成为了一个不可忽视的挑战。电磁干扰不仅会影响LED灯具的正常工作,还可能对周围电子设备造成不利影响,甚至引发系统故障。因此,采取有效的硬件措施来解决L...

关键字: LED照明技术 电磁干扰 驱动电源

开关电源具有效率高的特性,而且开关电源的变压器体积比串联稳压型电源的要小得多,电源电路比较整洁,整机重量也有所下降,所以,现在的LED驱动电源

关键字: LED 驱动电源 开关电源

LED驱动电源是把电源供应转换为特定的电压电流以驱动LED发光的电压转换器,通常情况下:LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: LED 隧道灯 驱动电源
关闭