秋月電子で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日)