NETMF : InputPortの使い方とGR-PEACH / GR-SAKURAでのボタン操作のコード例

.NET Micro Framework の入出力ポートの紹介、第2回。
今回は InputPort がテーマ、GPIO の使い方の2回目です。


InputPort

InputPort はセンサーなどのデバイスのデータを入力するためのポートです。ボタンも入力デバイスの一つです。

InputPort は以下のように宣言します。

var button = new InputPort(<ポート番号>, <グリッチフィルターの設定>, <プルアップ/ダウン抵抗>);

第一引数でどのポートを InputPort として使用するかを指定します。
グリッチフィルターとは、ボタンオン/オフなどの際に、入力値が一時的にパタパタと切り替わるのを防ぐフィルターのこと。true を指定するとグリッチフィルターが有効になります。
プルアップ/ダウン抵抗は、デバイスによって指定が異なります。Port.ResistorMode.Disabled を指定すると、プルアップ抵抗もプルダウン抵抗も使用しないことを意味します。

InputPort は Read メソッドを持っています。
文字通り、ポートの信号を読み出すメソッドです。メソッドを呼びだした時に同期的に信号を読み出すものなので、繰り返しポートの信号を読みたい時にはポーリングする必要があります。

GR-PEACH のボタン

GR-PEACH ではボタンは 0x60 番ポートに接続されています。

組込みに慣れていない方、普段は業務アプリ開発をしている方には直感的に分かりづらい点としては、Read メソッドで取得できる値は負論理である点です。つまりボタンが押されていれば false、離されていれば true が返されます。

GR-SAKURA のボタン

GR-SAKURA ではボタンは 0x57 番ポートに接続されています。


InputPort のコード例 ~ GR-PEACH / GR-SAKURA のボタン操作 ~

本稿の最後に、InputPort のコード例として GR-PEACH のボタン操作のコードを載せます。ボタンを押すとユーザー LED が点灯します。
OutputPort の時と同様、Microsoft.SPOT.Hardware の参照を追加する必要があります。
GR-SAKURA ではコメントを参考に一部書き換えてください。

using System.Threading;
using Microsoft.SPOT.Hardware;

namespace PeachInputPortDemo
{
    public class Program
    {
        // GR-PEACH
        private const Cpu.Pin ButtonPin = (Cpu.Pin)0x60;    // ボタン
        private const Cpu.Pin UserPin = (Cpu.Pin)0x6c;      // ユーザーLED

        // GR-SAKURA
        //private const Cpu.Pin ButtonPin = (Cpu.Pin)0x57;    // ボタン
        //private const Cpu.Pin UserPin = (Cpu.Pin)0x56;      // LED4

        public static void Main()
        {
            var button = new InputPort(ButtonPin, true, Port.ResistorMode.Disabled);
            var led = new OutputPort(UserPin, false);

            (new Thread(() =>
            {
                while (true)
                {
                    var isPressed = !button.Read();

                    led.Write(isPressed);
                    Thread.Sleep(100);
                }
            })).Start();
        }
    }
}