次の方法で共有


バイナリ入力に GPIO を使用する

汎用 I/O (GPIO) ピンは、電気信号を入力として受信するように構成できます。 最も基本的なレベルでは、これは回線の開閉を検出するシナリオに役立ちます。 このような回路には、プッシュ ボタン、トグル スイッチ、リード スイッチ、圧力スイッチ、および回路を完了することによってバイナリ (オン/オフ) 値を表すその他のデバイスが含まれる場合があります。

このチュートリアルでは、.NET と Raspberry Pi の GPIO ピンを使用して、回線の開閉を検出します。

前提条件

  • ARM ベース (ARMv7 以上) シングルボード コンピューター (SBC)
  • ジャンパーワイヤー
  • ブレッドボード (省略可能)
  • Raspberry Pi GPIO ブレークアウト ボード (省略可能)
  • .NET SDK 8 以降

このチュートリアルは、ターゲット デバイスが Raspberry Pi であることを前提として記述されています。 ただし、このチュートリアルは、オレンジ Pi、ODROID など、.NET をサポートする Linux ベースの SBC に使用できます。

デバイスで SSH が有効になっていることを確認します。 Raspberry Pi については、 Raspberry Pi ドキュメントの SSH サーバーの設定 を参照してください

ハードウェアを準備する

次の図に示すように、ハードウェア コンポーネントを使用して回線を構築します。

グラウンドピンをピン21に接続する回路を示す図。

上の図は、グラウンド ピンとピン 21 の間の直接接続を示しています。

ヒント

この図は説明のためにブレッドボードと GPIO ブレークアウトを示していますが、Raspberry Pi のジャンパー ワイヤーでグラウンド ピンとピン 21 を接続するだけで自由に使用できます。

必要に応じて、次のピン配列図を参照してください。

Raspberry Pi GPIO ヘッダーのピン配置を示す図。画像提供:Raspberry Pi Foundation。
画像提供:Raspberry Pi Foundation

アプリを作成する

好みの開発環境で次の手順を実行します。

  1. .NET CLI または Visual Studio を使用して、新しい .NET コンソール アプリを作成します。 InputTutorial という名前を付けます。

    dotnet new console -o InputTutorial
    cd InputTutorial
    
  2. System.Device.Gpio パッケージをプロジェクトに追加します。 プロジェクト ディレクトリまたは Visual Studio から .NET CLI を使用します。

    dotnet add package System.Device.Gpio --version 3.2.0-*
    
  3. Program.cs の内容を次のコードで置き換えます。

    using System.Device.Gpio;
    using System.Threading.Tasks;
    
    const int Pin = 21;
    const string Alert = "ALERT 🚨";
    const string Ready = "READY ✅";
    
    using var controller = new GpioController();
    controller.OpenPin(Pin, PinMode.InputPullUp);
    
    Console.WriteLine(
        $"Initial status ({DateTime.Now}): {(controller.Read(Pin) == PinValue.High ? Alert : Ready)}");
    
    controller.RegisterCallbackForPinValueChangedEvent(
        Pin,
        PinEventTypes.Falling | PinEventTypes.Rising,
        OnPinEvent);
    
    await Task.Delay(Timeout.Infinite);
    
    static void OnPinEvent(object sender, PinValueChangedEventArgs args)
    {     
        Console.WriteLine(
            $"({DateTime.Now}) {(args.ChangeType is PinEventTypes.Rising ? Alert : Ready)}");
    }
    

    前のコードでは、次のようになります。

    • using 宣言では、GpioControllerのインスタンスが作成されます。 using宣言により、オブジェクトが破棄され、ハードウェア リソースが適切に解放されます。
      • GpioController はパラメーターなしでインスタンス化され、実行されているハードウェア プラットフォームを検出し、 論理ピン番号スキームを使用する必要があることを示します。
    • GPIO ピン 21 は、 PinMode.InputPullUpで開かれます。
      • これにより、 プルアップ 抵抗がかみ合った状態でピンが開きます。 このモードでは、ピンがグラウンドに接続されると、 PinValue.Lowが返されます。 ピンがグラウンドから切断され、回路が開いていると、ピンから PinValue.High が返されます。
    • 初期状態は、三項式を使用してコンソールに書き込まれます。 ピンの現在の状態は、 Read()で読み取られます。 PinValue.Highの場合は、Alert文字列をコンソールに書き込みます。 それ以外の場合は、 Ready 文字列を書き込みます。
    • RegisterCallbackForPinValueChangedEvent() は、ピンの PinEventTypes.Rising イベントと PinEventTypes.Falling イベントの両方のコールバック関数を登録します。 これらのイベントは、それぞれ PinValue.HighPinValue.Lowのピンの状態に対応します。
    • コールバック関数は、 OnPinEvent()と呼ばれるメソッドを指します。 OnPinEvent() は、対応する Alert または Ready 文字列も書き込む別の三項式を使用します。
    • メイン スレッドは、ピン イベントの待機中に無期限にスリープ状態になります。
  4. アプリをビルドします。 .NET CLI を使用している場合は、 dotnet buildを実行します。 Visual Studio でビルドするには、Ctrl+Shift+Bキーを押します。

  5. 自己完結型アプリとして SBC にアプリをデプロイします。 手順については、「 Raspberry Pi への .NET アプリのデプロイ」を参照してください。 chmod +xを使用して実行可能ファイルに実行アクセス許可を付与してください。

  6. Raspberry Pi でアプリを実行するには、デプロイ ディレクトリに切り替えて実行可能ファイルを実行します。

    ./InputTutorial
    

    コンソールには、次のようなテキストが表示されます。

    Initial status (05/10/2022 15:59:25): READY ✅
    
  7. ピン 21 を地面から取り外します。 コンソールには、次のようなテキストが表示されます。

    (05/10/2022 15:59:59) ALERT 🚨
    
  8. ピン 21 とグラウンドを再接続します。 コンソールには、次のようなテキストが表示されます。

    (05/10/2022 16:00:25) READY ✅
    
  9. Ctrl+C キーを押してプログラムを終了します

おめでとうございます! System.Device.Gpio NuGet パッケージを用いて GPIO で入力を検出しました。 この種類の入力には多くの用途があります。 この例は、スイッチが回線を接続または切断する任意のシナリオで使用できます。 開いているドアや窓を検出するためによく使用される磁気リードスイッチでそれを使用する例を次に示します。

磁気リードスイッチの開閉を示すアニメーション GIF。スイッチが磁石に公開され、アプリに READY と表示されます。磁石が取り外され、アプリにアラートが表示されます。その後、アクションが繰り返されます。

レーザートリップワイヤー

前の例の概念をさらに拡張して、レーザートリップワイヤーの作成にどのように適用できるかを見てみましょう。 レーザートリップワイヤーを構築するには、次の追加コンポーネントが必要です。

  • KY-008レーザー送信機モジュール
  • レーザー受信機センサーモジュール (下記の注を参照)
  • 2個の10K Ω抵抗

レーザー受信機センサモジュール は、多くのインターネット小売業者で見られる共通モジュールに適用される汎用名です。 デバイスの名前や製造元が異なる場合がありますが、このイメージのようになります。

レーザー受信センサモジュールの画像

レーザートリップワイヤーハードウェアを接続する

次の図で詳しく説明するように、コンポーネントを接続します。

レーザー受信センサー モジュールから入力を取得する回路を示す図。

10K Ω抵抗に細心の注意を払います。 これらは 分圧器を実装します。 これは、レーザ受信モジュールが5Vを出力してビームが破損したことを示しているためです。 Raspberry Pi では、GPIO 入力に対して最大 3.3V のみがサポートされます。 完全な5Vをピンに送信すると Raspberry Pi が破損する可能性があるため、レシーバモジュールからの電流は分圧器を通過して電圧を2.5Vに半分にします。

ソース コードの更新プログラムを適用する

前と ほとんど 同じコードを使用できますが、1 つの例外があります。 他の例では、ピンがグラウンドから切断され、回路が開いているときにピンが PinValue.High を返すように PinMode.InputPullUp を使用しました。

ただし、レーザー受信機モジュールの場合、オープン回路は検出されません。 代わりに、ピンがレーザー受信モジュールからの電流のシンクとして機能するようにします。 この場合は、 PinMode.InputPullDownでピンを開きます。 これにより、ピンは電流を受け取らないときに PinValue.Low を返し、レーザーレシーバモジュールから電流を受け取ると PinValue.High します。

controller.OpenPin(pin, PinMode.InputPullDown);

重要

レーザートリップワイヤーをテストする前に、Raspberry Pi にデプロイされたコードにこの変更が含まれていることを確認してください。 プログラムはそれなしで動作 します が、間違った入力モードを使用すると、Raspberry Pi に損傷を与える可能性があります。

レーザートリップワイヤーのデモンストレーションを示すアニメーション GIF。レーザーエミッターはレーザーセンサーモジュールを点灯させ、アプリは READY を表示します。レーザー ビームが切断され、アプリに ALERT が表示されます。その後、アクションが繰り返されます。

ソース コードを入手する

このチュートリアルのソースは GitHub で入手できます

次のステップ