友情提示:380元/半年,儿童学编程,就上码丁实验室。
惯性测量单元「Inertial measurement unit,简称 IMU」可以帮助我们在三维空间中获取物体当前三维位置的值,这些值可以用来帮助我们确定物体的精确位置,例如检测智能手机的水平或倾斜状态或是使用IMU传感器来追踪运动状态等。IMU传感器在汽车、自平衡机器人、四轴飞行器、惯性导航等设备上广泛应用。
六轴姿态传感器MPU6050是IMU传感器系列的一种,本篇介绍如何驱动其获取原始数据。
1. MPU6050传感器介绍
IMU传感器通常包含两个或多个功能,按优先级分别是加速计、陀螺仪、磁力计和测高仪。MPU6050传感器采用单芯片封装,将一个加速度计、一个陀螺仪和一个温度传感器集成在一起,提供六轴姿态数值输出。
主要参数
- 电压:3-5V
- 通讯:标准IIC通讯协议
- 16Bit AD转换器
- 数字温度传感器
- 集成数字运动处理器(DMP)
- 预留接口可用于与磁力计等其他IIC设备通讯
引脚说明
- VCC:电源
- GND:地
- SCL:IIC通讯时钟引脚
- SDA:IIC通讯数据引脚
- XDA:外接IIC设备数据引脚
- XCL:外接IIC设备时钟引脚
- ADO:IIC从地址LSB
- INT:用于指示数据准备就绪的中断引脚
2. 实验材料
- Uno R3开发板
- 配套USB数据线
- 面包板及配套连接线
- MPU6050传感器模块
3. 实验步骤
1. 根据原理图搭建电路图。
MPU6050传感器模块的VCC、GND分别连接开发板的3.3V、GND,传感器的SDA、SCL引脚连接开发板A4、A5引脚。
实验原理图如下图所示:
实物连接图如下图所示:
2. 新建sketch,拷贝如下代码替换自动生成的代码并进行保存。
#include<Wire.h>
const int MPU6050_addr = 0x68;
int16_t AccX, AccY, AccZ, Temp, GyroX, GyroY, GyroZ;
void setup() {
Wire.begin();
Wire.beginTransmission(MPU6050_addr);
Wire.write(0x6B);
Wire.write(0);
Wire.endTransmission(true);
Serial.begin(9600);
}
void loop() {
Wire.beginTransmission(MPU6050_addr);
Wire.write(0x3B);
Wire.endTransmission(false);
Wire.requestFrom(MPU6050_addr, 14, true);
AccX = Wire.read() << 8 | Wire.read();
AccY = Wire.read() << 8 | Wire.read();
AccZ = Wire.read() << 8 | Wire.read();
Temp = Wire.read() << 8 | Wire.read();
GyroX = Wire.read() << 8 | Wire.read();
GyroY = Wire.read() << 8 | Wire.read();
GyroZ = Wire.read() << 8 | Wire.read();
Serial.print("AccX = "); Serial.print(AccX);
Serial.print(" || AccY = "); Serial.print(AccY);
Serial.print(" || AccZ = "); Serial.print(AccZ);
Serial.print(" || GyroX = "); Serial.print(GyroX);
Serial.print(" || GyroY = "); Serial.print(GyroY);
Serial.print(" || GyroZ = "); Serial.print(GyroZ);
Serial.print(" || Temp = "); Serial.println(Temp / 340.00 + 36.53);
delay(500);
}
3. 连接开发板,设置好对应端口号和开发板类型,进行程序下载。
4. 实验现象
打开串口监视器,波特率设置成与程序中相一致的9600。监视器中数据会随着传感器的角度变化而变化。
5. 程序分析
程序中使用了通用IIC库「Wire」进行驱动,按照数据手册从指定寄存器中获取数据,注意要把两个字节组合得到16Bit的原始数据。当然MPU6050也有很多驱动库,将IIC通讯过程进一步封装。
转自公众号:
TonyCode