STM32传感器模块编程实践(十五)DIY语音对话控制+满溢检测智能垃圾桶模型

发布于:2025-09-05 ⋅ 阅读:(20) ⋅ 点赞:(0)

一.概要

以前介绍的智能垃圾桶模型都是通过超声波模块感知控制,这次介绍一款新的智能垃圾桶,直接使用语音交互模块进行垃圾桶的开闭控制。

在这里插入图片描述

本文就做一个语音对话智能感应垃圾桶套件模型,采用STM32F103C8T6单片机+舵机+语音交互模块+激光红外模块,实现使用语音指令就能进行垃圾桶自动开启,以及垃圾桶里的物体放满了,就产生垃圾桶满的语音报警。
在这里插入图片描述

二.实验模型原理

1.硬件连接原理框图

在这里插入图片描述

模型主要分为五部分:主芯片单元,语音对话单元,执行动作单元,满溢检测单元。
在这里插入图片描述

图中主控芯片为STM32F103C8T6单片机,语音对话单元为ASR-PRO模块,执行传感器为180度SG90舵机,满溢检测单元为红外激光测距检测。

信号线连接:SG90(180度)舵机的信号脚橙色线接到单片机的PA6脚。ASR-PRO模块接单片机的PB8,PB9引脚。红外激光测距模块接单片机的模拟IIC通讯引脚PB12,PB13以及PB7引脚。

2.控制原理

语音模块交互原理:
语音交互模块是一款集成了离线语音识别功能的模块,用户可以通过该模块实现语音识别功能,外部加上麦克风与喇叭,就能实现语音识别与对话。
在这里插入图片描述

语音核心板固件程序可以通过 USB转 TTL模块连接实现硬件连接下载,接线是 5V,GND,TX,RX四根线。
在这里插入图片描述

使用语音模块的开发软件,天问 Block 编程软件,制作好图形化语音对话控制程序,下图是语音交互程序,接收的语音命令是"打开垃圾桶",“关闭垃圾桶”,生成模型后,点击2M编译下载,连接USB转 TTL模块就能实现对语音模块进行固件程序下载。
在这里插入图片描述

舵机控制原理:
SG90舵机,首先,控制引脚是三根线,分别是GND(棕色)、VCC(红色)、PWM(黄色),控制方式也是一样的PWM时序,具体的方法如下:

(1)采用PWM控制的方式来进行舵机的旋转
(2)舵机的控制需要MCU产生一个20ms周期的脉冲信号,以0.5ms到2.5ms的高电平来控制舵机的角度。
(3)高电平时间跟舵机旋转的角度对应关系:
0.5ms-------------0度;对应函数中占空比为2.5%
1.0ms------------45度;对应函数中占空比为5.0%
1.5ms------------90度;对应函数中占空比为7.5%
2.0ms-----------135度;对应函数中占空比为10.0%
2.5ms-----------180度;对应函数中占空比为12.5%

满溢检测原理:

通过红外激光模块装在垃圾桶顶部区域,单片机通过IIC总线与红外模块进行通讯,读取检测到的距离值,红外激光模块通过光线的反射原理,用来测量障碍物的距离,如果障碍物的距离比较小,说明垃圾桶满了。
在这里插入图片描述

三.实验模型控制流程

1.语音交互模块接收到"打开垃圾桶"的语音之后,语音模块的PA4引脚就会输出高电平。

2.单片机一直读取PB9引脚,由于单片机的PB9跟语音模块的PA4引脚是相连的,如果读取到PB9引脚为高电平,单片机就会通过PA6引脚输出20ms周期的PWM波。PWM波高电平脉冲时间为2.5ms,这样舵机就会旋转180度,从而带动垃圾桶的盖打开,垃圾桶保持打开状态不变。单片机同时驱动红外激光模块测距,如果距离小于8CM,说明垃圾桶顶部被东西覆盖,垃圾桶已经满了,单片机就会控制PB8引脚输出高电平,由于单片机的PB8引脚与语音模块的PA1引脚是相连的,语音模块的PA1引脚读取到高电平之后,就会输出"满了满了"的语音。

3.语音交互模块接收到"关闭垃圾桶"的语音之后,语音模块的PA4引脚就会输出低电平,单片机一直读取PB9引脚,由于单片机的PB9跟语音模块的PA4引脚是相连的,如果为低电平,单片机通过PA6引脚输出20ms周期。PWM波高电平脉冲时间为0.5ms,这样舵机就回到0度,从而带动垃圾桶的盖闭合。

四.语音控制垃圾桶模型程序

板子与SG90舵机(180度舵机)用杜邦线连接:
板子5V----红色线
板子A6----橙色线
板子G-----棕色线
	
板子与红外激光测距模块用杜邦线连接:
板子3.3V----VIN
板子B12----SCL
板子B13----SDA
板子B7------XSHUT
板子G-------GND

USB线需要接小系统板,给STM32板子供5V, 板子与语音模块直接相连,板载麦克风,板子再外接一个喇叭。
在这里插入图片描述
实物地址

打开STM32CubeMX软件,新建工程
在这里插入图片描述
Part Number处输入STM32F103C8,再双击就创建新的工程
在这里插入图片描述
配置下载口引脚
在这里插入图片描述
配置外部晶振引脚
在这里插入图片描述
配置系统主频
在这里插入图片描述
PB8,PB12,PB13,PB7配置成输出,PB9配置成输入,而且是下拉输入,因为要读取语音模块输出的高电平信号。
在这里插入图片描述

配置PWM输出,定时器3通道1,周期20ms
在这里插入图片描述

配置工程文件名,保存路径,KEIL5工程输出方式
在这里插入图片描述
生成工程
在这里插入图片描述
用Keil5打开工程
在这里插入图片描述

添加代码

添加红外激光代码:
在这里插入图片描述

添加语音模块输出的高低电平控制舵机驱动代码:
在这里插入图片描述

添加满溢检测代码:
在这里插入图片描述

主要程序:

/* USER CODE BEGIN 0 */
uint16_t Pluse_Time=500,Old_Pluse_Time,DistanceTimeCounter,DistanceCounter;//1毫秒脉冲,单位是us
uint8_t OpenFlag;
uint8_t Vl53l0_FullFlag;//满报警,连续检测3次满,认为满了
/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_TIM3_Init();
  /* USER CODE BEGIN 2 */
	
	while(vl53l0x_init(&vl53l0x_dev))//vl53l0x初始化
	 {	 
		HAL_Delay(500);
	 }

   if (HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1) != HAL_OK)//PA6脚PWM输出
  {
    /* PWM generation Error */
    while(1);
  }
	HAL_Delay(200);//等待200ms
	//以180度角度伺服为例,那么对应的控制关系是这样的(t为高电平时间):
	//t=0.5ms(占空比2.5%)---------0°;
	//t=1.0ms(占空比5%)-----------45°;
	//t=1.5ms(占空比7.5%)---------90°;
	//t=2.0ms(占空比10%)---------135°;
	//t=2.5ms(占空比12.5%)-------180°;
	Pluse_Time=500;//0.5ms高电平脉冲,用于控制舵机转到0度
	HAL_TIM_PWM_Stop(&htim3, TIM_CHANNEL_1);//PWM停止输出
	HAL_Delay(100);//等待100ms
	MX_TIM3_Init();//重新初始化配置PWM波
	if (HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1) != HAL_OK)//PA6脚PWM输出
	{
	/* PWM generation Error */
	while(1);
	}
	HAL_Delay(200);//等待200ms
	HAL_TIM_PWM_Stop(&htim3, TIM_CHANNEL_1);//PWM停止输出	
	OpenFlag=0;//关闭
	vl53l0x_general_Init(&vl53l0x_dev,Default_Mode);//默认模式测试

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
		HAL_Delay(100);//等待100ms	
		if((HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_9) == 1) && OpenFlag==0)//收到打开垃圾桶语音,进行打开垃圾桶动作
		{
	
			DistanceCounter=0;
  		Pluse_Time=2500;
			HAL_TIM_PWM_Stop(&htim3, TIM_CHANNEL_1);//PWM停止输出
			MX_TIM3_Init();//重新初始化配置PWM波
			if (HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1) != HAL_OK)//PA6脚PWM输出
			{
			while(1);
			}
			HAL_Delay(1000);
			OpenFlag=1;
					
		}else if((HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_9) == 0)&& OpenFlag==1)//收到关闭垃圾桶语音,进行关闭垃圾桶动作
		{
			
			DistanceCounter=0;
			  Pluse_Time=500;//0.5ms高电平脉冲,用于控制舵机转到0度
				if(Old_Pluse_Time!=Pluse_Time)
				{
			
						HAL_TIM_PWM_Stop(&htim3, TIM_CHANNEL_1);//PWM停止输出
						MX_TIM3_Init();//重新初始化配置PWM波
						HAL_Delay(100);//等待100ms
						if (HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1) != HAL_OK)//PA6脚PWM输出
						{
						/* PWM generation Error */
						while(1);
						}
						HAL_Delay(1000);//等待1000ms
						OpenFlag=0;	
				}			

		}
		
		if(OpenFlag==1)//打开的时候做满检测
		{
			vl53l0x_general_Test(&vl53l0x_dev);
			if(Vl53l0_OK_Flag==1&& vl53l0x_data.RangeMilliMeter<=50)//检测到有效距离,且距离小于5cm,说明满了
			{
				
				Vl53l0_FullFlag++;
				if(Vl53l0_FullFlag>=3)
				{
					HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8,GPIO_PIN_SET);//PB8输出高电平,控制语音模块输出满了满了语音
				  HAL_Delay(1000);//等待1000ms

				}
			}else
			{
				HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8,GPIO_PIN_RESET);//PB8输出低电平,关闭满了满了的语音
				Vl53l0_FullFlag=0;

			}
		}
		Old_Pluse_Time=Pluse_Time;
  }
  /* USER CODE END 3 */
}

语音模块是通过图形化编程,用天问软件,流程代码如下:
在这里插入图片描述

五.实验效果视频

STM32单片机带语音交互控制和满溢检测智能垃圾桶模型

六.小结

融合了舵机,语音交互模块,红外激光测距的控制,对STM32的单片机的定时器PWM功能,定时器功能,IIC通讯有更深的了解。


网站公告

今日签到

点亮在社区的每一天
去签到