Windows 10 IoT入門

Windows 10 IoT入門

Raspberry Pi 2電子工作をWindows 10 IoT Coreで始めよう!

2015年5月21日

ついにプレビュー公開が開始されたWindows 10ベースのIoT向けOSは、どのような機能・特徴を持つのか? ラズパイ2にインストールして試してみよう。

デジタルアドバンテージ 一色 政彦
  • このエントリーをはてなブックマークに追加

 ここ数年、Raspberry Pi(ラズベリーパリ。以下、ラズパイ)という、基板むき出しの安価(執筆時点で約5千円)な小型コンピューターが人気だ。これを活用すれば、お金を掛けずに手軽にさまざまな電子工作が楽しめる。例えば、LEDを点滅させるような簡易なものから、センサー情報などをクラウドに送信して分析・活用するIoT(Internet of Things)、ロボットのような機械の制御といったものまで、想像と工夫次第で「何でも」と言ってよいほどさまざまなモノが製作できる。しかもArduino(アルデュイーノ)やNetduino(ネットデュイーノ)などと違い、ラズパイにはOSをインストールしてPC(パーソナルコンピューター)として利用できるという特徴もある。この特徴を生かせば多種多様なプログラムを動かせるようになるので、ラズパイは、数あるマイコンボードの中でも、特に活用の幅が広くて使いやすいデバイスだといえるだろう。

図1 Raspberry Pi 2

 ラズパイにインストールできる最も基本的なOSはRaspbian(ラズビアン)だ。このOSはLinuxベースであるため、特にLinux界わいでラズパイは盛り上がりを見せており、その状況をWindows系の.NET開発者などはうらやましく思っていたことだろう。Build Insiderにも「Raspberry Pi電子工作で、C#のWeb技術を生かす!」という記事が掲載されているが、Windows系開発者の中には「LinuxでWindows技術を何とか活用しよう」と試行錯誤する人も少なくなかった。そんな状況が、(米国時間で)4月29日に開催されたマイクロソフトの世界的な開発者向けカンファレンス「Build 2015」で一変した。ラズパイ向けの無料Windows OSが発表されたからだ。

 実はこのニュース、性能を大幅改善したラズパイのバージョン2である「Raspberry Pi 2(Model B)*1(図1)が2月2日に販売開始されると同時に告知され、IT技術者の間で話題になっていた。特にWindows系の開発者の多くが、そのラズパイ用Windows 10の公開を心待ちにしていたであろう(筆者もそのうちの1人である)。その公開が大方の予想通り、Build 2015で発表になったのだ。これが、「Windows 10 IoT Core for Raspberry Pi 2」(以下、IoT Core)である。なお、このIoT CoreはInsider Preview(プレビュー版)であり、正式版ではないことに注意してほしい※2015/07/29追記 正式版もリリースされました。こちらは英語ですがリリースノートです)

  • *1 ラズパイには「A」「A+」「B」「B+」などいくつかのモデルがある。各モデルで、メモリ容量やUSBポートの数が異なる。モデルごとのハードウェア仕様などの紹介は、本稿では割愛するので、詳しくは公式サイトを参照してほしい。

 本稿では、IoT Coreがどのようなものなのか、その特徴をまとめ、実際に試してみる。

Windows 10 IoT Core for Raspberry Pi 2とは? 何ができるのか?

Windows 10 IoT Coreの種類

 いくつかのマイコンボード向けに最適化されたIoT Coreが存在し、執筆時点では次の2種類がリリースされている(それぞれリンク先からダウンロードできる)。

 今回は、「Raspberry Pi 2向けのIoT Core」(図2)の方を説明する。MinnowBoard Maxは(執筆時点で)99米ドルのボードであるが、本稿では説明を割愛する。

図2 IoT Coreのメイン画面(IoTCoreDefaultApp: IoT Coreのデフォルトアプリ)

中央には[デバイス名]や[ネットワーク接続状態]、[IPアドレス]などの情報が表示されている。
右上の電源アイコからは[シャットダウン]や[再起動]が行える。
右下の歯車アイコンからは[言語](現時点で「English (United States)」のみ)や[タイムゾーン](「(UTC+09:00) Osaka, Sapporo, Tokyo」あり)の設定などが行える。

 ちなみに、Build 2014では「Windows for IoT」というOSが発表されIntel Galileoにインストールできたが、新しいIoT CoreはGalileoボードには対応していない(現時点で対応する計画もないとのこと)。

Windows 10 IoT Coreの機能・特徴

 筆者が試した印象として、IoT Coreには下記のような機能・特徴がある。

  • GUI有りのユニバーサルWindowsアプリが動作する
  • GUIが有るので、キーボード入力やマウス入力を受け付けるただし反応は遅く、高度な入力系の利用にはあまり向いていない。電子看板のような表示系か、シンプルなボタンタッチ程度の入力が主な使い方という印象)
  • GUIは有るが、IoTデバイス上で使えるシェル(=デスクトップ環境や、マルチウィンドウシステム、コマンドプロンプトなど)は無い
  • headed(=ディスプレイ接続するモードで、ユニバーサルWindowsアプリも実行可能)headless(=ディスプレイ接続しないモードで、バックグランドアプリを実行)という2つのデバイスモード(ブート時に設定)がある
  • (基本的に)デプロイ済みのアプリを、OSスタートアップ時に起動する仕組み
  • (基本的に)開発・設定作業は、ネットワーク越しのリモート操作のみとなる上記の「シェルがない」と同意)
  • リモート接続にはPowerShellセッション(=LinuxのSSHと同じようなもの)を使うシェルがないので、当然、リモートデスクトップもできない……)
  • Cドライブを探るとProgram FilesなどがありWindowsシステムそのものUSBメモリのような外部ドライブも利用できた)
  • IoT Core上でNode.jsやPythonがサポートされている筆者は試していないが、ツールが提供されている)
  • 現在のプレビュー段階では有線LAN接続しかサポートされていない(無線LANが利用できない)Wi-FiとBluetoothの機能は「現在、準備中」とのこと)

 筆者はこれまでRaspbian OSでラズパイを使ってきた。Raspbianの場合、シェルがあり、デバイス上でコマンド入力できるだけでなく、デスクトップ環境を起動してマルチウィンドウシステムを使うこともできたので、デバイス上の各種設定など何でも実行できて非常に便利だった。ただしその分、挙動が重いという問題もあった。

 そのため、IoT Coreにはマルチウィンドウシステムがないことに、まずがっかりした。ユニバーサルWindowsアプリは全て全画面で挙動し、エンドユーザーからの操作では他のアプリに切り替えられないようだ(少なくとも筆者はいろいろ試したが切り替えることができなかった)。ならIoT CoreのシンプルGUIは、Raspbianのデスクトップよりも軽いかというと、ユーザー体感としてはIoT CoreのGUIも反応が遅い(特に入力系)と感じた。

 ちなみにこのようなシンプルなGUIシステムにしている理由は、「デスクトップはPCのものであり、IoTデバイスには向いていない」ということらしい。マイクロソフトは、「GUIがもたらすセキュリティリスク/メモリ/ディスク容量などの増大を回避したい」と考えており、特にサーバー系OSにおいては“GUI-less”を目指している。「サーバー管理用のGUI操作画面なし」には、「多くのIT関係者がテキストモードの操作を好んでいるだけでなく、スクリプト作成や自動化(これらはGUIだと実現が困難)においても大きなメリットがあるため」とマイクロソフトは説明している。

 正直な感想としては、簡易な仕組みでもよいので、デスクトップ環境やマルチウィンドウシステムがあったら、もっと作業しやすいのに……と思った。せっかくGUIでスクリーン表示されキーボードもつながっているのに、全ての作業は別のPCからリモートでしか行えないからだ。これだと、IoTデバイスとリモートPCの2つのキーボードとディスプレイを行ったり来たりになってしまう……。

 あと、後述する設定手順が非常に面倒なのが気になった(1つ1つコマンドを打っていくため)。これは正式版では(ウィザード形式などで)もっと手軽になることに期待したい。

 IoT Coreで特に「良い」と感じたのは、やはり.NETの技術やVisual Studioが使えて開発しやすいことと(図3)、GUI有りのユニバーサルWindowsアプリが動くので活用の幅が広がりそうなことである。

図3 Visual Studioを使ってデバッグできる

Windows 10 IoTの各種エディション

 Windows IoTには、上記のIoT Coreを含めて、以下のようなエディションも用意されている。

  • Windows 10 IoT for industry devices
  • Windows 10 IoT for mobile devices
  • Windows 10 IoT Core

 以下にそれぞれの特徴を箇条書きでまとめておく。なお、これらのWindows IoTのOSでは、Windows Updateによる更新もできるようになるようだ(OSのアップデートが楽になるので、これはうれしい)。また、AllJoynによるIoTデバイス連携にも対応している。

Windows 10 IoT for industry devices
  • ディスプレイを通してユーザーと対話するATMや券売機などのような産業IoTデバイス用のOS
  • ユニバーサルWindowsアプリ/ユニバーサルWindowsドライバだけでなく、Win32アプリも動く
  • デスクトップシェル有り
  • 最小メモリ: 1Gbyes
  • 最小ストレージ: 16Gbytes
  • CPU: x86/x64

 デスクトップやデスクトップアプリ(Win32/.NET/WPF)が必要な場合は、これを選択することになる。

Windows 10 IoT for mobile devices
  • ハンドヘルド端末やモバイルPOS端末のようなモバイルIoTデバイス用のOS
  • ユニバーサルWindowsアプリ/ドライバだけでなく、モバイルアプリが動く
  • モダンシェル有り(モダンシェルの具体的な内容は不明)
  • 最小メモリ: 512Mbyes
  • 最小ストレージ: 4Gbytes
  • CPU: ARM

 Windows IoTデバイス上でシェルが必要な場合、また、複数のアプリケーションの実行や、Windows標準アプリの実行、モバイル音声が必要な場合には、これを選択する。

Windows 10 IoT Core
  • ラズパイのような小型IoTデバイス用のOS
  • ユニバーサルWindowsアプリ/ドライバが動く
  • マイクロソフト製のメイン画面(headed)、もしくはシェル無し(headless)
  • 最小メモリ: 256Mbyes
  • 最小ストレージ: 2Gbytes
  • CPU: ARMもしくはx86/x64

 産業デバイスやモバイルデバイスのような要件が不要であれば、これを選択することになる。

【余談1】Windows 10 IoTとWindows Embeddedファミリー

 マイクロソフトは近年、「One Windows Platform」というコンセプトの下、各種デバイスOSを1つのWindowsに集約してきた。例えば、以前から組み込みデバイス向けに提供してきたWindows Embeddedファミリーは、このコンセプトに従い、図4のように、Windows Embedded Standard/Pro/Handheld間でのOSカーネルの集約に始まり、アプリモデル/アプリ自体/ドライバなどと、徐々に、現在のWindows 10 IoTに集約してきている(ちなみに、Windows Embedded Compactは依然として顧客にとって高い価値がある製品なので残しつつ、Windows 10 IoTへの移行用ツールも提供するとしている)。

図4  Windows 10 IoTに集約されていくWindows Embeddedファミリー

Internet of Things Overview | Build 2015 | Channel 9」より引用。

 このようにしてWindows 10 IoTは、各種デバイス上で動くWindowsとなってきているので、「Windows on Devices」と表現されることがある。

【余談2】.NET Micro Frameworkについて

 .NET Micro Frameworkは、Arduinoのような小型マイコンボード用の技術で、Netduinoや、FEZ Spider Starter Kit(=はんだ付け不要でハードウェアモジュールを接続する方法でプロトタイピングが可能な.NET Gadgeteerのキット)などで使われている(図5)。

図5 .NET Micro Frameworkが使われている「Netduino」や「FEZ Spider Starter Kit」

Windows for Makers: Raspberry Pi 2, Arduino and More | Build 2015 | Channel 9」より引用。

 また、上記のGHI製の.NET Gadgeteerをラズパイ2の上に載せて組み合わせて使うGHI Gadgeteer for Windowsが開発中だ(図6の写真はプロトタイプ版)。「Windows」とあるように、.NET Micro Frameworkではなく、ラズパイ2のWindows 10 IoT Coreを使って、これまでに培われてきたGHIのハードウェア・モジュール・エコシステムを活用できることになる。

図6 Windows IoTでGHI Gadgeteerのハードウェア・モジュール・エコシステムを活用

Windows for Makers: Raspberry Pi 2, Arduino and More | Build 2015 | Channel 9」より引用。

Windows IoTデバイスのセットアップ(Raspberry Pi 2編)

 それでは、Windows 10 IoT Core for Raspberry Pi 2を試してみたい人に向けて、筆者が実際に試した手順を紹介する。なお以下では、OSを示す「IoT Core」という略記に加えて、IoT Coreがインストールされたマイコンボードは「Windows IoTデバイス」と表現する。

ハードウェア環境(デバイス)の準備

 まずは、肝心のラズパイ2がないとお話にならない。日本ではRSオンラインという通販サイトが、英国のラズベリーパイ財団(Raspberry Pi Foundation)公認の販売サイトとなっている。が、ラズパイ用のケースやキーボードなど一式をそろえるなら、Amazon.co.jpでまとめて購入するのがお勧めだ。例えば以下のようなものを購入すればよい*2

  • *2 これらのほとんどは、筆者ができるだけ安くなるように実際に購入したものの例である。この中ではモニターが一番高額なので、テレビで代用したり、HDMI接続が可能なモニターが余っていたらそれを活用したりするのがお勧め。ケースがあると、ボードを手で扱いやすくなるのでお勧め。無線LAN機器はボードに搭載されていないので、必要があれば購入する必要がある(が、執筆時点ではIoT CoreがWi-Fiに対応していないので注意してほしい)。
  • *3 動作電圧は5V。消費電流は、状況によって異なるので注意してほしい。IoT Coreの場合、最低限、1A(1000mA)は必要になる。一般的な使い方であれば1.2A(1200mA)あれば十分だが、例えば外部電源供給ありのUSBハブを使わずにUSBポート4つを全て使う場合であれば2.5A(2500mA)程度が必要になる。

Windows 10 IoT Core for Raspberry Pi 2(OS)のダウンロード

 ラズパイ2でIoT Coreを使うにはまず、(現在のInsider Preview版の場合)Microsoft ConnectInsider PreviewプログラムのEULA(使用許諾契約)に同意する必要がある(その手順の説明は割愛する。英語になるが、こちらに詳しい手順が記載されている)。

 実は、IoT Coreをインストールする先のmicroSDカードを使えるように(=プロビジョニング)するには、(build 10069以降の)Windows 10がインストールされたPCが必要だ。使っていないノートPC(SDカードが挿せるものが便利)などに、Windows 10のプレビュー版(本稿の例では日本語版)をインストールするとよいだろう(後述するが、できればこのPCをリモート操作用の端末として、開発環境のVisual Studio 2015もインストールしたいので、それらが問題なく動作するスペックにした方がよい)。

 次に、そのWindows 10のPC上に、下記のリンク先からIoT Core(OS)をダウンロードする。

 これにより、.zipファイルがダウンロードされる。なお、Windows OS上でダウンロードした場合は、ファイルにセキュリティ用の保護ブロック設定された状態になるので、ファイルの右クリックメニューから[プロパティ]を選択してダイアログを表示し、その中の[全般]タブの一番下にある[ブロックの解除]チェックボックスにチェックを入れて[OK]ボタンをクリックすることで、ブロック設定を解除しておこう。再び、右クリックメニューを出して、今度は[すべて展開]を選択し、デスクトップなど任意の場所に.zipファイルの中身を展開する。これにより以下のファイル群が展開される。

  • Flash.ffu: Windows 10 IoT Core(OS)のイメージファイル。なお拡張子.ffuは、Windows用イメージ形式「Full Flash Update」を意味する。FFUイメージは、DISMというツールを使うことで、SDカードやUSBメモリなどに適用できる。
  • ReadMe.txt: 最初に開く必要がある説明ファイル。現状ではリリースノート(英語)へのリンクが記載されている。
  • license.rtf: OSのライセンスについて記載されているファイル。
  • WindowsDeveloperProgramForIoT.msi: IoT Coreを監視するためのアプリケーション「Windows IoT Core Watcher」(後述)などをWindows 10のPC上にインストールするためのセットアッププログラム(後述)。

 ちなみに、IoT Core上で(C#などの.NETプログラムだけでなく)Node.jsやPythonを動かしたい人は、Visual Studio 2015拡張の以下のツールもダウンロード&インストールするとよい。

Windows 10 IoT Coreイメージのプロビジョニング

 それでは、IoT CoreイメージをmicroSDカードに適用していこう。

 まず、Windows 10のPCにSDカードを挿入する(=上で紹介したmicroSDカードの場合は、付属のアダプターを使うとSDカードとして使える)。

 次に、そのSDカードのディスク番号を知る必要がある。これを調べる方法はいくつかあるが、ここでは[ディスクの管理]ツールを使うことにしよう。WindowsXキーを押して[高度なコンテキスト メニュー]を(デスクトップ左下に)表示し、その[ディスクの管理]を選択する。ツールが起動すると図7のように表示され、この例の場合はCドライブが「ディスク 0」で、SDカードが「ディスク 1」であることが分かる。

図7 SDカードのディスク番号を調べる
図7 SDカードのディスク番号を調べる

 ディスク番号が分かったら、前述したコマンドラインツールのDISMを使って、IoT CoreイメージをSDカードに適用する。具体的には、[スタート]メニューの[すべてのアプリ]-[Windows システム ツール]-[コマンド プロンプト]を右クリックして、(コンテキストメニューから)[管理者として実行]を選択する。これによりコマンドプロンプトが管理者モードで起動するので、cdコマンドを使って、先ほど展開したFlash.ffuファイルが存在するディレクトリに移動する(筆者の場合はcd C:\Users\masa-i\Desktop\Windows_IoT_Core_RPI2_BUILDというコマンドを実行した)。そして次のコマンドを入力すればよい。注意点は、PhysicalDrive11の部分を、先ほど調べたディスク番号に置き換えることだ。

コンソール
dism.exe /Apply-Image /ImageFile:flash.ffu /ApplyDrive:\\.\PhysicalDrive1 /SkipPlatformCheck
IoT CoreイメージをSDカードに適用するためのコマンド

 コマンド実行の結果、図8のように「操作は正常に完了しました」と表示されれば完了だ。SDカードをPCから取り外そう。

図8 SDカードへのIoT Coreイメージの適用完了
図8 SDカードへのIoT Coreイメージの適用完了

Windows 10 IoT Coreの起動

 Raspberry Pi 2にmicroSDカードを挿し、その他、LANケーブル(もしくはUSBの無線LAN子機)、HDMIケーブル(ディスプレイ接続)を挿す(図9)。

図9 SDカード挿入と、必要なケーブル類をつなげたRaspberry Pi 2

 最後に電源ケーブルをつないで電力供給が開始されると、自動的にIoT Coreの起動が始まる。最初の起動時には、自動的に2回ほど再起動するなどして合計で5分以上かかるので注意してほしい(そこで電源を切ってはいけない)。途中でブルーのスクリーン(=DefaultApp: アプリ一覧が表示されるマイクロソフト製デフォルトアプリ)が表示されるが、そこはスルーして、最終的に図10の画面(=IoTCoreDefaultApp: マイクロソフト製のIoT Core用デフォルトアプリ)が表示されれば起動完了だ。

図10 起動が完了したIoT Coreのメイン画面

 ここでは、[Device name]欄(=マシン名、デバイス名。基本的に「minwinpc」)と[IP address]欄(=DHCPにより割り当てられたIPアドレス)の値をメモっておこう。ちなみに実際にIoT Coreをリモートから使う場合には、HDMIでモニター接続してこの画面を常に表示しておく必要はない。

リモート環境(Windows 10のPC)のセットアップ

 IoT Coreは、前述の通り、LNA経由でリモートから操作することが基本となる。そこで、Windows 10をインストールしたPCからリモートアクセスできる環境をセットアップしよう。

 このセットアップには、PowerShellを使う必要がある。まず、管理者モードでPowerShellのコンソール(=コマンド入力画面。以下、PSコンソール)を起動しよう。具体的には、[スタート]メニューの[すべてのアプリ]-[Windows システム ツール]-[Windows PowerShell]を右クリックして、(コンテキストメニューから)[管理者として実行]を選択する。これによりPSコンソールが起動する。

pingを使ってネットワーク経由で接続できているか確認

 まずはIoT Coreにリモートから接続できるかを確認しよう。これには、PSコンソールでping minwinpcコマンドを実行すればよい(図11参照。「minwinpc」の部分は、状況に応じて、適切なデバイス名もしくはIPアドレスを指定してほしい。以下、本稿の説明でminwinpcと記述した部分は同様に置き換えてほしい)。

図11 pingを使ってネットワーク経由で接続できているか確認

なお、pingが失敗する場合は、IPアドレスでのpingを試し、それでもダメな場合はLANネットワーク上の問題を疑ってほしい。

WinRMサービスを起動

 次に、PCのデスクトップからIoT Coreにリモート接続できるように、WinRM(Windowsリモート管理)サービスを起動しておく(図12)。これには、PSコンソールでnet start WinRMというコマンドを実行すればよい。

図12 WinRMサービスを起動
Windows IoTデバイスを信頼するホストとして登録

 続いて、リモートのWindows IoTデバイスを信頼するホストとしてサーバーマネージャーに追加する(図13)。これには、PSコンソールでSet-Item WSMan:\localhost\Client\TrustedHosts -Value minwinpcというコマンドを実行する。

図13 Windows IoTデバイスを信頼するホストとして登録

途中で、「本当に追加するか」という確認が表示されるので、Yキーを押して承認する。

PowerShellコンソール上で問題を起こすモジュールを削除

 さらに注意点として、「PowerShellコンソール上でStackOverflowExceptionを起こす既知の問題が存在する」ということなので(筆者の経験では後述のPSセッションで挙動がおかしいので)、ここで、その問題を回避するためにremove-module psreadline -forceコマンドを実行する必要がある(図14)。

図14 PowerShellコンソール上で問題を起こすモジュールを削除

psreadlineは、PowerShellコンソールでコマンドなどの色付けやCtrlVキーによるクリップボードからのペーストなどができるようになる、非常に便利な拡張モジュールだ。このコマンド実行では、これを強制的に削除している。

 ちなみに、このコマンド実行は、PSコンソールを起動するたびに実施する必要がある。

IoT Coreをリモート操作してみよう

 以上で一連のセットアップ作業は完了になる。実際にリモートから操作できるか、試してみよう。

 これにはPSコンソールで、PSセッションを確立するための、

Enter-PsSession -ComputerName minwinpc -Credential minwinpc\Administrator

というコマンドを実行する(これもPSコンソールを起動するたびに実施する必要がある)。途中でパスワードを聞かれるので、初期パスワードの「p@ssw0rd」を入力して先に進める。これにより、リモート接続先のコンソールに切り替わる(図15)。この状態で、リモートにあるWindows IoTデバイス上のIoT Core(OS)を、コンソールで操作できるようになった。なお、リモート操作を終了するときは、exitコマンドを実行すればよい。

図15 IoT Coreをリモート操作してみよう

[minwinpc]: PS C:\Users\Administrator\Documents>のように表示され、IoT Coreにリモートアクセスしている状態であることが分かる。ここでは試しに、[Environment]::OSVersionというコマンドを実行して、IoT CoreのOSバージョンを表示させている。

IoT Coreのパスワードを設定する

 リモート操作できるようになったので、IoT Coreを使い始める前に、IoT Coreのパスワードを設定しておこう。これには、上記の手順でリモート操作できる状態にした上で、net user Administrator 新しいパスワードコマンドを実行して、Administratorアカウントに対する新しいパスワードを指定する(図16)。

図16 IoT Coreのパスワードを設定する

マイクロソフトによる説明資料では、schtasks /Delete /TN Microsoft\Windows\IoT\Startup /Fというコマンドを実行して、タスクスケジューラーから「Microsoft\Windows\IoT\Startup」タスクを削除するように記載されているが(この操作は一度だけ)、筆者が試した限り、このタスクは存在しなかったので作業不要だった。ちなみに、C:\Windows\system32\IoTStartupOnBoot.cmdファイルに、この作業も含めて一連の初期化コマンドがまとまっている(恐らくこの.cmdファイルがWindows IoTデバイス初回ブート時に自動実行されているのだろう)。

【ヒント】Windows IoTデバイスのマシン名を変更するには?

 「minwinpc」というマシン名は変更することも可能だ。これにはsetcomputername 新しいマシン名コマンドを実行すればよい。shutdown /r /t 0コマンドでリモートからIoT Coreを再起動すると、この設定変更が有効になる。ただし、設定し直すと、「Windows IoTデバイスを信頼するホストとして登録」の手順をやり直す必要があるので注意してほしい。

【ヒント】Visual Studio Remote Debuggerの自動実行を確認するには?

 デプロイしたアプリをVisual Studio 2015を使ってリモートデバッグしたい場合には、IoT Core上でVisual Studio Remote Debuggerが起動している必要がある。デフォルトでこれは有効になっており、タスクリストを表示するためのtlistコマンドを実行すると、「msvsmon.exe」というプロセスが2つ起動しているのが確認できるだろう。万が一、起動していない場合は、IoT Coreを再起動すれば、「StartMsvsmon」というタスクによりブート時に自動的に起動する(デフォルトのタスクスケジュール設定が有効な場合)。

【ヒント】Windows 10 PCからWindows IoTデバイスに直接接続するには?

 本稿ではネットワーク経由でWindows IoTデバイスにリモート接続する手順で説明している。この他、PCとWindows IoTデバイスを直接接続することも可能だ。詳しくはマイクロソフトによる説明(英語)を参照してほしい。

Windows IoTデバイス向けのアプリ開発

 それではいよいよ、Windows IoTデバイス向けのアプリ(以下、IoTアプリ)を開発する方法を説明していこう。まずはWindows 10上に開発環境をセットアップする。

Visual Studio 2015開発環境のセットアップ

 次のリンク先からVisual Studio 2015(執筆時点ではRC版)をダウンロードして、Windows 10上にインストールする。エディションは、無償のCommunityか、有償のEnterpriseやProfessionalであればよい。

 インストール時の注意点として、カスタムオプションにして[ユニバーサル Windows アプリ開発 ツール]にチェックを必ず入れること(図17)。基本的には[すべて選択]で全てのオプションをインストールしておくと便利だ。

図17 [ユニバーサル Windows アプリ開発 ツール]をチェックしてVisual Studio 2015をインストール
図17 [ユニバーサル Windows アプリ開発 ツール]をチェックしてVisual Studio 2015をインストール

 インストールが完了したら、前述の「Windows 10 IoT Core for Raspberry Pi 2(OS)のダウンロード」に含まれていた「WindowsDeveloperProgramForIoT.msi」ファイルを実行して、IoTアプリ開発用の機能を追加インストールする。インストールが完了すると、図18に示す[Windows IoT Core Watcher]というアプリが起動する。アプリのデプロイ先として利用可能なWindows IoTデバイスを一覧表示する機能を持つ、このアプリは、PC上のWindows 10ブート時に自動起動する。最小化すると、タスクバーの通知領域に収まる。

図18 Windows IoT Core Watcher
図18 Windows IoT Core Watcher

筆者の場合、「Windows 10 Home Insider Preview英語版 × Visual Studio Enterprise 2015 RC」と「Windows 10 Home Insider Preview日本語版 × Visual Studio Community 2015 RC」という2つの環境で本稿の内容をテストしたが、なぜか前者の環境では、このWindows IoT Core Watcherが起動できなかった。起動できなくても実用上は問題ないので、同様の現象が起こった人のために、そういうバグ(?)があることを記載しておく。

 最後に、Windows 10の開発者モードを有効にする。これには、Windows 10の正式版では[スタート]メニューの[設定]から有効にできるもようだが、現時点ではレジストリを編集する必要がある(他にも方法があるが、その内容の説明は割愛)。これには、WindowsRキーで[ファイル名を指定して実行]ウィンドウを表示して「regedit」と入力してEnterキーを押す。[レジストリ エディター]が起動するので、左側のツリーからHKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\AppModelUnlockキーを選択し(キーを選択する場合は、そのキーの文字列を入力していくと簡単に選択できて便利)、右側の一覧で右クリックメニューから[新規]-[DWORD (32 ビット) 値]を選択することにより、下記の2つの名前のDWORD項目を作成して、それぞれの値を「1」に設定する(この設定に使えるレジストリファイルはこちらからダウンロードできる)。

  • AllowAllTrustedApps
  • AllowDevelopmentWithoutDevLicense

 以上で、開発環境のセットアップは完了だ。

初めての「GUI有り」のIoTアプリ開発

 それではさっそく、GUI有りのIoTアプリ(つまりユニバーサルWindowsアプリ)を作ってみよう。

 Visual Studio 2015のIDEを起動し、メニューバーから[ファイル]-[新規作成]-[プロジェクト]を実行して[新しいプロジェクト]ダイアログ(図19)を開き、左側のツリーから[Visual C#]-[Windows]-[Windows Universal]カテゴリを選択。右側の一覧から[Blank App (Windows Universal)]テンプレートを選択した上で、新規プロジェクトを作成する(本稿の例では、[名前]は「FirstIoTguiApp」とした)。

図19 ユニバーサルWindowsアプリ用プロジェクトの作成

 これにより、図20のようなファイル群が生成される。

図20 ひな型として生成されたファイル群([ソリューション エクスプーラー])
図20 ひな型として生成されたファイル群([ソリューション エクスプローラー])

 ここではシンプルな例として、TextBoxButtonTextBlockコントロールを配置して(図21)、ボタンが押された時にテキストボックスに入力されたテキストを、テキストブロックに表示する処理を実装する。コントロールの配置は、WPFやWindowsフォームなどの開発と同じように、[ツールボックス]からドラッグ&ドロップするだけだ(ただし、[ソリューション プラットフォーム]が「x86」にしていないと、ユニバーサルWindowsアプリのXAMLデザイナーは使えないので注意してほしい)。ボタンクリックに対応するイベントハンドラーは、ボタンを選択した状態で[プロパティ]ウィンドウを開き、上部右端の雷マーク(=[選択した要素のイベント ハンドラー])を選択して、[Click]イベントの入力欄をダブルクリックすると自動生成できる。

図21 XAMLデザイナーを使って自由にGUIレイアウトを作成できる

 参考までに、今回のサンプルのXAMLコードは次のようになっている。

XAML
<Page
  x:Class="FirstIoTguiApp.MainPage"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:local="using:FirstIoTguiApp"
  xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
  xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
  mc:Ignorable="d">

  <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
    <TextBox x:Name="textBoxInput" HorizontalAlignment="Left" Margin="60,55,0,0" TextWrapping="Wrap" Text="ラズパイ2" VerticalAlignment="Top" Width="188"/>
    <Button x:Name="buttonSayHello" Content="メッセージ表示" HorizontalAlignment="Left" Margin="60,92,0,0" VerticalAlignment="Top" Width="188" Click="buttonSayHello_Click"/>
    <TextBlock x:Name="textBlockOutput" HorizontalAlignment="Left" Margin="60,129,0,0" TextWrapping="Wrap" Text="---" VerticalAlignment="Top" Width="188"/>
  </Grid>
</Page>
TextBox/Button/TextBlockコントロールを配置して、ボタンクリックのイベントハンドラーを作成した例

今回はサンプルでしかないので、コントロールの位置やサイズは固定にしている。本来であれば、画面サイズに応じてより柔軟にレイアウトされるように作った方がよい。

 ボタンClickのイベントハンドラーは、次のようなコードにした。

C#
private void buttonSayHello_Click(object sender, RoutedEventArgs e)
{
  this.textBlockOutput.Text = "Hello, " + this.textBoxInput.Text;
}
ボタンが押された時にテキストボックスに入力されたテキストを、テキストブロックに表示する処理

 以上でプログラミングは完了だ。[標準]ツールバーの[ローカル コンピューター](=[デバッグの開始]ボタン)をクリックして(図22)、ローカル環境のユニバーサルWindowsアプリとして実行してみよう。

図22 ローカル環境のユニバーサルWindowsアプリとして実行する

 実行開始されると、次のようなアプリになっていることが分かる。

テキストボックスに任意のテキストを入力してボタンをクリック

テキストボックスに任意のテキストを入力してボタンをクリック

図23 ローカル環境でのユニバーサルWindowsアプリの実行結果
図23 ローカル環境でのユニバーサルWindowsアプリの実行結果

 正常に実行できることが確認できたら、Windows IoTデバイスで動かしてみよう。

IoTアプリをWindows IoTデバイス上でデバッグ実行する

 これには図24のように、[標準]ツールバーの[ソリューション プラットフォーム]を「x86」→「ARM」に変更し、先ほどは[ローカル コンピューター]となっていた[デバッグの開始]ボタンの右にある[▼]ボタンをクリックしてドロップダウンメニューを表示し、そこから「リモート コンピューター」を選択する。これにより[リモート接続]ダイアログが表示されるので、[手動で構成]グループの[アドレス]欄に「minwinpc」など適切なマシン名(もしくはIPアドレス)を入力し、[認証モード]欄で「なし」を選択し、最後に[選択]ボタンをクリックする。ダイアログが閉じられるので、[標準]ツールバーの[リモート コンピューター](=[デバッグの開始]ボタン)をクリックして、デバッグ実行を開始する。

図24 リモート環境のIoTアプリとして実行する

デバッグとデプロイまでに少し時間が掛かるので、メニューバーの[表示]-[出力]を選択して[出力]ウィンドウを表示し、そこでビルド&デプロイの進行状況を確認するとよい。

 実行開始されると、図25のようにIoT Core上でも先ほどと同じユニバーサルWindowsアプリが実行できることが分かる。

テキストボックスに任意のテキストを入力してボタンをクリック

テキストボックスに任意のテキストを入力してボタンをクリック

図25 リモート環境でのIoTアプリの実行結果
図25 リモート環境でのIoTアプリの実行結果

【ヒント】Visual Studio Remote Debuggerへの接続がタイムアウトした場合

 長時間、IoT Coreに接続していないと、Windows IoTデバイス上のVisual Studio Remote Debuggerへの接続がタイムアウトする可能性がある。そうなった場合にはIoT Coreを再起動する必要がある。リモートから再起動するコマンドはshutdown /r /t 0となる。

 ここではデバッグ実行したが、リリース版を正式にデプロイしたい場合はどうすればよいのだろうか?

リリース版のIoTアプリをスタートアップアプリにする

リリース版のIoTアプリをデプロイ

 これにはまず、[標準]ツールバーの[ソリューション構成]を「Release」にした上で、先ほどと同様の手順で[リモート接続]ダイアログの内容を設定する(図26)。次に、メニューバーの[ビルド]-[ソリューションの配置]を実行すればよい。

図26 リリース版のリモート接続を指定する
図26 リリース版のリモート接続を指定する

 デプロイが完了したら、[出力]ウィンドウに出力された[完全パッケージ名]を確認しておこう。ここでは取りあえず先頭の5文字程度をメモしておけば十分だ(図26の例ではfaf06……)。

IoTアプリをスタートアップアプリに指定

 次にデプロイしたアプリを動かす必要がある。これには、前述の「IoT Coreをリモート操作してみよう」の手順でPSセッションを確立して、

iotstartup list

と入力してみよう。このコマンドで図27のように、IoT Core上にデプロイ済みのIoTアプリを列挙でき、そこに先ほどデプロイしたパッケージ(本稿の例ではfaf06……)が存在するのが確認できる。

図27 デプロイ済みのIoTアプリを列挙する

DefaultApp_……は、ブルースクリーンでアプリ一覧を表示できるアプリだ(前述)。
IoTCoreDefaultAppが、IoT Coreのメイン画面(前述)。
Windows.MiracastView_……は、アプリ起動時に表示されるローディングマークである。

 これをIoT Coreのスタートアップ時に実行するには、

iotstartup add faf06

と入力する。この例ではfaf06と入力しているが、このように完全パッケージ文字とマッチする先頭の数文字だけを入力すればよい(例えばDefaultApp_……という完全パッケージ名であれば、先頭のDefという数文字だけで十分だ)。

 最後に、shutdown /r /t 0で再起動すればよい。これにより、次回起動時から自作のIoTアプリが起動することになる。なお、元のIoT Coreメイン画面に戻すには、iotstartup add IoTCoreDefaultAppとコマンド実行して、スタートアップアプリを切り替えるだけだ。

バックグランドで動作する「GUI無し」のIoTアプリ開発について

 本稿ではGUI有りのIoTアプリ(=ユニバーサルWindowsアプリ)の開発方法を紹介したが、GUIが不要なアプリもあるだろう。その場合は、GUI無しのIoTアプリ(=ユニバーサルWindowsプラットフォームAPIベースの「バッグラウンド」アプリ)を作成すればよい。具体的には、[新しいプロジェクト]ダイアログ(図28)を開き、左側のツリーから[Visual C#]-[Windows]-[Windows IoT Core]を選択。右側の一覧から[Background Application (IoT)]テンプレートを選択した上で、新規プロジェクトを作成すればよい。以降の開発手順は、上記とあまり変わらないので割愛する。

図28 バックグラウンドアプリ(IoT)用プロジェクトの作成

 以上でIoT Coreについて一通り説明した。通常記事2本分ぐらいの分量になったが、最後まで読んでいただいたことに感謝したい。

 Windows IoTには期待するところも大きい分、不満なところも少しあるというのが正直なところだ。Raspbianが試して遊べる娯楽的な要素があって楽しい印象だが、一方、IoT Coreは業務系など仕事で使える実用的なOSという印象である。これからIoTが本格的に社会で使われだすとするなら、シェル無しで実用性重視のWindows IoTの方が向いているのかもしれない。いずれにしても、Raspbianも使いつつ、IoT Core正式版のリリースを楽しみに待ちたい。

 本連載の続編としては、Lチカを手始めとして、Robot Kitによる走行ロボット製作などを試してみたいと考えている。ただし、正式版までに仕様が変わる可能性もあるので、その記事公開は正式版の公開を待つ予定だ。本稿のここまでの知識だけでも、かなりのことができるはずなので、ぜひ読者自らいろんなIoT Core開発にチャレンジして、機会があれば成果物を発表してほしい。

サイトからのお知らせ

Twitterでつぶやこう!


Build Insider賛同企業・団体

Build Insiderは、以下の企業・団体の支援を受けて活動しています(募集概要)。

ゴールドレベル

  • グレープシティ株式会社
  • 日本マイクロソフト株式会社