简易云台制作记录(内含MPU6050角度的求法)
开发板:STM32F103RCT6最小系统开发板
舵机 :SG90
运动处理传感器 : MPU-6050
云台
云台是安装、固定摄像机的支撑设备,固定云台可以用来调整摄像机的水平和俯仰的角度,电动云台由电动机接受来自控制器的信号精确的定位,可以扫描监视区域。
舵机
舵机是一种位置(角度)伺服的驱动器,适用于需要角度不断变化并可以保持的控制系统。
实现效果
在本项目中,MPU6050与舵机的结合无论处于什么位置,舵机上的扇叶始终保持与地面水平。
舵机处理:
舵机有三条导线:电源、地和控制线。
舵机的控制信号是PWM信号,利用占空比的变化,改变舵机的位置。
本次设计中使用TIM3_CH3输出PWM波形改变舵机的位置。代码的编写还是比较简单的,我首先使用按键控制改变PWM的占空比,观察舵机的而变化,脉冲方波信号的周期为20ms,按键每按下一次,高电平的时间增加0.1ms,测试发现当0.5ms时舵机位置开始变化,每按下一次,位置变化一丢丢,当到2.3的时候回旋转一圈,但没有返回刚开始的位置,并且此时舵机有一种卡住的感觉,当高电平的时间继续增加到2.5ms时,舵机恢复到刚开始的位置,具体的原因我还没有搞清楚。
这里还有一个需要注意的问题,可能也是我习惯不好,刚开始我搞了一会儿发现舵机的变化极其不规律,因为我平常只使用烧录器给开发板供电。而舵机需要的电压在4-6V,虽然插在了5V的引脚上,但供电仍然不够,之后使用USB线给开发板供电之后才测试出来了这些结果。
MPU-6050分析
RA是要读或写的寄存器的地址。
IIC协议:
本项目使用软件模拟I2C的电平变化传输数据。需要编写出起始信号、终止信号、应答、非应答、传或接收一个字节、传输或接受多个字节的函数,这些函数网上很多,也并不复杂,因此不在赘述。
当MPU6050做从机时,当AD0为低电平时,MPU6050的地址为0x68,为高电平时为0x69。也可以通过读WHO_AM_I寄存器得到器件ID,
下面列出一下常用的MPU6050寄存器的地址
/***********************************************************************/
//寄存器地址
#define MPU6050_PWR 0x6b //电源
#define MPU6050_SMPLRT_DIV 0x19 //取样时钟
#define MPU6050_CONFIG 0x1a //低通滤波
#define MPU6050_GYRO_CONFIG 0x1b //陀螺仪量程(bit3,4)(0-250,1-500,2-1000,3-2000)
#define MPU6050_ACCEL_CONFIG 0x1c //加速度计量程(bit3,4)(0-2g,1-4g,2-8g,3-16g)#define MPU6050_RA_TITO_EN 0X23 //设备各种FIFO使能
#define MPU6050_RA_INT_ENABLE 0X38 //中断使能
#define MPU6050_RA_INT_PIN_CFG 0X37 //中断引脚配置寄存器
#define MPU6050_RA_USER_CTRL 0X6A //使能FIFO缓存区、I2C主机模式喝主要接口
#define MPU6050_RA_PWR_MGMT_1 0X6B //用户配置电源模式和时钟源
#define MPU6050_RA_PWR_MGMT_2 0X6C //允许用户配置加速度计在低功耗模式下换器的频率#define MPU6050_DEVICE_ID_REG 0x75 //WHO_AM_I寄存器#define MPU6050_RA_ACCEL_XOUT_H 0x3B //加速度
#define MPU6050_RA_ACCEL_XOUT_L 0x3C
#define MPU6050_RA_ACCEL_YOUT_H 0x3D
#define MPU6050_RA_ACCEL_YOUT_L 0x3E
#define MPU6050_RA_ACCEL_ZOUT_H 0x3F
#define MPU6050_RA_ACCEL_ZOUT_L 0x40#define MPU6050_RA_TEMP_OUT_H 0x41 //温度
#define MPU6050_RA_TEMP_OUT_L 0x42#define MPU6050_RA_GYRO_XOUT_H 0x43 //转速陀螺仪
#define MPU6050_RA_GYRO_XOUT_L 0x44
#define MPU6050_RA_GYRO_YOUT_H 0x45
#define MPU6050_RA_GYRO_YOUT_L 0x46
#define MPU6050_RA_GYRO_ZOUT_H 0x47
#define MPU6050_RA_GYRO_ZOUT_L 0x48/****************************************************************************************************/
下面时MPU6050的初始化函数
//初始化MPU6050
//返回值: 0,成功
// 其他,错误代码
u8 MPU_Init(void)
{u8 res;IIC_Init();//初始化IIC总线I2C_Write_Byte(MPU6050_PWR,0X80);//复位MPU6050delay_ms(100);I2C_Write_Byte(MPU6050_PWR,0X00);//唤醒MPU6050MPU_Set_Gyro_Fsr(3); //陀螺仪传感器,±2000dps
// MPU_Set_Accel_Fsr(0); //加速度传感器 ±2gMPU_Set_Rate(50); //设置采样率50HZI2C_Write_Byte(MPU6050_RA_INT_ENABLE,0X00); //关闭所有中断I2C_Write_Byte(MPU6050_RA_USER_CTRL,0X00);//I2C主模式关闭I2C_Write_Byte(MPU6050_RA_TITO_EN,0X00);//关闭FIFOI2C_Write_Byte(MPU6050_RA_INT_PIN_CFG,0X80);//INT引脚低电平有效res=I2C_Read_Byte(MPU6050_DEVICE_ID_REG);if(res==(u8)MPU_ADDR)//器件ID正确{I2C_Write_Byte(MPU6050_RA_PWR_MGMT_1,0X01);//设置CLKSEL,PLL X 轴为参考I2C_Write_Byte(MPU6050_RA_PWR_MGMT_2,0X00);//加速度陀螺仪都工作MPU_Set_Rate(50); //设置采样率为50HZ}else return 1;return 0;
}
初始化完成后读温度、陀螺仪、加速度计可得到相对应的值。
下面说一下云台的实现,通过读取到的这些数据可以得到三个角度:偏航角(Yaw)、俯仰角(Pitch)、横滚角(Roll)。
本次简易云台的实现只使用了俯仰角来实现。其实具体使用哪个角完全看你的MPU6050怎么和云台结合。通过我之前使用按键可以找到数字舵机旋转一周改变的PWM的范围,然后找到平衡时候的PWM,而云台转动的过程中,通过MPU6050得到的角度,乘上旋转一度需要的PWM弥补回来,就可以一直达到平衡的效果
代码实现非常简单
TIM_SetCompare3(TIM3,(2300-Angle_y*12));
这里2300和12都是通过自己的实验得到的。
下面简单介绍一下如何通过加速度计得到俯仰角和横滚角。
根据百度百科的定义,atan2(y,x)所表达的意思是坐标原点为起点,指向(x,y)的射线在坐标平面上与x轴正方向之间的角的角度。而俯仰角是机体坐标系y轴与水平面的夹角。因此利用图中最下面的公式便可以求出来俯仰角和横滚角,
而偏航角的求值我是利用陀螺仪求出角速度,然后利用定时器计算时间,对角速度积分求得的,最后,云台的实现要看MPU6050如何与舵机结合,然后才能确定需要使用哪一个角度,但这样求得的角度可能会没有那么准确,但对于一个简易的云台来说,完全足够了。经过亲自测试。效果还行。
以后有机会了,学习一下卡尔曼滤波之类的MPU6050的角度求法。
配套源码
https://download.csdn.net/download/weixin_44845857/20377503
简易云台制作记录(内含MPU6050角度的求法)相关推荐
- Xd设计与制作记录贴:记录我的艺术设计基础期末大作业
Xd设计与制作记录贴:记录我的艺术设计基础期末大作业 通过艺术设计基础这门课的学习,我掌握了一些PPT的制作技巧和Xd入门操作方法. 期末大作业是要根据以前课上讨论的主题做一个能展现自己设计思路的工程 ...
- 浅析简易网页制作的准备工作
还记得最初开始网页制作的时候还是新手,面对自己第一个网页制作无论是网页设计还是制作流程都十分上心.对于一个新手来说,网页制作需要充分了解它的制作流程和准备工作,那么网页制作究竟都要涉及哪些方面准备呢? ...
- 如何在python制作计算器_Python简易计算器制作方法代码详解
主要用到的工具是Python中的Tkinter库 比较简单 直接上图形界面和代码 引用Tkinter库 from tkinter import * 建立主窗口对象 window=Tk() #设置窗口对 ...
- kali木马 简易木马制作与应用
Kali--木马(一) 学习web渗透过程中的心得体会以及知识点的整理,方便我自己查找,也希望可以和大家一起交流. -- 简易木马制作与应用 -- 一.流程 首先确定靶机和攻击主机可以连通 利用msf ...
- 华为小熊派开发记录STM32+MPU6050+WIFI8266
华为小熊派开发记录STM32+MPU6050+WIFI8266 前言 STM32CubeMX+MDK+LiteOS MPU6050 WIFI8266 华为云使用 其它 前言 忽悠下参加了物联网开发比赛 ...
- 基于DOS的简易俄罗斯方块制作
制作一个简易的俄罗斯方块,未调用graphics库(装了半天不成功),完全的黑框操作 基本思路: 1.利二维数组表示地图(也可以利用一维数组,此处利用的是一维数组) 0.表示没有方格,1.表示正在下落 ...
- 程序源码分享-51单片机用LCD1602显示MPU6050角度数据
硬件方面选择的是51单片机,显示屏LCD1602,姿态传感器MPU6050的型号为维特智能的JY60,具体设计思路见笔者的文章基于单片机的云台姿态测量系统设计. STM32将mpu6050的数据DAC ...
- HTML5 form表单 调查问卷制作(内含超详细代码解读)
HTML 表单技术练习:制作调查问卷(内含超详细代码解读) 这一篇来记录HTML5表单API的学习,以制作调查问卷为例,效果如图: 注:完整代码见文章末尾处. 一.表单标签form 1.常用属性 常用 ...
- 粘贴铜箔简易实验电路制作
▌01 简易电路 在博文 单管发报机的神奇之处-身兼两职 中,显示作者使用粘贴铜箔的方式制作简易发报机电路. 不过作为高频电路,这种制作只是为了显示电路的工作原理,但对于电路工作本身会产生很大的干扰和 ...
最新文章
- CoGAN pytorch
- IEEE Fellow、AI大牛田奇加入华为云!他为何而来?“加速AI基础研究落地”
- applet操作本地文件
- C#关于MSMQ通过HTTP远程发送专有队列消息的问题
- X5开发中buttongrounp对应contents组件切换时速度快点无效
- m5310模组数据上传至onenet_基于Semtech SX1276RF1KAS SPI模组及ATMEGA328架构下之烟雾气体感测方案...
- Leetcode392.判断子序列
- 【数据结构】从零实现顺序表+链表相关操作
- 快速解决win7系统Aero主题无法使用
- windows系统IP地址、localhost、127.0.0.1 、0.0.0.0和 本机IP区别
- 运行时 Entry name .... .. collided
- linux下载百度网盘
- html图片在wps中不显示文字大小,WPS文字插入图片显示不全怎么办 WPS文字插入图片显示不完整的解决方法...
- 无限极分类在html怎么用,wxj.html
- Unity给手加入圆柱骨骼
- 计算机配置xp系统,教你WinXP系统如何设置一台电脑两个显示器
- 简单使用OnlyOffice
- c语言程序设计植树,c语言程序设计报告
- 从维基百科、Quora到知乎,下一代知识社交平台如何表现?
- 看看这两个最火的电商直播平台
热门文章
- SSM+科技馆预约系统 毕业设计-附源码182154
- 在linux系统下实现SHELL自动化批量备份交换机配置文件
- 变色龙给驱动打补丁实现USB驱动无需USBInjectAll.kext
- mysql安装好了怎么用_MySQL如何安装
- xmta温度控制仪说明书_XMT-7000-XMTA-7000,XMTA7000,XMTA 7000,可带通讯协议温度控制仪-XMTA-7000-余姚市浩辉自动化科技有限公司...
- 西邮Linux兴趣小组2020纳新试题
- ipscan端口扫描工具
- 四大行正在大规模内测数字货币APP 可凭手机号完成转账
- 如何启用计算机睡眠功能,教你计算机休眠如何设置
- c语言序数英文,(英语 )序数词第一至40怎么写序数词第一至40怎么写?谁帮个忙...