传感器模块编程实践(三)舵机+超声波模块融合DIY智能垃圾桶模型

文章目录

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

一.概要

随着科技的飞速发展和环保意识的日益增强,智能垃圾桶成为了城市生活的新宠,智能垃圾桶人们无需接触垃圾桶的任何部位即可投放垃圾,防止交叉感染,环保卫生,外形雅观。

在这里插入图片描述

本文就做了一个简单的智能感应垃圾桶套件模型,采用STM32F103C8T6单片机+舵机+超声波模块,实现有物体靠近,垃圾桶自动开启,没有物体靠近,一定时间后自动合上。

在这里插入图片描述

二.实验模型原理

1.硬件连接原理框图

在这里插入图片描述

模型主要分为三部分:主芯片单元,测距感应单元,执行动作单元。

在这里插入图片描述

图中主控芯片为STM32F103C8T6单片机,测距传感器为超声波模块,执行传感器为SG90舵机。

信号线连接:HC-SR04超声波模块信号脚ECHO脚接到单片机的PA0脚,TRIG脚接到单片机的PA1脚。SG90(180度)舵机的信号脚橙色线接到单片机的PA6脚。

2.控制原理

超声波模块根据声音的反射原理,对前方的障碍物进行测距。如果没有障碍物,或者障碍物距离>=5CM,单片机驱动舵机转到0度,如果检测到障碍物距离小于5CM,单片机驱动舵机旋转到180度,打开垃圾桶盖子。

超声波测距原理:

在这里插入图片描述

以上时序图表明单片机只需要提供一个10uS以上脉冲触发信号给模块的TRIG引脚,超声波模块内部将发出8个40kHz周期电平并检测回波。模块一旦检测到有回波信号则输出回响信号到模块ECHO引脚。回响信号的脉冲宽度与所测的距离成正比。单片机通过采集收到的输出回响信号的宽度时间就可以计算得到距离。

距离公式:距离=回响高电平时间*声速(340M/S)/2

舵机控制原理:
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%

三.实验模型控制流程

1.单片机先通过PA0脚驱动超声波模块ECHO信号进行测距,超声波模块根据声音的反射原理,对前方的障碍物进行测距。如果没有障碍物,或者障碍物距离>=10CM,单片机不驱动舵机进行动作。

2.单片机一直通过PA0脚驱动超声波模块ECHO信号进行测距,如果障碍物距离<10CM,单片机通过PA6引脚输出20ms周期的PWM波。PWM波高电平脉冲时间为2.5ms,这样舵机就会旋转180度,从而带动垃圾桶的盖打开,如果障碍物距离一直小于10CM,垃圾桶保持打开状态不变。

3.单片机一直通过PA0脚驱动超声波模块ECHO信号进行测距,如果障碍物距离>=10CM,单片机通过PA6引脚输出20ms周期。PWM波高电平脉冲时间为0.5ms,这样舵机就回到0度,从而带动垃圾桶的盖闭合。

四.智能感应垃圾桶模型程序

板子与超声波模块用杜邦线连接:
板子G-----模块GND
板子3.3---模块VCC
板子A0----模块Trig
板子A1----模块Echo板子与SG90舵机(180度舵机)用杜邦线连接:
板子5V----红色线
板子A6----橙色线
板子G-----棕色线

USB线需要接小系统板,给板子供5V。

在这里插入图片描述

打开STM32CubeMX软件,新建工程
在这里插入图片描述
Part Number处输入STM32F103C8,再双击就创建新的工程
在这里插入图片描述
配置下载口引脚
在这里插入图片描述
配置外部晶振引脚
在这里插入图片描述
配置系统主频
在这里插入图片描述
配置PA0为输出,PA1为输入,PA1管脚选择下拉
在这里插入图片描述

配置定时器2,10us产生中断一次,用来统计后续采集超声波返回的脉冲宽度时间
在这里插入图片描述
在这里插入图片描述

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

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

添加代码

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

主要程序:

uint32_t Distance_Calculate(uint32_t count)//传入时间单位10us
{uint32_t Distance = 0;Distance = (uint32_t)(((float)count *17)/100);//距离单位cm,声速340M/S,时间*速度/2=距离return Distance;
}
//等待us级别
void Delay_us(unsigned long i)
{unsigned long j;for(;i>0;i--){for(j=8;j>0;j--);}
}
uint32_t Distance;//距离
uint32_t HalTime1,HalTime2;//时间临时变量
extern volatile uint32_t TimeCounter;//时间计数,单位10us/* USER CODE END PFP *//* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
uint16_t Pluse_Time=500,Old_Pluse_Time,DistanceTimeCounter,DistanceCounter;//1毫秒脉冲,单位是us
/* 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();MX_TIM2_Init();/* USER CODE BEGIN 2 */if (HAL_TIM_Base_Start_IT(&htim2) != HAL_OK)//启动定时器2,10us进入中断一次{while(1);}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停止输出	/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0,GPIO_PIN_RESET);//预先拉低Trig引脚HAL_Delay(5);HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0,GPIO_PIN_SET);//拉高Trig引脚Delay_us(40);HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0,GPIO_PIN_RESET);//拉低Trig引脚Delay_us(20);while(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_1) == 0);//如果是低电平,一直等HalTime1= TimeCounter;while(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_1) == 1);//如果是高电平,一直等if(TimeCounter>HalTime1){HalTime2 = TimeCounter-HalTime1;if(HalTime2<0x300){Distance = Distance_Calculate(HalTime2);//计算距离}else{Distance=100;}}HAL_Delay(100);DistanceTimeCounter++;if(DistanceTimeCounter>2)//连续监测2次{DistanceTimeCounter=0;}else{if(Distance<=10 && Distance>0){DistanceCounter++;}continue;//没到3次,不动作,防止超声波抖动}if(DistanceCounter>=2)//距离小于10CM,说明有手挡住{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(50);HAL_TIM_PWM_Stop(&htim3, TIM_CHANNEL_1);//PWM停止输出}else{DistanceCounter=0;Pluse_Time=500;//0.5ms高电平脉冲,用于控制舵机转到0度if(Old_Pluse_Time!=Pluse_Time){for(int i=0;i<2;i++){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输出{/* PWM generation Error */while(1);}HAL_Delay(300);//等待300msHAL_TIM_PWM_Stop(&htim3, TIM_CHANNEL_1);//PWM停止输出}		}			}Old_Pluse_Time=Pluse_Time;}/* USER CODE END 3 */
}
/* TIM3 init function */
void MX_TIM3_Init(void)
{TIM_MasterConfigTypeDef sMasterConfig = {0};TIM_OC_InitTypeDef sConfigOC = {0};htim3.Instance = TIM3;htim3.Init.Prescaler = 71;htim3.Init.CounterMode = TIM_COUNTERMODE_UP;htim3.Init.Period = 19999;htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;if (HAL_TIM_PWM_Init(&htim3) != HAL_OK){Error_Handler();}sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK){Error_Handler();}sConfigOC.OCMode = TIM_OCMODE_PWM1;sConfigOC.Pulse = Pluse_Time;//通过引入变量,方便调整占空比,高电平时间,单位ussConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;if (HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_1) != HAL_OK){Error_Handler();}HAL_TIM_MspPostInit(&htim3);}

五.实验效果视频

STM32F103单片机+舵机+超声波模块智能垃圾桶模型效果

六.小结

融合了舵机,超声波模块的控制,对STM32的单片机的定时器PWM功能,定时器功能有更深的了解。

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

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

相关文章

灵足时代:具身智能核心部件的新秀崛起——解析数千万元天使轮融资

在智能科技日新月异的今天,具身智能作为连接物理世界与数字世界的重要桥梁,正逐步成为科技创新的前沿阵地。近日,具身智能核心部件领域的新锐公司——“灵足时代”宣布完成数千万元天使轮融资,这一消息无疑为行业内外带来了强烈的震撼与期待。本轮融资由雅瑞智友科学家基金…

计算机组成原理(笔记6阵列乘法器、补码阵列乘法器)

手算阵列乘法器 平时我们计算乘法的时候是手算的 平时手算过程中我们是进行平行移位&#xff0c;可是在计算机里平行移位&#xff0c;会带来更大的开销&#xff0c;如下图我们可以看到&#xff0c;为此聪明的人&#xff0c;设计了斜移位的计算机 值得注意的是最后一行用的是平…

学籍管理平台|在线学籍管理平台系统|基于Springboot+VUE的在线学籍管理平台系统设计与实现(源码+数据库+文档)

在线学籍管理平台系统 目录 基于SpringbootVUE的在线学籍管理平台系统设计与实现 一、前言 二、系统功能设计 三、系统实现 四、数据库设计 1、实体ER图 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#xff1a;✌️大…

Thinkphp/Laravel旅游景区预约系统的设计与实现

目录 技术栈和环境说明具体实现截图设计思路关键技术课题的重点和难点&#xff1a;框架介绍数据访问方式PHP核心代码部分展示代码目录结构解析系统测试详细视频演示源码获取 技术栈和环境说明 采用PHP语言开发&#xff0c;开发环境为phpstudy 开发工具notepad并使用MYSQL数据库…

Qt的互斥量用法

目的 互斥量的概念 互斥量是一个可以处于两态之一的变量:解锁和加锁。这样&#xff0c;只需要一个二进制位表示它&#xff0c;不过实际上&#xff0c;常常使用一个整型量&#xff0c;0表示解锁&#xff0c;而其他所有的值则表示加锁。互斥量使用两个过程。当一个线程(或进程)…

MySQL 库的操作

温馨提示&#xff1a;非特殊情况不要删除和随意修改数据库 清除MySQL历史命令&#xff1a;system clear 增删数据库 增删数据库 登录MySQL&#xff1a;mysql -u root -pMySQL数据目录&#xff1a;/var/lib/mysql查看当前数据库列表&#xff1a;show databases;创建数据库&#…

代码随想录 | Day26 | 二叉树:二叉搜索树中的插入操作删除二叉搜索树中的节点修剪二叉搜索树

代码随想录 | Day26 | 二叉树&#xff1a;二叉搜索树中的插入操作&&删除二叉搜索树中的节点&&修剪二叉搜索树 主要学习内容&#xff1a; 二叉搜索树的插入删除操作 701.二叉搜索树中的插入操作 701. 二叉搜索树中的插入操作 - 力扣&#xff08;LeetCode&…

CSS3练习--电商web

免责声明&#xff1a;本文仅做分享&#xff01; 目录 小练--小兔鲜儿 目录构建 SEO 三大标签 Favicon 图标 布局网页 版心 快捷导航&#xff08;shortcut&#xff09; 头部&#xff08;header&#xff09; logo 导航 搜索 购物车 底部&#xff08;footer&#xff0…

C(九)while循环 --- 军训匕首操情景

匕首操&#xff0c;oi~oi~oi~~~~~ 接下来的几篇推文&#xff0c;杰哥记录的是三大循环结构的运行流程及其变式。 本篇的主角是while循环。&#x1f449; 目录&#xff1a; while循环 的组成、运行流程及其变式关键字break 和 continue 在while 循环中的作用while 循环的嵌套题目…

微信小程序 图片的上传

错误示范 /*从相册中选择文件 微信小程序*/chooseImage(){wx.chooseMedia({count: 9,mediaType: [image],sourceType: [album],success(res) {wx.request({url:"发送的端口占位符",data:res.tempFiles[0].tempFilePath,method:POST,success(res){//请求成功后应该返…

搜索引擎相关的一段实习经历

0 前言 就是跟搜索相关的一段经历。主要工作就是建立倒排索引库相关的一些简单内容。 又翻到了以前的工作&#xff0c;权作纪念。 就是简单的封装cpp的库供python语言调用。 反正就是很多版本问题等等吧各种鬼问题。 我感觉这个思路可能还是待考证。 跨语言的调用我感觉还是不…

STM32 Hal库SDIO在FATFS使用下的函数调用关系

STM32 Hal库SDIO在FATFS使用下的函数调用关系 本文并不将FATFS的相关接口操作&#xff0c;而是将HAL在使用FATFS通过SDIO外设管理SD卡时&#xff0c;内部函数的调用逻辑&#xff0c;有助于当我们使用CUBEMX生成FATFS读取SD卡的代码时无法运行时Debug。本文也会说明一些可能出现…

Study--Oracle-09--部署Openfiler存储服务器

一路走来,所有遇到的人,帮助过我的、伤害过我的都是朋友,没有一个是敌人。 免费的存储服务器软件有FreeNAS 和 Openfiler。 其中Freenas的网站上只有i386及amd64的版本,也就是说Freenas不能支持64位版本的Intel CPU,而Openfiler则提供更全面的版本支持,在其网站上…

一个真实可用的登录界面!

需要工具&#xff1a; MySQL数据库、vscode上的php插件PHP Server等 项目结构&#xff1a; login | --backend | --database.sql |--login.php |--welcome.php |--index.html |--script.js |--style.css 项目开展 index.html&#xff1a; 首先需要一个静态网页&#x…

Linux线程(七)线程安全详解

当我们编写的程序是一个多线程应用程序时&#xff0c;就不得不考虑到线程安全的问题&#xff0c;确保我们编写的程序是一个线程安全&#xff08;thread-safe&#xff09;的多线程应用程序&#xff0c;什么是线程安全以及如何保证线程安全&#xff1f;带着这些问题&#xff0c;本…

zookeeper选举kafka集群的controller

zookeeper选举kafka集群的controller目录 文章目录 zookeeper选举kafka集群的controller目录前言一、实操体验controller的选举二、模拟controller选举四、删除controller节点 前言 kafka集群的controller是kafka集群中一个有特殊作用的broker&#xff0c;负责整个kafka集群的…

数据结构--线性表(顺序结构)

1.线性表的定义和基本操作 1.1线性表以及基本逻辑 1.1.1线性表 &#xff08;1&#xff09;n(>0)个数据元素的有限序列&#xff0c;记作&#xff08;a1,a2,...an&#xff09;&#xff0c;其中ai是线性表中的数据元素&#xff0c;n是表的长度。 &#xff08;2&#xff09;…

Redis数据库与GO(二):list,set

一、list&#xff08;列表&#xff09; list&#xff08;列表&#xff09;是简单的字符串列表&#xff0c;按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。List本质是个链表&#xff0c; list是一个双向链表&#xff0c;其元素是有序的&#xff0c;元…

51单片机系列-串口(UART)通信技术

&#x1f308;个人主页&#xff1a; 羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” 并行通信和串行通信 并行方式 并行方式&#xff1a;数据的各位用多条数据线同时发送或者同时接收 并行通信特点&#xff1a;传送速度快&#xff0c;但因需要多根传输线&#xf…

计算机视觉学习路线:从基础到进阶

计算机视觉学习路线&#xff1a;从基础到进阶 计算机视觉&#xff08;Computer Vision&#xff09;是人工智能和机器学习领域中重要的分支&#xff0c;致力于让计算机能够理解和分析图像、视频等视觉信息。随着深度学习的发展&#xff0c;计算机视觉的应用变得越来越广泛&…