1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

C#でIoTプログラミング on RaspberryPi #2

Posted at

C#でIoTプログラミング

前回は初めてのプログラミングということで環境構築とLチカまでを紹介しました。
今回はGPIOへの入力処理を説明します。具体的にはGPIOにスイッチを接続してオンオフの状態を調べるプログラムになります。

今回使用するハードウェア

・RaspberryPi4BもしくはRaspberryPi5
・Grove Button or Grove LED Buttonなど
・GROVE - 4ピン-ジャンパーメスケーブル

今回使用するソフトウェア

・Raspberry Pi OS 64-bit bookworm(2024/03/15)
・.NET SDK 8.0.302

前回と同じです。

ハードウェアの準備

RapberryPiとButtonを次のように配線します。

RPi   Grove Button
5V---------VCC(赤)
GND--------GND(黒)
18Pin------SIG(黄)

必要な配線は3本になります。

プロジェクトの作成

.NETではテンプレートを利用してプログラミングを始めるのが一般的です。
今回はコンソールアプリを作成していきます。

$ dotnet new console -o button
$ cd button

dotnet new "テンプレート" -o "アプリ名" とすることでアプリのひな型が生成されます。

パッケージの追加

GPIOを制御するためにはGPIOライブラリが必要になります。
.NETでは必要なライブラリをパッケージとしてインストールします。

$ dotnet add package System.Device.Gpio

Program.csの書き換え

Program.csの内容を以下のように書き換えます。

//パッケージの読み込み
using System;
using System.Device.Gpio;
using System.Threading;


class Program
{
    private static int Pin=18;         //ボタンの状態を受け取るPin
    private static DateTime lastDebounceTime=DateTime.MinValue;     //チャタリング制御用
    private static readonly int debounceDelay=100;    //チャタリング制御用

    static void Main(string[] args)
    {
        //GPIOコントローラーのインスタンスを作成
        using var gpio=new GpioController();

        //ボタン用Pinの設定
        gpio.OpenPin(Pin,PinMode.InputPullUp);

        //ボタン用Pinのイベント設定
        gpio.RegisterCallbackForPinValueChangedEvent(
            Pin,    //対象となるPin
            PinEventTypes.Falling | PinEventTypes.Rising,    //Pinの入力値のタイプ HIGH->LOWがFalling LOW->HIGHがRising
            OnPinEvent);    //コールバックルーチン
        
        Console.WriteLine("Start. Enterキーを押すと終了します。");

        //キー入力があるまで待機
        Console.ReadLine();

        gpio.ClosePin(Pin);

    }

    //ボタンを押したときに呼ばれる
    static void OnPinEvent(object sender, PinValueChangedEventArgs args)
    {
        //チャタリングを防ぐための処理
        DateTime currentTime=DateTime.Now;
        if ((currentTime-lastDebounceTime).TotalMilliseconds > debounceDelay)
        {
            lastDebounceTime=currentTime;

            //ボタンを押したのか離したのか判定
            if (args.ChangeType==PinEventTypes.Falling)
            {
                //押した時
                Console.WriteLine("On");
            } else {
                //離した時
                Console.WriteLine("Off");
            }
        }
    }
}

ボタンを押すとイベントが発生し、コンソールに「On」と出力されます。ボタンを離すと「Off」と出力されます。
素早く押すと連続して「On」を出力することがありますが、これはスイッチから発生するノイズが原因となっておこる現象でチャタリングといいます。チャタリングによる誤動作を防ぐためにボタンを操作した直後一定時間処理を受け付けないようにしてあります。

$ dotnet run
Start. Enterキーを押すと終了します。
On
Off
On
Off
On
Off

ボタンスイッチ以外にMagneticスイッチ(磁石を利用したドアの開閉スイッチなど)、PIRセンサー(自動ドアなどで利用されている人感センサー)などは置き換えて利用できます。

以上 GPIOの入力処理プログラムでした。

次回の内容はまだ検討中・・・・

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?