連載
» 2016年08月23日 05時00分 公開

Unity 5.3のキャラクター操作と連動し、「触れたら光る“Lチカ”システム」を作るラズパイ3&Toradex、Windows 10 IoT Coreで楽しみながら検証するIoT実践入門(6)(3/4 ページ)

[薬師寺国安,PROJECT KySS]

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

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

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

コードを修正する

 ソリューションエクスプローラーから「CubeRollingScript.cs」ファイルを開く。最初はエラーを示す赤い波線が幾つか表示されるが、気にしなくてもいい。

 前述したリスト1のコードを追記修正する(リスト2)。

using UnityEngine;
using Windows.Devices.Gpio;
public class CubeRollingScript : MonoBehaviour
{
    private const int LED_PIN = 79;
    private GpioPin pin;
    private GpioPinValue pinValue;
   
    void OnControllerColliderHit(ControllerColliderHit hit)
    {
        checkItem(hit.collider.gameObject);
    }
    void checkItem(GameObject obj)
    {
        if (obj.tag == "Cube1" || obj.tag == "Cube2" || obj.tag == "Cube3" || obj.tag == "Cube4")
        {
            pinValue = GpioPinValue.High;
            pin.Write(pinValue);
            obj.GetComponent<Rigidbody>().AddForce(Vector3.forward * 50, ForceMode.Force);
        }
        else
        {
            pinValue = GpioPinValue.Low;
            pin.Write(pinValue);
        }
    }
    private void InitGPIO()
    {
        var gpio = GpioController.GetDefault();
        if (gpio == null)
        {
            pin = null;
            return;
        }
        pin = gpio.OpenPin(LED_PIN);
        pinValue = GpioPinValue.Low;
        pin.Write(pinValue);
        pin.SetDriveMode(GpioPinDriveMode.Output);
    }
}
リスト2 追記修正したToradex用「CubeRollingScript.cs」の中身

 追記修正した「CubeRollingScript.cs」のポイントは以下の通りだ。

名前空間の読み込み

 ユーザーモードの汎用入出力(GPIO)ピンを使うための型を含むWindows.Devices.Gpio名前空間を読み込む。

メンバー変数の宣言

 赤色のジャンパーワイヤを「SODIMM_79(GPIO)」につないだので、メンバー定数変数LED_PINを宣言し、Toradexでは「79」の値を記入して初期化する。一方、Raspberry Pi 3ではこの値を「25」にする。

 GpioPinクラスのメンバー変数pin、汎用入出力(GPIO)ピンの可能な値を表す列挙体メンバー変数である、GpioPiValue型のpinValueを宣言する。

Start()メソッドの処理

 GPIOピンを初期化するInitGPIO()メソッドを実行する。

checkItem()メソッドに処理を追加する

 キャラクターが「立方体に触れた」ときの処理として、GpioPinValue.Highに、高いGPIOピンの値(約5V)をメンバー変数pinValueへ格納し、WriteメソッドでGPIOに電力を出力するよう記述する。

 Toradexには、79番ピンとGND(電圧0V)の間に、LEDと抵抗を挟んでいる。電気は電圧の高いところから低いところへ流れる原則から、79番ピンに電圧をかけると、79番ピンからLEDを通ってGNDへ流れることになる。こうすることで、キャラクターが立方体に触れたら、LEDが光る仕掛けになる(※Raspberry Pi 3の場合は「25」に読み替えてほしい)。

 一方、キャラクターが立方体に触れていないときは、GpioPinValue.Low(約0V)で、低いGPIOピンの値をメンバー変数pinValueへ格納して、WriteメソッドでGPIOに電力を出力するように記述する。出力したとしても電圧は低(約0V)、つまりLEDを光らせない処理となる。

GPIOピンの初期化処理を行う

 GPIOControllerクラスを使ってGPIOを取得し、OpenPinメソッドでGPIOを開く。ここでは79ピンだ。低いGPIOピンの値(約0V)をメンバー変数pinValueへ格納し、WriteメソッドでGPIOに電圧をかける。

 続いてSetDriveModeで、そのピンを入力に使うか、出力に使うかを指定する。今回は「出力」になるのでGpioPinDriveMode.Outputと指定し、さらにGpioPinValue.Lowと指定することで、「約0V」が出力される。こうすることで、初期状態では「LEDは光らせない」処理になる。

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

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

メールマガジン登録

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