第十五篇、基于Arduino uno,获取mpu6050三轴加速度、角速度、温度的数据——结果导向

文章介绍了如何使用Arduino与MPU6050传感器进行交互,包括传感器的外观、连线方法,以及非阻塞方式的源程序设计。通过I2C接口连接,获取温度、三轴加速度和角速度数据,并提供了相应的库文件和注意事项,强调了传感器固定稳定对读数准确性的重要性。
摘要由CSDN通过智能技术生成

0、结果

 说明:先来看看串口调试助手显示的结果,第一个值是温度值,第二个值是X轴的加速度,第三个值是Y轴的加速度,第四个值是Z轴的加速度,第五个值是X轴的角速度,第六个值是Y轴的角速度,第七个值是Z轴的角速度,如果是你想要的,可以接着往下看。


1、外观

 说明:虽然mpu6050传感器形态各异,但是原理和代码都是适用的。


2、连线

 说明:只需要连接四根线。

  • uno————mpu6050传感器
  •   3.3V------VCC
  •   GND------GND
  •   SCL------SCL
  •   SDA------SDA

3、源程序

说明:采用非阻塞方式编写,一定时间获取一次数据,并将对应功能进行函数化,方便移植。

/****************************************mpu6050 part****************************************/
/*
  接线:
  VCC------VCC
  GND------GND
  SCL------SCL
  SDA------SDA
*/
#include <Adafruit_MPU6050.h>                                                 //include library
#include <Adafruit_Sensor.h>                                                  //include library
#include <Wire.h>                                                             //include library

Adafruit_MPU6050 mpu;                                                         //Instantiate object
#define mpu6050TimeInterval 100                                               //Detect the time interval of a trip
unsigned long mpu6050Times = 0;                                               //Record the device running time
float mpu6050Temp = 0;                                                        //Define a variable
float xAcceleration , yAcceleration , zAcceleration ;                         //Define three variables
float xAccele , yAccele , zAccele ;                                           //Define three variables
float xGyro = 0, yGyro = 0, zGyro = 0;                                        //Define three variables
float gravity = 9.8;                                                          //Define a variable
/****************************************set up and loop part*********************************/
void setup(void) {
  Serial.begin(9600);                                                         //Example Set the baud rate of the serial port to 9600

  if (!mpu.begin()) {                                                         // Try to initialize!
    while (millis() - 1000) {                                                 //Wait for the device to come online
      Serial.println("Failed to find MPU6050 chip");
    }
  }
  mpu.setAccelerometerRange(MPU6050_RANGE_16_G);                              //Set the accelerometer range
  mpu.setGyroRange(MPU6050_RANGE_250_DEG);                                    //Set the gyroscope range
  mpu.setFilterBandwidth(MPU6050_BAND_21_HZ);                                 //Set filtering bandwidth

  Serial.println("Go online!");
}
void loop() {
  getMpu6050Data();                                                           //Obtain data about the mpu6050
}
/****************************************mpu6050 part****************************************/
/*Obtain data about the mpu6050*/
void getMpu6050Data() {
  if (millis() - mpu6050Times >= mpu6050TimeInterval) {                       //This command is executed once in a while
    mpu6050Times = millis();
  
    sensors_event_t a, g, temp;                                               //Set three variables
    mpu.getEvent(&a, &g, &temp);                                              //Read the corresponding three values

    mpu6050Temp = temp.temperature;                                           //Acquired temperature

    xAcceleration = a.acceleration.x ;                                        //Acquired acceleration
    yAcceleration = a.acceleration.y ;                                        //Acquired acceleration
    zAcceleration = a.acceleration.z ;                                        //Acquired acceleration

    xAccele = xAcceleration / gravity;                                        //Convert the units of acceleration into g
    yAccele = yAcceleration / gravity;                                        //Convert the units of acceleration into g
    zAccele = zAcceleration / gravity;                                        //Convert the units of acceleration into g

    xGyro = g.gyro.x;                                                         //Acquired angular velocity
    yGyro = g.gyro.y;                                                         //Acquired angular velocity
    zGyro = g.gyro.z;                                                         //Acquired angular velocity

    Serial.print("Temp: ");
    Serial.print(mpu6050Temp);                                                //Serial print temperature
    Serial.print(" , x-accele: ");
    Serial.print(xAccele);                                                    //Serial print acceleration
    Serial.print(" , y-accele: ");
    Serial.print(yAccele);                                                    //Serial print acceleration
    Serial.print(" , z-accele: ");
    Serial.print(zAccele);                                                    //Serial print acceleration

    Serial.print(" , x-gyro:");
    Serial.print(xGyro);                                                      //Serial port print angular speed
    Serial.print(" , y-gyro:");
    Serial.print(yGyro);                                                      //Serial port print angular speed
    Serial.print(" , z-gyro:");
    Serial.println(zGyro);                                                    //Serial port print angular speed
  }
}

4、注意事项

说明:需要下载对应的库文件才不会编译报错。建议使用2.5V~3.6V的电源。实际使用过程中温度数据和加速度可能会有一些些误差,在MPU6050使用的过程中,需要确保其固定稳定,避免因振动或者位移导致读数不准确

5、基本原理

        MPU6050是一种常用的带有三轴加速度计和三轴陀螺仪的MEMS传感器,可以通过I2C总线与Arduino进行通信,在Arduino中使用MPU6050传感器需要注意一些细节和性能参数。
        工作原理方面,MPU6050的加速度计基于微机电系统(MEMS)技术,使用微小的机械结构和电子元件来测量物体在三个方向(X、Y、Z轴)上的加速度,通过自身的电路进行处理和放大后,输出测量到的加速度值。
        陀螺仪则利用了光电陀螺的原理,通过测量振动捕捉器或旋转体在三轴方向上的震荡运动,来记录物体在三个方向上的角速度,同样也是X、Y和Z轴方向上的角速度值。通常,陀螺仪的精度比加速度计高,但是更容易受到噪声和温度的影响。
        在Arduino中使用MPU6050传感器,我们需要先将其正确连接到Arduino板上,并设置相应的采样参数和滤波带宽参数。通过读取MPU6050传感器测量到的X、Y、Z轴方向上的加速度和角速度值,我们可以根据这些数据计算和分析物体的倾斜角度、运动方式等信息,以应用于各种实际应用场景中。
        需要注意的是,由于MPU6050传感器的测量精度和稳定性受到多种因素的影响,如传感器的校准、采样频率、运动状态等,因此在使用时还需要进行相应的校准和优化,以提高数据的准确性和可靠性。

使用Arduino驱动MPU6050,您需要完成以下步骤: 1. 连接MPU6050模块到Arduino板上,将VCC引脚连接到5V引脚,GND引脚连接到GND引脚,SCL引脚连接到A5引脚,SDA引脚连接到A4引脚。 2. 打开Arduino IDE,创建一个新的项目,并添加Wire库。 3. 在代码中引入Wire库,并定义MPU6050的地址,使用Wire.begin()初始化I2C总线。 ```c++ #include <Wire.h> #define MPU6050_ADDR 0x68 void setup() { Wire.begin(); } ``` 4. 设置MPU6050的寄存器,使其输出加速度计和陀螺仪的原始数据。 ```c++ void setup() { Wire.begin(); Wire.beginTransmission(MPU6050_ADDR); Wire.write(0x6B); Wire.write(0); Wire.endTransmission(true); Wire.beginTransmission(MPU6050_ADDR); Wire.write(0x1B); Wire.write(0x08); Wire.endTransmission(true); Wire.beginTransmission(MPU6050_ADDR); Wire.write(0x1C); Wire.write(0x08); Wire.endTransmission(true); } ``` 5. 读取MPU6050的原始数据,并将其转换为实际的加速度角速度值。 ```c++ void loop() { Wire.beginTransmission(MPU6050_ADDR); Wire.write(0x3B); Wire.endTransmission(false); Wire.requestFrom(MPU6050_ADDR, 14, true); int16_t ax = (Wire.read() << 8) | Wire.read(); int16_t ay = (Wire.read() << 8) | Wire.read(); int16_t az = (Wire.read() << 8) | Wire.read(); int16_t gx = (Wire.read() << 8) | Wire.read(); int16_t gy = (Wire.read() << 8) | Wire.read(); int16_t gz = (Wire.read() << 8) | Wire.read(); float accel_x = ax / 16384.0; float accel_y = ay / 16384.0; float accel_z = az / 16384.0; float gyro_x = gx / 131.0; float gyro_y = gy / 131.0; float gyro_z = gz / 131.0; // Do something with the data... } ``` 6. 完成以上步骤后,您就可以使用Arduino驱动MPU6050了。可以将转换后的加速度角速度值用于控制机器人或其他项目。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值