摘要:本文介绍姿态传感器MPU6050的使用方法
姿态传感器是一种用于测量物体姿态的传感器,它可以检测物体的加速度和角速度,并计算出物体的方向和角度。前边介绍的RPI-1031只能定性的得到物体的倾斜情况,而姿态传感器则可以定量的得到物体倾斜的方向和角度。
MPU6050是一种常用的姿态传感器,它具有高精度、低功耗和成本低廉的特点。本文将介绍MPU6050的基本原理、工作方式、应用领域以及优缺点。
MPU-6050是全球首例6轴运动处理传感器。它集成了3轴微机电系统(Microelectro Mechanical Systems, MEMS)陀螺仪和3轴MEMS加速度计,以及板载数字运动处理器(Digital Motion Processor, DMP)。加速度计可以检测物体的线性加速度,而陀螺仪可以检测物体的角速度。因此,MPU-6050可以测量物体在x、y、z三个方向上的加速度和角速度。通过将加速度计和陀螺仪的测量结果进行数据融合,可以计算出物体的方向和角度。所以,MPU-6050常应用于平衡车、飞行器等需要检测自身姿态的场景。
前面所说的几轴通常指加速度传感器(即加速计)、角速度传感器(即陀螺仪)、磁感应传感器(即电子罗盘)的数量,这三类传感器测量的数据在空间坐标系中都可以被分解为X,Y,Z三个方向轴的力,因此也常常被称为3轴加速度计、3轴陀螺仪、3轴磁力计。
上面3类传感器有其各自的功能特点及应用,比如加速度计可以测量设备的线性加速度,陀螺仪可以测量设备自身的旋转角速度,还有磁力计可以检测设备的方位。通过它们相互组合和匹配融合又可以衍生出更多的不同应用,在叫法上通过这样简单的轴数上相加的可以变成六轴传感器或者九轴传感器。
六轴传感器:通常指的是三轴加速度计+三轴陀螺仪,三轴加速度计是检测三个方向的加速度的,三轴陀螺仪是检测旋转角速度,因此可以用在平衡车、体感游戏机以及飞行器上。
九轴传感器:就是三轴加速度计+三轴陀螺仪+三轴磁力计的组合,在飞行器上是广泛应用的。另外,在九轴传感器基础上再加入气压传感器,从而能获取海拔高度的数据,人们通常称之为十轴传感器。
通常使用的MPU6050模块如下所示:
那么MPU6050所对应的坐标系和角速度方向如下所示:
在上图中可以看到,向右为X轴正方向,向前为Y轴正方向,垂直模块向上为Z轴正方向。旋转角的方向按右手法则定义,即右手大拇指指向轴向,四指弯曲的方向即为绕该轴旋转的方向。
为了称呼方便,给这三个旋转角又起了三个不同的名字:
横滚角(Roll):即为绕X轴旋转方向的角度;
俯仰角(Pitch):即为绕Y轴旋转方向的角度;
偏航角(Yaw):即为绕Z轴旋转方向的角度;
这三者合称为姿态角或欧拉角(Euler angles)。通过一架飞机的姿态来理解这三个角度,应该更容易一些,如下所示:
MPU6050作为首款6轴的姿态传感器,拥有以下一些特性:
1.以数字形式输出6轴或9轴(需外接磁力传感器——通过XCL、XDA进行通信)的旋转矩阵、四元数(quaternion)、欧拉角格式(Euler Angle forma)的融合演算数据(需DMP支持)。
2.具有测量范围为±250、±500、±1000 与±2000°/sec的3轴角速度感测器(陀螺仪)。
3.集成可程序控制,测量范围为±2g、±4g、±8g和±16g的3轴加速度传感器。
4.自带数字运动处理(DMP:Digital Motion Processing)引擎,可减少MCU进行复杂的融合演算、传感器同步化、姿势感应等的负荷。
5.自带一个数字温度传感器。
6.可程序控制的中断(interrupt)(INT接口的功能),支持姿势识别功能。
7.自带1024字节FIFO,有助于降低系统功耗
8.高达400KHz的IIC通信接口
MPU6050模块引脚的功能如下表所示:
引脚 | 功能 |
VCC、GND | 电源供电,直流3.3V~5V |
SCL、SDA | I2C通信引脚(模块已经内置两个4.7K上拉电阻,因此接线时可以直接把SCL和SDA接在GPIO口上) |
XCL、XDA | 主机I2C通信引脚(为了扩展芯片功能,通常用于外接磁力计或者气压计) |
AD0 | 从机地址最低位(接0则7位从机地址为1101000;接1则7位从机地址为1101001) |
INT | 中断输出引脚(可以配置芯片内部事件以触发中断引脚的输出) |
接下来就来看一个简单的例子,通过一个程序来获得MPU6050的测量数据。首先把MPU6050与ESP32扩展板相连接,连接的方法如下:
MPU6050 | ESP32扩展板 |
VCC | +5V |
GND | GND |
SCL | P22 |
SDA | P21 |
接下来是下载一个支持MPU6050的库,在Arduino IDE中,有很多关于MPU6050的库,我所选择的是MPU6050_tockn库,如下图所示:
使用MPU6050_tockn库读取MPU6050模块的信息需要以下几步:
- 引入头文件MPU6050_tockn.h
- 创建MPU6050对象
- 调用begin()方法进行初始化
- 调用calcGyroOffsets()方法进行自检
- 调用update()方法更新数据
- 调用各种方法得到各种需要的数据了。
具体代码如下所示:
#include <MPU6050_tockn.h> #include <Wire.h> MPU6050 mpu6050(Wire); long timer = 0; void setup() { Serial.begin(9600); Wire.begin(); mpu6050.begin(); mpu6050.calcGyroOffsets(true); } void loop() { mpu6050.update(); if(millis() - timer > 1000){
Serial.println("======================================================="); Serial.print("temp : ");Serial.println(mpu6050.getTemp()); Serial.print("accX : ");Serial.print(mpu6050.getAccX()); Serial.print("\taccY : ");Serial.print(mpu6050.getAccY()); Serial.print("\taccZ : ");Serial.println(mpu6050.getAccZ());
Serial.print("gyroX : ");Serial.print(mpu6050.getGyroX()); Serial.print("\tgyroY : ");Serial.print(mpu6050.getGyroY()); Serial.print("\tgyroZ : ");Serial.println(mpu6050.getGyroZ());
Serial.println("=======================================================\n"); timer = millis();
} } |
在这个程序中,读取了原始的加速度和角速度数据。至于更多的数据以及更多的应用,未来将会有一个关于平衡车的主题,在那里会进行更详细的介绍。