Arduino UNO R4 Minimaでセンサ・インターフェーシング ㊳ IMU LSM6DSOX

 AdafruitのIMU(イナーシャル・メジャーメント・ユニット)LSM6DSOX(ST Microelectronics)を利用します。 

 3軸の加速度センサに3軸のジャイロ・センサが組み合わされています。

AdafruitのStemma QT/Qwiicボード

 LSM6DSOXボード解説のページ

 Stemma QT/Qwiic(JST SH 4ピン)コネクタは2か所に装着されていて、どちらにつないでもかまいません。このコネクタを使ってI2Cで制御する場合、特に、ジャンパ線をつなぐなどは不要です。

 コネクタは、表と裏のどちらも差し込めそうですが、ピンが内部の上部に並んでいるので、差し込める方向は一意です。ロック機構はないですが、すぐに抜けるということはありません。

IMU LSM6DSOXのおもなスペック

 LSM6DSOXのデータシート

  • 動作電圧 1.71~3.6V
  • 動作温度範囲  -40~+85°C
  • 加速度測定範囲 ±2、±4、±8、±16g
  • ジャイロ測定範囲 フルスケール・レンジ±250、 ±500、±1000、±2000dps
  • インターフェース I2C(最大400kHz)、SPI(最大10MHz)、MIPI I3C
  • I2Cアドレス デフォルト0x6a、裏面のAD0ジャンパで0x6bに変更可(I2Cバスをスキャンすると、このアドレス以外に0x7eが見つかる)

使用環境

  • Arduino UNO R4 Minima
  • Arduino IDE 2.2.1
  • Windows10 22H2

接続

 Arduino UNO R4 MinimaのI2C信号とセンサ・ボードをJSTコネクタでつなぎます(Stemma QT/Qwiicボードの写真の比率は異なる)。

スレーブ・アドレスを確認

 従来からよく使われているi2cScanner.inoを動かしてスレーブ・アドレスを確認します。電源は3.3Vです。

  0x6aと0x7eを見つけてきました。

 


ライブラリの用意

 LSM6DSで検索して見つかった  Adafruit LSM6DSライブラリをインストールします。

 インストールを始めたとき、関連のライブラリや依存関係をインストールするかというパネルが出た場合は、全てをインストールします。


サンプル・スケッチ

 メニューのファイル->スケッチ例の、Adafruit LSM6DSから adafruit_lsm6dsox_test.inoを選択します。

  コンパイル、実行します。

 

 

グラフィック・ディスプレイに測定結果を表示

 次の記事を参考に、グラフィック・ディスプレイに測定したを表示します。

  Arduino UNO R4 Minimaでセンサ・インターフェーシング ⑤ 温湿度センサSi7021の測定結果をグラフィック・ディスプレイに表示

 スケッチです。


// Basic demo for accelerometer & gyro readings from Adafruit
// LSM6DSOX sensor

#include <Adafruit_LSM6DSOX.h>
#include <Adafruit_SSD1306.h> Adafruit_LSM6DSOX sox; Adafruit_SSD1306 display = Adafruit_SSD1306(128, 64, &Wire); void setup(void) { Serial.begin(115200); while (!Serial) delay(10); // will pause Zero, Leonardo, etc until serial console opens Serial.println("Adafruit LSM6DSOX + ssd1306"); if (!sox.begin_I2C()) { Serial.println("Failed to find LSM6DSOX chip"); while (1) { delay(10); } } Serial.println("LSM6DSOX Found!"); // sox.setAccelRange(LSM6DS_ACCEL_RANGE_2_G); Serial.print("Accelerometer range set to: "); switch (sox.getAccelRange()) { case LSM6DS_ACCEL_RANGE_2_G: Serial.println("+-2G"); break; case LSM6DS_ACCEL_RANGE_4_G: Serial.println("+-4G"); break; case LSM6DS_ACCEL_RANGE_8_G: Serial.println("+-8G"); break; case LSM6DS_ACCEL_RANGE_16_G: Serial.println("+-16G"); break; } // sox.setGyroRange(LSM6DS_GYRO_RANGE_250_DPS ); Serial.print("Gyro range set to: "); switch (sox.getGyroRange()) { case LSM6DS_GYRO_RANGE_125_DPS: Serial.println("125 degrees/s"); break; case LSM6DS_GYRO_RANGE_250_DPS: Serial.println("250 degrees/s"); break; case LSM6DS_GYRO_RANGE_500_DPS: Serial.println("500 degrees/s"); break; case LSM6DS_GYRO_RANGE_1000_DPS: Serial.println("1000 degrees/s"); break; case LSM6DS_GYRO_RANGE_2000_DPS: Serial.println("2000 degrees/s"); break; case ISM330DHCX_GYRO_RANGE_4000_DPS: break; // unsupported range for the DSOX } // sox.setAccelDataRate(LSM6DS_RATE_12_5_HZ); Serial.print("Accelerometer data rate set to: "); switch (sox.getAccelDataRate()) { case LSM6DS_RATE_SHUTDOWN: Serial.println("0 Hz"); break; case LSM6DS_RATE_12_5_HZ: Serial.println("12.5 Hz"); break; case LSM6DS_RATE_26_HZ: Serial.println("26 Hz"); break; case LSM6DS_RATE_52_HZ: Serial.println("52 Hz"); break; case LSM6DS_RATE_104_HZ: Serial.println("104 Hz"); break; case LSM6DS_RATE_208_HZ: Serial.println("208 Hz"); break; case LSM6DS_RATE_416_HZ: Serial.println("416 Hz"); break; case LSM6DS_RATE_833_HZ: Serial.println("833 Hz"); break; case LSM6DS_RATE_1_66K_HZ: Serial.println("1.66 KHz"); break; case LSM6DS_RATE_3_33K_HZ: Serial.println("3.33 KHz"); break; case LSM6DS_RATE_6_66K_HZ: Serial.println("6.66 KHz"); break; } // sox.setGyroDataRate(LSM6DS_RATE_12_5_HZ); Serial.print("Gyro data rate set to: "); switch (sox.getGyroDataRate()) { case LSM6DS_RATE_SHUTDOWN: Serial.println("0 Hz"); break; case LSM6DS_RATE_12_5_HZ: Serial.println("12.5 Hz"); break; case LSM6DS_RATE_26_HZ: Serial.println("26 Hz"); break; case LSM6DS_RATE_52_HZ: Serial.println("52 Hz"); break; case LSM6DS_RATE_104_HZ: Serial.println("104 Hz"); break; case LSM6DS_RATE_208_HZ: Serial.println("208 Hz"); break; case LSM6DS_RATE_416_HZ: Serial.println("416 Hz"); break; case LSM6DS_RATE_833_HZ: Serial.println("833 Hz"); break; case LSM6DS_RATE_1_66K_HZ: Serial.println("1.66 KHz"); break; case LSM6DS_RATE_3_33K_HZ: Serial.println("3.33 KHz"); break; case LSM6DS_RATE_6_66K_HZ: Serial.println("6.66 KHz"); break; } // SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3D)) { // Address 0x3C for 128x32 Serial.println(F("SSD1306 allocation failed")); for (;;) ; // Don't proceed, loop forever } display.display(); delay(500); // Pause for 2 seconds display.setTextSize(1); display.setTextColor(WHITE); display.setRotation(0); display.clearDisplay(); } void loop() { // /* Get a new normalized sensor event */ sensors_event_t accel; sensors_event_t gyro; sensors_event_t temp; sox.getEvent(&accel, &gyro, &temp); Serial.print("\t\tTemperature "); Serial.print(temp.temperature); Serial.println(" deg C"); /* Display the results (acceleration is measured in m/s^2) */ Serial.print("\t\tAccel X: "); Serial.print(accel.acceleration.x); Serial.print(" \tY: "); Serial.print(accel.acceleration.y); Serial.print(" \tZ: "); Serial.print(accel.acceleration.z); Serial.println(" m/s^2 "); /* Display the results (rotation is measured in rad/s) */ Serial.print("\t\tGyro X: "); Serial.print(gyro.gyro.x); Serial.print(" \tY: "); Serial.print(gyro.gyro.y); Serial.print(" \tZ: "); Serial.print(gyro.gyro.z); Serial.println(" radians/s "); Serial.println(); display.clearDisplay(); display.setCursor(0, 0); display.println("Accelerometer - m/s^2"); display.print(accel.acceleration.x, 1); display.print(", "); display.print(accel.acceleration.y, 1); display.print(", "); display.print(accel.acceleration.z, 1); display.println(""); display.println(""); display.println("Rotation is measured in rad/s"); display.print(gyro.gyro.x, 1); display.print(", "); display.print(gyro.gyro.y, 1); display.print(", "); display.print(gyro.gyro.z, 1); display.println(""); display.display(); delay(500); }

 実行例です。

前へ

Arduino UNO R4 Minimaでセンサ・インターフェーシング ㊲ 加速度計/磁力計LSM303AGR

次へ

Arduino UNO R4 WiFiでBLE ① 気圧センサLPS22をつなぐ