2016年

3月

11日

GR-PEACH オンボードLEDのボタン動作2 [InterruptPort]

このページは、下記の参考ページを元に掲載しています。ご了承願います。

 

GR-PEACH (Visual Studio 2015 C#) のオンボードLEDのボタン動作2 [InterruptPort]検証をしています。

Visual Studio 2015を起動

新規作成 --> プロジェクトを選択 --> Visual C# --> Micro Framework 
”Console Application”を選択 --> OK選択

コンパイルするには、Microsoft.SPOT.Hardware の参照を追加する必要があります。

[参照]を右クリックし参照の[追加(R)...]を選択クリック

Microsoft.SPOT.Hardwareを選択追加

■ InterruptPort

InterruptPort はデバイスのデータを入力するためのポートです。

と言うと、「InputPort との違いは何?」という疑問がわくと思います。
InterruptPort の特徴は、入力値の H / L が切り替わったタイミングでイベントを発行してくれる点です。
コンストラクターの引数によって、H→L、L→H、またはその両方でイベントを投げてくれるように指定できます。
InputPort は定期的にセンサーデータを読み出したい場合に使用し、InterruptPort は必要なデータが得られるタイミングが不定期な場合に使用するといいと思います。

例えば、定期的に室温を測定したい場合は InputPort を使い、周囲の温度が何度以上になったら何かアクションが必要な場合は InterruptPort を使うなどの使い分けです。
前回、ボタンのオンオフを InputPort を使って紹介しましたが、ボタンについては実は今回の InterruptPort のほうが適することが多いです。

■ InterruptPort の使い方

InterruptPort は次のように使います。

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

第3引数までは InputPort と同じですね。そう言えば、前回は説明を省略したのですが、GR-PEACH ではプルアップ抵抗が実装されています(このあたりは回路図を見て確認する部分です)。よって、第3引数には “Port.ResistorMode.PullUp” を指定してもいいです。

イベントの方向ですが、HからLに変わる時か、LからHに変わる時か、または両方かを指定します。

イベント発行のタイミング
InterruptEdgeBoth  信号の立ち上がり/立ち下がりの両方
InterruptEdgeHigh 信号の立ち上がり時
InterruptEdgeLow 信号の立ち下がり時
InterruptEdgeLevelHigh 信号が High の時
InterruptEdgeLevelLow 信号が Low の時
InterruptNone イベントを受け取らない

InterruptEdgeHigh / Low では、信号の変化のタイミングでイベントが発行されます。
それに対して、InterruptEdgeHighLevel / LowLevel では信号の値によってイベントが発行されます。これらのイベント受信後には ClearInterrupt メソッドを呼んでください。

■ InputPort のコード例 ~ GR-PEACH / GR-SAKURA のボタン操作 ~
ボタンを押すとユーザー LED が点灯します。
GR-SAKURA ではコメントを参考に一部書き換えてください。

 

なお一つ注意として、GR-PEACH では OnInterrupt イベントハンドラでは、ボタンが押されていれば data2 が 0 、離されていれば data2 が 1 になります。

Visual Studio 2015 C# のソース記述

GRPeachInputPort

 

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

namespace GRPeachInterruptPor
{
    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

        private static OutputPort _led;

        public static void Main()
        {
            //Debug.Print(Resources.GetString(Resources.StringResources.String1));

            var button = new InterruptPort(
                ButtonPin, true, 
                Port.ResistorMode.Disabled, 
                Port.InterruptMode.InterruptEdgeBoth);
            button.OnInterrupt += button_OnInterrupt;

            _led = new OutputPort(UserPin, false);

            (new Thread(() =>
            {
                Thread.Sleep(Timeout.Infinite);
            })).Start();
        }

        static void button_OnInterrupt(uint data1, uint data2, DateTime time)
        {
            var isPressed = data2 == 0;
            _led.Write(isPressed);
        }
    }
}

後は Visual Studio から実行するだけですが、デフォルトの設定だとエミュレータが起動するようになっているので、プロジェクトのプロパティから GR-PEACH を使うように変更しておきます。

正常に GR-PEACH が認識されている場合、USB を選択すると GR-PEACH に切り替わるはずです。

 

目 次