ついに、ラズパイに手を出してしまった・・・
ちょっと、マシンルームの温度計測やメールによるアラート機能を付けたくて、とりあえず、ラズパイ(3B+)と入門キットを購入。
電子回路なんて、高校の時にイジって以来だから、全然分からないけど、とりあえず、入門書とか読みながら、簡単な回路を作ってお試し中。
入門キットのサンプルは、CやPythonなんかで書かれているけど、やはり、ここはC#で書きたいよね。
で、ラズパイに.net 5を導入。ラズパイ3B+はARM64なんだけど、デフォルトで入っている、OSは32bit(メモリ1Gだからまぁ妥当だろう)のDebianベースのOSだが、デフォルトではapt listで調べるも、dotnet-sdkは見つからない。何かしらの方法はあるのだろうが、パッケージマネージャーからインストールするのは諦めて、.net 5ダウンロードサイトからのarm32版のtar.gzを落としてきて、展開。(どうせ、複数人数で使うわけじゃないから問題無し)
で、簡単な回路を作成してみる。
とりあえず、赤枠で囲んだ部分が最初に作った回路。簡単に書くと以下のような回路になっている。
青いケーブルが+3.3Vに刺さっていて、赤いケーブルはラズパイ上のGPIO0に刺さっている。GPIO0の後の()に17と書かれているのはBCMと呼ばれる番号で、Microsoft製のライブラリはこちらの番号を指定する必要がある。以下はgpioコマンドの出力で、いくつかの名前やピン番号が表示されている。ライブラリによって、使用するピン番号が違うので、注意されたい。
なんで複数の呼び方があるのかとか言うのは、ラズパイ入門編のサイトとかに必ず書いてあるので、そちらを参照して欲しい。
で、今回この回路でやりたいのは、LEDの点灯・消灯である。回路を見ると、GPIO0(BCMピン番号17)が邪魔をする形になっているので、LEDを点灯させたければ、GPIO0(BCMピン番号17)の電位を落とす必要がある。逆に消灯させたい場合は電位を上げれば良い。
ということで、以下のようなコードでプログラムからLEDのオン・オフが実現できる。
(プロジェクトに↓のパッケージ追加が必要)
- System.Device.Gpio
- Iot.Device.Bindings
プログラムは単純にConsoleアプリで作ってみた。
using System;
using System.Threading;
// GPIOライブラリ
using System.Device.Gpio;
namespace oneLedCtrl
{
class Program
{
static void Main(string[] args)
{
const int pinno = 17; // BCM Pin No
// GPIOコントローラインスタンス作成
var ctrl = new GpioController();
// Pinのオープン(書き込みモード)
ctrl.OpenPin(pinno,PinMode.Output);
PinValue val = PinValue.High;
// 1秒ごとに点滅を繰り返す
for(;!Console.KeyAvailable;) {
if (val == PinValue.High) {
val = PinValue.Low; // 点灯
} else {
val = PinValue.High; // 消灯
}
// GPIO0(BCM 17)に書き込み
ctrl.Write(pinno,val);
Thread.Sleep(1000);
}
ctrl.ClosePin(pinno);
}
}
}
これくらいの回路なら、簡単だからいいんだけど、複雑なのは配線も面倒だよね。
業務で使うのなら、やっぱり、回路が組んである製品を購入すべきなんだろうね。
まぁ、とりあえずは、入門キットで色々と遊んでみるつもり。
Iot.Device.Bindingsパッケージに有名どころのDevice(チップ)がクラスとして、ラッピングされている。
これを使うと、回路さえ作れてしまえば、面倒なプロトコルを知らなくても、Deviceのコントロールや値取得が簡単にできる。
例えば、温湿度センサーのDHT11とかはC等を使用した場合、周期的にビットを読み込んで、計算しないといけないのだが、Dht11クラスを使用した場合、プロパティ値として、温度,湿度を取得することが可能。