文章目录

    • 一.概要
    • 二.实验模型原理
      • 1.硬件连接原理框图
      • 2.控制原理
    • 三.实验模型控制流程
    • 四.语音控制垃圾桶模型程序
    • 五.实验效果视频
    • 六.小结

一.概要

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

在这里插入图片描述

本文就做一个语音对话智能感应垃圾桶套件模型,采用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);//等待100msMX_TIM3_Init();//重新初始化配置PWM波if (HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1) != HAL_OK)//PA6脚PWM输出{/* PWM generation Error */while(1);}HAL_Delay(200);//等待200msHAL_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);//等待100msif (HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1) != HAL_OK)//PA6脚PWM输出{/* PWM generation Error */while(1);}HAL_Delay(1000);//等待1000msOpenFlag=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通讯有更深的了解。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/95935.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/95935.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/95935.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[bat-cli] docs | 控制器

链接&#xff1a;https://github.com/sharkdp/bat 前文传送&#xff1a; 【探索Linux命令行】从基础指令到高级管道操作的介绍与实践【Linux命令行】从时间管理-&#xff1e;文件查找压缩的指令详解【Linux】1w详解如何实现一个简单的shell docs&#xff1a;bat bat 是一个*…

无线自动信道调整

通过信道调整功能&#xff0c;可以保证每个AP 能够分配到最优的信道&#xff0c;尽可能地 减少和避免相邻信道干扰&#xff0c;而且通过实时信道检测&#xff0c;使AP 实时避开雷达&#xff0c;微波炉等干扰源。 动态信道调整能够实现通信的持续进行&#xff0c;为网络的可靠传…

ios面试八股文

​​Swift 语言特性​​&#xff1a;请解释一下 struct和 class的主要区别。特性​​​​struct (值类型)​​​​class (引用类型)​​​​类型本质​​值类型 (复制时创建独立副本)引用类型 (复制时共享同一实例)​​内存分配​​通常在栈上 (更快速)在堆上 (需要ARC管理)​​…

IntelliJ IDEA 2023更新git凭据

背景&#xff1a;已知原来从远程仓库获取的项目&#xff0c;需要更新git用户和密码&#xff0c;但是又不想删除本地项目环境&#xff08;不想重新获取新建项目&#xff09;。报错&#xff1a;remote: HTTP Basic: Access denied. The provided password or token is incorrect …

Docker 容器 OOM:从资源监控到JVM调优的实战记录

人们眼中的天才之所以卓越非凡&#xff0c;并非天资超人一等而是付出了持续不断的努力。1万小时的锤炼是任何人从平凡变成超凡的必要条件。———— 马尔科姆格拉德威尔 &#x1f31f; Hello&#xff0c;我是Xxtaoaooo&#xff01; &#x1f308; “代码是逻辑的诗篇&#xff…

【开题答辩全过程】以 基于微信小程序的宠物领养系统为例,包含答辩的问题和答案

个人简介一名14年经验的资深毕设内行人&#xff0c;语言擅长Java、php、微信小程序、Python、Golang、安卓Android等开发项目包括大数据、深度学习、网站、小程序、安卓、算法。平常会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。感谢大家的…

【可信数据空间-连接器状态监控-Java代码集成】

可信数据空间-连接器状态监控-Java代码集成一、 核心概念1. Micrometer2. Micrometer Registry Prometheus3.Prometheus二、 依赖配置 (Maven)三、 集成步骤与代码示例场景一&#xff1a;在 Spring Boot 应用中集成&#xff08;最简单&#xff09;1. 添加依赖&#xff08;如上所…

反编译分析C#闭包

一、问题描述&#xff1a;比如有这样的代码&#xff1a;它的输出结果是 3&#xff0c;3&#xff0c;3。通过搜索得知这一现象是因为C#闭包导致的.我们借助ILSpy看下IL中间代码&#xff0c;首先它生成了一个名叫DisplayClass的类&#xff0c;类中定义了i的字段主代码&#xff1a…

卷积神经网络(CNN):从图像识别原理到实战应用的深度解析

目录一.CNN的技术必要性&#xff1a;破解传统图像处理的两大核心痛点痛点1&#xff1a;特征依赖人工设计&#xff0c;通用性差痛点2&#xff1a;全连接网络参数爆炸&#xff0c;训练难收敛二.CNN的核心原理&#xff1a;两大机制与分层感知逻辑1.核心机制1&#xff1a;局部连接&…

用 SPL 编写阿里云 FC2.0 函数

前言 在数字化转型持续加速的背景下&#xff0c;企业越来越多地将业务逻辑以服务化方式部署至云端。阿里云函数计算&#xff08;Function Compute&#xff0c;简称FC&#xff09;作为一种无服务器计算平台&#xff0c;屏蔽了底层资源运维的复杂性&#xff0c;使开发者能够专注…

AR 巡检与普通巡检有哪些区别,有哪些优势|阿法龙XR云平台

AR 巡检&#xff08;增强现实巡检&#xff09;与普通巡检&#xff08;传统人工巡检&#xff09;在技术应用、效率、准确性等多个维度存在显著差异&#xff0c;具体区别如下&#xff1a; 1. 巡检方式更智能 普通巡检&#xff1a;依赖人工现场观察&#xff0c;主要通过眼看、手…

Java中的volatile关键字详解

核心作用&#xff1a;解决可见性和有序性问题volatile 的主要作用可以归结为两点&#xff1a;1.保证变量的可见性 和 禁止指令重排序。2.它提供了一种轻量级的同步机制&#xff0c;3.但需要注意的是&#xff0c;它不能保证原子性。保证可见性&#xff1a;什么是可见性问题&…

【Linux】MySQL数据目录迁移步骤(含流程图踩坑经验)

在生产环境中&#xff0c;有时候你会遇到一些看似简单但实际上很棘手的问题。最近我就碰到了一次典型的服务器磁盘空间告急&#xff0c;最后通过迁移 MySQL 数据目录成功解决了问题。本文记录整个过程&#xff0c;包括我的分析思路、迁移步骤、踩坑和经验总结&#xff0c;希望对…

数据驱动下的连锁模式复制:技术科普与方法论深度解析

前言在连锁经营的赛道上&#xff0c;“复制”是核心命题&#xff0c;但绝非简单的“粘贴”。当行业进入数字化深水区&#xff0c;数据驱动正成为连锁模式突破增长瓶颈、实现高效复制的“隐形引擎”。本文将从技术科普与方法论心得两个维度&#xff0c;深度拆解数据如何重塑连锁…

数据库学习MySQL系列2、Windows11系统安装MySQL方法一.msi安装详细教程

方法一.msi安装详细教程 Windows系统下MySQL——.msi安装详细教程&#xff08;默认--只安装服务端“Server only”&#xff09;MySql官网地址&#xff1a;https://www.mysql.com/&#xff1b;快速下载通道请单击→ No thanks, just start my download.ps&#xff1a;其他资源(…

html+css+vue实现增删改查

代码如下&#xff1a;<!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>优化版 Vue.js CRUD 示例&l…

(计算机网络)DNS解析流程及两种途径

在计算机网络中&#xff0c;DNS&#xff08;Domain Name System&#xff09;用于 将域名解析为 IP 地址。一个完整的解析过程涉及 递归查询、迭代查询&#xff0c;以及多个关键角色&#xff08;LDNS、本地域名服务器&#xff1b;根服务器&#xff1b;顶级域名服务器&#xff1b…

数据结构——队列(Java)

一.基本概念 队列用来存储逻辑关系为“一对一”的数据&#xff0c;是一种“特殊”的线性存储结构。 特点&#xff1a; •先进先出&#xff1a;队列中元素的添加&#xff08;入队enqueue&#xff09;和移除&#xff08;出队dequeue&#xff09;遵循先进先出的原 则。 •端点&…

【Go】:mac 环境下GoFrame安装开发工具 gf-cli——gf_darwin_arm64

当前主要是关于gf_darwin_arm64的安装步骤 如何快速给mac电脑安装gfgf是什么安装步骤方法1&#xff1a;去github下载gf-cli去git上下载对应电脑版本的gf-cli验证下载文件是否二进制文件授予该文件权限方法2&#xff1a;去goframe官网教你下载步骤验证gf是否安装成功可能遇到的问…

【新】ApiHug官方文档-ApiHug Spring Security 扩展-补充说明

概述 在上次说明中我们写了ApiHug 如何做授权的&#xff0c; 这里有个概念的混淆&#xff0c; 其实 apihug 不是在spring security 上做的安全扩展&#xff0c; 应该是 apihug spring, 安全设计框架&#xff0c; 和本身 spring security 没有半毛钱关系&#xff0c; 而如果你…