Top/Devel/電子工作/Arduino/モーションセンサ/MPU-9150

MPU-9150 の変更点はてなブックマーク


#ref(mpu-9150.jpg,right,around,20%)

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

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

~

#youtube(cVN7V2YPKlI)

~

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


*必要なもの
**ハードウェア
|項目|説明|h
|[[Arduino Uno>http://www.amazon.co.jp/exec/obidos/ASIN/B0044X2E5S/cubic9com-22]]|比較的小型で安価で簡単に使えるマイコンボード。|
|[[MPU-9150 9軸センサモジュール>http://strawberry-linux.com/catalog/items?code=12150]]|InvenSense社の3軸加速度+3軸ジャイロ+3軸コンパスのモーションセンサチップMPU-9150が載ったモジュール。&br;MPU-9150は、InvenSenseの加速度・ジャイロチップMPU-6050と旭化成のコンパスチップをAK8975を1パッケージにしたものです。&br;MPU-9150もしくはMPU-6050が搭載されているモジュールならば概ね同様だと思います。&br;これらのチップにはDMP(Digital Motion Processor)という機能があり、センサの生データではなく、センサの値からクォータニオンを算出してくれるので便利です。|

**ソフトウェア
|項目|説明|h
|Arduino IDE|Arduino用の開発環境。&br;[[オフィシャルサイト>http://arduino.cc/]]からダウンロードしてください。|
|[[Unity>http://japan.unity3d.com/]]|マルチプラットフォーム対応のゲームエンジン。簡単に3D(or 2D)ゲームを作ることが出来る。&br;[[オフィシャルサイト>http://japan.unity3d.com/]]からダウンロードしてください。|
|I2C Device Library|I2Cデバイス用C++ライブラリとMPU-6050とMPU-9150のArduinoサンプルスケッチ。&br;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};
<
+&color(#F00){MPU9150/MPU9150_9Axis_MotionApps41.hをエディタで開く。};
+&color(#F00){61行目の"typedef unsigned char unsigned char;"をコメントアウトする。};
+&color(#F00){ファイル内の"prog_uchar"を"unsigned char"に置換する。}; 
+Arduino IDEを起動する。
+メニューの[ファイル]>[スケッチの例]>[MPU6050]>[Example]>[MPU6050_DMP6]を選択する。
+87行目を次のように変更する。~
(unidiff風に書いています。要するに先頭が-の行を削除して、先頭が+の行を追加するだけです。)
#code(C,nonumber,nooutline){{
-#include "MPU6050_6Axis_MotionApps20.h"
+#include "MPU9150_9Axis_MotionApps41.h"
}}
+61行目を次のように変更する。
#code(C,nonumber,nooutline){{
-MPU6050 mpu;
+MPU9150 mpu;
}}
+87行目を次のように変更する。
#code(C,nonumber,nooutline){{
-//#define OUTPUT_READABLE_QUATERNION
+#define OUTPUT_READABLE_QUATERNION
}}
+100行目を次のように変更する。
#code(C,nonumber,nooutline){{
-#define OUTPUT_READABLE_YAWPITCHROLL
+//#define OUTPUT_READABLE_YAWPITCHROLL
}}
+192-194行目を次のように変更する。
#code(C,nonumber,nooutline){{
-    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行目を次のように変更する。
#code(C,nonumber,nooutline){{
-    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#スクリプト
#code(C,nonumber,nooutline,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(B0154PM102,left)
#amazon(4800711460,left)
#amazon(4873117895,left)
差分 一覧