ESP32: BPI-BIT 开发板外设 MPU9250 学习(Arduino)

前言

学习使用 bpi-bit 板子上的 MPU9250 制作指南针

软硬件

测试使用的开发板: bpi-bit

应用到的外设: MPU9250

测试使用的软件:Arduino IDE 1.8.9

函数解析

int MPU9250::setAccelRange(AccelRange range)将加速度计满刻度范围设置为默认值以外的值

int MPU9250::setGyroRange(GyroRange range)将陀螺仪满刻度范围设置为默认值以外的值

int MPU9250::setDlpfBandwidth(DlpfBandwidth bandwidth)将DLPF带宽设置为默认值以外的值

int MPU9250::calibrateMag()找到磁强计的偏差和比例因子校准,传感器应以画8的方式旋转,直到完成;校准功能

double atan2(double y, double x)返回以弧度表示的 y/x 的反正切。y 和 x 的值的符号决定了正确的象限。也可以理解为计算复数 x+yi 的辐角

代码讲解

MPU9250 IMU(i2c0, 0x68);//V1.4
//we need to modify the I2C address according to the hardware.
//Hardware Version 1.2   >MPU9250 IMU(i2c0, 0x69);<
//Hardware Version 1.4   >MPU9250 IMU(i2c0, 0x68);<

创建 MPU9250 对象。i2c0 是 I2C 的 pin 脚,0x68 是 I2C 的地址
(如果 bpibit 的版本为 1.2,则 I2C 的地址为 0x69)

Serial.printf("\r\n Yaw %.6f ", float(atan2(IMU.getMagY_uT(), IMU.getMagX_uT())) * RAD_TO_DEG);
  delay(20);

打印出 x y 方向的倾斜角度

使用示例

要对代码进行测试,只需使用Arduino IDE对其进行编译并上传到 bpibit 开发板即可

#include "MPU9250.h"

MPU9250 IMU(i2c0, 0x68);//V1.4
//we need to modify the I2C address according to the hardware.
//Hardware Version 1.2   >MPU9250 IMU(i2c0, 0x69);<
//Hardware Version 1.4   >MPU9250 IMU(i2c0, 0x68);<

int status;

void setup()
{
  // serial to display data
  Serial.begin(9600);
  while (!Serial)
  {
  }
  // start communication with IMU
  status = IMU.begin();
  if (status < 0)
  {
    Serial.println("IMU initialization unsuccessful");
    Serial.println("Check IMU wiring or try cycling power");
    Serial.print("Status: ");
    Serial.println(status);
    while (1)
    {
    }
  }
  // setting the accelerometer full scale range to +/-8G
  IMU.setAccelRange(MPU9250::ACCEL_RANGE_2G);
  // setting the gyroscope full scale range to +/-500 deg/s
  IMU.setGyroRange(MPU9250::GYRO_RANGE_250DPS);
  // setting DLPF bandwidth to 20 Hz
  IMU.setDlpfBandwidth(MPU9250::DLPF_BANDWIDTH_41HZ);
  // setting SRD to 19 for a 50 Hz update rate
  // IMU.setSrd(19);
  IMU.calibrateMag();
}

#define RAD_TO_DEG 57.295779513082320876798154814105  // 180/π

void loop()
{
  // read the sensor
  IMU.readSensor();

  

  Serial.printf("\r\n Yaw %.6f ", float(atan2(IMU.getMagY_uT(), IMU.getMagX_uT())) * RAD_TO_DEG);
  delay(20);
}

现象

通过串口返回板载MPU9250磁力计获得的地磁数据转化来的南北角度。
角度与方向(LED面板向上):

方向 角度
+90
±180
西 -90
±0

bpibit 板子金手指边的朝向越接近于南,则打印出来的倾斜度就越接近于0

一开始会有几秒钟的校准,在视频没有显示出来

参考资料

MPU9250 库

ESP32 概览 | 乐鑫

1 个赞

你这个真的是业界劳模鸭!!!