Date

Netduino Plus 2 を買ってみた。Arduino に近いが .NET Micro Framework が動作するマイコン搭載ボードだ。スギ花粉シーズンもピークに近づきつつあるので PPD42NS というホコリセンサユニットから値を読み取ってみることにした。(URL は PPD42NS なのに製品名は PPD42NJ 、検索するとひっかかるデータシートは PDF42NS と機種名が異なるので、とりあえず本記事では PPD42NS と表記する。)

回路

以下のように接続する。

Netduino Plus 2 PPD42NS
GPIO PIN 0 PIN 4 (OUTPUT(P1))
5V PIN 3 (INPUT(5VDC 90mA))
GND PIN 1 (COMMON (GND))

ここで PPD42NS に加圧する 5V は ±10% である必要がある。可能であれば Netduino2 からではなく電源から直接とったほうが良い。

コードを書く

センサのデータシート PDFを読むと、30秒間でPIN 4の電圧が低かった時間の割合で、パーティクルの量を導くとなっている。PDFのグラフから適当に回帰分析をして数式を出しておく。

PIN 4 は GPIO PIN 0 に繋いでいる。30秒間ループを回し、その間 GPIO PIN 0 を読み続けるという方法でも良いが InterruptPort クラスを使うとよりスマートにできる。このクラスを使うと GPIO PIN が Hi または Lo に変化したときに呼び出される delegate を指定できる。 Lo → Hi 間の時間の合計を変数に記憶しておき、30秒経過したら、割合を求める。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// GPIO PIN 0
static InterruptPort PPD42Signal = new InterruptPort(
    Pins.GPIO_PIN_D0,
    false,
    Port.ResistorMode.Disabled,
    Port.InterruptMode.InterruptEdgeBoth);

// あらかじめ Interrupt を有効にしておく
PPD42Signal.EnableInterrupt();
PPD42Signal.OnInterrupt += new NativeEventHandler(interrupt);

// 変化したときに呼び出される delegate
private void interrupt(uint data1, uint data2, DateTime t)
{
    Debug.Print("data1=" + data1 + " data2=" + data2 + " t.Ticks="+t.Ticks);
    if ((uint)Pins.GPIO_PIN_D0 == data1) {
        if (data2 == 0) {
            // Lo のときの処理
        }
        else if (data2 == 1) {
            // Hi のときの処理
        }
    }
}

検出したホコリの量を6段階に分け、ボード上のLEDを決まったパターンで点滅させることにする。

ソースコードを GitHub からどうぞ

実行してみる

実行するとオンボードのLEDが点滅を始める。30秒間の計測が終わるごとに、検出したホコリの量でLEDの点滅パターンが変わる。

デバッグ出力例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
data1=39 data2=1 t.Ticks=129513600409371140
data1=39 data2=0 t.Ticks=129513600411676430
data1=39 data2=1 t.Ticks=129513600411865660
data1=39 data2=0 t.Ticks=129513600411997110
data1=39 data2=1 t.Ticks=129513600412508640
data1=39 data2=0 t.Ticks=129513600421560290
data1=39 data2=1 t.Ticks=129513600422769620
data1=39 data2=0 t.Ticks=129513600423821510
data1=39 data2=1 t.Ticks=129513600423984240
(6.61040258%) concentration:12.5634012/ml

センサーには空気の流れを作るためのヒーターが搭載されているので、3 分程度は暖機運転したほうが良いと思われる。

点滅パターンに変化がないときはセンサーを軽く振ってみると良い。


Comments

comments powered by Disqus