智能小制作(含源码、库)-自平衡云台-输出三维倾斜角度,基于mpu6050、arduino

目录

  • 智能小制作(含源码、库)-自平衡云台-输出三维倾斜角度,基于mpu6050、arduino
    • 准备知识
      • 介绍、思路
      • mpu6050六轴姿态传感器介绍
      • 其他硬件介绍
    • 制作
      • 所需材料
      • 接线
      • 库文件
    • 源代码

准备知识

介绍、思路

当你需要保持一个物品的平衡,或者需要得到物品倾斜的角度,不妨看看下面文章,下面内容即是实现这一功能

功能:
当你的立足的空间倾斜或者角度改变时,在自平衡稳定器将保持平衡或保持一定角度,防止倾斜导致不利的结果。

稍微修改也可以用于输出空间俯仰、滚转、偏航三个方向的倾斜角度

实现思路

通过处理arduino使用六轴姿态传感器得到的原始数据,得到空间俯仰、滚转、偏航三个方向的倾斜角度,进而arduino控制舵机的角度,达到自我平衡的效果,当然这里也可以使用LCD、OLED等输出俯仰、滚转、偏航三个方向的倾斜角度

示例这里使用的舵机可能或出现抖动的情况,需要要求精度,可以使用伺服电机或其他设备

mpu6050六轴姿态传感器介绍

MPU-6000为全球首例整合性6轴运动处理组件,整合了3轴陀螺仪、3轴加速器,解决了组合陀螺仪与加速器时存在的一些问题问题,还包含了内建的温度感测器、DMP(Digital Motion Processor)

DMP:可以直接输出四元数,减少复杂的融合演算数据、感测器同步化、姿势感应等的负荷

MPU-6000的角速度感测范围为±250、±500、±1000与±2000°/sec (dps),可以准确捕捉快速与慢速动作,用户可程式控制的加速器全格感测范围为±2g、±4g±8g与±16g。产品传输可透过最高至400kHz的I2C或最高达20MHz的SPI。

应用

  1. 现实增强

  2. 电子稳像 (EIS: Electronic Image Stabilization)

  3. 光学稳像(OIS: Optical Image Stabilization)

  4. 行人导航器

  5. 姿势快捷方式

  6. 平衡车

  7. 飞行器呀

  8. 双足机器人


其他硬件介绍

由于在我的其他博客已经写过,就不在这里啰嗦了

制作

所需材料

  1. Arduino
  2. mpu6050六轴姿态传感器
  3. 舵机 —或更高级的伺服电机
  4. 支架(自行选择)
  5. 杜邦线
    可选
    LCD、OLED

接线

MPU6050 引脚说明

MPU6050 引脚 Arduino引脚
VCC 5V
GND 地线
SCL MPU6050作为从机时IIC时钟线
SDA MPU6050作为从机时IIC数据线
XCL MPU6050作为主机时IIC时钟线
XDA MPU6050作为主机时IIC数据线
AD0 地址管脚,该管脚决定了IIC地址的最低一位
INT 中断引脚

在本项目中只需要接VCC、GND 、SCL、SDA

舵机引脚说明

所有的舵机都有外接三根线,分别用棕、红、橙(黄)三种颜色进行区分,由于舵机品牌不同,颜色也会有所差异,棕色为接地线,红色为电源正极线,橙(黄)色为信号线

舵机是一种位置伺服的驱动器,其工作原理是由接收机或者单片机发出信号给舵机,其内部有一个基准电路,产生周期为20ms,宽度为1.5ms 的基准信号,将获得的直流偏置电压与电位器的电压比较,获得电压差输出。经由电路板上的IC 判断转动方向,再驱动无核心马达开始转动,透过减速齿轮将动力传至摆臂,同时由位置检测器送回信号,判断是否已经到达定位。适用于那些需要角度不断变化并可以保持的控制系统。当电机转速一定时,通过级联减速齿轮带动电位器旋转,使得电压差为0,电机停止转动。一般舵机旋转的角度范围是0 度到180 度。

关于支架根据自己选择的支架安装,这里不详细说明

库文件

在我的主页文件中

说明

这两个zip文件内都包含了.h 和 .cpp文件,将两个文件解压放到arduino代码的同目录下即可正常使用

源代码

#include "Wire.h"
#include "I2Cdev.h"
#include "MPU6050.h"/*舵机*/
#include <Servo.h>
Servo myservo;  //创建一个舵机控制对象
Servo myservo2;  //创建一个舵机控制对象
// 使用Servo类最多可以控制8个舵机
MPU6050 accelgyro;unsigned long now, lastTime = 0;
float dt;                                          //微分时间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;                   //陀螺仪偏移量float pi = 3.1415926;
float AcceRatio = 16384.0;                       //加速度计比例系数
float GyroRatio = 131.0;                          //陀螺仪比例系数uint8_t n_sample = 8;                            //加速度计滤波算法采样个数
float aaxs[8] = {0}, aays[8] = {0}, aazs[8] = {0};         //x,y轴采样队列
long aax_sum, aay_sum,aaz_sum;                       //x,y轴采样和float a_x[10]={0}, a_y[10]={0},a_z[10]={0} ,g_x[10]={0} ,g_y[10]={0},g_z[10]={0};
float Px=1, Rx, Kx, Sx, Vx, Qx;             //x轴卡尔曼变量
float Py=1, Ry, Ky, Sy, Vy, Qy;             //y轴卡尔曼变量
float Pz=1, Rz, Kz, Sz, Vz, Qz;             //z轴卡尔曼变量void setup()
{    myservo.attach(9);  // 该舵机由arduino第九脚控制myservo2.attach(8);  // 该舵机由arduino第八脚控制Wire.begin();Serial.begin(115200);accelgyro.initialize();                 //初始化unsigned short times = 200;             //采样次数for(int i=0;i<times;i++){accelgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz); //读取六轴原始数值axo += ax; ayo += ay; azo += az;      gxo += gx; gyo += gy; gzo += gz;}axo /= times; ayo /= times; azo /= times; //计算加速度计偏移gxo /= times; gyo /= times; gzo /= times; //计算陀螺仪偏移
}void loop()
{unsigned long now = millis();              //当前时间dt = (now - lastTime) / 1000.0;             //微分时间lastTime = now;                            //上一次采样时间accelgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);  //读取六轴原始数值float accx = ax / AcceRatio;                //x轴加速度float accy = ay / AcceRatio;                //y轴加速度float accz = az / AcceRatio;                //z轴加速度aax = atan(accy / accz) * (-180) / pi;    //y轴对于z轴的夹角aay = atan(accx / accz) * 180 / pi;       //x轴对于z轴的夹角aaz = atan(accz / accy) * 180 / pi;       //z轴对于y轴的夹角aax_sum = 0;                               // 对于加速度计原始数据的滑动加权滤波算法aay_sum = 0;aaz_sum = 0;for(int i=1;i<n_sample;i++){aaxs[i-1] = aaxs[i];aax_sum += aaxs[i] * i;aays[i-1] = aays[i];aay_sum += aays[i] * i;aazs[i-1] = aazs[i];aaz_sum += aazs[i] * i;}aaxs[n_sample-1] = aax;aax_sum += aax * n_sample;aax = (aax_sum / (11*n_sample/2.0)) * 9 / 7.0;    //角度调幅至0-90°aays[n_sample-1] = aay;                          //此处应用实验法取得合适的系数aay_sum += aay * n_sample;                        //本例系数为9/7aay = (aay_sum / (11*n_sample/2.0)) * 9 / 7.0;aazs[n_sample-1] = aaz; aaz_sum += aaz * n_sample;aaz = (aaz_sum / (11*n_sample/2.0)) * 9 / 7.0;float gyrox = - (gx-gxo) / GyroRatio * dt;     //x轴角速度float gyroy = - (gy-gyo) / GyroRatio * dt;    //y轴角速度float gyroz = - (gz-gzo) / GyroRatio * dt;    //z轴角速度agx += gyrox;                                //x轴角速度积分agy += gyroy;                             //x轴角速度积分agz += gyroz;/* kalman start */Sx = 0; Rx = 0;Sy = 0; Ry = 0;Sz = 0; Rz = 0;for(int i=1;i<10;i++){                                          //测量值平均值运算a_x[i-1] = a_x[i];                        //即加速度平均值Sx += a_x[i];a_y[i-1] = a_y[i];Sy += a_y[i];a_z[i-1] = a_z[i];Sz += a_z[i];}a_x[9] = aax;Sx += aax;Sx /= 10;                                  //x轴加速度平均值a_y[9] = aay;Sy += aay;Sy /= 10;                                  //y轴加速度平均值a_z[9] = aaz; Sz += aaz;Sz /= 10;for(int i=0;i<10;i++){Rx += sq(a_x[i] - Sx);Ry += sq(a_y[i] - Sy);Rz += sq(a_z[i] - Sz);}Rx = Rx / 9;                               //得到方差Ry = Ry / 9;                        Rz = Rz / 9;Px = Px + 0.0025;                           // 0.0025在下面有说明...Kx = Px / (Px + Rx);                       //计算卡尔曼增益agx = agx + Kx * (aax - agx);              //陀螺仪角度与加速度计速度叠加Px = (1 - Kx) * Px;                        //更新p值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;Serial.print(agx);Serial.print(",");Serial.print(agy);Serial.print(",");Serial.print(agz);Serial.println();myservo.write(agx);        // 指定舵机转向的角度delay(15);                       // 等待15ms让舵机到达指定位置myservo2.write(agy);        // 指定舵机转向的角度delay(15);                       // 等待15ms让舵机到达指定位置}

如何自制自平衡云台基于mpu6050,arduino输出三维倾斜角度的方法(含源码,库)相关推荐

  1. 【014】基于Vue.js的移动端购物商城网站(含源码、课设报告)

    文章目录 一.项目介绍 二.代码及报告获取 一.项目介绍 基于Vue.js的移动端购物商城网站(含源码.课设报告),代码获取放在文末了,码字不易,感谢点赞~ 一.系统概述 本部分主要是对项目进行简要描 ...

  2. 基于51单片机霍尔测速直流电机控制设计(含源码+原理图+论文+PCB封装)、基于STM32闭环步进电机控制系统设计(仿真,程序,说明)-转发分享

    设计思路: 本文主要研究了利用MCS-51系列单片机控制PWM信号从而实现对直流电机转速进行控制的方法.本文中采用了三极管组成了PWM信号的驱动系统,并且对PWM信号的原理.产生方法以及如何通过软件编 ...

  3. 基于深度学习的恶意样本行为检测(含源码) ----采用CNN深度学习算法对Cuckoo沙箱的动态行为日志进行检测和分类...

    from:http://www.freebuf.com/articles/system/182566.html 0×01 前言 目前的恶意样本检测方法可以分为两大类:静态检测和动态检测.静态检测是指并 ...

  4. 8.图片组件和动画效果--从零起步实现基于Html5的WEB设计器Jquery插件(含源码)...

    前面示例我建立了三种形状的组件,圆.矩形.椭圆,本节我将再扩展两种类型:图片和动画,并通过这个过程来论证前面OOP的编程是如何简化扩展工作的: 首先要在工具条里增加这两个组件,以便可以拖动: < ...

  5. 7.组件连线(贝塞尔曲线)--从零起步实现基于Html5的WEB设计器Jquery插件(含源码)...

    上节讲到如何创建组件,清除设计器视图,以及设计视图的持久化和恢复,本节将重点讲如何实现组件间的连线,前面章节有提到为了方便从持久化文件中恢复,组件和连线是分别存放的:nodes和lines对象,两个组 ...

  6. 基于HTML实现的电商团购网站(含源码)

    源码下载地址在文章末尾! 网站截图 细节演示 网页中使用了很多的鼠标交互效果,例如轮播和鼠标悬停特效 左侧广告弹窗跟随效果: 右侧导航栏的显示与隐藏效果: 源码下载地址 https://downloa ...

  7. 智能家居硬件小制作(含源码)《手势识别控制器》基于PAJ7620手势模块、L298N驱动板、arduino

    智能家居硬件小制作(含源码)<手势识别控制器>基于PAJ7620手势模块.L298N驱动板.arduino 目录 智能家居硬件小制作(含源码)<手势识别控制器>基于PAJ762 ...

  8. orb特征 稠密特征_一种基于ORB-SLAM2的双目三维稠密建图方法技术

    本发明专利技术公开了一种基于ORB‑SLAM2的双目稠密建图方法,涉及机器人同步定位与地图创建领域,该方法主要由跟踪线程.局部地图线程.闭环检测线程和稠密建图线程组成.其中稠密建图线程包含以下步骤:1 ...

  9. TensorFlow工作笔记001---Centos7.3下安装TensorFlow最新版本,基于python2.7.5的,没有编译TensorFlow的源码

    技术交流QQ群[JAVA,.NET,BigData,AI]:170933152 Centos7.3下安装TensorFlow最新版本,基于python2.7.5的,没有编译TensorFlow的源码, ...

  10. vue canvas插件_基于vue.js 制作在线桌椅定制选择交互特效源码

    码农那点事儿 关注我们,一起学习进步 基于vue.js写的在线桌子椅子垫子选择拼成的自己理想的书桌椅图像,这是一款交互式的课桌椅在线定制选择功能.非常不错,感兴趣的朋友前来下载使用. 下载源码(提取码 ...

最新文章

  1. Runtime.getRuntime().exec(...)使用方法
  2. 如何解决AIX的文件系统故障
  3. oracle使用parallel并行,多线程查询
  4. SAP UI5 调试模式标志位的持久化原理 - local storage
  5. 数据结构-队列之顺序队列
  6. xcode 设置快捷键 整行上下移动
  7. LeetCode 1736. 替换隐藏数字得到的最晚时间
  8. 数据产品-数据分析方法论和分析方法介绍
  9. c语言数组特殊初始化方法
  10. DDoS异常流量清洗解决方案
  11. 潘多拉网吧防火墙 1.0 双线破解
  12. 市场调查大赛全保姆教程(经验分享)
  13. Python爬虫实战之二:requests-爬取亚马逊商品详情页面
  14. C++程序设计三周教学记录
  15. 内网穿透-端口映射-跨域问题解决
  16. pjsip学习 ------ 二
  17. surface pro java_【微软SurfacePro4评测】两代产品外观对比_微软 Surface Pro 4_笔记本评测-中关村在线...
  18. 数值分析中对有效数字的定义
  19. 对python的认识作文500字_关于启示的作文500字
  20. 开源OA协同办公平台搭建教程丨服务器端命令:数据导入导出及配置

热门文章

  1. 2021-03-08动力学方程
  2. C语言面试题---函数(一)
  3. 被炫龙DD3plus的insyde h20 bios整天了一整天分享分享解决问题经验
  4. 利用pytesseract图像识别文字
  5. 学习iOS逆向有什么用?
  6. 航迹推演(Odometry)
  7. 电脑翻页时钟屏保Fliqlo
  8. 可以搜python题答案的app-有哪些可以搜Python题答案的APP
  9. 答题小程序之调查问卷模板开发
  10. 快收藏!最适合计算机大学生的Java毕业设计项目--高校食堂点餐系统