汎用 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 の間の直接接続を示しています。
ヒント
この図は説明のためにブレッドボードと GPIO ブレークアウトを示していますが、Raspberry Pi のジャンパー ワイヤーでグラウンド ピンとピン 21 を接続するだけで自由に使用できます。
必要に応じて、次のピン配列図を参照してください。
アプリを作成する
好みの開発環境で次の手順を実行します。
.NET CLI または Visual Studio を使用して、新しい .NET コンソール アプリを作成します。 InputTutorial という名前を付けます。
dotnet new console -o InputTutorial cd InputTutorial
System.Device.Gpio パッケージをプロジェクトに追加します。 プロジェクト ディレクトリまたは Visual Studio から .NET CLI を使用します。
dotnet add package System.Device.Gpio --version 3.2.0-*
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.High
とPinValue.Low
のピンの状態に対応します。- コールバック関数は、
OnPinEvent()
と呼ばれるメソッドを指します。OnPinEvent()
は、対応するAlert
またはReady
文字列も書き込む別の三項式を使用します。 - メイン スレッドは、ピン イベントの待機中に無期限にスリープ状態になります。
- using 宣言では、
アプリをビルドします。 .NET CLI を使用している場合は、
dotnet build
を実行します。 Visual Studio でビルドするには、Ctrl+Shift+Bキーを押します。自己完結型アプリとして SBC にアプリをデプロイします。 手順については、「 Raspberry Pi への .NET アプリのデプロイ」を参照してください。
chmod +x
を使用して実行可能ファイルに実行アクセス許可を付与してください。Raspberry Pi でアプリを実行するには、デプロイ ディレクトリに切り替えて実行可能ファイルを実行します。
./InputTutorial
コンソールには、次のようなテキストが表示されます。
Initial status (05/10/2022 15:59:25): READY ✅
ピン 21 を地面から取り外します。 コンソールには、次のようなテキストが表示されます。
(05/10/2022 15:59:59) ALERT 🚨
ピン 21 とグラウンドを再接続します。 コンソールには、次のようなテキストが表示されます。
(05/10/2022 16:00:25) READY ✅
Ctrl+C キーを押してプログラムを終了します。
おめでとうございます! System.Device.Gpio
NuGet パッケージを用いて GPIO で入力を検出しました。 この種類の入力には多くの用途があります。 この例は、スイッチが回線を接続または切断する任意のシナリオで使用できます。 開いているドアや窓を検出するためによく使用される磁気リードスイッチでそれを使用する例を次に示します。
レーザートリップワイヤー
前の例の概念をさらに拡張して、レーザートリップワイヤーの作成にどのように適用できるかを見てみましょう。 レーザートリップワイヤーを構築するには、次の追加コンポーネントが必要です。
- 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 に損傷を与える可能性があります。
ソース コードを入手する
このチュートリアルのソースは GitHub で入手できます。
次のステップ
.NET