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

このエラーが表示した場合、COMポートを確認し再度お試しください。
サンプル
ネコ技術がC#で作成した描画プログラムを公開します。ダウンロードはこちらです。
実際の動作の様子はこちら:
以上
(最後更新:2014年10月28日)

