Arduino uno + mpu6050 陀螺仪 运用卡尔曼滤波姿态解算实验

Arduino uno + mpu6050 陀螺仪 运用卡尔曼滤波姿态解算实验_第1张图片

 

MPU6050六轴陀螺仪

作用于四轴无人机,平衡车,机器人等等的电子实作当中,用于姿态判断,掌握了可以发挥自己的想象完成更多更有趣的作品。

 

本例程输出XYZ的角度,正负90度。

运用卡尔曼滤波算法解算姿态,感觉算是比较稳定,但好像有点偏移。大家好好学习参考,再改进吧。

 

输出效果

首先看看本例程XYZ轴的输出效果图:

(时间曲线的体现是:静止姿态→摆动→恢复原静止姿态→拍动桌子→静止姿态)

Arduino uno + mpu6050 陀螺仪 运用卡尔曼滤波姿态解算实验_第2张图片

 

Bom表

 

Arduino Uno               *1

mpu6050 陀螺仪模块 *1

跳线                            若干

 

MPU6050 引脚说明

VCC             3.3-5V(内部有稳压芯片)

GND             地线
SCL              MPU6050作为从机时IIC时钟线

SDA              MPU6050作为从机时IIC数据线

XCL               MPU6050作为主机时IIC时钟线

XDA              MPU6050作为主机时IIC数据线
AD0              地址管脚,该管脚决定了IIC地址的最低一位

INT                中断引脚

 

接线

Arduino uno+MPU6050接线方式如下

Arduino uno + mpu6050 陀螺仪 运用卡尔曼滤波姿态解算实验_第3张图片

  

 

程序实现

 

首先要更新I2C库

在GITHUB找到的I2C库

(程序来源: https://github.com/jrowberg/i2cdevlib)

 

打开,把Arduino文件夹里的I2Cdev,MPU6050文件夹复制到Arduino IDE的库文件夹里

(默认的路径是这个 C:\Program Files (x86)\Arduino\libraries)

 

 

在GITHUB找到的卡尔曼滤波程序(程序来源: https://github.com/wjjun/MPU6050_Kalman)

 

 

把程序上传到板子上,打开串口监视器,就可以看到一堆堆的数据了

(往后再说说怎么整理处理这些数据)

 

程序和库文件打包下载:https://u16460183.ctfile.com/fs/16460183-295242093

 

压缩包文件夹说明:
I2Cdev  -- i2c库(都是需要放置在Arduino的库目录里面)
MPU6050 -- mpu6050陀螺仪库
LS_MPU6050  -- 主程序文件

 

#include "Wire.h"
#include "I2Cdev.h"
#include "MPU6050.h"

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()
{
    Wire.begin();
    Serial.begin(115200);

    accelgyro.initialize();                 //初始化

    unsigned short times = 200;             //采样次数
    for(int i=0;i

 

 

 

 

 

 

 

你可能感兴趣的:(Arduino,系列实验)