Gainer/加速度センサ

パーツリスト

部品備考数量
3軸加速度センサモジュールKXM52-1050x1

加速度センサの情報取得 + 角度算出

回路

回路は,Cookbook / 加速度センサをつなぐ@GAINER.ccを参考にし,

加速度センサGainer
X軸の出力ain 0
Y軸の出力ain 1
Z軸の出力ain 2

となるよう接続しています.

加速度センサ情報取得

単純にain 0~ain 2の状態を取得することで3軸加速度センサの情報を取得しています.

ただ,センサから取得した値が安定せずブレてしまうので,Cookbook / 移動平均法によるスムージング@GAINER.ccを参考にしてスムージング処理を行いました.

角度算出

加速度センサの出力を角度に変換するを参考に. 算出にはスムージング処理後の値を使いました.ただし,Processing版の角度算出サンプルが無かったため自力でコーディング(下記コード参照).

サンプルプログラム(Processing)

下記コード中の

//---------------
int xMin = 75;  //最小値
int xMax = 184;  //最大値

//----------------
int yMin = 75;  //最小値
int yMax = 184;  //最大値

というところは,実際にセンサを90度,-90度と傾けてみて得られた実測値 を設定しています.
同じセンサを使っていても人によっては異なる可能性があるので適宜設定してください.

※Processing初心者(というかマジメにコード書いたのは今回はじめて)なので 間違い等ありましたら連絡お願いします.

各種バージョン

Processinggainer_lib_processingJDK
0135 betav1.1.0rc31.6.0_03
fileaccelerationSensor.pde
import processing.gainer.*;

Gainer gainer;
PFont myFont;

//移動平均法フィルタ
MovingAverageFilter maFilterX;
MovingAverageFilter maFilterY;
MovingAverageFilter maFilterZ;

//---------------
int xMin = 75;  //最小値
int xMax = 184;  //最大値

//----------------
int yMin = 75;  //最小値
int yMax = 184;  //最大値

//初期化関数
void setup() {
  //ウィンドウサイズ設定
  size(300, 500);
  
  //フォント初期化
  myFont = loadFont("Eureka90.vlw");
  textFont(myFont, 24);
  
  //Gainerオブジェクト生成
  gainer = new Gainer(this);
  
  //アナログポートの状態をanalogInput[]に取得し続ける
  gainer.beginAnalogInput();
  
  //移動平均法フィルタオブジェクト生成
  maFilterX = new MovingAverageFilter(16);
  maFilterY = new MovingAverageFilter(16);
  maFilterZ = new MovingAverageFilter(16);
}

void draw()
{
  int aveX = 0;
  int aveY = 0;
  int aveZ = 0;
  float xInDegree = 0.0;
  float yInDegree = 0.0;
  
  //背景色設定
  background(0);
  
  gainer.peekAnalogInput();
  
  //センサ値取得
  int rawX = gainer.analogInput[0];
  int rawY = gainer.analogInput[1];
  int rawZ = gainer.analogInput[2];
  
  //フィルタリング処理
  aveX = maFilterX.processSample(rawX);
  aveY = maFilterY.processSample(rawY);
  aveZ = maFilterZ.processSample(rawZ);
  
  //センサ値(未加工)表示
  text("rawX: " + rawX, 10, 50); 
  text("rawY: " + rawY, 10, 80);
  text("rawZ: " + rawZ, 10, 110);
  
  //角度取得
  xInDegree = getDegree(aveX, xMin, xMax);
  yInDegree = getDegree(aveY, yMin, yMax);
  
  //センサ値(フィルタリング後)表示
  text("averagedX: " + aveX, 10, 170);
  text("averagedY: " + aveY, 10, 200);
  text("averagedZ: " + aveZ, 10, 230);
  
  //角度表示
  text("deg1: " + round(xInDegree), 10, 290); 
  text("deg2: " + round(yInDegree), 10, 320);
}

//角度計算関数
float getDegree(int in, int min, int max)
{
  float theta = 0;
  
  //スケーリング
  theta = map(in, min, max, -1.0, 1.0);
  
  //上限・下限を超えた場合の処理
  if(theta >= 1.0)
  {
    theta = 1.0;
  }
  else if(theta <= -1.0)
  {
    theta = -1.0;
  }
  
  //角度計算
  float deg = asin(theta)/ PI * 180.0;
  
  return deg;
}

//移動平均法クラス
public class MovingAverageFilter
{
  int taps;
  float[] values;
  
  //コンストラクタ
  public MovingAverageFilter(int requestedTaps)
  {
    taps = requestedTaps;
    values = new float[taps];
  }
  
  //フィルタリング処理
  int processSample(int in)
  {
    float acc = 0;
    values[0] = in;
    
    for(int i = 0; i < taps; i++)
    {
      acc += values[i];
    }
    acc /= taps;
    
    for(int i = taps - 1; i > 0; i--)
    {
      values[i] = values[i - 1];
    }
    return round(acc);
  }
}

スクリーンショット

screenshot.png

添付ファイル: filescreenshot.png 3254件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2008-06-19 (木) 21:46:00 (6015d)