MPU-9150
今回はモーションセンサをArduinoに接続し、AruinoとUnityを連携させて、Unity空間のオブジェクトの回転を制御してみます。
要するにPAXパワーグローブのページでやっているパワーグローブ近代化作業の要素技術確認です。
本ページで解説しているのはInvenSense社のMPU-9150についてですが、Bosch社のBNO055版の記事もあります。
必要なもの
ハードウェア
項目 | 説明 |
---|---|
Arduino Uno | 比較的小型で安価で簡単に使えるマイコンボード。 |
MPU-9150 9軸センサモジュール | InvenSense社の3軸加速度+3軸ジャイロ+3軸コンパスのモーションセンサチップMPU-9150が載ったモジュール。&br;MPU-9150は、InvenSenseの加速度・ジャイロチップMPU-6050と旭化成のコンパスチップをAK8975を1パッケージにしたものです。&br;MPU-9150もしくはMPU-6050が搭載されているモジュールならば概ね同様だと思います。&br;これらのチップにはDMP(Digital Motion Processor)という機能があり、センサの生データではなく、センサの値からクォータニオンを算出してくれるので便利です。 |
ソフトウェア
項目 | 説明 |
---|---|
Arduino IDE | Arduino用の開発環境。オフィシャルサイトからダウンロードしてください。 |
Unity | マルチプラットフォーム対応のゲームエンジン。簡単に3D(or 2D)ゲームを作ることが出来る。オフィシャルサイトからダウンロードしてください。 |
I2C Device Library | I2Cデバイス用C++ライブラリとMPU-6050とMPU-9150のArduinoサンプルスケッチ。 https://github.com/jrowberg/i2cdevlib を開き、右側の「Download ZIP」をクリックしてダウンロードしてください。 |
Unity用C#スクリプト | 上記サンプルスケッチの出力をUnity側で受け取ってGameObjectを制御するC#スクリプト。本ページ下部からダウンロードしてください。 |
手順
ハードウェアの準備
- MPU-9150のSCL(今回のモジュールでは3番ピン)をArduinoのSCL(Arduino UnoではA5ピン)に接続する。
- MPU-9150のSDA(今回のモジュールでは4番ピン)をArduinoのSDA(Arduino UnoではA4ピン)に接続する。
- MPU-9150のINT(今回のモジュールでは8番ピン)をArduinoのinterrupt(Arduino UnoではD2ピン)に接続する。
- MPU-9150のGND(今回のモジュールでは10番ピン)とAD0(今回のモジュールでは9番ピン)をArduinoのGNDピンに接続する。
- MPU-9150のVDD(今回のモジュールでは1番ピン)とVLOGIC(今回のモジュールでは2番ピン)をArduinoの3.3Vピンに接続する。
ソフトウェアの準備(1):Arduinoスケッチ
- i2cdevlib-master.zipを解凍する。
- 下記2つのフォルダをArduino用フォルダのlibrariesにコピーする。
-i2cdevlib-master/Arduino/I2Cdev
-i2cdevlib-master/Arduino/MPU6050
-&color(#F00){i2cdevlib-master/Arduino/MPU9150}; - MPU9150/MPU9150_9Axis_MotionApps41.hをエディタで開く。
- 61行目の"typedef unsigned char unsigned char;"をコメントアウトする。
- ファイル内の"prog_uchar"を"unsigned char"に置換する。
- Arduino IDEを起動する。
- メニューの[ファイル]>[スケッチの例]>[MPU6050]>[Example]>[MPU6050_DMP6]を選択する。
- 87行目を次のように変更する。~
(unidiff風に書いています。要するに先頭が-の行を削除して、先頭が+の行を追加するだけです。)
-#include "MPU6050_6Axis_MotionApps20.h"
+#include "MPU9150_9Axis_MotionApps41.h" - 61行目を次のように変更する。
-MPU6050 mpu;
+MPU9150 mpu; - 87行目を次のように変更する。
-//#define OUTPUT_READABLE_QUATERNION
+#define OUTPUT_READABLE_QUATERNION - 100行目を次のように変更する。
-#define OUTPUT_READABLE_YAWPITCHROLL
+//#define OUTPUT_READABLE_YAWPITCHROLL - 192-194行目を次のように変更する。
- while (Serial.available() && Serial.read()); // empty buffer
- while (!Serial.available()); // wait for data
- while (Serial.available() && Serial.read()); // empty buffer again
+// while (Serial.available() && Serial.read()); // empty buffer
+// while (!Serial.available()); // wait for data
+// while (Serial.available() && Serial.read()); // empty buffer again - 201-204行目を次のように変更する。
- mpu.setXGyroOffset(220);
- mpu.setYGyroOffset(76);
- mpu.setZGyroOffset(-85);
- mpu.setZAccelOffset(1788); // 1688 factory default for my test chip
+// mpu.setXGyroOffset(220);
+// mpu.setYGyroOffset(76);
+// mpu.setZGyroOffset(-85);
+// mpu.setZAccelOffset(1788); // 1688 factory default for my test chip - 保存してArduinoに書き込む。
- メニューの[ツール]>[シリアルモニタ]を選択する。
- 右下のボーレート選択リストから115200baudを選択する。
- 「Initializing I2C device..」に続いて、先頭に「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の再生ボタンを押す。
- MPU-9150を傾けてみて、Cubeが動けば成功! 動かない場合は、Arduino本体のリセットボタンを押してみてください。
お疲れ様でした。 :)
設定について
- MPU-9150の調整はArduinoスケッチの201-204行目で変更できます。
- シリアルポートの接続設定(ポート番号、ボーレート、タイムアウト値)はC#スクリプトの先頭の定数部分で変更できます。
Unity用C#スクリプト
ControlObjectByMPU9150InUnity.cs