一、MPU6050传感器介绍

MPU6050传感器是一个带3轴加速度计,3轴陀螺仪和带I2C接口的温度传感器的集成传感器。

名称

描述

VCC

正极

GND

负极

SCL

I2C时钟线

SDA

I2C数据线

XDA

闲置

XCL

闲置

AD0

地址选择引脚

INT

中断


android获得陀螺仪传感器 陀螺仪传感器数据获取_陀螺仪

MPU6050

   *通常只需要连接VCC、GND、SCL、SDA引脚。

   *设备的I2C地址是0x68。可以通过将AD0引脚接到VCC来更改0x69的地址。

属性:

名称

描述

X轴加速度

X轴上的加速度。acceleration.x (g)

Y轴加速度

Y轴上的加速度。acceleration.y (g)

Z轴加速度

Z轴上的加速度。acceleration.z (g)

X轴旋转值

在X轴上的旋转角度。gyro.x(rad/s)

Y轴旋转值

在Y轴上的旋转角度。gyro.x(rad/s)

Z轴旋转值

在Z轴上的旋转角度。gyro.x(rad/s)

温度

温度测量数据。temperature(degc)

单位:

所有的速度值(x/y/z)都是用重力单位(g),其中1g=9.80665m/s^2。陀螺仪测量角旋转,并返回每秒的读数。

个人理解:

一个物体在无约束情况下有6个自由度,分别是3个沿着(x/y/z)轴平移的自由度,3个在(x/y/z)轴上旋转的自由度。加速度陀螺仪就是测量这6个自由度的传感器。


android获得陀螺仪传感器 陀螺仪传感器数据获取_陀螺仪_02

6个自由度,3个旋转和3个平移

二、代码:

这个代码把6个自由度和温度检测到的数据打印在串口监视器上。

// 基本示例:从 Adafruit MPU6050 读取加速度计数据
//在Arduino上使用MPU60506轴加速度陀螺仪传感器要包含3个库,分别是:

#include <Adafruit_MPU6050.h>   // 包含 MPU6050 库文件
#include <Adafruit_Sensor.h>    // 包含 Adafruit 传感器库文件
#include <Wire.h>               // 包含 I2C 通信库文件

//和舵机一样,都需要创建一个对象:

Adafruit_MPU6050 mpu;          // 创建 MPU6050 对象(mpu是创建的对象名,可以用其他的)

//只执行一次的设置
void setup() {
//初始化、检测是否初始话是否成功

  Serial.begin(115200);        // 初始化串口通信,波特率设为 115200
  while (!Serial) delay(10);  // 等待串口初始化完成(对于 Zero、Leonardo 等板子)

  Serial.println("Adafruit MPU6050 测试!");

  // 尝试初始化 MPU6050
  if (!mpu.begin()) {
    Serial.println("未能找到 MPU6050 芯片");
    while (1) delay(10);  // 初始化失败则循环等待
  }

  Serial.println("找到 MPU6050!");


//在setup中有3个参数要设置:分别为加速度计量程、陀螺仪量程和滤波器带宽。

  // 设置加速度计量程为 ±8G
  mpu.setAccelerometerRange(MPU6050_RANGE_8_G);//只有这一句是设置加速度计,其他都是显示信息
  Serial.print("加速度计量程设置为: ");
  switch (mpu.getAccelerometerRange()) {
    case MPU6050_RANGE_2_G:
      Serial.println("±2G");
      break;
    case MPU6050_RANGE_4_G:
      Serial.println("±4G");
      break;
    case MPU6050_RANGE_8_G:
      Serial.println("±8G");
      break;
    case MPU6050_RANGE_16_G:
      Serial.println("±16G");
      break;
  }

  // 设置陀螺仪量程为 ±2000°/s
  mpu.setGyroRange(MPU6050_RANGE_2000_DEG);//只有这一句是设置陀螺仪,其他都是显示信息
  Serial.print("陀螺仪量程设置为: ");
  switch (mpu.getGyroRange()) {
    case MPU6050_RANGE_250_DEG:
      Serial.println("± 250 度/秒");
      break;
    case MPU6050_RANGE_500_DEG:
      Serial.println("± 500 度/秒");
      break;
    case MPU6050_RANGE_1000_DEG:
      Serial.println("± 1000 度/秒");
      break;
    case MPU6050_RANGE_2000_DEG:
      Serial.println("± 2000 度/秒");
      break;
  }

  // 设置滤波器带宽为 21Hz
  mpu.setFilterBandwidth(MPU6050_BAND_21_HZ);//只有这一句是设置带宽,其他都是显示信息
  Serial.print("滤波器带宽设置为: ");
  switch (mpu.getFilterBandwidth()) {
    case MPU6050_BAND_260_HZ:
      Serial.println("260 Hz");
      break;
    case MPU6050_BAND_184_HZ:
      Serial.println("184 Hz");
      break;
    case MPU6050_BAND_94_HZ:
      Serial.println("94 Hz");
      break;
    case MPU6050_BAND_44_HZ:
      Serial.println("44 Hz");
      break;
    case MPU6050_BAND_21_HZ:
      Serial.println("21 Hz");
      break;
    case MPU6050_BAND_10_HZ:
      Serial.println("10 Hz");
      break;
    case MPU6050_BAND_5_HZ:
      Serial.println("5 Hz");
      break;
  }

  Serial.println();
  delay(100);  // 稍作延迟
}

//到这就设置完了,接下来是实时读取数据的代码。

void loop() {
// 获取新的传感器事件数据
  //创建3个sensors_event_t类型的结构体变量,分别命名为a、g、temp
  //定义了用来存储传感器数据的结构体变量。
  sensors_event_t a, g, temp;

  //调用Adafruit_MPU6050类的getEvent()函数,从传感器获取最新的加速度、陀螺仪和温度数据
  //并将这些数据分别存储到对应的变量中。
  mpu.getEvent(&a, &g, &temp);

  // 打印出读数
  Serial.print("加速度 X: ");
  Serial.print(a.acceleration.x);
  Serial.print(", Y: ");
  Serial.print(a.acceleration.y);
  Serial.print(", Z: ");
  Serial.print(a.acceleration.z);
  Serial.println(" m/s^2");

  Serial.print("旋转 X: ");
  Serial.print(g.gyro.x);
  Serial.print(", Y: ");
  Serial.print(g.gyro.y);
  Serial.print(", Z: ");
  Serial.print(g.gyro.z);
  Serial.println(" rad/s");

  Serial.print("温度: ");
  Serial.print(temp.temperature);
  Serial.println(" 度C");

  Serial.println();  // 打印空行
  delay(500);       // 每隔 500ms 读取一次数据
}

在loop中有几句代码可能需要解释一下,方便读者理解:

1、 sensors_event_t a, g, temp;

sensors_event_t是Adafruit Sensor库中的一个结构体类型,用于存储传感器事件的数据,包括但不限于加速度、角速度(陀螺仪)和温度等。

 2、 mpu.getEvent(&a, &g, &temp);

调用Adafruit_MPU6050类的getEvent()方法。这个方法从MPU6050模块中获取传感器事件的数据,并将结果存储到之前定义的变量中。分别指向sensors_event_t类型的变量a,g和temp的地址。通过传递指针。

getEvent()函数可以直接将读取到的加速度数据填充到a,角速度填充到g、温度填充到temp。

3、  

a.acceleration.x:结构体变量a的成员,存储了X轴加速度的值。

a.acceleration.y:结构体变量a的成员,存储了Y轴加速度的值。

a.acceleration.z:结构体变量a的成员,存储了Z轴加速度的值。

g.gyro.x:结构体变量g的成员,存储了X轴上旋转角速度的值。

g.gyro.y:结构体变量g的成员,存储了Y轴上旋转角速度的值。

g.gyro.z:结构体变量g的成员,存储了Z轴上旋转角速度的值。

temp.temperature:结构体变量temp的成员,存储了温度数据。