NOBのArduino日記!

NOBのArduino日記!

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

Genuino101の使い方(IMU編)加速度センサーその1

Arduino/Genuino 101
 
 前回のGenuino101 RTC編に引き続き、今回は加速度センサーを使ってみました! 

1. 加速度センサーとは?

 加速度計(Accelerometer)は、物体の加速度を計測する事が出来ます。
 小型の加速度計(加速度センサ)は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:Bosch製 慣性測定ユニット「BMI160」
1.3 CurieIMU.h
 CurieIMU.hは、Genuino101ボードのIMUチップにおける全てのパラメータ、機能、読み取り値にアクセスできるライブラリです。

2. プログラム

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

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

void setup() {
  Serial.begin(9600); // シリアル通信を初期化
  while (!Serial);    // シリアルポートが開くのを待つ

  // デバイスの初期化
  Serial.println("Initializing IMU device...");
  CurieIMU.begin();

  // 加速度計の範囲を2Gに設定する
  CurieIMU.setAccelerometerRange(2);
}

void loop() {
  float ax, ay, az;   //スケールされた加速度計の値

  // デバイスからの加速度計測定値を設定された範囲にスケール
  CurieIMU.readAccelerometerScaled(ax, ay, az);

  // タブで区切られた加速度計のx / y / z値を表示する
  Serial.print("a:\t");
  Serial.print(ax);
  Serial.print("\t");
  Serial.print(ay);
  Serial.print("\t");
  Serial.print(az);
  Serial.println();
}
イメージ 1
図2:プログラム例

3. 実験!

3.1 振る!
 図2サンプルプログラムを実行した結果が図3です。
 特に意味はありませんが、Genuino101を必死で振りながら測定してみました
 
 
イメージ 1
図3:シリアルモニタ出力結果
 
3.2 加速度センサーに関する関数
 IMUで使う関数は図2で使った「CurieIMU.begin()」や「CurieIMU.setAccelerometerRange(2)」や「CurieIMU.readAccelerometerScaled(ax, ay, az)」以外にも表1の通り沢山用意されております!

表1:CurieIMU ライブラリ(加速度センサー関連)
関数 説明 内容
.begin() ArduinoとGenuino 101 IMUを初期化します。他のCurieIMUライブラリ関数の前にbegin()を呼び出す必要があります。 なし
.getAccelerometerRate() 加速度計のデータレート、つまり加速度(Hz)で表される周波数を返します。 加速度計の速度(Hz)。
.setAccelerometerRate(float rate) 加速度計の出力データレートを定義します。データレートはサンプリング周波数でもあり、読み取り値の帯域幅に影響します。 rate:Hzで設定されるレート。指定出来る値{12.5、25、50、100、200、400、800、1600(Hz)}
.getAccelerometerRange() 加速度計の範囲を返します。 加速度計の範囲は、gの倍数で表されます。
.setAccelerometerRange(int range) 加速度計の範囲をgの倍数で設定します。 range:設定される範囲は、gの倍数で表されます。指定出来る値は{±2、±4、±8、±16(g)}
.autoCalibrateAccelerometerOffset
(int、axis、int target)
加速度計指定軸の自動校正を開始します。この手順は、ボードが平らに動かないようにしている間に実行する必要があります。 axis:キャリブレーションする軸。次のいずれかの値を取ることができます(X_AXIS、Y_AXIS、Z_AXIS)
.noAccelerometerOffset() 加速度計オフセットを無効にします。 なし
.accelerometerOffsetEnabled() 加速度計オフセットのイネーブル状態を返します。 機能が有効または無効の場合はtrueまたはfalse
.getAccelerometerOffset(int axis) 選択した軸の加速度計のオフセット値を返します。 axis:オフセット値を取得する軸で次のいずれかを指定できます(X_AXIS、Y_AXIS、Z_AXIS)。選択した軸のオフセット値から返される値は、±495.3mg(step 3.9mg)です。
.setAccelerometerOffset
(int axis、int offset)
加速度計オフセットの値を設定します。 axis:ターゲット軸。次の値のいずれかを指定できます。(X_AXIS、Y_AXIS、Z_AXIS)offset:選択した軸のオフセット値。この値は加速度計で選択した範囲とは関係なく±495.3 mg(step 3.9mg)です。
.readAccelerometer
(int ax、int ay、int az)
加速度計の生の値を読み取ります。 ax、ay、az : x、y、zに沿った加速度計の値が格納される変数。測定値をmgに変換するには以下の式を使います。float g =(gRaw / 32768.0)* getAccelerometerRange() ※gRaw:ax、ay、azのいずれか
〇その他関数
 Curie IMUライブラリに関するその他関数については、コチラをご覧ください。

3. まとめ

 表1は加速度計の基本的な部分ですが、使いこなすのはなかなか大変そうです
 ライブラリの中には他にも色々有って、「落ちる」「ぶつかる」「動く」「止まる」「叩く」などの状態になった時に「true」を返してくれる面白い関数も入っていました!
 これを使えば落下を察知した時、猫みたいにストンと着地するロボットとか作れるかもしれません!
 
イメージ 1 イメージ 3
励みになりますのでよければクリック下さい(^o^)/

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