NOBのArduino日記!

NOBのArduino日記!

趣味は車・バイク・自転車・ラジコン・電子工作です。

Genuino 101の使い方(IMU編)ジャイロセンサー

イメージ 3
Arduino/Genuino 101
※Genuino101を3Dモデリング化してみました!
 
 前回「Genuino101 加速度センサー編」の続きで、今回はジャイロセンサーを使ってみました! 
 ジャイロセンサー(角速度センサー)とは、慣性センサーの一種で加速度センサーでは反応しない回転の動きを測定します。
※角速度とは、ある物体の角度が単位時間当たりどれだけ変化しているか、つまり物体が回転している速度を表します。
 Genuino101に使用されているジャイロセンサーは、ICタイプの振動式でMEMS技術を用いて作製されています。

1.1 MEMS
 MEMS(Micro Electro Mechanical Systems)を使ったジャイロセンサーの場合、質量が小さいためジャイロセンサーとしての感度は低下しますが、代わりに劇的な小型化が可能になります。
 使用用途としてスマホ・自動車のエアバッグカーナビゲーションの傾斜計・ゲームのコントローラなどに使われています。
 
1.2 Genuino101ボードのIMU
 Genuino101ボードに使われているIntel Curie Moduleには図1のBosch製BMI160と言う3軸加速度センサーと、3軸ジャイロセンサーを併せ持つIMU(慣性測定ユニット)が搭載されています。
 またIMUをArduino IDEから簡単に利用出来る様にCurieIMU.hライブラリーが用意されています。
イメージ 2
 
1.3 CurieIMU.h
 CurieIMU.hは、Genuino101ボードのIMUチップにおける全てのパラメータ、機能、読み取り値にアクセスできるライブラリです。

2. プログラム

2.1 サンプルプログラム読み込み
 Arduino IDEIntel CurieボードパッケージをインストールしておけばGenuino101の加速度センサーを使ったサンプルプログラムも入っています。
 図2のサンプルプログラムを呼び出すにはArduino IDEで「ファイル」→「スケッチの例」→「CurieIMU」→「Gyro」の順に開きます。

2.2 サンプルプログラムの内容
 ジャイロセンサーの各軸は、setGyroRange関数によって定義された範囲内の角速度を測定し、生データを返します。
 測定された生データは、角速度(X、Y、Z)の3つの値としてシリアルモニタに出力されます。
#include "CurieIMU.h"

void setup() {
  Serial.begin(9600); // シリアル通信を初期化する
  while (!Serial);    // シリアルポートが開くのを待つ
  Serial.println("Initializing IMU device...");
  CurieIMU.begin();// デバイスを初期化する
  CurieIMU.setGyroRange(250);  // 角速度測定範囲を250度/秒に設定する
  CurieIMU.autoCalibrateGyroOffset(); //ジャイロセンサーを自動校正する
}

void loop() {
  float gx, gy, gz; //スケーリングされたジャイロ値
  // デバイスからジャイロ測定値を読み込み、設定された範囲にスケーリングします。
  CurieIMU.readGyroScaled(gx, gy, gz);
  // タブで区切られたジャイロのx / y / z値を表示する
  Serial.print("g:\t");
  Serial.print(gx);
  Serial.print("\t");
  Serial.print(gy);
  Serial.print("\t");
  Serial.print(gz);
  Serial.println();
}
イメージ 1
図2:プログラム例

3. 実験!

3.1 置く!
 図2サンプルプログラムを実行した結果が図3です。
 ジャイロセンサーの自動校正関数「CurieIMU.autoCalibrateGyroOffset()」を入れましたので、最初はGenuino101を静置した状態で測定を開始しています。 
イメージ 1
図3:シリアルモニタ出力結果
 
3.2 加速度センサーに関する関数
 IMUで使う関数は図2で使った「CurieIMU.begin()」や「CurieIMU.setGyroRange(250)」や「CurieIMU.readGyroScaled(ax, ay, az)」も含め表1の通り沢山用意されております!
 
表1:CurieIMU.hライブラリ(ジャイロセンサー関連)
関数 説明 内容
CurieIMU.begin() ArduinoとGenuino 101 IMUを初期化します。他のCurieIMUライブラリ関数の前にbegin()を呼び出す必要があります。 なし
CurieIMU.getGyroRate() ジャイロスコープが読み取られる頻度であるジャイロデータレートを返します。 ジャイロデータレートはHzで表します。
CurieIMU.setGyroRate(int rate) ジャイロスコープの出力データレートを定義します。データレートはサンプリング周波数でもあり、読み取り値の帯域幅に影響します。 rate:設定されるレート。指定出来る値{25、50、100、200、400、800、1600、3200(Hz)}
CurieIMU.getGyroRange() ジャイロの角度測定範囲を返します。 ジャイロの角度範囲。
CurieIMU.setGyroRange(int rate) ジャイロの角度測定範囲を設定します。 rate:設定される範囲。指定出来る値は{±2000、±1000、±500、±250、±125(°/s)}
CurieIMU.autoCalibrateGyroOffset() ジャイロのオフセットの自動較正を開始します。この手順の間、ボードは動かなくなります。 なし
CurieIMU.noGyroOffset() ジャイロオフセットを無効にします。 なし
CurieIMU.gyroOffsetEnabled() ジャイロオフセットの有効状態を返します。 機能が有効または無効の場合はtrueまたはfalse
CurieIMU.getGyroOffset(int axis) ジャイロのオフセットの値を返します。 axis:ターゲット軸。次の値のいずれかを指定できます(X_AXIS、Y_AXIS、Z_AXIS)選択した軸のオフセット値から返される値は、±31.25°/s (step 0.061°/s)です。
CurieIMU.setGyroOffset(int axis、int offset) ジャイロオフセットの値を設定します。 axis:ターゲット軸。次の値のいずれかを指定できます(X_AXIS、Y_AXIS、Z_AXIS)offset:設定されるオフセットの値。有効な値は、±31.25°/s (step 0.061°/s)です。
CurieIMU.readGyro(int gx、int gy、int gz) ジャイロの生の値を読み取ります。 gx、gy、gz : x、y、zに沿ったジャイロの値が格納される変数。

〇その他関数
 Curie IMUライブラリに関するその他関数については、コチラをご覧ください。

3. まとめ

 Genuino101は、シンプルなArduinoUNOに比べると機能がてんこ盛りです!
 嬉しいやら悲しいやら一通りの機能を試してみるのに結局一ヶ月近く掛かりました
 
イメージ 1 イメージ 3
励みになりますのでよければクリック下さい(^o^)/

↩【Genuino101の使い方!】目次に戻る