六轴传感器MPU6050

本文详细介绍了六轴传感器MPU6050,包括其与九轴传感器的区别、功能特性以及MPU6050的内部结构。文章深入解析了MPU6050的初始化步骤,包括IIC接口设置、寄存器配置,如角速度和加速度传感器的满量程范围、系统时钟源选择等。此外,还介绍了如何使用MPU6050的数字运动处理器(DMP)进行姿态解算,获取欧拉角数据。最后,提供了MPU6050的初始化和数据读取的C语言代码示例。
摘要由CSDN通过智能技术生成

1.六轴与九轴的区别

六轴包括:三轴加速度计、三轴陀螺仪

九轴包括:三轴加速度计、三轴陀螺仪、三轴磁强计

2.MPU6050简单介绍

MPU6050 是 InvenSense 公司推出的全球首款整合性 6 轴运动处理组件,相较于多组件方案,免除了组合陀螺仪与加速器时之轴间差的问题,减少了安装空间。MPU6050 内部整合了 3 轴陀螺仪和 3 轴加速度传感器,并且含有一个第二 IIC 接口,可用于连接外部磁力传感器即AUX_CL 和 AUX_DA,并利用自带的数字运动处理器(DMP: DigitalMotion Processor)硬件加速引擎,通过主 IIC 接口,向应用端输出完整的 9 轴融合演算数据。有了 DMP,我们可以使用 InvenSense 公司提供的运动处理资料库,非常方便的实现姿态解算,降低了运动处理运算对操作系统的负荷,同时大大降低了开发难度。

3.模块原理图


其中,SCL 和 SDA 是连接 MCU 的 IIC 接口,MCU 通过这个 IIC 接口来控制 MPU6050,
另外还有一个 IIC 接口:AUX_CL 和 AUX_DA,这个接口可用来连接外部从设备,比如磁
传感器,这样就可以组成一个九轴传感器。VLOGIC 是 IO 口电压,该引脚最低可以到 1.8V,
我们一般直接接 VDD 即可。AD0 是从 IIC 接口(接 MCU)的地址控制引脚,该引脚控制
IIC 地址的最低位。如果接 GND,则 MPU6050 的 IIC 地址是:0X68,如果接 VDD,则是
0X69,注意:这里的地址是不包含数据传输的最低位的(最低位用来表示读写)!!

4.初始化步骤及寄存器详解

1 )初始化 IIC  接口
MPU6050 采用 IIC 与 STM32F1 通信,所以我们需要先初始化与 MPU6050 连接的 SDA
和 SCL 数据线。
2 )复位 MPU6050
这一步让 MPU6050 内部所有寄存器恢复默认值,通过对电源管理寄存器 1(0X6B)的
bit7 写 1 实现。 复位后,电源管理寄存器 1 恢复默认值(0X40),然后必须设置该寄存器为
0X00,以唤醒 MPU6050,进入正常工作状态。
3 )设置角速度传感器(陀螺仪)和加速度传感器的满量程范围
这一步,我们设置两个传感器的满量程范围(FSR),分别通过陀螺仪配置寄存器(0X1B)
和加速度传感器配置寄存器(0X1C)设置。我们一般设置陀螺仪的满量程范围为±2000dps,
加速度传感器的满量程范围为±2g。
4 )设置其他参数
这里,我们还需要配置的参数有:关闭中断、关闭 AUX IIC 接口、禁止 FIFO、设置陀
螺仪采样率和设置数字低通滤波器(DLPF)等。我们不用中断方式读取数据,所以关
闭中断,然后也没用到 AUX IIC 接口外接其他传感器,所以也关闭这个接口。分别通过中
断使能寄存器(0X38)和用户控制寄存器(0X6A)控制。MPU6050 可以使用 FIFO 存储传
感器数据,不过我们没有用到,所以关闭所有 FIFO 通道,这个通过 FIFO 使能寄存器
(0X23)控制,默认都是 0(即禁止 FIFO),所以用默认值就可以了。陀螺仪采样率通过采
样率分频寄存器(0X19)控制,这个采样率我们一般设置为 50 即可。数字低通滤波器(DLPF)
则通过配置寄存器(0X1A)设置,一般设置 DLPF 为带宽的 1/2 即可。
5 )配置系统时钟源并使能角速度传感器和加速度传感器
系统时钟源同样是通过电源管理寄存器 1(0X1B)来设置,该寄存器的最低三位用于
设置系统时钟源选择,默认值是 0(内部 8M RC 震荡),不过我们一般设置为 1,选择 x 轴
陀螺 PLL 作为时钟源,以获得更高精度的时钟。同时,使能角速度传感器和加速度传感器,
这两个操作通过电源管理寄存器 2(0X6C)来设置,设置对应位为 0 即可开启。
至此,MPU6050 的初始化就完成了,可以正常工作了(其他未设置的寄存器全部采用
默认值即可),接下来,我们就可以读取相关寄存器,得到加速度传感器、角速度传感器和
温度传感器的数据了。不过,我们先简单介绍几个重要的寄存器。
首先,我们介绍电源管理寄存器 1,该寄存器地址为 0X6B,各位描述如图


其中,DEVICE_RESET 位用来控制复位,设置为 1,复位 MPU6050,复位结束后,MPU
硬件自动清零该位。SLEEEP 位用于控制 MPU6050 的工作模式,复位后,该位为 1,即进
入了睡眠模式(低功耗),所以我们要清零该位,以进入正常工作模式。TEMP_DIS 用于设
置是否使能温度传感器,设置为 0,则使能。最后 CLKSEL[2:0]用于选择系统时钟源,选择
关系如表


默认是使用内部 8M RC 晶振的,精度不高,所以我们一般选择 X/Y/Z 轴陀螺作为参考
的 PLL 作为时钟源,一般设置 CLKSEL=001 即可。
接着,我们看陀螺仪配置寄存器,该寄存器地址为:0X1B,各位描述如图

首先,需要将MPU6050连接到Arduino板上,并使用I2C通信协议读取传感器数据。然后,将Arduino与Unity连接,将传感器数据传递到Unity中。 以下是一些基本的步骤: 1. 连接MPU6050到Arduino 使用以下代码将MPU6050连接到Arduino: #include<Wire.h> const int MPU_addr=0x68; int16_t AcX,AcY,AcZ,Tmp,GyX,GyY,GyZ; void setup(){ Wire.begin(); Wire.beginTransmission(MPU_addr); Wire.write(0x6B); Wire.write(0); Wire.endTransmission(true); Serial.begin(9600); } void loop(){ Wire.beginTransmission(MPU_addr); Wire.write(0x3B); Wire.endTransmission(false); Wire.requestFrom(MPU_addr,14,true); AcX=Wire.read()<<8|Wire.read(); AcY=Wire.read()<<8|Wire.read(); AcZ=Wire.read()<<8|Wire.read(); Tmp=Wire.read()<<8|Wire.read(); GyX=Wire.read()<<8|Wire.read(); GyY=Wire.read()<<8|Wire.read(); GyZ=Wire.read()<<8|Wire.read(); Serial.print("Accelerometer: "); Serial.print("X="); Serial.print(AcX); Serial.print(" Y="); Serial.print(AcY); Serial.print(" Z="); Serial.println(AcZ); Serial.print("Gyroscope: "); Serial.print("X="); Serial.print(GyX); Serial.print(" Y="); Serial.print(GyY); Serial.print(" Z="); Serial.println(GyZ); Serial.println(); delay(500); } 2. 将传感器数据发送到Unity 使用以下代码将传感器数据发送到Unity: #include <SoftwareSerial.h> SoftwareSerial mySerial(2, 3); // RX, TX const int MPU_addr=0x68; int16_t AcX,AcY,AcZ,Tmp,GyX,GyY,GyZ; void setup(){ Wire.begin(); Wire.beginTransmission(MPU_addr); Wire.write(0x6B); Wire.write(0); Wire.endTransmission(true); Serial.begin(9600); mySerial.begin(9600); } void loop(){ Wire.beginTransmission(MPU_addr); Wire.write(0x3B); Wire.endTransmission(false); Wire.requestFrom(MPU_addr,14,true); AcX=Wire.read()<<8|Wire.read(); AcY=Wire.read()<<8|Wire.read(); AcZ=Wire.read()<<8|Wire.read(); Tmp=Wire.read()<<8|Wire.read(); GyX=Wire.read()<<8|Wire.read(); GyY=Wire.read()<<8|Wire.read(); GyZ=Wire.read()<<8|Wire.read(); String data = "Accelerometer:" + String(AcX) + "," + String(AcY) + "," + String(AcZ) + "; Gyroscope:" + String(GyX) + "," + String(GyY) + "," + String(GyZ) + ";"; mySerial.println(data); Serial.println(data); delay(500); } 3. 在Unity中接收传感器数据 使用以下代码在Unity中接收传感器数据: using System.Collections; using System.Collections.Generic; using UnityEngine; using System.IO.Ports; public class Arduino : MonoBehaviour { public SerialPort serialPort = new SerialPort("COM4", 9600); public string[] sensorData; void Start () { serialPort.Open(); } void Update () { if (serialPort.IsOpen) { string data = serialPort.ReadLine(); sensorData = data.Split(';'); } } } 以上是一些基本的步骤,你可以根据自己的需要进行修改和扩展。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值