COD2012 - C5 .NET Gadgeteerセッションフォロー

2012/6/9のCOD2012東京会場で担当した.NRT Gadgeteerセッションに関するフォローです。

セッション内で、タッチディスプレイ+温度センサー+イーサネットによる温度計測デモの後に、コードを全部基板から引っこ抜いて、モーター駆動+リレー制御+イーサネットの構成に素早く衣替えするのは南蛮渡来の妖術を使わない限り無理ということで、全セッション終了後のパーティーが行われている傍らの部屋に機材一式を用意して、デモを披露させていただいた次第。

見せたデモは、PCとWindows PhoneのIEにURLを入力して、.NET Gadgeteerをネット越しに制御して、

  • 100Vの電灯をでON/OFFする
  • タミヤのギヤーボックスを2つ使ってモーター二つの電源を独立に制御し、タイヤを回す

の二つでした。

使った部品は、

  • FEZ Spider Mainboard
  • MotorControllerL298
  • Relays
  • Ethernet_J11D

※いずれも、https://www.tinyclr.jp/ から購入可能

他には、

  • 秋葉原で買ってきたテーブルタップと電線、100V家庭用の電源プラグ
  • 町の電気屋さんで売っているマニュアルスイッチつきの電灯
  • タミヤの「楽しい工作シリーズNO.167」シングルギヤボックス×2とユニバーサルプレート、ピンスパイクタイヤセット、単三×4の電池ボックス及びリード線

を使っています。

.NET Gadgeteer関連パーツはのつなぎ方は、

Program.gadgeteer上で、必要パーツをドラッグアンドドロップ&Connect All Modulesで、実際のパーツ群を配線します。

モーターとリレーは、下のように配線します。

 

※100Vの電源につなぐので十分注意してくださいね。

制御コードは、Program.csのProgramクラスのProgramStartedメソッドの最後に、以下のコードを追加します。

            string ipaddr = "xxx";

            foreach (var ni in Microsoft.SPOT.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces())            {                if (ni.IsDhcpEnabled)                {                    ni.RenewDhcpLease();                }                else                {                    ni.EnableDhcp();                }                ipaddr = ni.IPAddress;            }

            WebServer.StartLocalServer(ipaddr, 80);            var relaysEvent = WebServer.SetupWebEvent("Relays"); ;            relaysEvent.WebEventReceived +=                 new WebEvent.ReceivedWebEventHandler(relaysEvent_WebEventReceived);            var motorEvent = WebServer.SetupWebEvent("Motors");            motorEvent.WebEventReceived +=                new WebEvent.ReceivedWebEventHandler(motorEvent_WebEventReceived);

これが、イーサネット有線接続時のDHCP有効化処理と、REST形式のWebサービスAPI定義。

そして、ハンドラーコードは、

        void motorEvent_WebEventReceived(string path, WebServer.HttpMethod method, Responder responder)        {            if (path == "Motors")            {                string side = responder.GetParameterValueFromURL("side");                MotorControllerL298.Motor motorSide = MotorControllerL298.Motor.Motor1;                if (side == "right")                {                    motorSide = MotorControllerL298.Motor.Motor2;                }                string command = responder.GetParameterValueFromURL("command");                if (command == "forward")                {                    motorControllerL298.MoveMotor(motorSide, 50);                }                else if (command == "reverse")                {                    motorControllerL298.MoveMotor(motorSide, -50);                }                else                {                    motorControllerL298.MoveMotor(motorSide, 0);                }                responder.Respond("Motor Drived.");            }        }

        void relaysEvent_WebEventReceived(string path, WebServer.HttpMethod method, Responder responder)        {            if (path == "Relays")            {                string id = responder.GetParameterValueFromURL("id");                string command = responder.GetParameterValueFromURL("command");                bool on = false;                if (command == "on")                {                    on = true;                }                if (id == "1")                {                    relays.Relay1 = on;                }                else if (id == "2")                {                    relays.Relay2 = on;                }                else if (id == "3")                {                    relays.Relay3 = on;                }                else if (id == "4")                {                    relays.Relay4 = on;                }

                string result="<?xml version=\"1.0\" encoding=\"utf-8\"?>" +                    "<relays>";                if (relays.Relay1)                {                    result += "<relay id='1'>on</relay>";                }                else                {                    result += "<relay id='1'>off</relay>";                }                if (relays.Relay2)                {                    result += "<relay id='2'>on</relay>";                }                else                {                    result += "<relay id='2'>off</relay>";                }                if (relays.Relay3)                {                    result += "<relay id='3'>on</relay>";                }                else                {                    result += "<relay id='3'>off</relay>";                }                if (relays.Relay4)                {                    result += "<relay id='4'>on</relay>";                }                else                {                    result += "<relay id='4'>off</relay>";                }                result += "</relays>";                responder.Respond(System.Text.UTF8Encoding.UTF8.GetBytes(result), "text/xml");            }        }

以上が、デモで使ったコードです。

今回は、イーモバのポケットWiFiに、PCとIS12Tをつなぎ、無線有線コンバーターを介して、Fez Spiderに有線接続していました。(.NET GadgeteerのWiFiドングルが不調だったため)

上のコードでStartLocalServerをコールした時にデバッグウィンドウにFez SpiderのIPアドレスが表示されるので、そのアドレスを使い、

PCやIS12TのIEに、

https://xxx.yyy.zzz.aaa/Motors?side=left\&command=forward

と入力すれば、左のモーターが回転して、”Motor Drived."と表示され、

https://xxx.yyy.zzz.aaa/Relays?id=1\&command=on

と入力すると、電灯が点いて、4つのリレーの状態がXMLで表示されます。

 CODでは、実際にPCのIEとIS12TのIEで電灯の点灯消灯、モーターの回転等を披露でき、その場にいた皆さんも盛り上がってもらえたので非常にうれしかったです。なにせ、セッション開始の時に、電灯をこれ見よがしに置いたりしましたからね…あれで電灯の点灯消灯実演しないとね

.NET Gadgeteer、.NET Micro Frameworkに関する特集記事が実は近々発売予定。その時にはまたお知らせしますね。