次の方法で共有



May 2017

Volume 32 Number 5

モノのインターネット - Raspberry Pi と Windows 10 を使った作業

Bruno Sonnino

長年ソフトウェアに取り組んできましたが、ハードウェアを直接操作したことはありませんでした。ハードウェアに関係するソフトウェアはたくさん開発してきましたが、物理ボードを操作したことはありません。物理ボードではそこで行われることを完全に制御することになります。そのため、Raspberry Pi を使う機会、特に Windows 10 と Visual Studio を使ってこれを操作する機会を得たときは、ためらうことなく飛びつきました。

バージョン 2 と 3 の Raspberry Pi は OS に Windows 10 を使用できます (完全版ではありませんが、デバイスを制御するユニバーサル Windows プラットホーム [UWP] アプリを実行できます)。Raspberry Pi は安価なコンピューター (35ドル以下で入手可能) ですが、強力です。Raspberry Pi 3 は、クアッド コア、64 ビット ARM プロセッサ、HDMI ビデオ、イーサネット、Wi-Fi ネットワーク、Bluetooth、および 4 つの USB ポートを備えています。Raspberry Pi を使えば、間違いなく多くのことが可能です。

ハードウェア

まず、Raspberry Pi ボードは単独で使用できますが、いく分制限があります。ボードを単独で使用する場合は、コンピューターやスマートフォン向けの開発と同じです。また、いくつか追加のハードウェアも必要になります。プロトタイプ ボード、抵抗器、LED、分圧器、センサー、メモリ カードなど、Raspberry Pi ボードを補完するキットを作成しているメーカーもあります。Raspberry Pi のケースも購入できますが、接続のためにボードを開くことが多いため、あまり必要ありません。

ハードウェアについて

ボードとキットを用意したら、このハードウェアについて理解します。手始めに Raspberry Pi を調べ、用意されているものを確認します。図 1 にボードを示します。

Raspberry Pi 3 Model B と GPIO
図 1 Raspberry Pi 3 Model B と GPIO

図 1 のボードの右側に、2 つの USB ポート (1) とイーサネット コネクタ (2) があります。下部には左から右に、ミニ USB 形式の電源ジャック (3)、HDMI ビデオ (4)、カメラ ポート (5)、およびサウンド出力 (6) があります。ボードの左側には、micro SD カード スロット (7) と LCD ディスプレイ用コネクタ (8) があります。Wi-Fi と Bluetooth アダプタ (9) も確認できます。ボードの中央には、プロセッサ (10) とネットワーク コントローラー (11) があります。上部には、汎用入出力 (GPIO) ブロック (12) があり、ここですべての接続を行うことができます。図の上部に示したように、すべてのピンにはそれぞれ異なる目的があります。

Raspberry Pi の供給電圧には 5V と 3.3V の 2 種類があります。黒いピンはアースで、黄色のピンはプログラミングに使用することになる GPIO ピンです。ピン番号は順番に並んでいません。したがって、記憶力に自信がない方は、このような図を手元に置いておきましょう (bit.ly/1WcBUS2、英語で入手可能)。

次にキットを調査します。ここでは、すべての内容を取り上げません。メーカー (または購入目的) によって多くの違いが生まれる可能性があります。今回のプロジェクトには、ブレッドボード、3 つの LED、抵抗器、ケーブルが必要です。これらのコンポーネントの詳細とその操作方法については、Frank La Vigne の 2016 年 4 月の「最新のアプリ」コラム「モノのインターネット向け UWP アプリの作成」 (msdn.com/magazine/mt694090) をご覧ください。

最初の回路の取り付け

ボードと簡単なコンポーネントを理解したら、最初の回路を取り付けます。通常、このようなシステムにとっての「Hello World」は LED を点滅させるプログラムです。さらに簡単にするために、点滅なしで、LED を点灯する回路を最初に作成します。これには、どのような種類のプログラムも必要なく、組み立てる回路を理解するだけです。

LED を Raspberry Pi の 3.3V ピンに直接接続すると、LED はこの大きさの電流をサポートしないため、おそらく焼き付きます。オームの法則 (V = R*I) により、回路には 220 Ω (赤/赤/黒) の抵抗器を追加する必要があります。220 Ω の抵抗器を入手できない場合、それより大きい抵抗器であれば使用できます。このような抵抗器により回路内を通過する電流が小さくなるため、LED は損傷しません。抵抗が大きすぎると電流が小さくなりすぎるため、LED は点灯しません。今回は 330 Ω を使用しましたが、問題は生じませんでした。

ブレッドボードの取り付け状態については、図 2 をご覧ください。この図は “Fritzing” というオープン ソース プログラムで作成しています。このプログラムは fritzing.org (英語) からダウンロードできます。

回路の取り付け
図 2 回路の取り付け

回路を取り付けたら、電源を接続します。回路の取り付けは、コンポーネントが焼き付かないように、Raspberry Pi の電源を切って行います。回路を正しく取り付けると、LED が点灯します。LED が点灯しない場合、LED の極性の向きが正しいことを確認します。プラス極 (足の長い方) と Raspberry Pi の 3.3V ピンへの接続が同じ水平列に並ぶようにします。LED のマイナス極と抵抗器 (この場合極性はありません) が同じ列に並ぶようにします。抵抗器のもう 1 つの足は Raspberry Pi のアース ピンにつながる列に接続しなければなりません。このすべてが正しければ、LED が焼き付いているかどうかを確認し、別の LED に交換します。LED が点灯したら、次の段階に進み、LED を制御するプログラムを作成します。

Windows 10 のインストールと使用

ここまでは、Raspberry Pi をプログラムする必要がなかったため OS は必要ありませんでした。しかし、今回の調査を進めるには、なんらかのプログラミングが必要になります。そこで、今回は Windows 10 を使用します。Raspberry Pi 用の Windows 10 は無償でダウンロードしてインストールできます。デスクトップやタブレットで実行するのと正確に同じバージョンではありませんが、変更なしで UWP 向けプログラムを実行できます。

まず、SD カードに Windows 10 をダウンロードしてインストールします。そのため、Windows 10 IoT Core Dashboard ツール (bit.ly/2lPXrRc) をダウンロードしてインストールします。

Raspberry Pi に Windows 10 をインストールするには、少なくとも 8GB の互換性のある micro SD カードが必要です。次に、ダッシュボードの [新しいデバイスのセットアップ] オプションを選択して、SD カードに Windows 10 をインストールします。コンピューターの SD カードに書き込む方法を用意する必要があります。利用できるカード リーダーが手元にない場合は、USB カード リーダーを購入します。

SD カードを配置するデバイスの種類、OS、およびドライブを選択します。デバイス名を入力し、管理者のパスワードを選択します。ライセンス条項に同意するチェック ボックスをオンにし、インストール ボタンをクリックします。カードにデータをダウンロードして記録したら、Window 10 がインストールされ使用する準備が整います。デバイスのカード リーダーから SD カードを取り出し、Raspberry Pi のスロットに差し込みます。Wi-Fi ドングルを備えた Raspberry Pi 3 または 2 を使っている場合は、イーサネット ケーブル または Wi-Fi を使ってネットワークに接続します。デバイスの電源をオンにします。

Window 10 がブートすると、IoT Core Dashboard の [自分のデバイス] の下に接続済みのデバイスが表示されます。

接続済みデバイスの IP アドレスとポート 8080 を使って、ブラウザのデバイス ポータルを開くことができます。今回の場合は、アドレス「http://192.168.1.199:8080」で開きます。ポータルを開く際に設定した管理者パスワードを入力するよう求められます (図 3 参照)。

デバイス ポータル
図 3 デバイス ポータル

ポータルでは、デバイスの構成、インストール済みアプリの確認、パフォーマンスやストレージの検証が可能です。一番下のオプションの [Remote (リモート)] では、デバイスをリモート制御できるようになります。コンピューターからデバイスをリモート制御できると、デバイスにモニターが接続されていない場合に便利です。[Windows IoT リモート サーバーを有効にする (Enable Windows IoT Remote Server)] チェック ボックスをオンにすると、デバイスのリモート制御が有効になり、ストアから Windows 10 用のリモート制御アプリをダウンロードできます。

Windows IoT リモート制御アプリをインストールして実行すると、遠隔地からデバイスを制御、操作できます。

この時点で、Windows 10 を使って Raspberry Pi の開発に着手できるようになります。

Visual Studio を使用した Raspberry Pi 向け開発

Visual Studio を使って Raspberry Pi 向けに開発するには、このツールをインストールする必要があります。[カスタム インストール] を選択し、[機能] の選択で [ユニバーサル Windows アプリ開発ツール] をオンにすることでインストールを確認できます。

ツールがインストールされているこを確認したら、Windows 10 を使った Raspberry Pi の開発を開始できます。新しいプロジェクトを作成して、“空の” UWP アプリを選択します。

これにより、空のアプリが作成されるので、メイン画面に現在のコンピューター名を表示するアプリを作成します。Main­Page.xaml に、以下のコードを追加します。

<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
  <TextBlock FontSize="32" x:Name="MachineText"
    HorizontalAlignment="Center"
    VerticalAlignment="Center"/>
</Grid>

次に、MainPage.xaml.cs に以下のコードを追加して、コンピューター名を取得、表示します。

public MainPage()
  this.InitializeComponent();
  Windows.Security.ExchangeActiveSyncProvisioning.EasClientDeviceInformation eas =
    new Windows.Security.ExchangeActiveSyncProvisioning.EasClientDeviceInformation();
  MachineText.Text = eas.FriendlyName;
}

ローカル コンピューターでこのアプリを実行すると、コンピューター名を含むウィンドウが表示されます。

続いて、Raspberry Pi を実行します。[ソリューション プラットフォーム] ドロップダウンで [ARM] を選択し、[デバイス] ドロップダウンで [リモート コンピューター] を選択します。リモート コンピューターを選択するダイアログ ボックスが開きます。

Raspberry Pi デバイスを選択し、アプリを実行します。アプリが Raspberry Pi に配置され、リモート制御ウィンドウに実行中のアプリが表示されます。ウィンドウに表示されるコンピューター名が SD カードをフォーマットして Windows 10 をインストールした際に設定した名前になっていることを確認します。

ローカル アプリと同じ方法でアプリをデバッグできます。つまり、ブレークポイントの設定や変数の分析などが可能です。Visual Studio でアプリを終了すると、アプリが閉じ、Raspberry Pi のメイン画面が表示されます。ブラウザーでポータルに移動すると、アプリが既にインストールされていることが表示され、実行ボタンで実行できます (図 4 参照)。

インストール済みアプリを表示するアプリ ポータル
図 4 インストール済みアプリを表示するアプリ ポータル

UWP アプリにより、驚異的なレベルの互換性が提供されます。その可能性を示すため、Raspberry Pi 向けになっていないアプリを使用します。UWP Community Toolkit のサンプル アプリを使用します。UWP Community Toolkit は、マイクロソフトとコミュニティの協力によって開発されたコンポーネントのツールキットです。このツールキットは、間違いなく確認する価値があります (bit.ly/2b1PAJY、英語)。

このパッケージをダウンロードしてコンパイルしたら、Raspberry Pi に配置して実行します (デスクトップ上とまったく同じ方法でプログラムを実行できます)。ところで、デバイスでコントロールを試してみてください。コントロールは正常に機能します。

ボードの操作

プログラムが実行されたら、ボードの操作に着手します。今回は、信号機コントローラーを作成します。そのため 3 つの LED (赤、黄、緑) を用意し、それぞれを異なるタイミングで点灯します。

ボードの LED を操作するには、GPIO コントローラーを取得し、制御するピンを開いて、目的の点滅方法を設定します。図 1 では、GPIO ブロックの 8 番目のピン (2列目) が 22 番ピンです。今回は 22 番、9 番、および 19 番ピンを使います。完成後の回路は図 5 のようになります。

信号機の回路
図 5 信号機の回路

この回路の準備が整ったら、新しい空の UWP アプリを作成します。MainPage.xaml に、図 6 に示すコードを入力します。

図 6 Main Page xaml コード、信号機の表示

<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
  <Border BorderBrush="Black" BorderThickness="3" HorizontalAlignment="Center"
      VerticalAlignment="Center" CornerRadius="5">
    <StackPanel HorizontalAlignment="Center" VerticalAlignment="Center">
      <Ellipse Width="50" Height="50" Fill="Red" Opacity="0.5"
        Margin="20,20,20,10" x:Name="RedLed" Stroke="Black"
        StrokeThickness="1"/>
      <Ellipse Width="50" Height="50" Fill="Yellow" Opacity="0.5"
        Margin="20,10,20,10" x:Name="YellowLed" Stroke="Black"
        StrokeThickness="1"/>
      <Ellipse Width="50" Height="50" Fill="LimeGreen" Opacity="0.5"
         Margin="20,10,20,20" x:Name="GreenLed" Stroke="Black"
         StrokeThickness="1"/>
    </StackPanel>
  </Border>
</Grid>

ボード上とディスプレイ上の両方に信号機が表示されます。リモート ディスプレイを表示することで何が起こっているかを確認することもできます。Mainpage.xaml.cs のソース コードを図 7 に示します。

図 7 指定された間隔で信号機を点灯するソース コード

private int _currentLight;
private DispatcherTimer _timer;
private int[] _pinNumbers = new[] { 22, 9, 19 };
private GpioPin[] _pins = new GpioPin[3];
public MainPage()
{
  this.InitializeComponent();
  if (InitGPIO())
    InitTimer();
}
private void InitTimer()
{
  var intervals = new[] { 6000, 2000, 6000 };
  var lights = new[] { RedLed, YellowLed, GreenLed };
  _currentLight = 2;
  _timer = new DispatcherTimer { Interval = TimeSpan.FromMilliseconds(500) };
  _timer.Tick += (s, e) =>
  {
    _timer.Stop();
    lights[_currentLight].Opacity = 0.5;
    _pins[_currentLight].Write(GpioPinValue.High);
    _currentLight = _currentLight == 2 ? 0 : _currentLight + 1;
    lights[_currentLight].Opacity = 1.0;
    _pins[_currentLight].Write(GpioPinValue.Low);
    _timer.Interval = TimeSpan.FromMilliseconds(intervals[_currentLight]);
    _timer.Start();
  };
  _timer.Start();
}

このコードを実行するには、IoT 拡張機能への参照を追加する必要があります。ソリューション エクスプローラーで [参照] ノードを右クリックし、[参照の追加] を選択します。[拡張機能]で [Windows IoT Extensions for UWP] を追加します。

intervals 配列 (今回は、6秒、2秒、6 秒) で設定した間隔で各 LED を点灯するタイマーを作成します。画面の楕円は透明度を 0.5 に設定しているため、明瞭には表示されていませんが、点灯するときはそれぞれ 1 に設定します。InitGPIO 関数では、ボードの GPIO を設定できる場合のみタイマーを設定しています (図 8 参照)。

図 8 GPIO を初期化し LED ピンを出力用に設定するコード

private bool InitGPIO()
{
  var gpio = GpioController.GetDefault();
  if (gpio == null)
    return false;
  for (int i = 0; i < 3; i++)
  {
    _pins[i] = gpio.OpenPin(_pinNumbers[i]);
    _pins[i].Write(GpioPinValue.High);
    _pins[i].SetDriveMode(GpioPinDriveMode.Output);
  }
  return true;
}

3 つのピンを出力用で開き、それらを High に設定すると、LED がオフになります。ピンを Low に設定すると、回路に電流が流れ、LED がオンになります。プログラムを実行すると、信号機を含む画面が表示され、本物の信号機のようにライトが点滅します。ボードは図 9 の写真のようになります。

プログラム実行中の信号機ボード
図 9 プログラム実行中の信号機ボード

まとめ

ここまで見てきたように、Raspberry Pi を操作するプログラムを作成するのは簡単です。Windows 10 プログラミングを理解していれば、Raspberry Pi をプログラムするのに必要な知識は既にすべてそろっています (もちろん、ボードを操作するとなると話は別ですが、既に半分は終わっています)。Windows 10 プログラムを作成するのと同じ方法でプログラムを作成できます (実際、UWP プログラムは変更を加えることなく Raspberry Pi で実行できます)。唯一の違いは、データの設定と取得に GPIO コントローラーを用意することです。知識を広げる場合は、bit.ly/2llecFZ にある多くのサンプルを試すことができます。これにより、多くの機会が生まれ、強力なハードウェアと生産性の高い優れたソフトウェアを組み合わせることができます。これはすばらしい組み合わせです。


Bruno Sonnino は 2007 年から Microsoft MVP の一員です。彼は開発者、コンサルタント兼執筆者で、Windows 開発に関する多くの書籍や記事を執筆しています。Twitter は、@bsonnino (英語) からフォローできます。または、blogs.msmvps.com/bsonnino (英語) で彼のブログをご覧いただけます。

この記事のレビューに協力してくれたマイクロソフト技術スタッフの Rachel Appel に心より感謝いたします。