Share via



April 2016

Volume 31 Number 4

最新のアプリ - モノのインターネット向け UWP アプリの作成

Frank La La

今、テクノロジ業界で最もホットな言葉の 1 つは「モノのインターネット」(IoT) でしょう。IoT をクラウドに接続すると、どんなデバイスでもスマート デバイスへと変貌を遂げます。クラウドに接続すれば、デバイスは、制御パネルやデータそのものをクラウドから提供できます。カメラを遠隔操作できます。データを集め、パターンや洞察に基づいて分析できます。

デバイスを使ってデータを集めて分析する方法を取り上げた記事は、MSDN マガジンに多数掲載されていますが、今のところ、ハードウェアや配線の面から取り上げたトピックはありません。とは言え、ソフトウェア開発者が IoT に本格的に取り組もうとすれば、電子設計、電気、場合によってはハンダ付けといった、新たなスキルを身につけなければなりません。ソフトウェア開発者は、本質的にコーディングは苦になりませんが、仮想世界すべての基盤となる回路や電子機器を扱うのはおそらくあまり得意ではありません。多くのソフトウェア開発者は、ハンダ付けのいらない実験用回路板、ジャンパー ケーブル、抵抗などをどう扱えばよいのかわからないのではないでしょうか。今回は、そんな開発者が目指すべき道を示します。

もちろん、プログラム可能なデバイスは何年も前からありました。ただし、こうしたデバイスのコードを作成するには、専用のツールセットや高価な試作ハードウェアについての幅広い知識が求められるのが一般的です。Raspberry Pi 2 Model B では、Windows 10 の特殊なバージョンの Windows 10 IoT Core が動作します。この Windows 10 IoT Core は、Windows デベロッパー センター IoT Web サイト (dev.windows.com/iot) から無料でダウンロードできます。Windows 10 IoT Core が Raspberry Pi 2 で動作するようになったため、ユニバーサル Windows プラットフォーム (UWP) の開発者は既存のコードやスキルを活かせるようになります。

今回は、Raspberry Pi 2 で動作する UWP アプリを作成し、天気 API からのデータに基づいて LED ライトを点滅させます。ここでは、IoT の概念、Raspberry Pi 2 Model B ハードウェア、および C# コードによる制御方法を紹介します。

プロジェクト: 霜の監視

春になり、暖かな陽気が戻るにつれて、庭仕事の再開を待ちわびる人が増えてきます。ですが、春の初めに寒気がぶり返す地域も少なくありません。霜は植物に深刻な被害を及ぼす恐れがあるため、園芸家は寒気の戻りを予報で知りたいと考えます。そこで、今回は最低気温が華氏 38 度 (摂氏 3.3 度) を下回ると画面にメッセージを表示することにします。アプリは、他にも警告として LED を高速で点滅します。

通常は、ソフトウェアとして UWP アプリの作成が必要になりますが、他にもハードウェアがいくつか必要になります。当然、ソリューションを配置する Raspberry Pi 2 Model B が必要です。MicroSD カード、LED ライト、220 オームの抵抗、ハンダ付けのいらない実験用回路板、ジャンパー線、USB マウスとキーボード、HDMI モニターも必要です。

Raspberry Pi 2 Model B: Raspberry Pi 2 Model B は、今回の UWP アプリを配置するコンピューターです。Raspberry Pi 2 は 40 本のピンを備え (図 1 参照)、その一部を汎用入出力 (GPIO) ピンとして使用します。コードを使用すれば、これらのピンの状態の操作や読み取りが可能です。各ピンは、高低いずれかの値になります。高電圧の場合は「高」、低電圧の場合は「低」です。これを使って、LED ライトをオン/オフします。

Raspbery Pi 2 Model B のピン配列図
図 1 Raspbery Pi 2 Model B のピン配列図

MicroSD カード: MicroSD カードは Raspberry Pi 2 のハード ドライブの役割を果たします。デバイスは、このカード上でブート ファイルと OS を探します。配置した UWP アプリもカード上に常駐することになります。最低 4GB あれば機能しますが、推奨は 8 GB です。当然ですが、プロジェクトの要件に応じて必要なカード容量も変わります。たとえば、大量のセンサー データをローカルに保存してからアップロードする場合は、大きなローカル ファイル ストアをサポートするためにさらに大容量の SD カードが必要になります。

ハンダ付けのいらない実験用回路板とジャンパー線: Raspberry Pi 2 にコンポーネントを接続するには、Raspberry Pi 2 からコンポーネントへの電子経路と、コンポーネントから Raspberry Pi 2 に戻る電子経路を作成する必要があります。これが回路です。部品の配線方法はたくさんありますが、最も迅速かつ簡単なのがハンダ付けのいらない実験用回路板です。名前からわかるように、回路の作成にコンポーネントをハンダ付けする必要はありません。接続にはジャンパー線を使用します。今回プロジェクトで使用するタイプには、30 行 10 列のソケットが備えられています。列には、「a ~ e」と「f ~ j」という 5 つをひとまとまりとする 2 つのグループがあります。ソケット上の各穴は、同じ行列グループにある別の穴に電気的に接続されます。その理由は、後ほど説明します。

LED ライトと抵抗: 今回のプロジェクトでは、LED ライトを Raspberry Pi 2 の回路板に接続します。Raspberry Pi 2 のピンは 5 ボルトで動作します。ただし、LED ライトは、この電圧では焼き付きます。抵抗を付けて余分なエネルギーを減らし、LED ライト回路の安全性を確保します。

イーサネット ケーブル、USB マウスとキーボード、HDMI モニター: Raspberry Pi 2 Model B は、さまざまなコネクターの中から USB を 4 ポート、イーサネット ジャック、HDMI 出力を備えています。UWP アプリをデバイス上で実行したら PC やタブレットとほぼ同じようにアプリを操作できるように、ディスプレイを接続し、特定地域の予報を取得するために郵便番号を入力できるようにします。

Raspberry Pi 2 への Windows の配置

Windows 10 IoT Core を使用するには、bit.ly/1O25Vxl (英語) の手順に従います。最初の手順として、bit.ly/1GBq9XR (英語) から Windows 10 IoT Core のツールをダウンロードします。Windows 10 IoT Core のツールには、ユーティリティ、WindowsIoTImageHelper、WindowsIoTWatcher が含まれ、IoT デバイスを操作できるようにします。WindowsIoTImageHelper は、Windows IoT Core のブート ファイルを使って SD カードをフォーマットする GUI を提供します。WindowsIoTWatcher は、ローカル ネットワークを定期的にスキャンする Windows IoT Core のデバイス用ユーティリティです。これらは、後ほど使用します。

ハードウェアの配線

IoT 用ソリューションの作成に着手するには、動作する「もの」を作成しなければなりません。これは、IoT プロジェクトで多くの開発者が最も苦手とする部分です。多くの開発者はコードを使ってビットを動かすことには慣れていますが、電子が移動できるように部品を配線するのは得意ではありません。物事を単純にするために、今回はごく基本的な LED ライト点滅プロジェクト (bit.ly/1O25Vxl、英語) を流用しますが、これをインターネットのリアルタイム データを扱うように拡張します。基本的なハードウェア部品は同じで、LED ライト、ハンダ付けのいらない実験用回路板、ジャンパー線、および 220 オームの抵抗を使います。

Raspberry Pi 2 Model B にはたくさんの GPIO ピンがあります。これらのピンの多くは、その状態をコードで操作できます。ただし、予約済みで、コードからは制御できないピンもあります。さいわい、各ピンの用途を示した簡単な図があります。図 1 に示した図は「ピン配列」と呼ばれ、回路板のインターフェイスのマップを提供します。

回路の設計

基本的に作成しなければならないのは電子が流れる回路です (図 2 参照)。電子は、図 1 で「3.3V PWR」というラベルのピン 1 から流れ始めます。このピンは、3.3 ボルトの電源を回路に供給し、この電力によって LED が点灯します。実際には、3.3 ボルトは LED ライトの電力としては大きすぎます。回路が焼きつかないように、抵抗を付けて電気エネルギーを一部吸収します。次の回路は GPIO 5、つまりピン配列図の物理ピン 29 です。このピンをコードで制御して、LED ライトの点滅を制御します。このピンの出力電圧を高 (3.3 ボルト) または低 (0 ボルト) のどちらかに設定すると、LED ライトがそれぞれオン/オフされます。

回路図
図 2 回路図

回路の組み立て

いよいよ回路を組み立てます (図 2 参照)。そのためには、1 本のジャンパー線のメス端子を Raspberry Pi 2 のピン 29 に繋ぎ、もう一方のオス端子をハンダ付けのいらない実験用回路板のスロットに差し込みます。今回選択したのは行 7 列 e のスロットです。次に、LED ライトの短い足を行 7 列 a のスロットに、長い足を行 8 列 a のスロットに差し込みます。今度は、抵抗の一方の端子を行 8 列 c に、もう一方を行 15 列 c に差し込みます。最後に、2 本目のジャンパー線のオス端子を行 15 列 a のスロットに差し込み、メス端子を Raspberry Pi 2 のピン 1 に繋ぎます。この手順をすべて終えると、図 3 の状態になります。

配線が完了した Raspberry Pi 2 (透明のプラスチック ケースに収納)
図 3 配線が完了した Raspberry Pi 2 (透明のプラスチック ケースに収納)

デバイスの起動

MicroSD カードに Windows IoT Core をインストールしてから、その SD カードを Raspberry Pi 2 に挿入します。次に、ネットワーク ケーブル、USB マウス、HDMI モニターを接続し、Raspberry Pi 2 をコンセントに繋ぎます。デバイスが起動し、最終的には図 4 に示す画面がポップアップします (デバイス名と IP アドレスをメモします)。

Raspberry Pi 2 の Windows IoT Core の既定の情報画面
図 4 Raspberry Pi 2 の Windows IoT Core の既定の情報画面

ソフトウェアの作成

ハードウェアのセットアップが完了したので、ここからは IoT プロジェクトのソフトウエアに取り掛かります。Visual Studio を使用すれば IoT プロジェクトを作成するのは簡単です。基本的に他の UWP プロジェクトと同じです。いつものように、Visual Studio 2015 で [ファイル] メニューの [新規作成] をポイントしてプロジェクトを作成し、テンプレートとして [新しいアプリケーション (ユニバーサル Windows)] を選択します。今回はプロジェクト名を「WeatherBlink」にしました。プロジェクトが読み込まれたら、Windows IoT Extensions for the UWP への参照を追加します。ソリューション エクスプローラーでソリューションの [参照] を右クリックし、表示されたダイアログ ボックスで、ユニバーサル Windows ツリーの [拡張機能](Extensions) で [Windows IoT Extensions for the UWP] チェック ボックスをオンにします (図 5 を参照)。最後に、[OK] をクリックします。

Visual Studio 2015 での Windows IoT Extensions for the UWP への参照の追加
図 5 Visual Studio 2015 での Windows IoT Extensions for the UWP への参照の追加

これで、適切な参照がプロジェクトに追加されます。MainPage.xaml.cs ファイルの先頭に以下の using ステートメントを追加します。

using Windows.Devices.Gpio;

Windows.Devices.Gpio 名前空間には、Raspberry Pi 2 の GPIO ピンの操作に必要なすべての機能が含まれており、特定のピンの状態を簡単に設定できます。たとえば、以下のコードはピン 5 の値を「高」に設定します。

var gpioController = GpioController.GetDefault();
gpioPin = gpioController.OpenPin(5);
  gpioPin.Write(GpioPinValue.High);

ピンの値も以下のように簡単に読み取れます。

var currentPinValue = gpioPin.Read();

GPIO ピンはアプリ全体で共有するリソースになるため、クラスのスコープで変数を管理するともっと簡単になります。

private GpioPin gpioPin;
private GpioPinValue gpioPinValue;

通常の方法でピンを初期化します。

private void InitializeGPIO()
{
  var gpioController = GpioController.GetDefault();
  gpioPin = gpioController.OpenPin(5);
  gpioPinValue = GpioPinValue.High;
  gpioPin.Write(gpioPinValue);
  gpioPin.SetDriveMode(GpioPinDriveMode.Output);
}

簡単な UI の作成

作成しているのは UWP アプリなので、Windows 10 UWP インターフェイスのコントロールはすべてアクセスできます。つまり、それほど開発作業を行わなくても、IoT に完全な対話型インターフェイスを装備することができます。多くの IoT 実装は「ヘッドレス」になっていて、UI がありません。

今回のプロジェクトでは、天気予報に基づいてメッセージを表示する簡単な UI を用意します。キーボードとマウスを Raspberry Pi 2 に接続すれば、エンド ユーザーが郵便番号を入力し、それに基づいて天気予報を更新できます (図 6 参照)。

WeatherBlink UWP アプリの UI
図 6 WeatherBlink UWP アプリの UI

デバイスをスマートに

IoT デバイスに天気予報を認識させるためには、インターネットから天気データを取り込みます。作成しているのは UWP アプリなのでライブラリやツールはすべて利用できます。今回は、特定地域の天気データを JSON 形式で提供している openweathermap.org/api から、天気データを取得することにします。気温はすべて、ケルビン (華氏) で表現されています。図 7 は、天気をチェックし、その結果に基づいて点滅の速度を変更するコードを示しています。一般に、霜の警告は、気温がほぼ華氏 38 度 (摂氏 3.3 度) になると発令されます。今回は、霜の恐れがある場合、LED を高速点滅させて、庭に危機が迫っていることを警告します。それ以外は、LED をゆっくり点滅させて、デバイスに電力が供給されていることを知らせます。UWP での REST API 呼び出しの実行と JSON 応答の解析は、よく取り上げられるトピックなので、この部分に該当するコードは省略して簡潔にしています。

図 7 天気のチェックと点滅速度

private async void LoadWeatherData()
{
  double minTempDouble = await GetMinTempForecast();
  // 38F/3.3C = 276.483 Kelvin
  if (minTempDouble <= 276.483)
  {
   Blink(500);
   txtStatus.Text = "Freeze Warning!"
  }
  else
  {
    Blink(2000);
    txtStatus.Text = "No freezing weather in forecast."
  }

Blink メソッドは簡単です。メソッドに渡されるパラメーターに基づいて、ディスパッチ タイマーの間隔を設定します。

private void Blink(int interval)
{
  blinkingTimer = new DispatcherTimer();
  blinkingTimer.Interval =
    TimeSpan.FromMilliseconds(interval);
  blinkingTimer.Tick += BlinkingTimer_Tick;
}

BlinkingTimerTick メソッドは、LED を点滅させます。ピンの状態を読み取り、状態を逆の値に設定します。

private void BlinkingTimer_Tick(
  object sender, object e)
{
  var currentPinValue = gpioPin.Read();
  if (currentPinValue == GpioPinValue.High)
  {
    gpioPin.Write(GpioPinValue.Low);
  }
  else
  {
    gpioPin.Write(GpioPinValue.High);
  }
}

完全なソース コードは、bit.ly/1PQyT12 から入手できます。

アプリの配置

Raspberry Pi 2 にアプリを配置するには、PC での初期セットアップが必要です。まず、アーキテクチャを ARM に変更する必要があります。再生アイコンの隣にあるドロップダウン リストで [リモート コンピューター] を選択します。[リモート接続] ダイアログ ボックス (図 8) が表示されます。ここで、デバイスの IP アドレスを手作業で入力するか、自動検出されたデバイスの一覧からデバイスを選択します。どちらの場合も、認証が有効になっている必要はありません。最後に、[選択] をクリックすれば、ソリューションをデバイスに配置できるようになります。

[リモート接続] ダイアログ ボックス
図 8 [リモート接続] ダイアログ ボックス

設計上の考慮事項

IoT の世界は、開発者に新しいビジネス チャンスをもたらしますが、課題ももたらします。IoT デバイスのプロトタイプを組み立てるときは、配置先の実行環境が重要な要素になります。デバイスの電源やネットワークは準備できているでしょうか。自宅のサーモスタットならば確実に動作するかもしれませんが、遠隔地の森林の中にある気象台では動作しないかもしれません。明らかに、このような課題の多くはデバイスの組み立て方法に影響します。たとえば、屋外で使う場合は防水の容器を追加します。ソリューションはヘッドレスにしますか、それとも UI を用意しますか。このような課題は場合によって、コーディング方法に影響することがあります。たとえば、デバイスが 4G ネットワークでデータを転送するとしたら、データ転送コストも 1 つの要因になります。このような場合は、明らかにデバイスが送信するデータ量を最適化することになります。純粋なソフトウェア プロジェクトと同様に、エンドユーザーの要件に配慮することが重要です。

まとめ

コードで LED ライトを制御するだけでは世界は変わらないかもしれませんが、アプリケーションが変わる要素はたくさんあります。天気予報 API を利用しないで、気温センサーを Raspberry Pi 2 に繋いで、庭園近辺に設置してもかまいません。自宅のどこかの湿度を調べ、乾燥注意の電子メール警告を送信できるようにしてはどうでしょう。大都市近郊に大気汚染センサーを設置するのもよいでしょう。屋根の上に重量センサーを設置して、積雪量から崩落の危険性を判断するのもありですね。可能性は無限です。

すばらしいモノづくりを目指しましょう。


Frank La Vigne は、Microsoft Technology and Civic Engagement チームのテクノロジ エバンジェリストで、より良いコミュニティを形成するためにユーザーによるテクノロジの活用を支援しています。FranksWorld.com (英語) に定期的にブログ記事を投稿し、Frank's World TV (youtube.com/FranksWorldTV (英語)) という YouTube チャンネルを主催しています。

この記事のレビューに協力してくれた技術スタッフの Rachel Appel、Robert Bernstein、Andrew Hernandez に心より感謝いたします。