2007年06月04日

Arduino

Flashで電子工作(windows)

Flashは、シリアル通信がサポートされていないので、
通常は外部の基盤と接続できません。
そこで、FlashはxmlSocketでserproxy.exeに対してメッセージを送り、
serproxy.exeはシリアル通信でarduino基盤に接続させます。

Flashでボタンを押すとLEDが点灯して、
スイッチを押すとFlashで表示が変わるものを作ります。

ソースのダウンロード

用意するものと、回路はここと同じ。

接続手順

1.arduino基盤に、flas_and_arduinoフォルダのソースを書き込む
2.serproxyフォルダのserproxy.exeを起動
3.Flashのソースでは、環境に合わせて、ポート番号を変える必要がある。
flashフォルダのarduino.flaを開き、5行目を変更する。
テストした環境では、COM4に接続するので、上の例では、5334にしてある。

var port:Number = 5334;

4.Flashを起動する。
5.Flash上の「LEDボタン」を押せば、LEDが点灯、
基盤のスイッチを押せば、Flashの表示が変わる。

ソース解説

■arduinoソース
int lastSwitchState = 0;    // スイッチの状態
int inPutPin = 2;           // スイッチ用のピン
int ledPin = 13;            // ledに使うピン

void setup() {
  Serial.begin(9600);
  pinMode(inPutPin, INPUT);
  pinMode(ledPin, OUTPUT);
}

void loop () {
  // スイッチ
  int switchState = digitalRead(inPutPin);
  // スイッチの状態が変わった
  if (switchState != lastSwitchState) {
    if (switchState == HIGH){
      sendStringToFlash("on");
    }
    else {
      sendStringToFlash("off");
    }
    // スイッチの現在の状態をバックアップ
    lastSwitchState = switchState;
  }
  
  // LED
  // シリアルのからデータがきているか
   if(Serial.available() > 0) {
    int flashCommand = Serial.read();
    flashCommand -= 48;    // アスキーデータを数値に変換
    if(flashCommand == 0){
      digitalWrite(ledPin, LOW); 
    }else if(flashCommand == 1){
      digitalWrite(ledPin, HIGH); 
    }
  }
  
  delay(50);
}

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

Flashにデータを送るには、最後に定義してあるsendStringToFlash関数を使う。
文字を引数にすると、xmlSocketデータを送信する。
ボタンが押されると、"on"を送信するようにした。

Flashから、データが来たか知るには、Serial.available()で判定する。
アスキーコードで送ってくるので、-48を引いて数字に変換する。

flashCommand -= 48;

送られてきたデータが、0のときはLEDを消す。

if(flashCommand == 0){
	digitalWrite(ledPin, LOW); 
}
■Flashのソース
import 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 == "on") {
		_root.showMc.onFunc();
	}
	else if (msg == "off") {
		_root.showMc.offFunc();
	}
}

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

// arduinoに送信
function sendData(data){
	arduino.send(data);
}

Flashをパブリッシュしたときには、接続ができるのだが、swfファイルからだと、serproxyに接続ができなかった。とりあえず、スタンドアローンexeで接続が確認できた。