Arduino提高篇(十六)六轴姿态MPU6050

惯性测量单元「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通讯过程进一步封装。


Arduino学习交流群:672088578
更多内容,欢迎关注我的公众号。 微信扫一扫下方二维码即可关注:

  • 10
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MPU6050是一种常用的六轴陀螺仪和加速度计模块,可以用于测量物体的姿态和运动。在Arduino中控制舵机使用MPU6050可以实现自动平衡、姿态控制等功能。 要使用MPU6050控制舵机,首先需要连接硬件。将MPU6050模块的SDA引脚连接到Arduino的SDA引脚,SCL引脚连接到Arduino的SCL引脚,VCC引脚连接到Arduino的5V引脚,GND引脚连接到Arduino的GND引脚。然后将舵机的信号线连接到Arduino的一个数字引脚。 接下来,在Arduino中编写代码。首先需要包含Wire库和Servo库,然后初始化MPU6050和舵机对象。在主循环中,读取MPU6050的角度数据,并根据需要控制舵机的位置。 以下是一个简单的示例代码: ``` #include <Wire.h> #include <Servo.h> Servo servo; int servoPin = 9; const int MPU_addr=0x68; // I2C地址 int16_t AcX,AcY,AcZ,Tmp,GyX,GyY,GyZ; void setup(){ Wire.begin(); Wire.beginTransmission(MPU_addr); Wire.write(0x6B); // PWR_MGMT_1寄存器 Wire.write(0); // 唤醒MPU-6050 Wire.endTransmission(true); servo.attach(servoPin); } void loop(){ Wire.beginTransmission(MPU_addr); Wire.write(0x3B); // 从0x3B寄存器开始读取14个字节的数据 Wire.endTransmission(false); Wire.requestFrom(MPU_addr,14,true); // 请求14个字节的数据 AcX=Wire.read()<<8|Wire.read(); // 加速度计X数据 AcY=Wire.read()<<8|Wire.read(); // 加速度计Y数据 AcZ=Wire.read()<<8|Wire.read(); // 加速度计Z数据 Tmp=Wire.read()<<8|Wire.read(); // 温度数据 GyX=Wire.read()<<8|Wire.read(); // 陀螺仪X数据 GyY=Wire.read()<<8|Wire.read(); // 陀螺仪Y数据 GyZ=Wire.read()<<8|Wire.read(); // 陀螺仪Z数据 // 根据需要控制舵机的位置 int servoPos = map(GyX, -32768, 32767, 0, 180); servo.write(servoPos); delay(20); } ``` 这段代码通过读取MPU6050的陀螺仪数据,将陀螺仪X的值映射到舵机的角度范围,然后控制舵机的位置。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值