対象読者
IoTに興味があり、C#とRaspberry Pi(Linux環境)の基本的な知識がある方を対象とします。Linuxや電子工作の初歩的な説明は割愛しているので、「ラズベリーパイをつかったセンサープログラミング超入門」の記事なども併せて参照してください。
はじめに
前回で、WindowsとRaspberry Pi環境の準備が整ったので、今回は、C#によるGPIOの基本操作を解説します。
GPIO
Raspberry PiでLEDなどの電子部品を操作するには、GPIO(General Purpose Input/Output)の制御が必須です。
GPIOの制御は、ハードウェア的には、SoC(System on Chip、CPUと周辺パーツを集積したもの)のレジスタを操作することなのですが、Raspberry Pi(Raspbean OS)では、直接レジスタを操作するだけではなく、Linuxの仮想ファイルシステムを用いて制御することもできます。仮想ファイルシステムとは、さまざまなデバイスに、あたかも通常のファイルであるかのようにアクセスできる仕組みのことです。
仮想ファイルであれば、プログラムからは通常のファイルとして扱えるため、どのプログラミング言語でもGPIOの操作は可能です。ただし、仮想ファイルを操作してGPIOを制御するのは少し面倒で、GPIOの設定にも制限があります。そのため、プログラムからGPIOを制御するには、GPIO制御に特化したツールやライブラリを用いるほうが手軽です。
gpioコマンド
Raspberry Pi(Raspbean OS)では、WiringPiというGPIOの制御を行うC言語のライブラリが、デフォルトでインストールされています。WiringPiには、コマンドラインから使えるgpioコマンドが含まれています。例えば、GPIOの状態を確認するには、次のように指定します。
$ gpio readall
GPIOの番号と、ピンの状態(IN、OUTなど)が一覧で表示されます。またgpioコマンドでは、状態の参照だけではなく、特定のピンの制御ができるので、シェルスクリプトからGPIOを操作することも可能です。
C#によるGPIO制御
.Net Core環境のC#を用いてGPIOを制御するには、次の方法があります。
- 仮想ファイルシステムを利用する
- WiringPiなどのライブラリ(.Net用以外)を利用する
- .Net用のライブラリを利用する
仮想ファイルシステム
まず今回は、仮想ファイルシステムを利用してみましょう。仮想ファイルシステムによる操作の流れは、次のようになります。
- 使用するGPIOピンの初期設定
- GPIOピンの出力、入力の設定
- GPIOの制御
- GPIOピンの終了処理
1.使用するGPIOピンの初期設定
仮想ファイルを用いてGPIOを利用するには、使用するGPIOピンの初期設定が必要です。最初に、仮想ファイルの/sys/class/gpio/exportに、使用したいGPIOピンの番号を書き込みます。すると、/sys/class/gpio/ディレクトリに、GPIOピンを制御するための仮想ファイルが作成されます。例えばGPIO4なら、/sys/class/gpio/gpio4となります。この作成されたファイルを使って、GPIOを制御します。
2.GPIOピンの出力、入力の設定
指定したGPIOピンを入力で使うか出力で使うかの指定を行います。これは、仮想ファイルの/sys/class/gpio/gpio番号/directionに、"in"または"out"の文字列を書き込むことで設定します。
3.GPIOの制御
GPIOピンの制御は、仮想ファイルの/sys/class/gpio/gpio番号/valueを用います。ピンが出力であれば、このファイルに、"0"または"1"を書き込むことで、OFF、ONを設定できます。入力であれば、このファイルを読み出すことで、ピンの状態を0または1の値として確認できます。
4.GPIOピンの終了処理
GPIOピンの使用後は、仮想ファイルの/sys/class/gpio/unexportに、使用したGPIOの番号を書き込みます。すると、/sys/class/gpio/ディレクトリに作成された仮想ファイルが削除されます。