「タクトスイッチでキャラクターの動きを制御する」UWPアプリを作る:ラズパイ3&Toradex、Windows 10 IoT Coreで楽しみながら検証するIoT実践入門(終)(3/4 ページ)
ITエンジニアに向け、「ビジネスに貢献するIoT活用」の第一歩を踏み出す「ひらめき」を得てもらうための本連載。今回は、物理ボタンのオン/オフでシステムの動きを制御するUWPアプリを作ってみよう。
書き出したUnity 5.3のプロジェクトをVS2015で開き、コードの修正を行う
VS2015のソリューションエクスプローラーの「参照」で右クリック→「参照の追加」を選択する。表示される、参照マネージャーから、「Universal Windows」→「拡張」を選択して表示されるSDKリストから、「Windows IoT Extension for the UWP 10.0.10240.0」にチェックを入れる(図2)。選んだAPIがソリューションエクスプローラーの「参照」内に追加される。
コードを修正する
ソリューションエクスプローラーから「JumpScript.cs」ファイルを開く。最初はエラーを示す赤い波線が幾つか表示されるが、気にしなくてもいい。
前述したリスト1のコードを追記修正する(リスト2)。
using UnityEngine; using System; using Windows.Devices.Gpio; public class JumpScript : MonoBehaviour { //private GameObject obj; private bool flag=false; private Animator anim; private const int LED_PIN = 79; private const int BUTTON_PIN = 97; private GpioPin pin; private GpioPin buttonPin; private GpioPinValue pinValue = GpioPinValue.High; // Use this for initialization void Start() { anim = GetComponent<Animator>(); InitGPIO(); } void Update() { if (flag==true) { anim.SetBool("is_jumping", true); } else { AnimatorStateInfo state = anim.GetCurrentAnimatorStateInfo(0); if (state.IsName("Locomotion.Jump")) { anim.SetBool("is_jumping", false); } } } private void InitGPIO() { var gpio = GpioController.GetDefault(); if (gpio == null) { return; } buttonPin = gpio.OpenPin(BUTTON_PIN); pin = gpio.OpenPin(LED_PIN); pin.Write(GpioPinValue.High); pin.SetDriveMode(GpioPinDriveMode.Output); if (buttonPin.IsDriveModeSupported(GpioPinDriveMode.InputPullUp)) buttonPin.SetDriveMode(GpioPinDriveMode.InputPullUp); else buttonPin.SetDriveMode(GpioPinDriveMode.Input); buttonPin.DebounceTimeout = TimeSpan.FromMilliseconds(50); buttonPin.ValueChanged += buttonPin_ValueChanged; } private void buttonPin_ValueChanged(GpioPin sender, GpioPinValueChangedEventArgs e) { if (e.Edge == GpioPinEdge.FallingEdge) { pinValue = (pinValue == GpioPinValue.Low) ? GpioPinValue.High : GpioPinValue.Low; pin.Write(pinValue); if(pinValue==GpioPinValue.High) { flag = true; }else { flag = false; } } } }
追記修正した「JumpScript.cs」のポイントは以下の通りだ。
名前空間の読み込み
ユーザーモードの汎用入出力(GPIO)ピンを使うための型を含むWindows.Devices.Gpio名前空間を読み込む。
メンバー変数の宣言
ブール型メンバー変数flag、Animatorクラス型のメンバー変数animを宣言する。
赤いジャンパーワイヤーの1つは、SODIMM_79(GPIO)につないであるので、メンバー定数LED_PINを宣言して「79」の値で初期化する(Raspberry Pi 3の場合は「6」となる)。
タクトスイッチは、もう1本の赤色のジャンパーワイヤーを経由してSODIMM_97(GPIO)とつながっているので、BUTTON_PINを「97」で初期化しておく(Raspberry Pi 3の場合は「5」となる)。
GpioPinクラスのメンバー変数pinとbuttonPin、汎用入出力「GPIO」ピンの可能な値を表す列挙体メンバー変数となるGpioPiValue型のpinValueを宣言する。
Start()メソッドの処理
Animatorコンポーネントを作成して、メンバー変数animで参照しておく。また、GPIOピンを初期化するInitGPIO()メソッドを実行する。
Update()メソッドの処理
ブール型メンバー変数の値がtrueならばジャンプする、そうでなければジャンプしないとするコードを記入する。このUpdate()メソッドは常に呼び出されており、タクトスイッチを押すアクションでflag変数の値を変化させている。
InitGPIO()メソッドの処理
GPIOControllerクラスを使ってGPIOを取得し、OpenPinメソッドでLEDのGPIOを開く。Toradexでは「79」ピンになる。また、タクトスイッチのGPIOも開く、この場合は「97」になる。
最初にHIGH値を書き込むことで、オフ状態時にLEDを初期化するようにする。続いて、入力プルアップ抵抗がサポートされているかどうかを確認する。
ボタンを押したときのスイッチバウンスノイズを除去するために、デバウンスタイムアウトを設定。ボタンピンに、ValueChangedでbuttonPin_ValueChangedイベントに登録する。これが、ボタンが押されたときに呼び出される。
buttonValue_Changedメソッド()の処理
buttonValue_Changedは、タクトスイッチを押すたびに呼び出されるメソッドとなる。GPIOがHIGH→LOWに変化する処理を行い、HIGH(電流が流れる場合)のときに、メンバー変数flagをtrueで初期化し、それ以外の場合はfalseで初期化する。
この処理によって、タクトスイッチを押す動作で、LEDが点灯し、キャラクターがジャンプをする動きを制御できるようになる。タクトスイッチをオフにすると、LEDが消える処理とともに、キャラクターがジャンプする処理も停止する。
Copyright © ITmedia, Inc. All Rights Reserved.
関連記事
「Raspberry Pi 3」で早速チェック──「IoTハードウェア」を準備する
ITエンジニアに向け、「ビジネスに貢献するIoT活用」の第一歩を踏み出す「今後のひらめき」を得てもらうための本連載。初回は、登場間もない「Raspberry Pi 3」を中心に、IoTハードウェアとWindows 10 IoT Coreを準備するまでを解説する。「Raspberry Pi 3」が登場。Windows 10 IoT Coreは早速サポートを表明
無線通信モジュール付きのRaspberry Pi 3が登場。搭載チップの性能も向上している。マイクロソフトは発売当日にWindows 10 IoT Coreでのサポートを表明している。第1回 Windows IoTを始めよう
見聞きしない日はないほど流行している「IoT」。でも、どうやったら使えるのか? 本連載では読者諸氏が慣れ親しんだWindowsのIoT版を使って、IoTを実践してみる。まずは概要とインストールから始めよう。