Flash から Arduino へ文字列を送る

2010/05/22 time: 11:30
Arduino 日本語リファレンス の Firmata の項目で、コールバック関数を見てると、stringタイプのコールバック関数がある。
Flashから文字列送って、Arduino側でプログラム動作のコントロールが出来るかなと思い、
Flash側のライブラリ(as3glue)を見ても、それらしきメソッドが見当たらない。オレが見つけられてないだけか。。。

ということで、as3glue内のArduino.asに手を加えて、Arduinoへ文字列を送るようにしてみた。
最初、文字列をAsciiコードに変換して、一文字ずつ送信して、最後にnull文字送る必要があるようなんだが、
これに気づくのにかなり手間取ってしまった。

以下、Arduino.as に追加したコード。
文字列をAsciiコードに変換するメソッドと、ArduinoへそのAsciiコードを送るメソッドを追加。
//---------------------------------------
//  ORIGINAL FUNCTIONS
//---------------------------------------
    public function sendStringToArduino(str:String):void{
      var asciiArray:Array = stringToAsciiArray(str);
      
      writeByte(ARD_SYSEX_MESSAGE_START);
      writeByte(ARD_SYSEX_STRING);
      
      for each(var asciiCode:int in asciiArray){
        writeByte(asciiCode);
      }
      
      writeByte(ARD_SYSEX_MESSAGE_END);
      flush();
    }
    
    private function stringToAsciiArray(str:String):Array{
      var asciiArray:Array = new Array();
      for(var i:int = 0; i<str.length; i++){
        asciiArray.push(str.charCodeAt(i));
        asciiArray.push(0);
      }
      asciiArray.push(0);
      asciiArray.push(0);
      return asciiArray;
    }

ちなみに、Arduino側には以下コードを追加して、受け取った文字列をそのままFlashへ返すようにしてテストしてみた。

setup()関数内に、下記コードを追加。
リファレンスのページでは、コールバック呼び出すメッセージとして、FIRMATA_STRINGとあるが、ソースコード見てみると、STRING_DATAになってる。FIRMATA_STRINGでも動くっぽいけど。
Firmata.attach(STRING_DATA, stringCallback);

で、stringCallbackは以下。
void stringCallback(char *myString)
{
  Firmata.sendString(myString);
}

後になって、文字列送ってどうすんの?制御コードとか決めて数値送ればいいじゃん、とか思ってしまったが、まぁ、送ってみたかったという動機で充分か。