【GAINER】FLASHでリアルデバイス [Edit]


むらけんです。こんにちわ。 2月のF-siteセミナーに来ていただいた方は記憶にあるかと思いますが、タナカミノルさんに、ちょろっと紹介していただいた[GAINER]というものがありましたね。参考:[セミナーレポート]

僕、実は某工業高専の電子制御工学科出身でして、タナカミノルさんからお話があったときは、興味津々でした。
そして先日、trick7のteraさんがGAINER一緒にやる人を探していたので、いい機会だったので行ってきました。


最初はTVリモコンをFLASHで作ろうと思ったのですが、赤外線LEDの信号がややこしいのと、時間があまりなかったので、MASH UP++で、タナカミノルさんがやられている通り、リモコンをリレーで操作し、チョロQを動かすことにしました。
シンプルな構造上、書籍と図が被るので、回路図は省略します。ごめんなさい。
MASH UP++にわかりやすく書いてありますので、買ってください。

■製作方法
リモコンを分解しますが、もちろんサポート対象外になるので各自の責任にてお願いします。
①dout(degital out)0からリレーを通してGNDへ。このリレーはリモコンの「前進」ボタンの+-へそれぞれ繋ぐ。
②dout(degital out)1からリレーを通してGNDへ。このリレーはリモコンの「後退」ボタンの+-へそれぞれ繋ぐ。
③dout(degital out)2からリレーを通してGNDへ。このリレーはリモコンの「右折」ボタンの+-へそれぞれ繋ぐ。
④dout(degital out)3からリレーを通してGNDへ。このリレーはリモコンの「左折」ボタンの+-へそれぞれ繋ぐ。

これだけで接続は完了です。
原理、接続は同じ要領で、例えばエアコンのスイッチとかにも出来るんでFLASHのインターフェイスで、家中の家電をFLASHでON/OFFとかも簡単にできちゃいますね。(^ω^)
やりませんけど。w

■注意
当日、FLASHerが7人も揃っていたのですが、GAINERの専用JAVAサーバとGAINERの通信が正しく成功するのに、皆さん結構苦戦していました。(特にWindowsの人) 大体の原因はポートの設定にありました。
コントロールパネル→システム→デバイスマネージャでGAINERの接続されているポートの番号(COM3等)を確認するようにしてください。

これだけだと、書籍と作るものが全く被ってしまうので、スクリプトの方をオリジナルで書きました。
機能として、
①画面上のカーソルにrollOverさせた時に動く。
②カーソルキー(上下左右)で動く。
③ボタンを押すと、8秒間の動きを記憶し、その後もう一つのボタンを押すと、その記憶していた動きを自動でする。

というのを作りました。
出来上がったのはこちら。
GAINERはローカルでしか動きませんので今回はYOUTUBEに動画をあげました。

一応画面が見づらいのでFLASHの画面はこんな感じです。


スクリプトはこちら。

001| //=========================================
002| //Gainer digital Output Test
003| //
004| //@author    Copyright (c) 2007 むらけん / F-site
005| //@link         http://www.muraken.biz/
006| //@link         http://f-site.org/
007| //=========================================
008| 
009| // _______________________________________________________________________
010| //                                                               import
011| import gainer.*;
012| // _______________________________________________________________________
013| //                                                                  vars
014| var base:MovieClip = this;
015| var gnr:Gainer = new Gainer("localhost", 2000, Gainer.MODE1, true);
016| var dArray:Array = [falsefalsefalsefalse];//[前進、後退、右折、左折]
017| var mArray:Array;//メモリー用配列
018| // _______________________________________________________________________
019| //                                                                    init
020| play_btn._visible = false;
021| gnr.onReady=function(){
022|     btnSet();
023| }
024| // _______________________________________________________________________
025| //                                                           functions
026| function btnSet():Void{
027|     for(var i:Number=0;i<4;i++){
028|         base["d"+i].index=i;
029|         base["d"+i].onRollOver=_rollover;
030|         base["d"+i].onRollOut=_rollout;
031|     }
032|     var keyListener:Object = new Object();
033|     var keyListenerSide:Object = new Object();
034|     keyListener.onKeyDown = function() {
035|         switch (Key.getCode()) {
036|             case Key.UP      :base["d"+0].onRollOver();break;
037|             case Key.DOWN :base["d"+1].onRollOver();break;
038|         }
039|     }
040|     keyListener.onKeyUp = function() {
041|         switch (Key.getCode()) {
042|             case Key.UP      :base["d"+0].onRollOut();break;
043|             case Key.DOWN :base["d"+1].onRollOut();break;
044|         }
045|     }
046|     keyListenerSide.onKeyDown = function() {
047|         switch (Key.getCode()) {
048|             case Key.RIGHT :base["d"+2].onRollOver();break;
049|             case Key.LEFT   :base["d"+3].onRollOver();break;
050|         }
051|     }
052|     keyListenerSide.onKeyUp = function() {
053|         switch (Key.getCode()) {
054|             case Key.RIGHT :base["d"+2].onRollOut();break;
055|             case Key.LEFT   :base["d"+3].onRollOut();break;
056|         }
057|     }
058|     Key.addListener(keyListener);
059|     Key.addListener(keyListenerSide);
060|     
061|     memory_btn.onRelease=memoryIn;
062|     play_btn.onRelease=memoryOut;
063| }
064| 
065| function memoryIn():Void{
066|     var startTime:Number=getTimer();
067|     var cnt:Number=0;
068|     var nowTime:Number;
069|     var cntTime:Number=8;//秒
070|     mArray=new Array();
071|     play_btn._visible=false;
072|     onEnterFrame=function(){
073|         nowTime=getTimer()-startTime;
074|         dTxt.text=cntTime-(Math.floor(nowTime/1000));
075|         mArray.push([dArray[0],dArray[1],dArray[2],dArray[3]]);
076|         /*mArray.push(dArray);//何故かこっちだと挙動がおかしい(´・ω・)*/
077|         if(nowTime>cntTime*1000){
078|             delete onEnterFrame;
079|             dTxt.text="";
080|             play_btn._visible=true;
081|         }
082|         cnt++;
083|     }
084| }
085| function memoryOut():Void{
086|     var cnt:Number=0;
087|     memory_btn._visible=false;
088|     onEnterFrame=function(){
089|         gnr.digitalOutput(mArray[cnt]);
090|         cnt++;
091|         if(cnt==mArray.length){
092|             delete onEnterFrame;
093|             memory_btn._visible=true;
094|         }
095|     }
096| }
097| 
098| function _rollover():Void{
099|     dArray[this.index]=true;
100|     gnr.digitalOutput(dArray);
101| }
102| function _rollout():Void{
103|     dArray[this.index]=false;
104|     gnr.digitalOutput(dArray);
105| }
106| function dOut(num:Number):Void {
107|     dArray[num] = !dArray[num];
108|     gnr.digitalOutput(dArray);
109| }
110| 

75行目の問題はコメント欄にてtakaさんの助言を頂き、解決しました。
75行目と76行目を消して、
mArray.push(dArray.concat());
でもOKです。
thx 2 taka:nium

パブリッシュにはGainerのライブラリが必要です。(サイトで配布されています)
このFLASHが動作するには、GAINERのサイトにて配布されているJAVAのサーバと、上記製作方法にて接続されたGAINERが必要です。
ソースはこちら

▽免責事項▽
 このサンプルを使用した場合、または使用できなかった等のいかなる損害も、
 制作者 むらけん 及び F-site は、その責を負いません。
 ご自身の責任においてご使用ください。

コメント

この記事へのコメント

  1. 1.taka:nium(2007年06月05日 16:46)

    75行目と76行目ですが、両者の違いを考えると参照が入っていることが問題な気もするので、こんな感じにしたらどうですかー?

    mArray.push(dArray.concat());

    実機がないので試してませんが・・・。

  2. 2.むらけん(2007年06月05日 16:53)

    >>takaさん
    エクセレント!
    ばっちりです。

トラックバック

この記事へのトラックバック

  1. 日記/2007-06-06(2007年06月06日 17:39)

    Flash Player でカメラ映像をキャプチャする ▲ ▼参考 リッチクライアントの潮流とFlexのオープンソース 15パズル カ...
    from PukiWiki Plus! (PukiWiki/TrackBack 0.4)

その他の記事