jjzjj

基于STM32和LD3320的智能语音识别柔光台灯设计

BT-BOX 2024-03-30 原文

目录标题

毕业设计:

基于STM32智能语音识别柔光台灯设计

(源程序+原理图+PCB+设计说明书+PPT)

原理图:Altium Designer

程序编译器:keil4/keil 5

编程语言:C语言

设计编号:Y001

资料下载链接

设计说明

课题主要研究语音识别、按键识别、PWM波调节亮度、OLED屏幕显示四个模块,目前市面上语音识别的台灯大多仅是控制灯的亮灭,采用的是普通LED节能灯进行照明,相比较于市场上已有的产品,本课题所研究设计的台灯采用的主控芯片是性能较高的STM32F103C8T6单片机芯片,采用中断方式对台灯进行按键控制,并通过基于LD332O语音识别模块,利用非特定人语音识别技术对台灯的工作状态进行语音控制,同时实现了语音控制和按键控制台灯的工作状态,采用输出波形比较输出PWM波,利用PWM波来控制光照的亮度及达到柔光照射的目的,并采用OLED屏幕显示台灯的工作状态灯信息,因此使用者可以快速的指导台灯目前的工作状态,根据自身的实际需求通过语音或者按键对台灯的工作状态进行调节,这样就能够更好的帮助这些弱势群体,如老人、儿童、孕妇等行动不便的人,由于采用的是柔光台灯照明,在一定程度上减缓青少年近视发病率持续上升的趋势,并且LED灯能够缓解资源消耗过大、污染物排放量的现状。

实现功能如下:

1、语音识别部分:采用市面上流行的基于LD3320语音识别模块,利用非特定人语音识别(ASR)技术,调试语音模块使其满足台灯所需要的特定词汇。词汇包括:唤醒词、开灯、关灯、亮一点、变暗等。采用主控芯片STM32F103C8T6与LD3320语音识别模块进行串口通信,主控芯片接收数据后处理该消息命令。

2、按键控制部分:利用按键中断机制来控制灯的亮度,以及控制灯的开和关。

3、PWM波控制LED柔光灯亮度部分:采用STM32F103C8T6内部自带定时器输出PWM功能,接上外围电路,控制多个LED灯。

4、显示模块部分:主控芯片通过SPI协议驱动0.96寸OLED屏幕,在128*64个像素点的屏幕上显示灯的亮度级数及其他信息。

原理图

系统各模块器件介绍

整个设计包括STM32F103C8T6主控芯片模块、0.96寸OLED显示模块、LD3320语音模块、按键模块、LED灯组模块等组成,如下图 2.1所示:

主要用到的元器件有STM32F103C8T6单片机、OLED显示屏幕和其驱动芯片SSD1306、LD3320语音识别芯片和内部的增强型51单片机等,这些元器件将会在本章中进行介绍。

LD3320语音识别模块

​ LD3320语音识别常用的芯片,该芯片组成的语音模块识别的灵敏度高,采用的是非特定人语音识别(ARS)技术,这种技术是能够识别汉字小写拼音内容的,本课题的语音识别模块由LD3320与STC11L08XE单片机组成识别系统,如图 2.4所示:

语音识别系统原理框图

​ 语音识别芯片能够将咪头输入的语音信息内容进行频谱分析之后再提取出该信息内容的特征,再将识别出来的内容传输至语音识别器中与先前所设定好的关键词进行比对,然后找出与识别出的信息最为相似的关键词,并进行输出。使用者只需要将识别出来的关键词语内容以汉字拼音字符串的形式传输至语音芯片当中,即可识别生效。本课题语音识别模块每次识别完成将通过中断方式请求主控模块进行处理,通过SPI协议从语音识别芯片读取信息,并根据识别的信息通过串口通信的方式将识别出来的信息发送给STM32F103C8T6单片机。

OLED显示模块

OLED显示屏,是一种有机的发光二极管,它能够自发光,并且拥有反应灵敏、极薄厚度、能够适应的温度范围大、对比度相对较高,还有不需要背光源、结构简单、分辨率高等优势,同时也存在着难以大型化的不足。

本课题采用的OLED显示屏为中景园电子的显示屏,该模块有蓝色、黄蓝色、白色三种颜色可供选择,但是每一个OLED显示屏只能显示这三种颜色中的其中一种颜色,模块尺寸为2.7CM2.6CM,显示尺寸为0.96寸,屏幕的分辨率达12864,工作电压为3.3V。其结构图如下图 2.6所示:

PCB图

源程序

程序设计框架

整个程序的设计主要分为STM32F103C8T6单片机IO的初始化程序设计、OLED显示程序设计、PWM波输出程序设计、LD3320语音识别程序设计等,设计的框架如下图 4.1所示:

程序流程图

在主程序里,先直接调用各个模块初始化程序,完成OLED初始化、定时器初始化、串口初始化等,然后不断扫描执行switch case函数,调用PWM波输出控制LED灯程序和OLED显示屏显示函数。串口中断和按键外部中断会改变工switch控制参数,以此达到改变PWM波和OLED不同的显示界面。其主函数程序如下

主函数

int main(void)
{
	delay_init();	    	 //延时函数初始化
	NVIC_Configuration(); 	 //设置NVIC中断分组2:2位抢占优先级,2位响应优先级 	LED_Init();			     //LED端口初始化
	OLED_Init();			//初始化OLED 
	OLED_Clear(); 
	TIM1_PWM_Init();        //TIM1 PWM波输出初始化,并使能TIM1 PWM输出
	usart2_Init(9600);	    //初始化串口2
	EXTIX_Init();

	int j;
	show_name();
	My_USART2_SendData("123");
	while(1) 
	{
		j=ld3320_uart_receive();         //得到接受函数的字符串buff
		pwm_led_out_test(lighter); 
		switch(j)
		{
			case 1: show_name(); break; //小陈
			case 2:     //亮一点
			  My_USART2_SendData("ligther ");
			  if(lighter<5)              //如果亮度还不满5
			    { lighter++; show_light(lighter);  }    //显示亮度
			  else
			    { show_zuida(); } break;    //屏幕提示已达最大亮度
			case 3:      //变暗
			  if(lighter>0)
			    { lighter--; show_light(lighter); }    //显示亮度
			  else
			    { show_zuidi(); } break;       //屏幕提示已达最低亮度
			case 4: lighter = 3; show_light(lighter); break;   //开灯,默认亮度等级3,60%
			case 5: lighter = 0; show_ling(); break;       //关灯
			case 6: lighter = 1; show_ershi(); break;       //亮度20
			case 7: lighter = 3; show_liushi(); break;       //亮度60
			case 8: lighter = 5; show_yibai(); break; 		//亮度100
			case 9: show_chongfa(); break;       //显示请重新发口令
			case 10: show_chongfa();	break;      //显示请重新发口令
			default:break;
		}
	}
}

OLED程序

在液晶显示屏程序里,先配置SPI协议四个GPIO口和SSD1306复位引脚为推挽输出,然后输出复位电平复位SSD1306芯片。接下来是调用写命令函数来设置SSD1306工作参数,最后关闭显示,复位坐标点到原点,

/初始化SSD1306通信引脚					    
void OLED_Init(void)
{ 	
 	GPIO_InitTypeDef  GPIO_InitStructure;
 	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//使能A端口时钟
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_7;
 	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		    //推挽输出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;         //速度50MHz
 	GPIO_Init(GPIOA, &GPIO_InitStructure);	
 	GPIO_SetBits(GPIOA,GPIO_Pin_5|GPIO_Pin_7|GPIO_Pin_4);
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);//使能A端口时钟
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_8;
 	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		    //推挽输出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;         //速度50MHz
 	GPIO_Init(GPIOB, &GPIO_InitStructure);
 	GPIO_SetBits(GPIOB,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_8);
   
   OLED_RST_Set();
	delay_ms(100);
	OLED_RST_Clr();
	delay_ms(200);
	OLED_RST_Set();      //复位过程

LD3320驱动代码

void ProcessInt0(void)
{
	uint8 nAsrResCount=0;
	EX0=0;            //外部中断0允许位:不允许
	ucRegVal = LD_ReadReg(0x2B);   
	LD_WriteReg(0x29,0) ;      //中断允许寄存器
	LD_WriteReg(0x02,0) ;      //FIFO中断允许位
	if((ucRegVal & 0x10) && LD_ReadReg(0xb2)==0x21 && LD_ReadReg(0xbf)==0x35)
// b2:DSP忙闲状态,0x21表闲,可以进行下一步ASR动作;bf:ASR状态报告寄存器,确定一次语音识别流程正常结束,识别成功
	{
		nAsrResCount = LD_ReadReg(0xba); 
		if(nAsrResCount>0 && nAsrResCount<=4)   //BA寄存器对内容进行评分
		   { 
			nAsrStatus=LD_ASR_FOUNDOK;  //0x10 一次识别结束后有一个识别结果
		   } 
		else 
	      { 
			nAsrStatus=LD_ASR_FOUNDZERO;  //0x11一次识别结束后没有识别结果
		    }
	}
	else                      //没有识别结果
	   {
		nAsrStatus=LD_ASR_FOUNDZERO;
	    }
LD_WriteReg(0x2b,0);        //中断请求编号寄存器
LD_WriteReg(0x1C,0);        //ADC开关控制,写0表示ADC不可用
LD_WriteReg(0x29,0) ;      //中断允许寄存器
LD_WriteReg(0x02,0) ;      //FIF0中断允许
LD_WriteReg(0x2B,0);       //中断请求编号寄存器
LD_WriteReg(0xBA,0);	     //中断辅助信息寄存器
LD_WriteReg(0xBC,0);	     //识别过程强制结束,在ASR进行过程中,可以设置本寄存器提前结束本次ASR过程
LD_WriteReg(0x08,1);	     //清除FIF0内容(清除指定FIF0后再写入一次0x00),0x01为清除FIFO_DATA
LD_WriteReg(0x08,0);	     //清除FIFO_DATA后 再次写
EX0=1;                   //外部中断允许位:允许中断
}

设计说明书

立论依据

(课题来源、选题依据和背景情况、课题研究目的、理论意义和实际应用价值)

随着社会的发展,人们对美好生活愈加的向往,智能产品成为时代的发展趋势。我国语音识别研究在近年来发展迅速,研究的水平也从实验室逐步走向市场,进入消费者的电子产品、工业、家电、通信、汽车电子、医疗、家庭服务等各个领域。

语音识别技术就是通过识别和理解把语音信号转变为相应的文本或命令的高技术,发展至今日,中小词汇量非特定人语音识别系统识别精度已经大于98%,对特定人语音识别系统的识别精度就更高,这已经能够满足一般应用的要求,于是大量的语音识别产品开始进入市场和服务领域。这些产品为人们的生活提供了很大的便利,例如语音识别的智能台灯,改变了传统只能通过手动控制的方式,采用语音识别技术,通过语音来控制台灯的工作状态。

现在大部分台灯都是通过手动控制,虽然目前已有语音控制的台灯,但大多数语音控制台灯的控制模式单一,主要是控制台灯的开和关。当需要调节光照亮度时还需手动调节,因此使用起来很不方便,特别是对于老人、儿童和行动不便者来讲尤其困难。

设计这样一款能够通过语音识别控制亮灭以及亮度的台灯,它可以根据使用者的需求来进行调节,这样就能够更好的帮助这些弱势群体人群,以及在一定程度上减缓青少年近视发病率持续上升的趋势,并且能够避免资源的不必要消耗。

文献综述

(国内外研究现状、发展动态)

随着智能制造业的快速发展,语音识别开始得到广泛的应用,在信息处理、通信、控制等领域也相继出现了各种功能的语音识别系统。其中应用相对广泛的有IBM公司的Viavoice、Android系统的Voice Actions、苹果的Siri以及国内科大讯飞的语音识别产品等,这些软件的共同点是文本转语音的功能较为完善,而反过来语音转文本的功能则较为差些。例如Voice Actions的识别能力超强,但是前提是必须按照规定的格式和语法结构表达,否则就无法识别。

随着语音识别的广泛应用,出现了许多不同用途的语音识别模块,例如DFRobot的中文语音识别模块,它的核心是国内ICRoute公司的高性能LD3320语音识别芯片,是一颗基于非特定人语音识别(ASR)技术的语音识别/声控芯片,上面集成了高精度的A/D和D/A接口,不再需要外界辅助的Flash和RAM,就可以实现语音识别、声控、人机对话功能,不需要用户进行录音训练,识别的关键词语列表是可以动态编辑的。

越来越多的语音识别模块的出现,更加刺激了语音识别类产品的创新研发,市面上出现各种功能的语音智能产品,产品以实用性、易用性和人性化为主,致力于为人们提供一个舒适、方便、高效和快捷的生活环境。

研究内容

毕业设计(论文)的主要研究内容、构想与思路、可能出现的工作难点以及拟解决的方法)

主要研究内容:本课题是基于语音识别的智能LED柔光台灯设计,主要的研究内容包括语音识别模块应用,PWM波控制LED柔光灯的亮度,0.96寸OLED显示当前柔光LED台灯的工作状态,软件硬件的联合调试。

构想与思路:

\1. 语音识别部分:采用市面上流行的非特定人语音识别(ASR)模块,调试模块可以满足所需台灯要的特定词汇。词汇包括:唤醒词、开灯、关灯、亮一点、暗一点。采用主控芯片STM32F103C8T6与语音识别模块进行串口通信,主控芯片接收数据后处理该消息命令。

\2. 按键控制部分:按键中断机制控制灯的亮度,按键控制灯的开光。

\3. PWM波LED柔光灯亮度:采用STM32F103C8T6内部自带定时器输出PWM功能,接上外围电路,控制多个LED灯。

\4. 显示模块:主控芯片通过SPI协议驱动0.96寸OLED屏幕,在128*64个像素点的屏幕上显示灯的亮度级数及其他信息

研究基础

(所需研究条件和实验条件)

\1. 设计需要的主要元器件: STM32F103C8T6单片机开发板、LED灯、基于LD3320语音识别模块、0.96寸OLED屏幕

\2. 制作需要的实验条件:用于软硬件设计的个人电脑、用于制作电路板的电子电工实验室相关设备、用于烧录程序的ST-LINK下载器。

\3. 调试需要的实验条件:直流稳压电压源、万用表、示波器等。

\4. 研究所需的理论基础:C语言程序设计、单片机原理及应用、模拟电子技术基础、数字电路与逻辑设计、电路分析基础等。

资料清单

下载链接见文章开头

  1. 设计需要的主要元器件: STM32F103C8T6单片机开发板、LED灯、基于LD3320语音识别模块、0.96寸OLED屏幕

\2. 制作需要的实验条件:用于软硬件设计的个人电脑、用于制作电路板的电子电工实验室相关设备、用于烧录程序的ST-LINK下载器。

\3. 调试需要的实验条件:直流稳压电压源、万用表、示波器等。

\4. 研究所需的理论基础:C语言程序设计、单片机原理及应用、模拟电子技术基础、数字电路与逻辑设计、电路分析基础等。

[外链图片转存中…(img-rxjQCIoW-1661965086923)]

资料清单

下载链接见文章开头

有关基于STM32和LD3320的智能语音识别柔光台灯设计的更多相关文章

  1. 叮咚买菜基于 Apache Doris 统一 OLAP 引擎的应用实践 - 2

    导读:随着叮咚买菜业务的发展,不同的业务场景对数据分析提出了不同的需求,他们希望引入一款实时OLAP数据库,构建一个灵活的多维实时查询和分析的平台,统一数据的接入和查询方案,解决各业务线对数据高效实时查询和精细化运营的需求。经过调研选型,最终引入ApacheDoris作为最终的OLAP分析引擎,Doris作为核心的OLAP引擎支持复杂地分析操作、提供多维的数据视图,在叮咚买菜数十个业务场景中广泛应用。作者|叮咚买菜资深数据工程师韩青叮咚买菜创立于2017年5月,是一家专注美好食物的创业公司。叮咚买菜专注吃的事业,为满足更多人“想吃什么”而努力,通过美好食材的供应、美好滋味的开发以及美食品牌的孵

  2. 基于C#实现简易绘图工具【100010177】 - 2

    C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.

  3. STM32读取串口传感器数据(颗粒物传感器,主动上传) - 2

    文章目录1.开发板选择*用到的资源2.串口通信(个人理解)3.代码分析(注释比较详细)1.主函数2.串口1配置3.串口2配置以及中断函数4.注意问题5.源码链接1.开发板选择我用的是STM32F103RCT6的板子,不过代码大概在F103系列的板子上都可以运行,我试过在野火103的霸道板上也可以,主要看一下串口对应的引脚一不一样就行了,不一样的就更改一下。*用到的资源keil5软件这里用到了两个串口资源,采集数据一个,串口通信一个,板子对应引脚如下:串口1,TX:PA9,RX:PA10串口2,TX:PA2,RX:PA32.串口通信(个人理解)我就从串口采集传感器数据这个过程说一下我自己的理解,

  4. kvm虚拟机安装centos7基于ubuntu20.04系统 - 2

    需求:要创建虚拟机,就需要给他提供一个虚拟的磁盘,我们就在/opt目录下创建一个10G大小的raw格式的虚拟磁盘CentOS-7-x86_64.raw命令格式:qemu-imgcreate-f磁盘格式磁盘名称磁盘大小qemu-imgcreate-f磁盘格式-o?1.创建磁盘qemu-imgcreate-fraw/opt/CentOS-7-x86_64.raw10G执行效果#ls/opt/CentOS-7-x86_64.raw2.安装虚拟机使用virt-install命令,基于我们提供的系统镜像和虚拟磁盘来创建一个虚拟机,另外在创建虚拟机之前,提前打开vnc客户端,在创建虚拟机的时候,通过vnc

  5. ruby-on-rails - (Ruby,Rails) 基于角色的身份验证和用户管理...? - 2

    我正在寻找用于Rails的优质管理插件。似乎大多数现有的插件/gem(例如“restful_authentication”、“acts_as_authenticated”)都围绕着self注册等展开。但是,我正在寻找一种功能齐全的基于管理/管理角色的解决方案——但不是简单地附加到另一个非基于角色的解决方案。如果我找不到,我想我会自己动手......只是不想重新发明轮子。 最佳答案 RyanBates最近做了两个关于授权的railscast(注意身份验证和授权之间的区别;身份验证检查用户是否如她所说的那样,授权检查用户是否有权访问资源

  6. ruby - 在 Rakefile 中动态生成 Rake 测试任务(基于现有的测试文件) - 2

    我正在根据Rakefile中的现有测试文件动态生成测试任务。假设您有各种以模式命名的单元测试文件test_.rb.所以我正在做的是创建一个以“测试”命名空间内的文件名命名的任务。使用下面的代码,我可以用raketest:调用所有测试require'rake/testtask'task:default=>'test:all'namespace:testdodesc"Runalltests"Rake::TestTask.new(:all)do|t|t.test_files=FileList['test_*.rb']endFileList['test_*.rb'].eachdo|task|n

  7. ruby - 如何使用 Ruby 基于字母数字字符串生成颜色? - 2

    我想要像“嘿那里”这样的东西变成,例如,#316583。我希望将任意长度的字符串“归结”为十六进制颜色。我不知道从哪里开始。我在想,每个字符串的MD5散列都是不同的-但如何将该散列转换为十六进制颜色数字? 最佳答案 你可以只取几位前几位:require'digest/md5'color=Digest::MD5.hexdigest('Mytext')[0..5] 关于ruby-如何使用Ruby基于字母数字字符串生成颜色?,我们在StackOverflow上找到一个类似的问题:

  8. 玩以太坊链上项目的必备技能(初识智能合约语言-Solidity之旅一) - 2

    前面一篇关于智能合约翻译文讲到了,是一种计算机程序,既然是程序,那就可以使用程序语言去编写智能合约了。而若想玩区块链上的项目,大部分区块链项目都是开源的,能看得懂智能合约代码,或找出其中的漏洞,那么,学习Solidity这门高级的智能合约语言是有必要的,当然,这都得在公链``````以太坊上,毕竟国内的联盟链有些是不兼容Solidity。Solidity是一种面向对象的高级语言,用于实现智能合约。智能合约是管理以太坊状态下的账户行为的程序。Solidity是运行在以太坊(Ethereum)虚拟机(EVM)上,其语法受到了c++、python、javascript影响。Solidity是静态类型

  9. 【自动驾驶环境感知项目】——基于Paddle3D的点云障碍物检测 - 2

    文章目录1.自动驾驶实战:基于Paddle3D的点云障碍物检测1.1环境信息1.2准备点云数据1.3安装Paddle3D1.4模型训练1.5模型评估1.6模型导出1.7模型部署效果附录show_lidar_pred_on_image.py1.自动驾驶实战:基于Paddle3D的点云障碍物检测项目地址——自动驾驶实战:基于Paddle3D的点云障碍物检测课程地址——自动驾驶感知系统揭秘1.1环境信息硬件信息CPU:2核AI加速卡:v100总显存:16GB总内存:16GB总硬盘:100GB环境配置Python:3.7.4框架信息框架版本:PaddlePaddle2.4.0(项目默认框架版本为2.3

  10. STM32的HAL和LL库区别和性能对比 - 2

    LL库和HAL库简介LL:Low-Layer,底层库HAL:HardwareAbstractionLayer,硬件抽象层库LL库和hal库对比,很精简,这实际上是一个精简的库。LL库的配置选择如下:在STM32CUBEMX中,点击菜单的“ProjectManager”–>“AdvancedSettings”,在下面的界面中选择“AdvancedSettings”,然后在每个模块后面选择使用的库总结:1、如果使用的MCU是小容量的,那么STM32CubeLL将是最佳选择;2、如果结合可移植性和优化,使用STM32CubeHAL并使用特定的优化实现替换一些调用,可保持最大的可移植性。另外HAL和L

随机推荐