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」となっており、正常に読み込めました。