「タクトスイッチでキャラクターの動きを制御する」UWPアプリを作るラズパイ3&Toradex、Windows 10 IoT Coreで楽しみながら検証するIoT実践入門(終)(3/4 ページ)

» 2016年09月08日 05時00分 公開
[薬師寺国安PROJECT KySS]

書き出したUnity 5.3のプロジェクトをVS2015で開き、コードの修正を行う

 VS2015のソリューションエクスプローラーの「参照」で右クリック→「参照の追加」を選択する。表示される、参照マネージャーから、「Universal Windows」→「拡張」を選択して表示されるSDKリストから、「Windows IoT Extension for the UWP 10.0.10240.0」にチェックを入れる(図2)。選んだAPIがソリューションエクスプローラーの「参照」内に追加される。

photo 図2 「Windows IoT Extension for the UWP 10.0.10240.0」にチェックを入れる

コードを修正する

 ソリューションエクスプローラーから「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;
            }
          
       }
   } 
}
リスト2 追記修正したToradex用「JumpScript.cs」の中身

 追記修正した「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クラスのメンバー変数pinbuttonPin、汎用入出力「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.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。