2007年06月06日

Arduino

Flashに3軸加速度センサーをつなぐ

今回は、3軸加速度センサーKXM52−1050を使います。
kasoku.jpg

ソースのダウンロード

今までのセンサーと違い、Flashに送る値が3つに増えるので、
最初のデータを送信する前にstartの文字を送ることにした。

void setup() {
  Serial.begin(9600);
}

void loop() {
  sendStringToFlash("start");
  for(int i=0; i<3; i++){
    int val = analogRead(i);
    sendNumToFlash(val);
  }
  delay(100);
}

// Flashに対して、数値を送信する
void sendNumToFlash (int n) {
  Serial.print(n);
  printByte(0);
}

// Flashに対して、文字列を送信する
void sendStringToFlash (char *s) {
  while (*s) {
    printByte(*s++);
  }
  printByte(0);
}

Flashでも、グラフをつくってみることにした。
kasoku_f.jpg

import flash.display.BitmapData;
import flash.geom.Rectangle;
//------------------
import Arduino;

//------------------ グラフパラメータ
var dataCount = 0;				// x,y,zどのデータか
var back_data = new Array();	// 前のデータ
for(var i=0; i<3; i++) back_data[i] = 0;
var coMap = new Array();		// 線の色
coMap[0] = 0xFF0000;
coMap[1] = 0x00FF00;
coMap[2] = 0x0000FF;

//------------------ Arduino
// 環境に合わせて、ポートを設定する。
// COM1:5331、COM2:5332、COM3:5333、COM4:5334、COM5:5335、COM6:5336
var port:Number = 5334;
var arduino:Arduino = new Arduino(port);
listenObj = new Object();

// データを受信
listenObj.onReceiveData = function(evtObj:Object){
	var msg = evtObj.data;
	if(msg == "start"){				// データの始まり
		dataCount = 0;
	}else{									// 数値のデータ
		var val = Number(msg)/2;	// 値が大きいので、2で割る
		// グラフ作成
		drawGraf(dataCount, val);
		dataCount ++;
	}
}

// リスナー登録
arduino.addEventListener("onReceiveData", listenObj);

// -----------------------グラフ

var myBitmapData:BitmapData = new BitmapData(750, 512, false, 0xFFFFFF);
var mc_2:MovieClip = this.createEmptyMovieClip("mc2", this.getNextHighestDepth());
mc_2._x = -1;								// 見えない位置で作画させるため、x座標を-1に

mc_1.attachBitmap(myBitmapData, this.getNextHighestDepth());

function drawGraf(no, n){
	drawLine(Math.floor(512 - back_data[no]), Math.floor(512 - n), coMap[no]);
	back_data[no] = n;				// データバックアップ
	
	if(no >= 2){							// グラフをビットマップに作画
		myBitmapData.draw(mc_2);
		mc_2.clear();
		myBitmapData.scroll(1, 0);
		myBitmapData.fillRect(new Rectangle(0, 0, 1, 512), 0xffffff);
	}
}

// 線を引く
function drawLine(y0, y1, color){
	mc_2.lineStyle(1, color);
	mc_2.moveTo(0, y0);
	mc_2.lineTo(1, y1);
}