IoTへの挑戦 Raspberry PiでWindows 10 IoT Coreを動かす(10)
■UIをもたないでバックグラウンドで実行されるプログラム
今回から、Raspberry Piに接続されたディスプレイにウィンドウ画面を表示することなくバックグラウンドで実行されるプログラムのサンプルを動かします。
●サンプルBlinkyHeadless
BlinkyHeadlessというフォルダ・サンプルの中に用意されています。このHeadlessは、ウィンドウなどのUIをもたないでバックグラウンドで実行されるプログラムのことを示しています。
ArduinoなどはUIなしで多くのアプリケーションがあります。組み込みのシステムも多くはUIなしで運用されています。BlinkyHeadlessのサンプル・プログラムは、UIなしでGPIO5に接続されたLEDを点滅するプログラムです。
BlinkyHeadlessフォルダにはC#のためのCSフォルダのほかに、Python、C++のCPPなど、ほかの言語のサンプルも用意されています。今回はこの中でC#のサンプル・プログラムを確認します。
Visual Studio 2015を起動してメニュー・バーの、
ファイル(F) > 開く(O) > プロジェクト/ソリューション |
を選択し、上記のCSフォルダのBlinkyHeadlessCS.slnのソリューション・ファイルを開きます。
●LEDの接続
点滅させるLEDは、次に示すように今まで利用した赤色のLEDに330Ωの電流制限抵抗を使用します。LEDのプラス側は3.3Vに接続し、マイナス側はGPIO5に接続します。
サンプルのソース・プログラムは、ソリューションエクスプローラでC# StartupTask.csを選択すると、動作確認するサンプル・プログラムが次に示すように表示されます。
●テンプレートで用意されている
BlinkyHeadlessの基本的な枠組みは、バックグラウンド処理のためのテンプレートとして用意されています。新規にバックグラウンド処理のプログラムを作成するときは次に示すように、メニューバーで、
ファイル(f) > 新規作成(N) > プロジェクト(P) |
を選択しインストール済のテンプレートから、
VisualC# > Windows >Windows Iot Core |
を選択すると、次に示すように Background Application(Iot)が表示されます。
このBackground Application(Iot)を選択して、OKボタンをクリックすると、次に示すようにバックグラウンド処理のための基本的な枠組みが用意されたテンプレートが開きます。このテンプレートに必要とするコードを追加することで、バックグラウンド処理のためのプログラムを作ることができます。
●BlinkyHeadlessのプログラム
BlinkyHeadlessのプログラムを確認していきます。
// Copyright (c) Microsoft. All rights reserved. using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Net.Http; using Windows.ApplicationModel.Background; using Windows.Devices.Gpio; |
ここまでは、テンプレートのBackground Application(Iot)と同じです。次の文は、Windows.System.Threadingのスレッド処理のシステムの名前空間を利用してタイマの処理でスレッドを利用するために追加されています。
using Windows.System.Threading; |
名前空間の定義名が、テンプレートではBackground Application2からBlinkyHeadlessCSに変わっていますが、プログラムの記述方法はテンプレートと同じです。
namespace BlinkyHeadlessCS { |
システムが用意してあるIBackgroundTaskを利用して、今回のバックグラウンドで稼働するクラス、StartupTaskを定義しています。
public sealed class StartupTask : IBackgroundTask { |
バックグラウンドの処理が終了するまでプログラムを停止させないための遅延処理を、BackgroundTaskDeferral型のオブジェクトdeferralを定義します。
BackgroundTaskDeferral deferral; private GpioPinValue value = GpioPinValue.High; private const int LED_PIN = 5; private GpioPin pin; private ThreadPoolTimer timer; |
ここまでprivate変数として必要な変数の定義を行っています。
バックグラウンドの処理は、Runメソッドから開始します。deferralの設定を行い、次はInitGPIO()関数でLEDを駆動する汎用入出力ポートの初期化を行っています。500msごとにTimer_Tick()関数を呼び出すように設定します。
public void Run(IBackgroundTaskInstance taskInstance) { deferral = taskInstance.GetDeferral(); InitGPIO(); Timer=ThreadPoolTimer.CreatePeriodicTimer(Timer_Tick,TimeSpan.FromMilliseconds(500)); } |
汎用入出力ポートの初期化を行っています。
private void InitGPIO() { pin = GpioController.GetDefault().OpenPin(LED_PIN); pin.Write(GpioPinValue.High); pin.SetDriveMode(GpioPinDriveMode.Output); } |
タイマによって500msごとに呼び出され、GPIOポートの出力をHIGH/LOW反転しています。
private void Timer_Tick(ThreadPoolTimer timer) { value=(value==GpioPinValue.High) ? GpioPinValue.Low : GpioPinValue.High; pin.Write(value); } } } |
●デバッグでプログラムの動作を確認
次に示すように、各関数入り口にブレークポイントを設定して動作を確認しました。Runの関数の処理が終わると、タイマのイベントごとにTimer_Tick関数が呼び出され、LEDの点滅処理を行います。
ブレークポイントを外してスタートすると、0.5秒くらいの間隔でLEDが点滅します。
次回、前回行ったPushButtonのプログラムをバックグラウンドで動かすことを検討します。
(2016/4/11 V1.0)
<神崎康宏>
バックグラウンド
UI;User Interfaceの略語です。ディスプレイなどを指します。deferral;遅延。
名前空間;C# プログラミング ガイドを参照してください。