マイクロソフトがWindows Remote Arduino Libraryというものを公開していたので、試してみました。
#Windows Remote Arduinoとは?
これです。
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 R3を使います。
##Windows 10
Windows 10のパソコン。
今回は、Surface Pro 2を使います。
##その他
ArduinoとWindows 10の通信は、USBシリアル、Bluetooth、Ethernet/WiFiを使うことができます。
必要に応じて、Arduino Shieldが必要になります。
今回は、USBシリアルで接続します。
#Arduinoにスケッチを書き込む
ArduinoとUWPアプリは、"Firmata"というプロトコルで通信します。
ArduinoがFirmataプロトコルで通信できるようにするために、プログラムを書き込む必要があります。
1.Arduino IDEで、スケッチの例にある、StandardFirmataを開きます。
2.マイコンボードに書き込みます。
3.「マイコンボードへの書き込みが完了しました。」と表示されます。
#UWPアプリを作る
1.Visual Studio 2015を起動して「空白のアプリ(ユニバーサルWindows)」を作成します。
2.nugetからプロジェクトへ「Windows-Remote-Arduino」をインストールします。
3.UWPアプリからシリアル通信できるようにするために、Package.appxmanifestにDeviceCapabilityを追加します。
<?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>
4.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がチカチカと点滅しました。