Top/Devel/電子工作/Arduino/モーションセンサ/BNO055

BNO055 の変更点はてなブックマーク


今回はモーションセンサをArduinoに接続し、AruinoとUnityを連携させて、Unity空間のオブジェクトの回転を制御してみます。

~
要するに[[../../PaxPowerGlove]]のページでやっているパワーグローブ近代化作業の要素技術確認です。

~

#vine(epWFAhPwDa6)

~

本ページで解説しているのはBosch社のBNO055についてですが、[[InvenSense社のMPU-9150版の記事もあります。>../MPU-9150]]

*必要なもの
**ハードウェア
|項目|説明|h
|[[Arduino Uno>http://www.amazon.co.jp/exec/obidos/ASIN/B0044X2E5S/cubic9com-22]]|比較的小型で安価で簡単に使えるマイコンボード。|
|[[BNO055ブレイクアウトボード>https://learn.adafruit.com/adafruit-bno055-absolute-orientation-sensor/overview]]|Bosch社の3軸加速度+3軸ジャイロ+3軸コンパスのモーションセンサチップBNO055が載ったAdafruit社のブレイクアウトボード。&br;BNO055が搭載されているモジュールならば概ね同様だと思います。([[Arduino 9軸モーションシールド>https://www.switch-science.com/catalog/2213/]]など)&br;BNO055は、センサの生データではなく、複数のセンサの値を統合(センサフュージョン)し、クォータニオンを算出してくれるので便利です。&br;Adafruit社のブレイクアウトボードは国内で販売していなかったため、輸入しました。&br;価格は34.95ドル。送料(UPS Express Saver)が26.99ドルで、合計61.94ドル。8/11 23:30に注文、8/13 16:00に到着。|

**ソフトウェア
|項目|説明|h
|Arduino IDE|Arduino用の開発環境。&br;[[オフィシャルサイト>http://arduino.cc/]]からダウンロードしてください。|
|[[Unity>http://japan.unity3d.com/]]|マルチプラットフォーム対応のゲームエンジン。簡単に3D(or 2D)ゲームを作ることが出来る。&br;[[オフィシャルサイト>http://japan.unity3d.com/]]からダウンロードしてください。|
|Adafruit_BNO055 Library|[[Adafruitのサイト>https://learn.adafruit.com/adafruit-bno055-absolute-orientation-sensor/wiring-and-test]]からダウンロードしてください。|
|Adafruit_Sensor Library|[[Adafruitのサイト>https://learn.adafruit.com/adafruit-bno055-absolute-orientation-sensor/wiring-and-test]]からダウンロードしてください。|
|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風に書いています。要するに先頭が-の行を削除して、先頭が+の行を追加するだけです。)
#code(C,nonumber,nooutline){{
-  Serial.begin(9600);
+  Serial.begin(115200);
}}
+36行目を次のように変更する。(意味については、[[BoschのBNO055のデータシートPDF>http://www.adafruit.com/datasheets/BST_BNO055_DS000_12.pdf]]の"3.3 Operation Modes"をご覧ください。)
#code(C,nonumber,nooutline){{
-  if(!bno.begin())
+  if(!bno.begin(bno.OPERATION_MODE_IMUPLUS))
}}
+87行目を次のように変更する。
#code(C,nonumber,nooutline){{
-  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行目を次のように変更する。
#code(C,nonumber,nooutline){{
-  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用に作成したものを流用しています。

~

#code(C,nonumber,nooutline,../MPU-9150/ControlObjectByMPU9150InUnity.cs)

*参考
-[[SerialPort クラス (System.IO.Ports)>http://msdn.microsoft.com/ja-jp/library/system.io.ports.serialport(v=vs.110).aspx]]

*Amazon
#amazon(B0044X2E5S,left)
#amazon(B00VLTU694,left)
#amazon(4800711460,left)
#amazon(4873117895,left)
差分 一覧