Same Shit Different Day

Arduino実験機1号~シリアル通信+Flashインターフェイス編

メール 印刷
ThumbnailArduino(公式サイト)を使って、プッシュボタンをArduinoに接続し、ボタンが押された数を集計すると言う単純な実験機を作る計画ですが、Arduino IDEを使ってのシリアル信号の受信は成功しています。

後はこれをFlashアプリと連携させて動かすだけですが、どのようにFlashを作り込めばいいのでしょうか?

Arduinoの公式サイトにはFlashとの連携について記載があり、”Arduino"”Flash”と言うキーワードで検索してみてもかなりの数のサイトが見つかります。

それらの情報によると、
  1. Flashは直接シリアルポートにアクセスできない
  2. FlashからTCPポートへはアクセスできる
  3. serproxyと言うソフトを使えばシリアルポートとTCPポートの橋渡しができる
SerproxyはWindowsとMac用にすでにバイナリファイルが公式サイトに用意されているので、それをダウンロードして適当なフォルダに展開します。

Serproxy起動の前にPCのCOM(シリアル)ポートに合わせて設定ファイル(Serproxy.cfg)を書き換えましょう。
# Comm ports used
#comm_ports=1,2,3,4,5,6
comm_ports=6

# Default settings
comm_baud=9600
comm_databits=8
comm_stopbits=1
comm_parity=none

# Idle time out in seconds
timeout=300

# Port 6 settings (ttyS5)
net_port6=5336
※設定ファイルの内容は抜粋です

ArduinoがCOMポート”6”を使用していたため、設定ファイルの内容を合わせて書き換えています

ボーレートは一番安全っぽい”9600”(Arduino側と合わせる必要があります)に、TCPポートはとりあえず”5336”にしました。

serproxy.exeを起動すると、Windowsのコマンドプロンプトが出てきて、通信待ちのメッセージが表示されます。

アイコン化ができてタスクバーに入ってくれると最高なんですが、それは贅沢と言うものでしょう。

通信の状況が良く分からないので、正しく動いているかどうかが判断できないのですが、Telnetで接続すれば何らかのメッセージが表示され、動作していることが確認できます。

Thumbnail Thumbnail Thumbnail
次にFlash側ですが、Action Script3からは、Socketクラスが追加されており、Socket通信が簡単に使えます。

新しいflaファイルを作成して、ステージ上にダイナミックテキストを配置、ラベル名を”cntText”にします。

1フレーム目に下記のようなスクリプトを追加、

//Include Socket Class
import flash.net.Socket;

// Define Variables
var socket:Socket = new Socket();
var hostName="127.0.0.1";
var conPort=5336;
var btCnt = 0;

// Connect when Start
socket.connect(hostName,conPort);

// Recieving Data
socket.addEventListener(ProgressEvent.SOCKET_DATA, onRecvData);

// Connected
socket.addEventListener(Event.CONNECT, function(){
  //ここに繋がった時に行う処理を記載
});

// Closed from Server
socket.addEventListener(Event.CLOSE, function(){ 
  //ここに切断された際に行う処理を記載
});

// On Recieving Data
function onRecvData(e:Event):void{
	if(!socket.connected) return;
	if(socket.bytesAvailable > 0){
		var bytes:ByteArray = new ByteArray();
		socket.readBytes(bytes);
		var recvStr:String = bytes.toString();
		incCount(recvStr);
	}
}

// Update Counter
function incCount(str:String):void{
	btCnt++;
        //繰り上がったカウンターをダイナミックテキストで表示
	cntText.text = btCnt;
}
ムービーをプレビューし、Arduinoに接続されているボタンを押すと・・・・・ボタンを押す度にカウンターが繰り上がっていくはずです。

Flash Test
※実際は本物のボタンです
(クリックでSWFムービー再生)
ここで、落とし穴があるのですが、Flashプレーヤーのバージョン9のあるバージョンからはセキュリティー設定が強化されており、swfにパブリッシュされた後のFlashからはネットワークにアクセスできません

ネットワークにアクセスするためには、Flashの起動時にアクセス許可を行うためのポリシーファイルをダウンロードさせる必要があり、ポートの843を監視してポリシーファイルを送信するサーバーが別途必要になります。

一応、アドビの開発者が簡易サーバースクリプトを提供してくれいているのですが、スクリプトはPerlPythonで提供されていて、別にセットアップしなければなりません。

取り急ぎ、Flashのプレビューか、exe(プロジェクタ)ファイルを作れば問題なく動作するようですので、ポリシーファイル用のサーバーは立てずにそのままにします。

Linuxの場合はPythonが普通にインストールされているはずですので、このスクリプトを使えば簡単にサーバーを立てることができます。

と言うことで、ArduinoとFlashを無事に通信させることに成功しました。

ただ、今の動作は、ボタン >> Arduino >> Serial(COM6) >> TCP(5336) >> Flash(Socket)の処理でFlashからArduinoへのデータの送信は行っていません。

FlashからArduinoへデータを送信する必要がある場合は、socket.writeUTFBytes("文字");で行えますが、キャラクターはArduinoへ送信した際、勝手にコードに変換されてしまうので注意が必要です。

 
ホーム | がらくた紹介 | Arduino実験機1号~シリアル通信+Flashインターフェイス編

最新記事

人気記事