RaspberryPiのWindows 10 IoT CoreでGPIOを触ってみる

RaspberryPiのWindows 10 IoT CoreでGPIOを触ってみる

仕事が忙しがしく、ほとんど休みも微妙だったのですがやっと時間が取れるようになってきたので、久々にWindows10IotCoreを触ってみました。

今後はRaspianだけでなくWindows 10 IoT Coreも触っていくことにしていきます。(そんなにPythonやnode.jsがとくいというわけでもないので)

インストールに関しては、いろいろなブログもあるけど公式の情報だけでもそこそこわかりやすいと思います。 デフォルトのパスワードが引っかかるところなので、そこだけp@ssw0rdと覚えておけばいいかと。

ということで、インストールの手順は省きます。

なにはなくともLチカだろ

避けて通ることのできないLチカです。実際のコードとなるとVisual Studioの一択だと思いますので、これもインストールは省きます。個人的には全部入れるようにしています。

プロジェクトの初期設定

まずはVisual Studioを起動して新しいプロジェクトを作成します。以下のような画面になるので

f:id:ueponx:20160731113720j:plain

テンプレートの中から【C#】->【ユニバーサル】から「空白のアプリ(ユニバーサルWindows)」を選択します。 プロジェクト名は任意のものをつけて【OK】を押します。

f:id:ueponx:20160731113725j:plain

最小ターゲットの確認ダイアログが表示されますがそのまま【OK】を押して問題ないです。 すると以下のようにプロジェクトが作成されます。

f:id:ueponx:20160731113730j:plain

通常のUWPの開発であればそのままでいいのですが、IoTCoreの場合には一手間が必要になります。

f:id:ueponx:20160731113737j:plain

メニューから【参照マネージャー】を選択して左の【Universal Windows】->【拡張】を選択し右上にある検索ボックスに"iot"を入力します。すると、【Windows IoT Extensions for the UWP】が表示されるので、少し前に表示されたターゲットバージョンに合うものを選択します(チェックを入れる)。(今回は10.0 10586を選択します)

f:id:ueponx:20160731113741j:plain

確認できたら【OK】を押します。OKを押すとソリューションエクスプローラでプロジェクトが以下のようになっているでしょうか。(参照の中にWindows IoT Extensions...が入っていれば問題ありません)

f:id:ueponx:20160731113756j:plain

実際にコーディングするのはこの中のMainPage.xaml.csになります。がその前にターゲットをRaspberryPiに変更しておきます。画面の上部のメニューバーに以下のような部分があると思います。このままではWindows10のPC用のデスクトップをターゲットにしていることになっていますので

f:id:ueponx:20160731113759j:plain

x86】から【ARM】に変更します。続いてデバイスと表示されている部分のプルダウンを選択し、

【変更前】 f:id:ueponx:20160731113803j:plain

【変更後】 f:id:ueponx:20160731113806j:plain

リモートコンピュータを選択します。

f:id:ueponx:20160731113810j:plain

すると以下のようなダイアログが表示されます。

f:id:ueponx:20160731113831j:plain

既にRaspberryPiが起動している場合には【自動検出】でWindows 10 IoT Coreがインストールされたデバイスが見えているかと思います。 IPアドレスを確認して問題がない場合にはその部分をクリックします。

画面の表示が詳細表示になります。

f:id:ueponx:20160731113852j:plain

問題がなければ【選択】をクリックすると事前の設定は完了となります。

Lチカのためのコーディング

プロジェクトの設定が終わったので以降はコーディングとなります。MainPage.xaml.csを以下のコードに書き換えます。(不要なusingを削除しているので結構小さくなります。)

using Windows.UI.Xaml.Controls;

using Windows.Devices.Gpio;
using System.Threading.Tasks;

namespace App
{
    public sealed partial class MainPage : Page
    {
        private const int LED_PIN = 4;
        private GpioPin pin;

        public MainPage()
        {
            this.InitializeComponent();

            setupGPIO();
            loop();
        }

        private void setupGPIO()
        {
            var gpio = GpioController.GetDefault();

            if(gpio == null)
            {
                pin = null;
                return;
            }
            pin = gpio.OpenPin(LED_PIN);
            pin.Write(GpioPinValue.High);
            pin.SetDriveMode(GpioPinDriveMode.Output);
        }

        private async void loop()
        {
            while (true)
            {
                pin.Write(GpioPinValue.Low);
                await Task.Delay(1000);
                pin.Write(GpioPinValue.High);
                await Task.Delay(1000);
            }
        }
    }
}

一応これでGPIO4Pinに接続したLEDの点滅を行うことができます。

部分的に説明をすると、

using Windows.Devices.Gpio;
using System.Threading.Tasks;

Windows.Devices.GpioをusingすることでGPIO関係のクラスの名前空間を使用できるようになります。 System.Threading.Tasksは中にある処理でスリープ(Delay)を行うために入れていますが、この部分はかなり自信がないので、もっとほかの処理に変えたほうがいいのかもしれません。(UWPではDelay処理を推奨していないので)

        private void setupGPIO()
        {
            var gpio = GpioController.GetDefault();

            if(gpio == null)
            {
                pin = null;
                return;
            }
            pin = gpio.OpenPin(LED_PIN);
            pin.Write(GpioPinValue.High);
            pin.SetDriveMode(GpioPinDriveMode.Output);
        }

上記がGPIOの初期設定を行う部分になります。 GPIOのLED_PINで指定されるPinを初期値をHI(ON)にしてアウトプットモード(出力設定)にしています。

        private async void loop()
        {
            while (true)
            {
                pin.Write(GpioPinValue.Low);
                await Task.Delay(1000);
                pin.Write(GpioPinValue.High);
                await Task.Delay(1000);
            }
        }

上記の部分が定期的に点滅させる処理になります。今回はArduinoを少し意識してループを作成したため、Task.Delayで間隔設定してみましたが、本来であればタイマー(DispatcherTimer)を使うべきだと思います。

これでLチカができました。


Windows10 IoT CoreでLチカ

まとめ

初期の設定はありますが、比較的カンタンにLチカまでは行けたかなと思います。

LチカするだけではRaspbianでもいいのですが、Visual Studioによる便利な機能(インテリセンスやデバッガ機能)、UIなどを作成することもできるのでそういう部分ではWindows 10 IoT Coreはおすすめできるのかもしれません。 ただ、まだドライバー関連では今ひとつの部分もあるので新しいデバイスを使おうと考えるなら、時期尚早なのかもしれません。

/* -----codeの行番号----- */