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Ωでプルアップします。
| 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」の実行結果を次に示します。
- 作成したコンパスセンサのスケッチ「esp32s3_AK09918.ino」の実行結果を次に示します。
nitialize the sensor 「 bmi270_init(&sensor);」関数の戻り値が「-2」(BMI2_E_DEV_NOT_FOUND -Communication fail)となります。
CNTL2: Control 2レジスタ「31h」に「8」( AK09918_CONTINUOUS_100HZ)を書き込んで、読み出すと「0」になっており、うまく書く込めていないようです。WIA: Who I AmのWIA1「00h」WIA2「02h」を読み込むと、それぞれ「48h」「0ch」となっており、正常に読み込めました。



