Freenove ESP32-S3-WROOM CAMボードに9軸 加速度計・ジャイロ・コンパスセンサを接続し、9軸 加速度計・ジャイロ・コンパスセンサの入力プログラムを作成しました。「Spresenseで9軸 加速度計・ジャイロ・コンパスセンサ 入力とフルカラーテープLED表示」では、Spresenseに接続しました。

ESP32-S3と9軸 加速度計・ジャイロ・コンパスセンサを接続して、I 2 Cアドレスは確認できましたが、センサー情報の入力が上手くいきませんでした。

ESP32-S3と9軸 加速度計・ジャイロ・コンパスセンサの接続

9軸 加速度計・ジャイロ・コンパスセンサの信号を次のようにESP32-S3に接続します。なお、SCL/SDAは4.7kΩでプルアップします。

ESP32-S3と9軸 加速度計・ジャイロ・コンパスセンサの接続の接続
9軸 加速度計・ジャイロ・コンパスセンサ ESP32-S3
GND GND
3.3v 3V3
SCL 2
SDA 1

ESP32-S3に接続されている9軸 加速度計・ジャイロ・コンパスセンサのI 2 Cアドレスをスキャンするプログラム「esp32s3_i2c_scanner.ino」を実行すると、次にように、 慣性測定ユニット(IMU)「BMI270」のI2Cアドレス「0x68」、3 軸電子コンパス「AK09918」のI 2 2Cアドレス「0x0C」が表示されます。

ESP32-S3と9軸 加速度計・ジャイロ・コンパスセンサの接続画像を次に示します。

9軸 加速度計・ジャイロ・コンパスセンサスケッチの作成

加速度計・ジャイロセンサのスケッチ「esp32s3_BMI270.ino」を次に示します。「SparkFun_BMI270_Arduino_Library」の「/examples/Example01_BasicReadingsI2C」を参照しました。

esp32s3_BMI270.ino

#include <Wire.h>
#include "SparkFun_BMI270_Arduino_Library.h"

#define PIN_SDA 1
#define PIN_SCL 2

// Create a new sensor object
BMI270 imu;

// I2C address selection
uint8_t i2cAddress = BMI2_I2C_PRIM_ADDR; // 0x68
//uint8_t i2cAddress = BMI2_I2C_SEC_ADDR; // 0x69

void setup()
{
    // Start serial
    Serial.begin(115200);
    Serial.println("BMI270 Example 1 - Basic Readings I2C");

    // Initialize the I2C library
    Wire.begin(PIN_SDA, PIN_SCL);

    // Check if sensor is connected and initialize
    // Address is optional (defaults to 0x68)
    while(imu.beginI2C(i2cAddress) != BMI2_OK)
    {
        // Not connected, inform user
        Serial.println("Error: BMI270 not connected, check wiring and I2C address!");

        // Wait a bit to see if connection is established
        delay(1000);
    }

    Serial.println("BMI270 connected!");
}

void loop()
{
    // Get measurements from the sensor. This must be called before accessing
    // the sensor data, otherwise it will never update
    imu.getSensorData();

    // Print acceleration data
    Serial.print("Acceleration in g's");
    Serial.print("\t");
    Serial.print("X: ");
    Serial.print(imu.data.accelX, 3);
    Serial.print("\t");
    Serial.print("Y: ");
    Serial.print(imu.data.accelY, 3);
    Serial.print("\t");
    Serial.print("Z: ");
    Serial.print(imu.data.accelZ, 3);

    Serial.print("\t");

    // Print rotation data
    Serial.print("Rotation in deg/sec");
    Serial.print("\t");
    Serial.print("X: ");
    Serial.print(imu.data.gyroX, 3);
    Serial.print("\t");
    Serial.print("Y: ");
    Serial.print(imu.data.gyroY, 3);
    Serial.print("\t");
    Serial.print("Z: ");
    Serial.println(imu.data.gyroZ, 3);

    // Print 50x per second
    delay(20);
}

コンパスセンサのスケッチ「esp32s3_AK09918.ino」を次に示します。「Seeed ICM20600 + AK09918 Library 」の「/examples/compass」を参照しました。

#include "AK09918.h"
#include <Wire.h>

#define PIN_SDA 1
#define PIN_SCL 2

uint8_t _bufferx[16];

AK09918_err_type_t err, err1, err2;
int32_t x, y, z;
AK09918 ak09918;

void setup() {
  Serial.begin(115200);
  // join I2C bus (I2Cdev library doesn't do this automatically)
  Wire.begin(PIN_SDA, PIN_SCL);

  Serial.printf("***********************************************\n", err);
  Serial.printf("***********************************************\n", err);

/*  while (true) {
    if (!I2Cdev::readByte(AK09918_I2C_ADDR, AK09918_WIA2, _bufferx)) {
      Serial.printf("AK09918_ERR_READ_FAILED\n");
    } else {
      Serial.printf("data %x\n", _bufferx[0]);
    }
    delay(100);
  }
*/


  err = ak09918.initialize();
  err1 = ak09918.switchMode(AK09918_POWER_DOWN);
  err2 = ak09918.switchMode(AK09918_CONTINUOUS_100HZ);

  Serial.printf("init:%d,1:%d,2:%d\n", err, err1, err2);

  err = ak09918.isDataReady();
  while (err != AK09918_ERR_OK) {
    //err2 = ak09918.switchMode(AK09918_CONTINUOUS_100HZ);
    delay(100);
    I2Cdev::readByte(AK09918_I2C_ADDR, AK09918_CNTL2, _bufferx);
    Serial.printf("AK09918_CNTL2 %x\n", _bufferx[0]);

    //Serial.println("Waiting Sensor");
    Serial.printf("Waiting Sensor %d\n", err);
    delay(100);
    err = ak09918.isDataReady();
  }
}

void loop() {
  err = ak09918.isDataReady();
  // err = AK09918_ERR_OK;
  if (err == AK09918_ERR_OK) {
    err = ak09918.isDataSkip();
    if (err == AK09918_ERR_DOR) {
      Serial.println(ak09918.strError(err));
    }
    err = ak09918.getData(&x, &y, &z);
    if (err == AK09918_ERR_OK) {
      Serial.print("X: ");
      Serial.print(x);
      Serial.print("uT");
      Serial.print("\tY: ");
      Serial.print(y);
      Serial.print("uT");
      Serial.print("\tZ: ");
      Serial.print(z);
      Serial.println("uT");
    } else {
      Serial.println(ak09918.strError(err));
    }
  } else {
    Serial.println(ak09918.strError(err));
  }
  delay(100);
}

9軸 加速度計・ジャイロ・コンパスセンサのスケッチの実行

作成したいずれのスケッチでも、9軸 加速度計・ジャイロ・コンパスセンサ情報のデータが入力できませんでした。それぞれの実行結果を次に示します。

  • 作成した加速度計・ジャイロセンサのスケッチ「esp32s3_BMI270.ino」の実行結果を次に示します。
  • nitialize the sensor 「 bmi270_init(&sensor);」関数の戻り値が「-2」(BMI2_E_DEV_NOT_FOUND -Communication fail)となります。

  • 作成したコンパスセンサのスケッチ「esp32s3_AK09918.ino」の実行結果を次に示します。
  • CNTL2: Control 2レジスタ「31h」に「8」( AK09918_CONTINUOUS_100HZ)を書き込んで、読み出すと「0」になっており、うまく書く込めていないようです。WIA: Who I AmのWIA1「00h」WIA2「02h」を読み込むと、それぞれ「48h」「0ch」となっており、正常に読み込めました。