传感器模块编程实践(四)舵机+MPU6050陀螺仪模块融合云台模型

文章目录

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

一.概要

云台主要用来固定摄像头。准确地说,云台是一种可以多角度调节的支撑设备,类似于人的脖子可以支撑着脑袋,并通过转动来调节视野。
云台电机可以被用于相机、无人机和摄像机等设备上,以实现平滑稳定的拍摄效果,无人机在飞行过程中,尤其是遇到风力干扰或进行复杂飞行动作时,机身容易产生震动和晃动。而云台的存在可以有效地隔离这些抖动,保证挂载在上面的相机或摄像头能够拍摄出稳定、清晰的画面。这对于航拍、侦察、监测等需要高质量影像的任务至关重要。

本文就做了一个简单的云台模型,采用STM32F103C8T6单片机+舵机+陀螺仪模块,实现一个简易云台,随着陀螺仪模块倾斜多少度,舵机就转动到多少度。

在这里插入图片描述

二.实验模型原理

1.硬件连接原理框图

在这里插入图片描述

模型主要分为三部分:主芯片单元,倾斜测量单元,执行动作单元。

在这里插入图片描述

图中主控芯片为STM32F103C8T6单片机,倾斜测量为MPU6050陀螺仪模块,执行传感器为SG90舵机。

信号线连接:MPU6050陀螺仪模块信号脚SCL脚接到单片机的PB10脚,SDA脚接到单片机的PB11脚。SG90(180度)舵机的信号脚橙色线接到单片机的PA6脚。

2.控制原理

陀螺仪模块测量模块跟水平方向的夹角,如果大于0度,单片机驱动舵机也转到响应的角度,如果陀螺仪模块的倾斜角度没有变化,舵机角度保持不变,如果陀螺仪模块回到0度,舵机也相应转到0度。

陀螺仪模块测倾角原理:

MPU6050含3轴的加速度与3轴的陀螺仪,我们只要取单轴的加速度值,就能计算在某一方向上的倾斜角度。
在这里插入图片描述

舵机控制原理:
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.单片机先通过IIC口读取陀螺仪的角度。

2.计算陀螺仪的倾斜角度,如果有倾斜,驱动PA6引脚输出20ms周期控制舵机旋转到响应的角度。

3.如果倾斜角度回到0,控制舵机旋转到0度。

四.云台模型程序

板子与MPU6050陀螺仪模块用杜邦线连接:
板子G-----模块GND
板子3.3---模块VCC
板子B10---模块SCL
板子B11---模块SDA板子与SG90舵机(180度舵机)用杜邦线连接:
板子5V----红色线
板子A6----橙色线
板子G-----棕色线

USB线需要接小系统板,给板子供5V。
在这里插入图片描述

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

配置IIC引脚
在这里插入图片描述

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

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

添加代码

在这里插入图片描述

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

主要程序:

short Accel[3];
short Gyro [3];
short Temp;
float AccelData[3];//单位g
float GyroData[3];//单位mdps
/* USER CODE END PFP *//* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
uint16_t Pluse_Time=1000;//1毫秒脉冲,单位是ustypedef struct Angle
{double X_Angle;double Y_Angle;double Z_Angle;} MPU6050_Angle;
MPU6050_Angle data;
double Angle_Old;
/****************************************************************************** 
* 函数介绍: 计算 x, y, z 三轴的倾角 
* 输入参数: 无 
* 输出参数: data:角度结构体 
* 返回值 : 无 
******************************************************************************/
void MPU6050_Get_Angle(MPU6050_Angle *data)
{   /* 计算x, y, z 轴倾角,返回弧度值*/data->X_Angle = acos(AccelData[0]/1000);data->Y_Angle = acos(AccelData[1]/1000);data->Z_Angle = acos(AccelData[2]/1000);/* 弧度值转换为角度值 */data->X_Angle = data->X_Angle * 57.29577;data->Y_Angle = data->Y_Angle * 57.29577;data->Z_Angle = data->Z_Angle * 57.29577;
} /*** 函数功能: 读取MPU6050的加速度数据* 输入参数: 无* 返 回 值: 无* 说    明: 无*/ 
void MPU6050ReadAcc(short *accData)
{uint8_t buf[6];MPU6050_ReadData(MPU6050_ACC_OUT, &buf[0], 6);accData[0] = (buf[0] << 8) | buf[1];accData[1] = (buf[2] << 8) | buf[3];accData[2] = (buf[4] << 8) | buf[5];
}/* 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_I2C2_Init();//IIC初始化MX_TIM3_Init();//配置定时器,20ms周期PWM波,初始化高电平是1msMPU6050_Init();//MPU6050初始化配置,中断使能配置if(MPU6050ReadID() == 0)//读取MPU6050 ID{	while(1);}/* USER CODE BEGIN 2 */if (HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1) != HAL_OK)//PA6脚PWM输出{/* PWM generation Error */while(1);}Pluse_Time=500;//0.5ms高电平脉冲,用于控制舵机转到0度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停止输出	/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */MPU6050ReadAcc(Accel);//读取加速度数据for( int i=0;i<3;i++){if(Accel[i]>=0){AccelData[i]=Accel[i]*2000/32768;//转换成单位mg}else{AccelData[i]=-(-Accel[i]+1)*2000/32768;}	}	MPU6050_Get_Angle(&data);//计算倾角,通过X_Angle来控制舵机转角if(abs((int)Angle_Old-(int)data.X_Angle)>3)//当前角度与存储的角度差值大于3度,进行动作,主要是防止手抖动{	//以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+((float)data.X_Angle/18)*200;//高电平时间=0.5ms+(角度/180°)×2msHAL_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(50);HAL_TIM_PWM_Stop(&htim3, TIM_CHANNEL_1);//PWM停止输出	}Angle_Old=data.X_Angle;//把目前读到的角度值存下来,以便下次比较使用}/* USER CODE END 3 */
}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;sConfigOC.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);}

五.实验效果视频

演示效果

六.小结

融合了舵机,陀螺仪模块的控制,对STM32的单片机的定时器PWM功能,IIC通讯,陀螺仪的产品有更深的了解。

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

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

相关文章

Leetcode 删除链表倒数第 N 个节点

算法思想&#xff1a; 使用了双指针法。下面是详细的算法思想&#xff1a; 1. 引入虚拟头节点&#xff08;dummy node&#xff09; 为了处理链表的一些边界情况&#xff08;比如删除头节点&#xff09;&#xff0c;我们在链表的头部引入了一个虚拟节点 dummy&#xff0c;并让…

【AAOS】Android Automotive 9模拟器源码下载及编译

源码下载 repo init -u https://android.googlesource.com/platform/manifest -b android-9.0.0_r61 repo sync -c --no-tags --no-clone-bundle 源码编译 source build/envsetup.sh lunch aosp_car_x86_64-userdebug make -j8 运行效果 emulator Home界面 MAP All apps S…

ATX和ITX有什么区别?

ATX&#xff08;Advanced Technology eXtended&#xff09;和 ITX&#xff08;Information Technology eXtended&#xff09;是两种常见的主板规格&#xff0c;它们之间存在几个关键的区别&#xff0c;主要体现在版型尺寸、配置功能以及适用范围上。 ATX主板与ITX主板的对比 …

前端环境搭建一览记录

文章目录 写在前面Nodejs下载Nodejs介绍Nodejs下载方式nvm安装:安装Homebrew&#xff08;安装器&#xff09;(打开终端&#xff0c;输入下面的脚本)安装nvm验证安装是否成功配置环境内容查看环境内容刷新配置 nvm 使用如何使用nvm ls 查看当前安装的版本nvm use versionId 切换…

精益生产现场管理和改善:从知识到实操的落地

在制造业的广阔天地中&#xff0c;精益生产作为一种追求浪费最小化、效率最大化的生产管理模式&#xff0c;已成为众多企业转型升级的关键路径。本文&#xff0c;深圳天行健企业管理咨询公司将从精益生产现场管理和改善的理论知识出发&#xff0c;深入探讨其从理念导入到实操落…

SQL自学:什么是SQL的聚集函数,如何利用它们汇总表的数据

在 SQL&#xff08;Structured Query Language&#xff0c;结构化查询语言&#xff09;中&#xff0c;聚集函数也称为聚合函数&#xff0c;是对一组值进行计算并返回单一值的函数。 一、常见的聚集函数及功能 1. AVG()&#xff1a;用于计算某一列的平均值。 例如&#xff0c;…

【安装JDK和Android SDK】

安装JDK和Android SDK 1 前言2 下载2.1 下载途径2.2 JDK下载和安装2.2.1 下载2.2.2 安装并配置环境变量2.2.3 验证 2.3 SDK下载和安装2.3.1 下载2.3.2 安装2.3.3 环境变量配置2.3.4 验证 1 前言 在软件开发中&#xff0c;Android应用开发通常使用Android Studio&#xff0c;但…

Windows 搭建 Gitea

一、准备工作 1. 安装 Git&#xff1a;Gitea 依赖 Git 进行代码管理&#xff0c;所以首先需要确保系统中安装了 Git。 下载地址&#xff1a;https://git-scm.com/downloads/win 2. 安装数据库&#xff08;可选&#xff09; 默认情况下&#xff0c;Gitea 使用 SQLite 作为内…

springboot 前后端处理日志

为了实现一个高效且合理的日志记录方案&#xff0c;我们需要在系统架构层面进行细致规划。在某些情况下&#xff0c;一个前端页面可能会调用多个辅助接口来完成整个业务流程&#xff0c;而并非所有这些接口的交互都需要被记录到日志中。为了避免不必要的日志开销&#xff0c;并…

基于STM32的简易交通灯proteus仿真设计(仿真+程序+设计报告+讲解视频)

基于STM32的简易交通灯proteus仿真设计(仿真程序设计报告讲解视频&#xff09; 仿真图proteus 8.9 程序编译器&#xff1a;keil 5 编程语言&#xff1a;C语言 设计编号&#xff1a;C0091 **1.**主要功能 功能说明&#xff1a; 以STM32单片机和数码管、LED灯设计简易交通…

无人自助超市系统小程序源码开发

随着科技的飞速发展和消费模式的转变&#xff0c;无人自助超市作为一种新兴的商业模式&#xff0c;以其便捷性、高效率以及对“体验式购物”的完美诠释&#xff0c;受到了广泛关注。本文renxb001将深入探讨无人自助超市系统小程序源码开发的核心环节和技术要点。 一、系统需求分…

RNN--详解

RNN 1. 概述 循环神经网络 (Recurrent Neural Network, RNN) 是一种专门用于处理序列数据的神经网络模型。与传统的前馈神经网络不同&#xff0c;RNN 具有循环结构&#xff0c;能够处理时间序列和其他顺序依赖的数据。其关键在于可以利用前一个时刻的信息&#xff0c;通过隐状…

红帽7—Mysql路由部署

MySQL Router 是一个对应用程序透明的InnoDB Cluster连接路由服务&#xff0c;提供负载均衡、应用连接故障转移和客户端路 由。 利用路由器的连接路由特性&#xff0c;用户可以编写应用程序来连接到路由器&#xff0c;并令路由器使用相应的路由策略 来处理连接&#xff0c;使其…

Jedis多线程环境报错:redis Could not get a resource from the pool 的主要原因及解决办法。

本篇文章主要讲解&#xff0c;Jedis多线程环境报错&#xff1a;redis Could not get a resource from the pool 的主要原因及解决办法。 作者&#xff1a;任聪聪 日期&#xff1a;2024年10月6日01:29:21 报错信息&#xff1a; 报文&#xff1a; redis Could not get a resou…

云原生日志ELK( logstash安装部署)

logstash 介绍 LogStash由JRuby语言编写&#xff0c;基于消息&#xff08;message-based&#xff09;的简单架构&#xff0c;并运行在Java虚拟机 &#xff08;JVM&#xff09;上。不同于分离的代理端&#xff08;agent&#xff09;或主机端&#xff08;server&#xff09;&…

Spring Boot驱动的现代医院管理系统

1系统概述 1.1 研究背景 如今互联网高速发展&#xff0c;网络遍布全球&#xff0c;通过互联网发布的消息能快而方便的传播到世界每个角落&#xff0c;并且互联网上能传播的信息也很广&#xff0c;比如文字、图片、声音、视频等。从而&#xff0c;这种种好处使得互联网成了信息传…

【斯坦福CS144】Lab5

一、实验目的 在现有的NetworkInterface基础上实现一个IP路由器。 二、实验内容 在本实验中&#xff0c;你将在现有的NetworkInterface基础上实现一个IP路由器&#xff0c;从而结束本课程。路由器有几个网络接口&#xff0c;可以在其中任何一个接口上接收互联网数据报。路由…

【uniapp小程序】使用cheerio去除字符串中的HTML标签并获取纯文本内容

【uniapp小程序】使用cheerio去除字符串中的HTML标签并获取纯文本内容 参考资料安装引入使用 参考资料 【博主&#xff1a;AIpoem】uniapp小程序 使用cheerio处理网络请求拿到的dom数据 cheerio文档&#xff1a;https://github.com/cheeriojs/cheerio/wiki/Chinese-README 安…

Sequelize 做登录查询数据

在 Sequelize 中处理登录请求通常意味着你需要根据提供的用户名或电子邮件以及密码来查询数据库中的用户。由于密码在数据库中应该是以哈希形式存储的&#xff0c;因此你还需要验证提供的密码是否与存储的哈希密码匹配。 以下是一个简单的例子&#xff0c;展示了如何使用 Sequ…

SpringBoot美发门店系统:提升服务质量

摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了美发门店管理系统的开发全过程。通过分析美发门店管理系统管理的不足&#xff0c;创建了一个计算机管理美发门店管理系统的方案。文章介绍了美发门店管理系统的系…