Arduino UNO R4 Minimaでセンサ・インターフェーシング ㉝ IMU BNO055
Adafruitの方位/慣性計測(IMU)モジュール BNO055(BOSCH)を利用します。
このモジュールでは、加速度センサに3軸磁力計、3軸ジャイロスコープが組み合わされています。3軸+3軸+3軸で9軸です。
磁界センシングを使って磁力計のキャリブレーションを行えば、北に向かっているかを知ることができます。
回転速度がわかれば、センサ自体が水平に進んでいるかどうかがわかります。
加速度がわかれば、一定速度で動いているかどうかがわかります。
- 3軸の加速度(重力 + 直線運動):加速度ベクトル
- 3軸の回転速度:角速度ベクトル
- 3軸の磁界センシング:磁界強度ベクトル
- 温度
これら三つのセンサのデータから、例えば飛行機であれば、進む方向、飛行機の傾きなどを表せるオイラー角やクォータニオンが算出できます。
- 絶対方位(オイラー角)
- 絶対方向(クォータニオン)
生データを受け取った側で計算するのではなく、このモジュールでは3Dの処理などにすぐに使える上記の演算済みの値が出力されます。
●AdafruitのStemma QT/Qwiicボード
Stemma QT/Qwiic(JST SH 4ピン)コネクタは2か所に装着されていて、どちらにつないでもかまいません。このコネクタを使ってI2Cで制御する場合、特に、ジャンパ線をつなぐなどは不要です。
コネクタは、表と裏のどちらも差し込めそうですが、ピンが内部の上部に並んでいるので、差し込める方向は一意です。ロック機構はないですが、すぐに抜けるということはありません。
●IMU BNO055のおもなスペック
- 動作電圧 2.4~3.6V
- 動作温度範囲 -40~+85°C
- 加速度測定範囲 ±2、±4、±8、±16g;14ビット
- ジャイロスコープ ±125°から±2000°/sec 切り替え可能な範囲;16ビット
- 地磁気(磁気) ±1300µT(x、y軸)、±2500µT(z軸)、分解能0.3µT;13/13/15ビット
- インターフェース I2C(最大400kHz)
- スレーブ・アドレス デフォルト0x28、裏面ジャンパで0x29
●使用環境
- Arduino UNO R4 Minima
- Arduino IDE 2.2.1
- Windows10 22H2
●接続
Arduino UNO R4 MinimaのI2C信号とセンサ・ボードをJSTコネクタでつなぎます(Stemma QT/Qwiicボードの写真の比率は異なる)。
●スレーブ・アドレスを確認
従来からよく使われているi2cScanner.inoを動かしてスレーブ・アドレスを確認します。電源は3.3Vです。
0x28を見つけてきました。
●ライブラリの用意
BNO055で検索して、見つかった Adafruit BNO055ライブラリをインストールします。
インストールを始めたとき、関連のライブラリや依存関係をインストールするかというパネルが出た場合は、全てをインストールを選びます。
●デバイスのキャリブレーション
BNO055 には、デバイス内のジャイロスコープ、加速度計、磁力計を常に校正するための内部アルゴリズムが含まれています。
キャリブレーション・プロセスの正確な性質はブラック・ボックスであり、完全には文書化されていませんが、 Adafruit_BNO055ライブラリの.getCalibration関数を使用して各センサのキャリブレーション ステータスを読み取れます 。この関数の使用方法を示すスケッチ例は sensorapi.inoにあります。
●サンプル・スケッチ①
メニューのファイル->スケッチ例から、Adafruit BNO055のbunny.inoを選択します。
Processingを用いて3Dのウサギを表示するときに用いるスケッチです。
コンパイル、実行します。3Dのウサギの表示は動かしていません。
●サンプル・スケッチ②
メニューのファイル->スケッチ例から、Adafruit BNO055のposition.inoを選択します。
linearAccelData.acceleration.x、linearAccelData.acceleration.y、の位置情報、センサが向いている方向の速度(headingVel)の三つを表示します。
コンパイル、実行します。
●サンプル・スケッチ③
メニューのファイル->スケッチ例から、Adafruit BNO055のrawdata.inoを選択します。
最初に温度を表示し、その後、生の加速度計、磁力計、またはジャイロスコープのデータを表示します。
コンパイル、実行します。
●サンプル・スケッチ④
メニューのファイル->スケッチ例から、Adafruit BNO055のread_all_data.inoを選択します。
コンパイル、実行します。
●サンプル・スケッチ⑤
メニューのファイル->スケッチ例から、Adafruit BNO055のrestore_offsets.inoを選択します。
コンパイル、実行します。
●サンプル・スケッチ⑥
メニューのファイル->スケッチ例から、Adafruit BNO055のsensorapi.inoを選択します。
コンパイル、実行します。
●サンプル・スケッチ⑦
メニューのファイル->スケッチ例から、Adafruit BNO055のwebserial_3d.inoを選択します。
Chrome ブラウザでWeb Serial APIを利用して、うさぎの3Dを回転させるスケッチです。
コンパイル、実行します。表示では、オイラー角もしくはクォータニオンのデータが選択できます。
3Dのウサギの表示は動かしていません。
●グラフィック・ディスプレイに測定結果を表示---失敗
次の記事を参考に、グラフィック・ディスプレイに測定した値を表示します。
ベースにしたのは、サンプル・スケッチ⑦のwebserial_3d.inoです。
Arduino UNO R4 Minimaでセンサ・インターフェーシング ⑤ 温湿度センサSi7021の測定結果をグラフィック・ディスプレイに表示
グラフィック・ディスプレイをつなぐと、表示される値がほとんど全部0になりました。
i2cScanner.inoを動かすと、0x28と0x3dが表示され、スレーブ・アドレスが重なっているわけではなさそうです。BNO055ボードの裏面0x29のジャンパをショートし、スケッチの、
Adafruit_BNO055 bno = Adafruit_BNO055(55, 0x29);
を変更してみました。
BNO055ボード単独では正常でしたが、グラフィック・ディスプレイをつなぐと値が0になります。
原因は不明です。