itsukichang

フロントエンドが得意なエンジニア.ダーツと旅行とギターが好き

ANEを使ってAIRアプリ単体でArduinoと通信する

久々にFlash×Arduinoネタ.
as3-arduino-connector というANEを使います.

introduction

flasharduinoを連携させる方法は今までも色々ありましたが,flashはシリアル通信が出来ないので別途プロキシサーバを用意する必要がありました.
(代表的な方法としてFunnelというプロキシサーバ&apiを使うやり方があります.以前blogでも取り上げました;) Flashを使用したフィジカルコンピューティング - いつきの技的日記 )
つまりAIRarduinoと連携したアプリを作って配布しても,各ユーザにプロキシサーバをインストールしてもらい,アプリを使う際に毎回起動してもらわなければなりませんでした.
これは大変な手間ですし現実的ではないです.

が,as3-arduino-connectorというANEの登場で状況が一変しました.
Google Code Archive - Long-term storage for Google Code Project Hosting.
このANEを使うことで,別途プロキシサーバを用意すること無くAIRアプリ単体でarduinoと通信ができるのです!

使ってみる

感覚的にはprocessingとarduinoを通信させる時に似ています.

準備

とりあえずas3-arduino-connectorをダウンロードして,プロジェクトに入れましょう.
Flash cs6なら,スクリプトの設定→ライブラリパスの画面でaneファイルを追加することで,apiが使用できるようになります.

コード

準備ができたらコードを書いていきましょう
まずarduino側でシリアル通信の準備.
試しに以下のようなコードを書いてarduinoに送ってみます.

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

void loop() {
  Serial.write("hello");
  delay(1000);
}

これで1秒感覚で"hello"という文字を投げるようになります.

そして,flash側では次のようなコードを書いてみます.

package  {
	
	import flash.display.Sprite;
	import flash.text.TextField;
	import flash.events.Event;
	
	import com.quetwo.Arduino.ArduinoConnector;
	import com.quetwo.Arduino.ArduinoConnectorEvent;
	
	public class Main extends Sprite{

		private var _arduino:ArduinoConnector;
		private var _txt:TextField;
		
		public function Main() {
			init();
		}
		
		private function init():void {
			_txt = new TextField();
			addChild(_txt);
			
			
			_arduino = new ArduinoConnector();
			if (_arduino.isSupported()) {
				comm();
			}
		}
		
		private function comm():void {
			_arduino.connect("/dev/tty.usbserial-A6008kUC",9600);
			_arduino.addEventListener("socketData",onSock);
		}
		
		private function onSock(e:Event):void {
			_txt.text += _arduino.readBytesAsString();
			_txt.text += "\r";
		}
	}
}

as3側ではarduinoが発信している内容を取得して,テキストフィールドに書き込んでいますね.
コードをもう少し詳しく見てみましょう.

as3コード解説

まず必要ライブラリのインポート.

  • import com.quetwo.Arduino.ArduinoConnector;
  • import com.quetwo.Arduino.ArduinoConnectorEvent;

ArduinoConnectorがarduinoと通信をする本体で,ArduinoConncetorEventが通信に関するイベントを扱うものです.

ArduinoConnectorをnewして,isSupported()でこのANEが使えるかをチェックします.
無事使用できるようなら,connect()でarduinoと接続を行います.
第一引数がシリアルポート,第二引数がarduino側で設定した通信速度です.
ちなみにシリアルポートは _arduino.getComPorts(); で取得することも出来ます.(戻り値型はarray)
接続設定を行ったら,"socketData" イベントをaddします.これでarduino側から新しいデータが送られたときにイベントリスナーが呼ばれます.
あとはreadBytesAsString()で,データを読み取ります.

パブリッシュ&アプリ起動


地味ですが,無事通信できています!!!

まとめ

as3-arduino-connectorというANEで,AIRアプリ単体でarduinoと通信が出来るようになりました.
Google Code Archive - Long-term storage for Google Code Project Hosting.
今回はarduino->flashでしたが,その逆も同じ要領で可能です.
様々なセンサと組み合わせて,楽しげなものが作れる気がしますね;)


次はもう少し具体的な連携(AIRでハードウェア制御やArduinoでソフトウェア制御)を試した記事を書いてみます.

おまけ ~AIRのメリット

個人的な感想だと,processingやopenFrameworksを使うよりAIRの方がUIとか作りやすいしいいなーと思ってます.
arduinoを使ったフィジカルコンピューティングの入門用としてなら,processingが手軽で良いですが,作り込みが必要な本格的な作品となるとAIRとかoFがいいのかなーと.
結局適材適所ですね;)
でもFlasherが今までの資産を生かすにはこの方法が間違いなくベストです!
最近パーソナルファブリケーションとか流行ってますし,少しずつハードウェアも使いこなしていくと世界が広がるんじゃないかなーと思ってます.