Skip to main content

3方向加速度センサーを使って手の動きをPCで表示する

秋月電子で3方向加速度センサー(Kionix KXR94-2050)を遊びました。このセンサーはX、Y、Z三つの方向での検出した変動値をアナログとして出力できるため、ArduinoやAVRマイコンのAD変換端子付のPINに接続し、そのままデータを読み込めます。さらにArduinoの場合COM接続もArduinoボードに搭載されているため、PC側はCOMポートの入力内容を分析し動きを画面に描画できます。

3axle_com_pc

ArduinoからCOMポート経由で送信する際にデータをX、Y、Zの3方向カンマ付で送信します。

12,56,31
63,43,3

Arduino側ソースコード

送信用コードは以下の通りです。(Arduino言語)

// 入力ピン定義
// センサーの出力ピンをArduinoのアナログ入力ピンに接続する必要がある

#define AX 1
#define AY 2
#define AZ 3

void setup()
{
  // シリアル通信を初期化
  Serial.begin(9600);
}

void loop()
{
  unsigned int x = 0, y = 0, z = 0;
 
  while(1)
  {
    x = analogRead(AX);
    y = analogRead(AY);
    z = analogRead(AZ);
 
    // 99回サンプリング
    for (int i=0; i < 99; i++)
    {
      x += analogRead(AX); y += analogRead(AY); z += analogRead(AZ);
    }

    // 平均値を計算
    x /= 100; y /= 100; z /= 100;

    // 計算した平均値をシリアルに出力
    Serial.print(x, DEC);
    Serial.print(", ");
    Serial.print(y, DEC);
    Serial.print(", ");
    Serial.println(z, DEC);
 
    delay(10);
  }
}

Windows側ソースコード

受信用PC側のコードがデータを分析し画面に表示します。(C#言語)

// COM23を開く
SerialPort sp = new SerialPort("COM23");
sp.Open();

while (inputThread.IsAlive)
{
  string line = sp.ReadLine();
  string[] splitted = line.Split(',');
   
  if (splitted.Length > 2)
  {
    // X,Y,Z それぞれのデータを読み込む
    int x = int.Parse(splitted[0]);
    int y = int.Parse(splitted[1]);
    int z = int.Parse(splitted[2]);

    // 画面のポインターを移動する
    axlePanel1.OffsetX += (avgx + x) /2;
    axlePanel1.OffsetY += (avgy - y) /2;
    axlePanel1.OffsetZ += (avgz - z) /2;

    axlePanel1.Invalidate(false);
  }
}

Windows側の表示画面:
3axle_com_pc_window

例外

COMポートが開けない、データを読み込めない際のエラーの表示例:
3axle_com_pc_error
このエラーが表示した場合、COMポートを確認し再度お試しください。

サンプル

ネコ技術がC#で作成した描画プログラムを公開します。ダウンロードはこちらです。

実際の動作の様子はこちら:

以上

(最後更新:2014年10月28日)

Jingwood

北海道の田舎で暮らしているプログラマーです。最近山登りにハマりました。

Leave a Reply

Your email address will not be published. Required fields are marked *