3軸加速度センサで傾斜角度を測定してみます

〔Arduinoの動かせ方入門に戻る〕


最近加速度センサは色々な物に応用されています、ロボットの姿勢制御や車エアーバッグの衝突検出
に、カメラの手ぶれ検出、携帯電話など、電話の縦横を変えると画面方向が変わったりしますよね。

加速度センサはモーションセンサとも言い、物体が動く速度(1秒あたりの速度の変化を検出)を測定
する物で、傾き(重力)や動きに振動と衝撃を検出する事が出来ます。

また、加速度センサと似た様な物で角速度センサ(ジャイロセンサ)が有りますが、
これはセンサを軸にして回転方向の運動を測定する物で、物体が1秒間に何度の回転運動を
しているのかを検出する事が出来ます。

加速度センサは"重力"・"振動(動き)"・"衝撃"を検出できますが、
今回は"重力"を検出し、センサから読み込んだ値を利用して傾斜させた場合の
角度(重力方向に対する角度)を表示させて見ようと思います。

ここで使用する加速度センサは、KXM52を使いましたが秋月電子のこちらではKXR94-2050
変更になっている様です。
 異なっている点
  ・ 電源電圧がKXM52は2.7V-5.5Vで、KXR94は2.5V-5.25Vで若干低め。
  ・ 0gオフセット誤差がKXM52は±167mV(3.3V)で、KXR94は±50mV(3.3V)で少し良くなっている。
  ・ 感度誤差もKXM52は±5%で、KXR94は±13mVとなっている。
  ・ 接続ピン名称が異なっている、KXM52は2:PSDと4:parityで、KXR94は2:Enableと4:Vmuxであるが
    機能は同じ様な使い方です。

KXR94  このセンサは各方向X軸Y軸Z軸の3方向をArduinoのアナログ入力に
 接続する事により速度の変化量を読み取る事が出来ます。

 各軸の水平方向(0度)が0gで、垂直方向(90度)が1gです。
 なのでZ軸は垂直状態なので1gが既に加かっています。
 地球上では全ての物体に1Gの重力が加かっているらしい

図1 このセンサの測定のレンジは±2gです、
0g時の電圧値はVDD/2(今回はVDD:5Vで利用)で2.5V
出力感度はVDD/5(1g辺り)なので、1V
±90度までの測定だと3.5V(+1g)〜1.5V(-1g)の電圧値が得られ
電圧値を実際に測定するとVDD=4.99Vでした。

Arduinoは0V〜5V(4.99V)を 0〜1023に変換して読みます。
Arduinoの読込み値(X軸)は728(1g)-507(0g)-288(-1g)でした。
また、センサーが水平時の実際の測定値は
X軸が2.275Vで読込み値は507位で0g時の値
Y軸が2.415Vで読込み値は520位で0g時の値
Z軸が3.241Vで読込み値は756位で1g時の値

図2 ここのスケッチでは左図の様にXZの2軸を使い360度の測定が
出来ます。またYZ軸を使うと左右方向を測定できます。
(1軸のみでの計算では360度の測定が出来ないので2軸使用)

ここでは計算式の説明は省きます、興味ある人は他のサイト様を
検索して下さい。(実はうまく説明出来なかったりします...えへ)

《配線図》

配線図

センサのピン名称はKXM52のモデルですが、( )内の名称はKXR94のモデルです。
接続ピンの機能は購入すると付属してくる説明書を見ると良いでしょう。
Arduinoのアナログ3番ピンがX軸、4番ピンがY軸、5番ピンがZ軸に繋がっています。

《スケッチ1》

まずは、センサーが出力するそのままの値を表示させて見ましょう
センサー値は各軸を100回読み込んで単純平均化させています。

@上記図画面の様に配線しましょう。

Aarduinoボード(Arduino Duemilanove 328)はUSBケーブルで接続して、arduino IDEを起動させます。

BIDEに下記のスケッチプログラムをコピーペーストして貼り付けて下さい。
---------------------------------------------------------------------
void setup()
{
     // シリアルモニターの初期化をする
     Serial.begin(9600) ;
}
void loop()
{
     int i ;
     long x , y , z ;

     // 各データを100回読込んで平均化する
     x = y = z = 0 ;
     for (i=0 ; i < 100 ; i++) {
          x = x + analogRead(3) ;  // X軸を読込む
          y = y + analogRead(4) ;  // Y軸を読込む
          z = z + analogRead(5) ;  // Z軸を読込む
     }
     x = x / 100 ;
     y = y / 100 ;
     z = z / 100 ;
     // 読み込んだ各軸をそのまま表示する
     Serial.print("X:") ;
     Serial.print(x) ;             // X軸
     Serial.print(" Y:") ;
     Serial.print(y) ;             // Y軸
     Serial.print(" Z:") ;
     Serial.println(z) ;           // Z軸

     delay(500) ;
}
---------------------------------------------------------------------
CIDEツールバーの赤枠部分のボタンをクリックしてコンパイルとarduinoボードに書込みを
 行います。

upload

D正常終了後、ArduinoIDEのシリアルモニター(右側のアイコン)を起動して下さい、
 下記画面の様に表示されると思います。
 尚、シリアルモニターの使い方はこちらを参照下さい。
実行結果表示画面1
左結果はセンサーを水平に置いた
時の内容です。
XY軸は0gでZ軸は1gでの内容です
(センサーにより値は変わります)

センサーを動かせば表示が変わると思います。
Z軸を水平(0g)にした場合の値は
558位でした。

尚、センサー値をグラフ表示させる
方法はこちらを参考にして下さい。


《スケッチ2》

こんどは読み込んだ値からセンサをそれぞれ+X軸方向と+Y軸方向に傾けた場合の傾斜角度を
計算させ表示を行いましょう。
---------------------------------------------------------------------
void setup()
{
     // シリアルモニターの初期化をする
     Serial.begin(9600) ;
}
void loop()
{
     int i , a ;
     long x , y , z ;

     // 各データを100回読込んで平均化する
     x = y = z = 0 ;
     for (i=0 ; i < 100 ; i++) {
          x = x + analogRead(3) ;  // X軸を読込む
          y = y + analogRead(4) ;  // Y軸を読込む
          z = z + analogRead(5) ;  // Z軸を読込む
     }
     x = x / 100 ;
     y = y / 100 ;
     z = z / 100 ;
     // 角度を計算して表示を行う
     a=atan2(x-507,z-558) / 3.14159 * 180.0 ;
     Serial.print("X=") ;
     Serial.print(a) ;             // X軸方向角度表示
     Serial.print(" Y=") ;
     a=atan2(y-520,z-558) / 3.14159 * 180.0 ;
     Serial.println(a) ;           // Y軸方向角度表示

     delay(500) ;
}
---------------------------------------------------------------------
実行結果表示画面2
 左図の様に表示をすると思います。

 +X軸方向を上に傾けて行けば1〜180度で表示し、
 下に傾けて行けば−1〜−180度で表示を行います。
 (+Y軸方向は左右に傾けます)

 精度的には1度ほどのズレではないでしょうか?
 (ただしKXM52での判断となります)

 a=atan2(x-507,z-558) / 3.14159 * 180.0 ;
 a=atan2(y-520,z-558) / 3.14159 * 180.0 ;
 このX-507/Y-520/Z-558はスケッチ1で表示させた0g時の値をいれます。
 0G水平時の値を0にする為のオフセット値です。
 約±220程で振れると思います。

但し注意としては、この値のX-507/Y-520/Z-558は電源電圧5.0V時で有り、
電源が3.3Vとかになると数値(少なくなる)は変わります。
また、センサの個体差等でも異なります
尚、傾斜計の様な物を製作する場合は、このオフセット値を簡単に設定出来るような操作の仕掛けが
必要になるでしょう。

又、今回の実験の様にセンサを動かさない固定した状態に、重力方向の角度を測定する場合には
上手く角度を得る事が可能です。
ですがぁ、検出物体が動いている所にセンサを設置して角度を得ようとすると、重力方向以外の
外部的な加速(G)が加わりまので、この様な場合は上手く角度が得られません、
そんな場合はジャイロセンサを使いましょう。 *1)

《その他》

実験風景
 左は実験風景です。
 手前の丸い物は水平器です。

 こちら(MMA7361)のモジュールが安いので
 お勧めかもぉ
 その内手に入れたら実験をしてみます。

 また、こちら(ADXL345)のモジュールは、
 SPIかI2Cで接続します、
 尚、このADXL345とPICでの接続実験は、
 こちらの頁を参照下さい。

 その内に"振動(動き)"を検出して万歩計の
 実験を行おうと思っていますがぁ....




記事一部追記(*1) 2016/07/23


【きむ茶工房ガレージハウス】
Copyright (C) 2006-2016 Shigehiro Kimura All Rights Reserved.