姿勢センサー MPU9250

姿勢センサー MPU9250 は多チップモジュールで、MPU6500 と AK8963 の 2 つのチップを統合したものです。MPU6500 は 3 軸のジャイロスコープと 3 軸の加速度計を備え、AK8963 は 3 軸の磁力計です。 ?>注意します: 使用前は、MPU9250 IMU エンティティを作成する必要があります

initMPU9250()

機能です:

MPU6500 チップを初期化します

原型関数です:

void initMPU9250()

使用例です:

#include <M5Stack.h>
#include "utility/MPU9250.h"

MPU9250 IMU; // new a MPU9250 object

void setup(){
    M5.begin();
    Serial.begin(115200);

    IMU.initMPU9250();
    byte c = IMU.readByte(MPU9250_ADDRESS, WHO_AM_I_MPU9250);
    Serial.print("MPU9250 "); Serial.print("I AM "); Serial.print(c, HEX);
}

initAK8963()

機能です:

AK8963 チップを初期化します

原型関数です:

void initAK8963(float * destination)

パラメータです 記述します
destination AK8963 チップ内の出荷時設定のデフォルト値の配列のポインタ

使用例です:

#include <M5Stack.h>
#include "utility/MPU9250.h"

MPU9250 IMU; // new a MPU9250 object

void setup(){
    M5.begin();
    Serial.begin(115200);

    // "magCalibration[3] = {0};" was defined at file "MPU9250.h"
    IMU.initAK8963(IMU.magCalibration);
    Serial.println("AK8963 initialized for active data mode....");
    if (Serial)
    {
      //  Serial.println("Calibration values: ");
      Serial.print("X-Axis sensitivity adjustment value ");
      Serial.println(IMU.magCalibration[0], 2);
      Serial.print("Y-Axis sensitivity adjustment value ");
      Serial.println(IMU.magCalibration[1], 2);
      Serial.print("Z-Axis sensitivity adjustment value ");
      Serial.println(IMU.magCalibration[2], 2);
    }
}

calibrateMPU9250()

機能です:

芯片を初期化した後、静止状態下のジャイロスコープと加速度計のオフセットを読み込み、それぞれのオフセットレジスタに保存するための関数を実行します

原型関数です:

void calibrateMPU9250(float * gyroBias, float * accelBias)

パラメータです 記述します
gyroBias 保存静止下ジャイロスコープの値の配列のアドレス
accelBias 保存静止下加速度計の値の配列のアドレス

使用例です:

#include <M5Stack.h>
#include "utility/MPU9250.h"

MPU9250 IMU; // new a MPU9250 object

void setup(){
    M5.begin();
    Serial.begin(115200);

    IMU.initMPU9250();
    byte c = IMU.readByte(MPU9250_ADDRESS, WHO_AM_I_MPU9250);
    Serial.print("MPU9250 "); Serial.print("I AM "); Serial.print(c, HEX);
    // "gyroBias[3] = {0};" was defined at file "MPU9250.h"
    // "accelBias[3] = {0};" was defined at file "MPU9250.h"
    IMU.calibrateMPU9250(IMU.gyroBias, IMU.accelBias);
    M5.Lcd.fillScreen(BLACK);
    M5.Lcd.setTextSize(1);
    M5.Lcd.setCursor(0, 0); M5.Lcd.print("MPU9250 bias");
    M5.Lcd.setCursor(0, 16); M5.Lcd.print(" x   y   z  ");

    M5.Lcd.setCursor(0,  32); M5.Lcd.print((int)(1000*IMU.accelBias[0]));
    M5.Lcd.setCursor(32, 32); M5.Lcd.print((int)(1000*IMU.accelBias[1]));
    M5.Lcd.setCursor(64, 32); M5.Lcd.print((int)(1000*IMU.accelBias[2]));
    M5.Lcd.setCursor(96, 32); M5.Lcd.print("mg");

    M5.Lcd.setCursor(0,  48); M5.Lcd.print(IMU.gyroBias[0], 1);
    M5.Lcd.setCursor(32, 48); M5.Lcd.print(IMU.gyroBias[1], 1);
    M5.Lcd.setCursor(64, 48); M5.Lcd.print(IMU.gyroBias[2], 1);
    M5.Lcd.setCursor(96, 48); M5.Lcd.print("o/s");
}

void loop(){

}

readByte()

機能です:

指定レジスタ内のデータを読み込み、返却します。返却値:レジスタの値、長さは 8 ビット

原型関数です:

uint8_t readByte(uint8_t address, uint8_t subAddress)

パラメータです 記述します
address チップ (MPU9250/AK8963)のアドレス
subAddress チップ内のレジスタアドレス

使用例です:

#include <M5Stack.h>
#include "utility/MPU9250.h"

MPU9250 IMU; // new a MPU9250 object

void setup(){
    M5.begin();
    Serial.begin(115200);

    byte c = IMU.readByte(MPU9250_ADDRESS, WHO_AM_I_MPU9250);
    Serial.print("MPU9250 "); Serial.print("I AM "); Serial.print(c, HEX);
}

readGyroData()

機能です:

指定レジスタ内のデータを読み込み、返却します。返却値:レジスタの値、長さは 8 ビット

原型関数です:

void readGyroData(int16_t * destination)

パラメータです 記述します
destination ジャイロスコープの値を保存する配列のアドレス

使用例です:

#include <M5Stack.h>
#include "utility/MPU9250.h"

MPU9250 IMU; // new a MPU9250 object

void setup(){
    M5.begin();
    Serial.begin(115200);

    IMU.initMPU9250();
    byte c = IMU.readByte(MPU9250_ADDRESS, WHO_AM_I_MPU9250);
    Serial.print("MPU9250 "); Serial.print("I AM "); Serial.print(c, HEX);
    IMU.calibrateMPU9250(IMU.gyroBias, IMU.accelBias);
}

void loop(){
    // If intPin goes high, all data registers have new data
    // On interrupt, check if data ready interrupt
    if (IMU.readByte(MPU9250_ADDRESS, INT_STATUS) & 0x01)
    {
        // "gyroCount[3] = {0};" was defined at file "MPU9250.h"
        IMU.readGyroData(IMU.gyroCount);  // Read the x/y/z adc values
        IMU.getGres(); // get Gyro scales saved to "gRes"
        IMU.gx = (float)IMU.gyroCount[0]*IMU.gRes;
        IMU.gy = (float)IMU.gyroCount[1]*IMU.gRes;
        IMU.gz = (float)IMU.gyroCount[2]*IMU.gRes;
        Serial.print("X-gyro rate: "); Serial.print(IMU.gx, 3);
        Serial.print(" degrees/sec ");
        Serial.print("Y-gyro rate: "); Serial.print(IMU.gy, 3);
        Serial.print(" degrees/sec ");
        Serial.print("Z-gyro rate: "); Serial.print(IMU.gz, 3);
        Serial.println(" degrees/sec");
    }
}

readAccelData()

機能です:

三方向のジャイロスコープの値を読み込みます

原型関数です:

void readAccelData(int16_t * destination)

パラメータです 記述します
destination ジャイロスコープの値を保存する配列のアドレス

使用例です:

#include <M5Stack.h>
#include "utility/MPU9250.h"

MPU9250 IMU; // new a MPU9250 object

void setup(){
    M5.begin();
    Serial.begin(115200);

    IMU.initMPU9250();
    byte c = IMU.readByte(MPU9250_ADDRESS, WHO_AM_I_MPU9250);
    Serial.print("MPU9250 "); Serial.print("I AM "); Serial.print(c, HEX);
    IMU.calibrateMPU9250(IMU.gyroBias, IMU.accelBias);
}

void loop(){
    // If intPin goes high, all data registers have new data
    // On interrupt, check if data ready interrupt
    if (IMU.readByte(MPU9250_ADDRESS, INT_STATUS) & 0x01)
    {
        // "accelCount[3] = {0};" was defined at file "MPU9250.h"
        IMU.readAccelData(IMU.accelCount);
        IMU.getAres(); // get accelerometer scales saved to "aRes"
        IMU.ax = (float)IMU.accelCount[0]*IMU.aRes; // - accelBias[0];
        IMU.ay = (float)IMU.accelCount[1]*IMU.aRes; // - accelBias[1];
        IMU.az = (float)IMU.accelCount[2]*IMU.aRes; // - accelBias[2];
        Serial.print("X-acceleration: "); Serial.print(1000*IMU.ax);
        Serial.print(" mg ");
        Serial.print("Y-acceleration: "); Serial.print(1000*IMU.ay);
        Serial.print(" mg ");
        Serial.print("Z-acceleration: "); Serial.print(1000*IMU.az);
        Serial.println(" mg ");
    }
}

readTempData()

機能です:

温度を読み取ります

原型関数です:

int16_t readTempData(void)

使用例です:

#include <M5Stack.h>
#include "utility/MPU9250.h"

MPU9250 IMU; // new a MPU9250 object

void setup()
{
  M5.begin();
  Wire.begin();

  IMU.calibrateMPU9250(IMU.gyroBias, IMU.accelBias);
  IMU.initMPU9250();
  IMU.initAK8963(IMU.magCalibration);
}

void loop()
{
   IMU.tempCount = IMU.readTempData();
   IMU.temperature = ((float) IMU.tempCount) / 333.87 + 21.0;
   M5.Lcd.setCursor(0, 0);
   M5.Lcd.print("MPU9250 Temperature is ");
   M5.Lcd.print(IMU.temperature, 1);
   delay(500);
}
On This Page