BNO055
今回はモーションセンサをArduinoに接続し、AruinoとUnityを連携させて、Unity空間のオブジェクトの回転を制御してみます。
要するにPAXパワーグローブのページでやっているパワーグローブ近代化作業の要素技術確認です。
本ページで解説しているのはBosch社のBNO055についてですが、InvenSense社のMPU-9150版の記事もあります。
必要なもの
ハードウェア
項目 | 説明 |
---|---|
Arduino Uno | 比較的小型で安価で簡単に使えるマイコンボード。 |
BNO055ブレイクアウトボード | Bosch社の3軸加速度+3軸ジャイロ+3軸コンパスのモーションセンサチップBNO055が載ったAdafruit社のブレイクアウトボード。BNO055が搭載されているモジュールならば概ね同様だと思います。(Arduino 9軸モーションシールドなど)BNO055は、センサの生データではなく、複数のセンサの値を統合(センサフュージョン)し、クォータニオンを算出してくれるので便利です。Adafruit社のブレイクアウトボードは国内で販売していなかったため、輸入しました。価格は34.95ドル。送料(UPS Express Saver)が26.99ドルで、合計61.94ドル。8/11 23:30に注文、8/13 16:00に到着。 |
ソフトウェア
項目 | 説明 |
---|---|
Arduino IDE | Arduino用の開発環境。オフィシャルサイトからダウンロードしてください。 |
Unity | マルチプラットフォーム対応のゲームエンジン。簡単に3D(or 2D)ゲームを作ることが出来る。オフィシャルサイトからダウンロードしてください。 |
Adafruit_BNO055 Library | Adafruitのサイトからダウンロードしてください。 |
Adafruit_Sensor Library | Adafruitのサイトからダウンロードしてください。 |
Unity用C#スクリプト | 上記サンプルスケッチの出力をUnity側で受け取ってGameObjectを制御するC#スクリプト。本ページ下部からダウンロードしてください。 |
手順
ハードウェアの準備
- BNO055のSCLをArduinoのSCL(Arduino UnoではA5ピン)に接続する。
- BNO055のSDAをArduinoのSDA(Arduino UnoではA4ピン)に接続する。
- BNO055のGNDをArduinoのGNDピンに接続する。
- BNO055のVinをArduinoの5Vピンに接続する。
ソフトウェアの準備(1):Arduinoスケッチ
- Adafruit_BNO055-master.zip、Adafruit_Sensor-master.zipを解凍する。
- できたフォルダをArduino用フォルダのlibrariesにコピーする。
- Arduino IDEを起動する。
- メニューの[ファイル]>[スケッチの例]>[Adafruit BNO055]>[rawdata]を選択する。
- 32行目を次のように変更する。~
(unidiff風に書いています。要するに先頭が-の行を削除して、先頭が+の行を追加するだけです。)
- Serial.begin(9600);
+ Serial.begin(115200); - 36行目を次のように変更する。(意味については、BoschのBNO055のデータシートPDFの"3.3 Operation Modes"をご覧ください。)
- if(!bno.begin())
+ if(!bno.begin(bno.OPERATION_MODE_IMUPLUS)) - 87行目を次のように変更する。
- Serial.print("qW: ");
- Serial.print(quat.w(), 4);
- Serial.print(" qX: ");
- Serial.print(quat.y(), 4);
- Serial.print(" qY: ");
- Serial.print(quat.x(), 4);
- Serial.print(" qZ: ");
- Serial.print(quat.z(), 4);
- Serial.print("\t\t");
+ Serial.print("quat\t");
+ Serial.print(quat.w());
+ Serial.print("\t");
+ Serial.print(quat.y());
+ Serial.print("\t");
+ Serial.print(-quat.x());
+ Serial.print("\t");
+ Serial.println(quat.z());
`` - 99行目を次のように変更する。
- uint8_t system, gyro, accel, mag = 0;
- bno.getCalibration(&system, &gyro, &accel, &mag);
- Serial.print("CALIBRATION: Sys=");
- Serial.print(system, DEC);
- Serial.print(" Gyro=");
- Serial.print(gyro, DEC);
- Serial.print(" Accel=");
- Serial.print(accel, DEC);
- Serial.print(" Mag=");
- Serial.println(mag, DEC); - 保存してArduinoに書き込む。
- メニューの[ツール]>[シリアルモニタ]を選択する。
- 右下のボーレート選択リストから115200baudを選択する。
- 「Orientation Sensor Raw Data Test」に続いて、先頭に「quat」、その後に数値が出力されたら、成功。表示されない場合は、Arduino本体のリセットボタンを押してみてください。
- このとき、ウィンドウのタイトルに「COM~」と表示されているはずなので、番号を覚えておく。
ソフトウェアの準備(2):Unity用C#スクリプト
- Unityを起動する。
- [Edit]>[Project Settings]>[Player]を開く。
- [Api Compatibility Level]を".NET 2.0 Subset"から".NET 2.0"に変更する。
- [GameObject]>[Create Other]>[Cube]を選択する。
- Scene Viewに立方体が表示され、Hierarchy Viewに「Cube」というGameObjectが出来ていることを確認する。
- Project Viewに本ページからダウンロードしたC#スクリプトをドラッグ&ドロップする。
- Project ViewにC#スクリプトが追加されていることを確認する。
- C#スクリプトをダブルクリックして開き、定数SERIAL_PORTを先ほど覚えておいた番号に書き換え、保存する。
- Project ViewのC#スクリプトをHierarchy Viewの「Cube」にドラッグ&ドロップする。
動作確認
- Unityの再生ボタンを押す。
- BNO055を傾けてみて、Cubeが動けば成功! 動かない場合は、Arduino本体のリセットボタンを押してみてください。
お疲れ様でした。 :)
Unity用C#スクリプト
InvenSense社のMPU-9150用に作成したものを流用しています。
ControlObjectByMPU9150InUnity.cs