![942a01a93ea45411acb7b9ca19ad73cc.png](https://i-blog.csdnimg.cn/blog_migrate/33beaa68121858187b938ad1fede1920.jpeg)
在本篇文章中,我们将主要介绍如何将MPU6050加速度计和陀螺仪传感器与Arduino开发板一起使用。首先,我们将介绍MPU6050是如何工作的以及如何从中读取数据,然后我们制作两个实际的例子。
概览
在第一个例子中,使用Processing开发环境,我们将对传感器方向进行三维可视化,在第二个例子中,我们将制作一个简单的自平衡平台或DIY万向节。基于MPU6050方向及其融合加速度计和陀螺仪数据,我们控制三个保持平台水平的伺服系统。
MPU6050的工作过程
MPU6050 IMU在单芯片上集成了一个3轴加速度计和一个3轴陀螺仪。
陀螺仪沿X、Y和Z轴测量角位置随时间的旋转速度或变化率。它使用MEMS技术和科里奥利效应进行测量。陀螺仪的输出以每秒度数为单位,因此为了获得角度位置,我们只需要对角速度进行积分。
![ab21ce03cdcbf32e6853eaf2df4084f8.png](https://i-blog.csdnimg.cn/blog_migrate/53dbdfb02284292489e8dc292c2ca876.jpeg)
另一方面,MPU6050加速度计测量加速度的方式与ADXL345加速度传感器相同。简而言之,它可以测量沿3个轴的重力加速度,并使用一些三角学数学,我们可以计算传感器定位的角度。因此,如果我们融合或组合加速度计和陀螺仪数据,我们可以获得有关传感器方向的非常准确的信息。
MPU6050 IMU也称为六轴运动跟踪设备或6 DoF(六自由度)设备,因为它有6个输出,即3个加速度计输出和3个陀螺仪输出。
Arduino和MPU6050的连接方法
我们来看看如何使用Arduino连接和读取MPU6050传感器的数据。我们使用I2C协议与Arduino进行通信,因此只需要两条线进行连接,另外还有两条线用于供电。
![dbd32a22c6b806bbc9832fbdcfee0604.png](https://i-blog.csdnimg.cn/blog_migrate/329a2435c1951bd2c73793be335113bd.png)
MPU6050的Arduino代码
以下是用于从MPU6050传感器读取数据的Arduino代码。在代码下方,您可以找到它的详细说明。
/*
代码描述:首先我们需要包含用于I2C通信的Wire.h库,并定义一些存储数据所需的变量。
在setup()函数部分,我们需要初始化wire库并通过电源管理寄存器复位传感器。 为此,我们需要查看传感器的数据手册,从中我们可以看到寄存器地址。
![5820ad6970853576afed08fd4b38d87f.png](https://i-blog.csdnimg.cn/blog_migrate/964d25a44b5859ee3d20ff9d4d72300b.png)
此外,如果需要,我们可以使用配置寄存器为加速度计和陀螺仪选择满量程范围。 对于这个例子,我们将使用加速度计的默认±2g范围和陀螺仪的250度/秒范围。
// Configure Accelerometer Sensitivity - Full Scale Range (default +/- 2g)
在loop()函数部分,我们首先读取加速度计的数据。 每个轴的数据存储在两个字节或寄存器中,我们可以从传感器的数据手册中看到这些寄存器的地址。
![e39528d1fe45c38ca41e116eb59fcfd9.png](https://i-blog.csdnimg.cn/blog_migrate/03c12729fde6c810505c02830408bc61.png)
为了全部读取它们,我们从第一个寄存器开始,然后使用requiestFrom()函数,我们请求读取X、Y和Z轴的所有6个寄存器。 然后我们从每个寄存器读取数据,并且由于输出是二进制补码,我们将它们相应地组合以获得正确的值。
// === Read acceleromter data === //
为了获得-1g到+ 1g的输出值,适合计算角度,我们将输出除以先前选择的灵敏度。
![daafb3990940c34b92a0fc005bb506e9.png](https://i-blog.csdnimg.cn/blog_migrate/f97d0113329b184ec24faacf6755419e.png)
最后,使用这两个公式,我们从加速度计数据计算滚转角和俯仰角。
accAngleX
接下来,使用相同的方法我们得到陀螺仪数据。
![891c692ce2fbe12d1b17ac65a45c0067.png](https://i-blog.csdnimg.cn/blog_migrate/1ab28160381fbf7c9ad31424d7cc9558.png)
我们读取了六个陀螺仪寄存器,适当地组合它们的数据并将其除以先前选择的灵敏度,以便以每秒的度数获得输出。
// === Read gyroscope data === //
![6cc616398c438f5ca35d2529004b66f0.png](https://i-blog.csdnimg.cn/blog_migrate/63514b27bbd7f2ec8d52be6c2cc708fe.png)
在这里你可以注意到我用一些小的计算误差值来校正输出值,我将在接下来解释它们是如何得到它们的。 因此,当输出以度/秒为单位时,现在我们需要将它们与时间相乘以得到度数。 使用millis()函数在每次读取迭代之前捕获时间值。
// Correct the outputs with the calculated error values
最后,我们使用互补滤波器融合加速度计和陀螺仪数据。在这里,我们采用96%的陀螺仪数据,因为它非常准确,不会受到外力的影响。陀螺仪的缺点是存在漂移,或者随着时间的推移在输出中引入误差。因此,从长远来看,我们使用来自加速度计的数据,本例为4%,足以消除陀螺仪的漂移误差。
// Complementary filter - combine acceleromter and gyro angle values
但是,由于我们无法从加速度计数据计算偏航,我们无法在其上实现互补滤波器。
在我们看一下结果之前,让我快速解释一下如何获得纠错值。为了计算这些错误,我们可以在传感器处于平坦静止位置时调用calculate_IMU_error()自定义函数。在这里,我们为所有输出做了200个读数,我们将它们相加并将它们除以200。由于我们将传感器保持在平坦静止位置,因此预期输出值应为0。因此,通过此计算,我们可以得到传感器的平均误差。
void
我们只需在串行监视器上打印这些值,一旦我们知道它们,我们就可以在前面所示的代码中实现它们,用于滚动和俯仰计算,以及3个陀螺仪输出。
![b71e149814910ba0103226f95456eb6e.png](https://i-blog.csdnimg.cn/blog_migrate/3798ed00a6f288d60e1dad1a179d328c.jpeg)
最后,使用Serial.print函数,我们可以在串行监视器上打印Roll、Pitch和Yaw值,看看传感器是否正常工作。
https://www.yiboard.com/thread-1212-1-1.htmlwww.yiboard.com更多有关Arduino开发板的文章,请关注微信公众号“一板网电子技术论坛”。
![404525fa0cded250972863fca45a1a41.png](https://i-blog.csdnimg.cn/blog_migrate/b4415d19ea942167fe77dbea01eda243.png)