5328| 5
|
[项目] 基于MPU6050手持稳定器 |
最近几年,各种手持云台进入了普通大众的视野,堪比专业效果的稳定拍摄体验,让手持云台一下子红火了起来,淘宝京东随便一搜,产品一大把。 前几年高大上的手持稳定器价格基本都在2000元以上,但是这几年随着稳定器技术的普及价格已经下探至1000以下。其实也是一个值得考虑入手的好东西。 当你需要保持一个物品的平衡,或者需要得到物品倾斜的角度,不妨看看下面文章,下面内容即是实现这一功能 #概述 手持稳定器是一种平衡为平台用来搭建相机的一种装置,同时它具有水平、垂直和旋转三个方向上运动的功能,在稳定器做三个方向运动的同时,它也能带动相机做相同的运动,这样就能通过控制稳定器来控制相机的运动。手持稳定器的核心问题是如何进行姿态解算和通过主控单元去控制舵机的转动,所以本文的重点介绍了姿态解算过程如何灵活的控制舵机的运转,从而达到灵活控制的目的。本文设计的稳定器采用Arduino为主控,MPU6050作为相机端资态传感器,能够实时检测相机字体的变化及抖动量,主控单元根据传感器数据对舵机进行控制。 附上制作视频: 根据稳定器的功能要求,本文所构建的云台控制系统主要由主控单元、姿态模块、舵机驱动、电源模块组成。 反馈是一个过程: 1、设定目标,对小朋友走路的例子来说,就是前进的路线。 2、测量状态,小朋友的眼睛看着路,就是在测量自己的前进方向。 3、将测量到的状态和设定的目标比较,把眼睛看到的前进方向和心里想的前进方向作比较,判断前进方向是否正确;如果不正确,相差有多少。 4、调整行动,在心里根据实际前进方向和设定目标的偏差,决定调整的量。 5、实际执行,也就是实际挪动脚步,重回正确的前进方向。 在整个走路的过程中,这个反馈过程周而复始,不断进行,这样,小朋友就不会走得东倒西歪了。 而在之前的很多比赛过往作品中我们也见到了PID的实际用于反馈控制的效果。 MPU6050是一种非常流行的空间运动传感器芯片,可以获取器件当前的三个加速度分量和三个旋转角速度。由于其体积小巧,功能强大,精度较高,不仅被广泛应用于工业,同时也是航模爱好者的神器,被安装在各类飞行器上驰骋蓝天。当然,随着Arduino开发板的普及,许多朋友希望能够自己制作基于MPU6050的控制系统,但由于缺乏专业知识而难以上手。那么接下我们来讲解让如何用arduino与MPU6050通信。 为避免纠缠于电路细节,我们直接使用集成的MPU6050模块。MPU6050的数据接口用的是I2C总线协议,因此我们需要Wire程序库的帮助来实现Arduino与MPU6050之间的通信。请先确认你的Arduino编程环境中已安装Wire库。Wire库的官方文档中指出。在UNO板子上,SDA接口对应的是A4引脚,SCL对应的是A5引脚。MPU6050需要5V的电源,可由UNO板直接供电。按照下图连线。 通过处理arduino使用六轴姿态传感器得到的原始数据,得到空间俯仰、滚转、偏航三个方向的倾斜角度,进而arduino控制舵机的角度,达到自我平衡的效果,当然这里也可以使用LCD、OLED等输出俯仰、滚转、偏航三个方向的倾斜角度。 /***************舵机篇***************/ 结构组成 舵机实际上是一种位置伺服的驱动器,主要是由外壳、电路板、无核心马达、齿轮与位置检测器所构成。 舵机内部有一个基准电路,产生周期为20ms、宽度为1.5ms的基准信号,将获得的直流偏置电压与电位器的电压比较,获得电压差输出。经过电路板IC方向判断,再驱动无核心马达开始转动,透过减速齿轮将动力传至摆臂,同时由位置检测器送回信号,判断是否已经到位。 舵机转动的角度是通过调节PWM「脉冲宽度调制」信号的占空比来实现的。标准的PWM信号的周期固定为20ms,理论上脉宽分布应该在1ms到2ms之间,实际上可由0.5ms到2.5ms之间,脉宽与转角0°—180°相对应。 舵机一般都外接三根线,分别用棕、红、橙三种颜色进行区分,由于品牌不同,颜色也会有所差异,棕色为接地线,红色为电源正极线,橙色为信号线。 接好线的我们就可以开始编写程序啦~ /***************软件篇***************/ 首先,我们引入了MPU6050传感器和舵机的库文件。该库文件负责Arduino和MPU6050传感器之间的SPI通信功能。 [mw_shl_code=c,false]#include "Wire.h" #include "I2Cdev.h" #include "MPU6050.h" #include <Servo.h>[/mw_shl_code] 然后创建了一个名为Servo myservo的变量,这个变量使得我们可以使用舵机库的功能,然后设置Arduino的数字针为舵机控制针脚。 [mw_shl_code=c,false]Servo myservo; //创建一个舵机控制对象 Servo myservo2; //创建一个舵机控制对象 Servo myservo3; //创建一个舵机控制对象[/mw_shl_code] 创建一个传感器的名称和类型的变量:MPU6050,这个变量也是帮助能使用库文件的功能。然后我们对一些变量进行了初始化,我们将用它来测量MPU6050传感器的输出。 [mw_shl_code=c,false]int16_t ax, ay, az, gx, gy, gz; float aax=0, aay=0,aaz=0, agx=0, agy=0, agz=0; long axo = 0, ayo = 0, azo = 0; long gxo = 0, gyo = 0, gzo = 0; [/mw_shl_code] [mw_shl_code=c,false]Px = Px + 0.0025; Kx = Px / (Px + Rx); agx = agx + Kx * (aax - agx); Px = (1 - Kx) * Px; Py = Py + 0.0025; Ky = Py / (Py + Ry); agy = agy + Ky * (aay - agy); Py = (1 - Ky) * Py; Pz = Pz + 0.0025; Kz = Pz / (Pz + Rz); agz = agz + Kz * (aaz - agz); Pz = (1 - Kz) * Pz;[/mw_shl_code] 最后,使用Serial.print函数,我们可以在串行监视器上打印Roll、Pitch和Yaw值,看看传感器是否正常工作。 感兴趣的朋友可以试一试噢 代码下载 关注微信公众号“KIDLINTEACH创客实验室”,回复“手持稳定器”获取完整代码。 |
© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed