Windows Remote Arduinoを試す

マイクロソフトがWindows Remote Arduino Libraryというものを公開していたので、試してみました。

#Windows Remote Arduinoとは？

[これ](https://github.com/ms-iot/remote-wiring)です。

> A remote "Arduino Wiring" interface to control an Arduino compatible device from a Windows 10 Universal Windows Application.

WindowsのUWPアプリから、Arduinoの信号を制御するライブラリです。
UWPアプリなので、Windows 10であれば動かすことができます。（Windows MobileやRaspberry Pi 2でも！）

#ハードウェア
##Arduino
デバイスとして、Arduinoが必要です。
対応しているArduinoは以下のとおり。
* [Arduino Uno](ssci.to/789)
* [Arduino Leonardo](ssci.to/968)
* [Arduino Mega](ssci.to/837)
* [DFRobot Bluno](http://www.dfrobot.com/index.php?route=product/product&product_id=1044)
* [DFRobot Bluno Beetle](http://www.dfrobot.com/index.php?route=product/product&product_id=1259)

今回は、Arduino Uno R3を使います。

![20160612C.jpg](https://qiita-image-store.s3.amazonaws.com/0/109634/7e520b31-697f-22e6-eae8-87fff64300d4.jpeg)


##Windows 10
Windows 10のパソコン。

今回は、Surface Pro 2を使います。

![20160612D.jpg](https://qiita-image-store.s3.amazonaws.com/0/109634/3ab386b8-a23b-0cc7-5608-8a9fbfb3310b.jpeg)


##その他
ArduinoとWindows 10の通信は、USBシリアル、Bluetooth、Ethernet/WiFiを使うことができます。
必要に応じて、Arduino Shieldが必要になります。

今回は、USBシリアルで接続します。

#Arduinoにスケッチを書き込む
ArduinoとUWPアプリは、["Firmata"](https://github.com/firmata/protocol)というプロトコルで通信します。
ArduinoがFirmataプロトコルで通信できるようにするために、プログラムを書き込む必要があります。

１．Arduino IDEで、スケッチの例にある、StandardFirmataを開きます。

![20160612E.png](https://qiita-image-store.s3.amazonaws.com/0/109634/86f7d2a2-6b8a-7566-cb00-774659f7a678.png)

２．マイコンボードに書き込みます。

![20160612F.png](https://qiita-image-store.s3.amazonaws.com/0/109634/48e7a0e1-3353-1d43-9f72-87618cb39a40.png)

３．「マイコンボードへの書き込みが完了しました。」と表示されます。

![20160612G.png](https://qiita-image-store.s3.amazonaws.com/0/109634/63df7390-f86b-5014-3d6a-d78e3963b5b6.png)

#UWPアプリを作る

１．Visual Studio 2015を起動して「空白のアプリ（ユニバーサルWindows）」を作成します。

![20160612H.png](https://qiita-image-store.s3.amazonaws.com/0/109634/c40d4409-c386-7de4-c3b2-fe89183ae9ea.png)

２．nugetからプロジェクトへ「Windows-Remote-Arduino」をインストールします。

![20160612I.png](https://qiita-image-store.s3.amazonaws.com/0/109634/3b8e91fb-3d2d-af31-fa52-0d3f9f44bbd9.png)

３．UWPアプリからシリアル通信できるようにするために、Package.appxmanifestにDeviceCapabilityを追加します。

```xml:Package.appxmanifest
<?xml version="1.0" encoding="utf-8"?>

<Package
  xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10"
  xmlns:mp="http://schemas.microsoft.com/appx/2014/phone/manifest"
  xmlns:uap="http://schemas.microsoft.com/appx/manifest/uap/windows10"
  IgnorableNamespaces="uap mp">

  ...

  <Capabilities>
    <Capability Name="internetClient" />
    <DeviceCapability Name="serialcommunication">
      <Device Id="any">
        <Function Type="name:serialPort"/>
      </Device>
    </DeviceCapability>
  </Capabilities>
</Package>
```

４．MainPage.xaml.csにコードを追加します。

```csharp:MainPage.xaml.cs
    public sealed partial class MainPage : Page
    {
        private Microsoft.Maker.RemoteWiring.RemoteDevice device;
        private Windows.System.Threading.ThreadPoolTimer timer;

        public MainPage()
        {
            this.InitializeComponent();

            var connection = new Microsoft.Maker.Serial.UsbSerial("VID_2A03", "PID_0043");
            device = new Microsoft.Maker.RemoteWiring.RemoteDevice(connection);
            device.DeviceReady += DeviceReady;

            connection.begin(57600, Microsoft.Maker.Serial.SerialConfig.SERIAL_8N1);
        }

        private void DeviceReady()
        {
            timer = Windows.System.Threading.ThreadPoolTimer.CreatePeriodicTimer(Timer_Tick, TimeSpan.FromMilliseconds(500));
        }

        private void Timer_Tick(Windows.System.Threading.ThreadPoolTimer timer)
        {
            if (device.digitalRead(13) == Microsoft.Maker.RemoteWiring.PinState.LOW)
            {
                device.digitalWrite(13, Microsoft.Maker.RemoteWiring.PinState.HIGH);
            }
            else
            {
                device.digitalWrite(13, Microsoft.Maker.RemoteWiring.PinState.LOW);
            }
        }

    }
```

#実行

0.5秒周期で、LEDがチカチカと点滅しました。

![20160613B.jpg](https://qiita-image-store.s3.amazonaws.com/0/109634/5862f9cf-360e-2e8c-cbda-126d47493d77.jpeg)

![20160613C.jpg](https://qiita-image-store.s3.amazonaws.com/0/109634/12366f29-50c8-415b-8b10-8dfa00a81405.jpeg)　![20160613D.jpg](https://qiita-image-store.s3.amazonaws.com/0/109634/0a589b24-7c08-5218-554a-37e9fed3472d.jpeg)