WDD お店を繁盛させる看板を.NET MFでつくる

4/24,25のWindows Developer Daysで展示されていたお店を繁盛させる看板、覚えてますか?

あの看板の、旗の上下とLED点灯は、.NET Micro Framework(Fez Panda)+自作ハードウェアで制御されています。同じ様な工作を手軽に試してみたい方には、.NET Gadgeteerをお勧めします。

デバイスドライバーズのご協力により、看板開発用キット化してもらったので、それをスタート地点にしてください。

https://www.tinyclr.jp/products/fez-completekit.htm#Digital Signage Kit

 このキットには、以下のパーツが入っています。

  • FEZ Spider Starter Kit
    制御ボード本体、LED、Ethenetシールド、カメラ、その他
  • Motor Driver L298 Module
    2個のモーターを制御
  • Relay Module
    4系統の電源のOFF/ON制御

LED点灯、モーター制御、ネットワークと一通り揃っているので、ネット越しに旗を上下させるモーターとLEDの点灯点滅制御が可能です。旗の上下は、タミヤのギヤーボックスとモーターを組み合わせて使うのが一番簡単です。また、キットについているLEDは小さく、光の強度も弱いので、ホームセンターや秋葉原のジャンク屋をあさって100Vの家庭用電源で点滅する魅惑の電飾を調達し、リレーモジュールで制御するのも面白いでしょう。

制御プログラム開発を始めるにあたっては、私の過去のブログ投稿を参考にしてください。

開発環境の準備ととっかかり

モーター駆動制御方法

ネット越しの制御方法

 https://www.tinyclr.jp では、他にも様々なパーツが売られているので、追加購入して色々チャレンジしてみてください。IT系エンジニアで「ハードウェア全く判りません」という方でもかなり色々楽しめるはずです。

Arduinoで過去に遊んでいる人、回路設計が出来て色々自作できる人は、カスタムのハードウェアを作って、.NET Gadgeteerにつないでみてくださいね~

 最後に、一番簡単なサンプルを紹介しておきます。参考にしてください。

Program.gadgeteerビュー

Program.csの全コード

using System;using System.Collections;using System.Threading;using Microsoft.SPOT;using Microsoft.SPOT.Presentation;using Microsoft.SPOT.Presentation.Controls;using Microsoft.SPOT.Presentation.Media;using Microsoft.SPOT.Touch;

using Gadgeteer.Networking;using GT = Gadgeteer;using GTM = Gadgeteer.Modules;using Gadgeteer.Modules.GHIElectronics;using Gadgeteer.Modules.Seeed;

using Microsoft.SPOT.Net.NetworkInformation;

namespace GadgeteerAppKANBAN{    public partial class Program    {        // This method is run when the mainboard is powered up or reset.           void ProgramStarted()        {            /*******************************************************************************************            Modules added in the Program.gadgeteer designer view are used by typing             their name followed by a period, e.g.  button.  or  camera.                        Many modules generate useful events. Type +=<tab><tab> to add a handler to an event, e.g.:                button.ButtonPressed +=<tab><tab>                        If you want to do something periodically, use a GT.Timer and handle its Tick event, e.g.:                GT.Timer timer = new GT.Timer(1000); // every second (1000ms)                timer.Tick +=<tab><tab>                timer.Start();            *******************************************************************************************/

            // Use Debug.Print to show messages in Visual Studio's "Output" window during debugging.            Debug.Print("Program Started");

            // Network初期化            string ipaddr = null;            foreach (var ni in NetworkInterface.GetAllNetworkInterfaces())            {                if (ni.IsDhcpEnabled)                {                    ni.RenewDhcpLease();                }                else                {                    ni.EnableDhcp();                }                ipaddr = ni.IPAddress;                break;            }

            // Webサービスの起動            WebServer.StartLocalServer(ipaddr, 80);            // LED表示用 REST API            WebServer.SetupWebEvent("Led").WebEventReceived +=                    new WebEvent.ReceivedWebEventHandler(Program_WebEventReceived);            // Motor駆動用 REST API            WebServer.SetupWebEvent("Motor").WebEventReceived +=                    new WebEvent.ReceivedWebEventHandler(Program_WebEventReceived);            // Relay駆動用 REST API            WebServer.SetupWebEvent("Relay").WebEventReceived +=                    new WebEvent.ReceivedWebEventHandler(Program_WebEventReceived);

        }

        void Program_WebEventReceived(string path, WebServer.HttpMethod method, Responder responder)        {            if (path.CompareTo("Led") == 0)            {                // LED点灯                string command = responder.GetParameterValueFromURL("command");                string color = responder.GetParameterValueFromURL("color");                if (command.CompareTo("on") == 0)                {                    if (color.CompareTo("blue") == 0)                    {                        led.TurnBlue();                    }                    else if (color.CompareTo("red") == 0)                    {                        led.TurnRed();                    }                    else if (color.CompareTo("green") == 0)                    {                        led.TurnGreen();                    }                }                else if (command.CompareTo("off") == 0)                {                    // LED消灯                    led.TurnOff();                }            }            else if (path.CompareTo("Motor") == 0)            {                // モーター駆動                string side = responder.GetParameterValueFromURL("side");                string speed = responder.GetParameterValueFromURL("speed");                MotorControllerL298.Motor motorSide = MotorControllerL298.Motor.Motor1;                if (side.CompareTo("1") == 0)                {                    motorSide = MotorControllerL298.Motor.Motor1;                }                else if (side.CompareTo("2") == 0)                {                    motorSide = MotorControllerL298.Motor.Motor2;                }                motorControllerL298.MoveMotor(motorSide, int.Parse(speed));            }            else if (path.CompareTo("Relay") == 0)            {                // リレー制御                string id = responder.GetParameterValueFromURL("id");                string command = responder.GetParameterValueFromURL("command");                bool status = false;                if (command.CompareTo("on") == 0)                {                    status = true;                }                switch (int.Parse(id))                {                    case 1:                        relays.Relay1 = status;                        break;                    case 2:                        relays.Relay2 = status;                        break;                    case 3:                        relays.Relay3 = status;                        break;                    case 4:                        relays.Relay4 = status;                        break;                }            }        }    }}