IoTへの挑戦 Raspberry PiでWindows 10 IoT Coreを動かす(9)
■デバッガを使ってPushButtonの処理内容を確認
今回は、サンプル・プログラムPushButtonの処理内容をデバッグ動作で確認します。
Visual Studio 2015を起動すると次に示すように、最近使用したファイルが表示されています。前回テストしたPushButtonのファイルが先頭にあります。このPushButtonのプロジェクト・ファイルを選択し起動します。
●ブレークポイントの設定
プログラムMainPage.xaml.csのユーザ設定プログラムとして最初に実行されるMainPage()関数の入り口に、最初のブレークポイントを設定します。
public MainPage() ● { InitializeComponent(); InitGPIO(); } |
もう一つのブレークポイントはプッシュ・ボタンからの入力時に呼び出されるbuttonPin_ValueChanged関数の入り口に、次に示すように設定します。
●デバッグの開始
ブレークポイントを設定して、前回LEDとプッシュ・ボタンを接続したRaspberry Pi 2 model BにモニタへのHDMIケーブル、LANケーブルを接続し電源をいれます。Windows 10 IoT Coreが起動するのを待ち、その後Visual Studio 2015のツールバーの緑色の三角形のアイコンをクリックしてデバッグ・モードでプログラムを開始します。Visual Studio 2015はプログラムをRaspberry Pi 2 modelB に配置し、Rasberry Pi 2 model B上のプログラムをデバッグ・モードで実行し、ブレークポイントが設定された場所まで実行します。その結果、次に示すようにMainPage()関数の入り口で停止しています。
ツールバーのステップインのアイコンをクリックするかF11キーを押して1命令進みます。
MainPage()関数の中では、InitializeComponent()とGPIOの初期化を行うInitGPIO()の二つの関数を実行します。
InitializeComponent()はシステムが提供したフォームの初期化のための関数で、ステップインで次に進みます。次に実行する命令は黄色い矢印で示されます。
次のInitGPIO()でステップインで次に進むと次に示すように、InitGPIO()関数の処理に進みます。
GPIO controllerの有無をチェックしています。GPIOはnullでないので実際のGPIOによる入力処理のための初期化の処理を開始します。
プッシュ・ボタンが接続されたGPIOのBUTTON_PIN、LEDが接続されているLED_PINに、具体的なピン番号26番ピンと5番ピンを割り当てます。
その後、ledPinにHIGHを出力し、出力モードに設定しています。
buttonPinについてはInputPullupが指定できる場合は、プルアップされた入力ポートとして、プルアップが設定できない場合はプルアップなしの入力ポートとして設定します。
●チャタリング・キャンセルの設定
次の命令でプッシュ・ボタンの接点の状態が安定するまでの時間を50msとして、この時間経過した後に設定の確認を行い、チャタリングによる誤動作の防止を図っています。
buttonPin.DebounceTimeout = TimeSpan.FromMilliseconds(50); |
その後、次の命令でプッシュ・ボタンが押されたり、放されたりしてプッシュ・ボタンからの入力値の値が変化したときに呼び出される関数をbuttonPin_ValueChanged()と設定します。
buttonPin.ValueChanged += buttonPin_ValueChanged; |
その後、GPIOピンの初期化が正しく行われたことを示す次のメッセージを用意して、
"GPIO pins initialized correctly |
この関数の処理を終え次に示すように、呼び出し元のMainPage()関数に戻ります。
MainPage()の処理を終えた後、システムが用意した画面表示の処理に入ります。
最初のページの表示処理に続いて、表示するウィンドウをアクティベートします。
この処理が終わると、最初の画面が表示されます。
●イベント待ちの状態
MainPage.xamlで設定されたウィンドウが表示されると、Visual Studio 2015の画面は次に示すようにデバッグに関するアイコンは中断と停止と再起動以外は利用できなくなり、プッシュ・ボタンからのイベント待ちの状態になります。
●プッシュ・ボタンを押すと
プッシュ・ボタンを押すとプッシュ・ボタンからの入力が変化するので、次に示すようにbuttonPin_ValueChanged()関数が呼び出されます。この関数が呼び出され、またデバッグのためのステップインなどの操作ができるようになります。
●プッシュ・ボタンからの入力のチェック
この関数の中で、プッシュ・ボタンからの入力が立ち下がりの場合は、表示色とLEDの点滅を反転します。併せてButton Pressed、Button Releasedなどのメッセージを表示します。
次の命令で入力が立ち上がりの場合、LEDの点滅、表示色を反転します。
if (e.Edge == GpioPinEdge.FallingEdge) { ledPinValue = (ledPinValue == GpioPinValue.Low) ? GpioPinValue.High : GpioPinValue.Low; |
この命令は、ledPinValueとGpioPinValue.Lowが一致した場合ledPinValueにGpioPinValue.Highを代入し、不一致の場合はledPinValueにGpioPinValue.Lowを代入します。その結果ledPinValueの値が反転されます。
次の命令でledPinに接続されたLEDの点滅を反転します。
ledPin.Write(ledPinValue); } |
●表示画面の変更処理
ウィンドウへの表示の変更の処理は、次のステップから行われます。次の処理はマルチタスクで行われ、その実行の優先順位Normalで投入された順番に実行される標準優先順位でOSが資源を割り当て実行します。黄色で示された範囲の処理がディスパッチされます。
ディスパッチされた後、この処理はOSにより実行資源が割り当てられ順番に処理が進みます。その様子はデバッガのステップイン動作で順番に確認できます。
次の処理はif文でGPIOからの入力が立ち下がりなら、ウィンドウの丸いマークの表示色を反転させ、Button Pressedと表示します。入力が立ち下がりでなければButton Releasedを表示して処理を終えます。
プッシュ・ボタンを押して離すと、押したときのイベントに続いて離したときのイベントも発生します。そのそのため押したときの確認が終わると続いて離したときのイベントのステップイン動作が続きます。両方の処理を終えて新たにボタンを押していないと次に示すようなイベント待ちの状態になります。
サンプル・プログラムにより、タイマで定期的に処理するプログラム、GPIOからの入力をきっかけに処理するプログラムを確認してきました。
もうしばらく、サンプル・プログラムでWindows10 IoT Coreの動作を確認します。
(2016/3/28 V1.0)
<神崎康宏>
バックグラウンドチャタリング;機械的な接点をもつスイッチやリレーでは、ON/OFF時に、接点がバウンスします。数msから十数msの間、ONとOFFが繰り返されるため、コンピュータがその間、どちらの状態を読むかが不確定です。コンピュータの処理は高速なので、スイッチをONしたのに、OFFの状態を読むことがあります。
アクティベート;有効にするという意味です。
イベント待ち;何かが変化するとアクションを起こすことをイベント・ドリブンといいます。事前にアクションが起きたら処理をするプログラムを用意しておきます。
ディスパッチ;マルチタスクOSでは短い時間ごとにプログラム(プロセス、タスク)が切り替えられて実行されます。CPUの実行時間はOSが管理している資源の一つです。CPUの実行を割り当てることをディスパッチといいます。
標準優先順位;マルチタスクOSは、一定時間で各種プログラム(プロセス、タスク)の実行を切り替えます。平均して数十からそれ以上のプログラムを切り替えていると、早く処理を終えたいプログラムの実行が遅くなります。実行するプログラムに優先する順番(プライオリティ)を設定できます。
資源;リソースともいわれ、OSが管理するCPUの処理時間、メモリ、I/Oなどを指します。OSは資源を有効に利用できるように配分します。