Sousu's ARENA

[ DIYに戻る ]
Raspberry pi およびArduinoで作る花粉センサー
2021.04.30
新規作成
2022.03.14
センサーの標準動作について補足を追加した
Abstract(概要)
シャープ株式会社製のダスト・センサGP2Y1010AU0Fと 温度湿度センサーをArduinoで検知し、 Raspberry piのnode-redで制御、表示するシステムです 概要イメージ
Introduction(まえがき・序論)

さて。春といえば花粉。

やや多い」とか「非常に多い」とか、一体どのぐらいなんだろうと、 気になったことはありませんか?


花粉の観測、測定といえばといえば、 自動捕集装置を使って集めた花粉を顕微鏡で数える方法や、

空中花粉の観測方法:北海道立衛生研究所

顕微鏡で花粉の識別し、数を数える

最近では、自動測定装置を使った測定方法が広く使われ始めています。

環境省花粉観測システム(はなこさん)2022注:2022年3月31日 18時」をもって閉鎖

顕微鏡で花粉の識別し、数を数える


中でも有名な装置が、「はなこさん」でも使われている 大和製作所のKH-3000-01ではないでしょうか

株式会社大和製作所 リアルタイム花粉モニターKH-3000-01

リアルタイム花粉モニターKH-3000-0設定風景

さて、はなこさんを眺めるのも楽しいのですが、 今回はほこりセンサーを使って花粉測定装置を作って確かめちゃいましょう!


Materials and Methods(方法)
ブロック図です ブロック図(クリックで拡大) ブロック図

Raspberry pi とArduinoのインターフェイスは、115200bpsのUARTです

温湿度センサーはI2Cで、Arduinoのライブラリを使用しました。

ダストセンサー用LEDチャージ回路は、 150Ωのチャージ抵抗(標準値)を変更し、47//47//47//150(約14Ω)にしています。(後述)

システム制御の中心は、Raspberry piで行いました Node redを使用したので、プログラムらしい部分は、ほとんどありません


node redのフローです

node redのフロー(クリックで拡大)

node redのフロー

最上段は送信系です

次の段は受信系です

dashboardに表示していたグラフもあったのですが 電源を切ったら消えてしまいました。 キャプチャーしておけばよかったです。 これぞ、お手軽IoTって感じだったのになあ。


センサー部の制御です

Aruduinoのダストセンサー部分のコードはこんな感じ

while(1)
{
    if (Serial.available() > 0) // 受信したデータが存在する
    {
        digitalWrite(GP2Y10_OUT, LOW);
        interrupts();
        return u32DustCount;
    }
    
    digitalWrite(GP2Y10_OUT, HIGH);
    delayMicroseconds(260); //★要調整
    if (u8count >= 10)
    {
        u16ad = analogRead(GP2Y10_IN);
        if (u16ad > 300)
        {
            u32DustCount += 1;
        }
    }

    digitalWrite(GP2Y10_OUT, LOW);
    delayMicroseconds(500); //★要調整
    if (u8count< 10)
        u8count++;
}

Raspberry pi からUARTで呼び出されたら、 u32DustCountに入っているデータを返します。

そのあと、温湿度センサーから得られるデータをバイナリフレームに構成して ヘッダやCRCつけて、Raspberry pi に送信します。

途中、u8count >= 10とやっているのは、 スタート直後はLED電圧が定常状態になっていないので、 10回分読み捨てています。

PART NAME

メインで使用したパーツはこれ。

GP2Y1010AU0F

シャープ株式会社製のダスト・センサGP2Y1010AU0Fです。 赤外発光ダイオードの光の反射をフォトダイオードで検知するタイプです

用意する物:

センサーはamazonで購入、ほかの電子部品はほぼ秋月でそろいました。

どれも、一般的なパーツです。

外観

外観です

外観

外殻は100円ショップで買った、ぞうさんです。

花粉の混ざった空気を鼻から吸って、後ろに排出します。

外観

鼻の部分には、DCファンが内蔵されており、 花粉入りの外気を吸気します。

屋外で使うので、雨よけと、大きなホコリ用のフィルタもつけました。

外観

ファンは5V用ですが3.3Vでゆっくり駆動しています。

最初はRaspberry piでPWM制御したのですが、 ノイズを考慮して定電圧駆動にしました。

外観

内部はこんな感じ。

ファンから送られてきた空気は、ホースを通って花粉センサーに入り、 レンジガードで作ったダクトから排出されます

一応循環をこうりょしたむきにしましたが、気休め程度ですね。

外観

外殻を外すとこんな感じ。

Arduino Nano Everyおよびセンサー以外の回路は タッパーの中に入れています。

結露が心配ので充填剤の投入も考えました。 しかし、充填剤が固くなっていて出なかったので諦めました。

通年使用はしないので、妥協です。

外観

センサー部を裏から見るとこんな感じ。

ホコリセンサー出口に、温湿度センサーが取り付けてあります。 これがのちに大活躍することになろうとは。

外観

取付写真です

防水のため、ぞうさんはさかさまに取り付けます。

固定はガムテープです。

ホットボンドで取り付けたら、風で落ちました。

ガムテープ最強です。

外観

最終的には、日よけを付けました。

ぞうさんに直射日光があたると、内部温度が高温になり、 センサーの値に影響が出ることが分かったからです。

開発のポイント

どんなところに苦労して、どう打開したかです


1.センサーへのノイズ

今回使用したダスト・センサ:GP2Y1010AU0Fは、 電源等のノイズにかなり弱い仕様でした。

まず問題になったのが、Raspberry piから発生するノイズです。

Raspberry piには、スイッチング方式のACアダプタから、 USB端子の形で5V電源が供給されているのですが、 Raspberry piの5V出力端子は、Raspberry piの動作に影響を受けますから かなりノイズが乗っているようです。

Raspberry pi に直接センサーを付けるような装置ではおなじみのトラブルらしいです。

私も例外なく食らいまして、 発生した事象は、「ダストセンサーからの値が10秒ごとに跳ね上がる」 というものでした

ダストセンサーからの波形を見る限り、 ノイズフロアが上がっており センサー値が不安定になっていました

ダストセンサーはArduinoと接続されており、 Arduino+ダストセンサーという組み合わせでは発生しないため ノイズ発生源の特定は容易でした

電源ラインにコンデンサ挿入等を試しましたが、 もともとRaspberry pi に5Vで供給されていることから 電源にも余裕がないようで、あまり効果はありませんでした。

結局、Raspberry pi の電源とセンサー側電源を分けることで解決しました

しかし、もう一つのノイズ源としてDCファンがありました。

ダストセンサーからの波形を見る限り、 センサー制御タイミングと関係ないタイミングで 値が高くなっているようでした

特定タイミングでのみ値が高くなることから発見しにくかったのですが、 これもACアダプタの分離で解決しました。


2.センサーの測定周期と時間の問題

上記ノイズの測定をする間に、何度か測定トライをしたのですが、 花粉が飛んでいるはずなのに、ほぼノイズしか拾わないという問題に直面しました

これには、GP2Y1010AU0Fと花粉の相性があることが分かりました。

問題の説明の前に、GP2Y1010AU0Fの測定方法にいて簡単に説明すると、 赤外線LEDから出た光がほこりに反射すると、 受光素子が反応するので、それをアンプ経由で出力するというようなものです。

内部構造はこんな感じ。

真ん中の小さい〇穴を通ったほこりが、赤外線を反射します。

GP2Y1010AU0F

測定制御についてですが、 リファレンスの測定タイミングチャートは下記のとおりです。(データシート抜粋)

GP2Y1010AU0F

ホコリの濃度に応じて、図中の「出力パルス」の電圧が高くなる仕組みです。 「サンプリング」とあるタイミングが「出力パルスのピークになるので、その電圧を読み取るわけです。


さて、この測定方法ですが、 はっきり言って、花粉測定には向いていません。

というか、ほとんど測定不可能です。


分かりやすいように、もうちょっと縮尺を合わせてみましょう。

10ms周期で0.28msサンプリング

測定タイミング

受信できるタイミングがこの時間というわけではなく、 10ms周期のうち、LEDを発光させてからサンプルするまでの時間が0.28msなのです。

実際、0.28msの端でほこりを受けても反応しないでしょうから、 反応可能な時間をざっくり0.1msと見積もると、センサーの反応時間は、たったの1%です。

内部風速を上げすぎるとこの確率になってしまいますし、 内部風速を下げれば測定する体積が減ります。

さて、花粉の密度はどうでしょうか。

花粉が多い日の飛散状況

20210319の新宿の花粉飛散状況

多い日でこれです。

ざっくり言って、1m^3あたり10個や20個の花粉を測定する必要があることが分かります。

100リットルに1個から数個というような計算ですから、

ごくまれに反応する一個の花粉をとらえる必要がある

ということが分かります。

一方、ホコリセンサーの大きさはどうでしょうか ホコリセンサーの大きさからして、丸穴の中は1cm^3もあればいいところです

ホコリセンサー内に緩やかに送風したとしても、 1cm^3の空間に送風し、100ms周期で1%しかないタイミングで 100リットルに1個のほこりを検知するというのは、 かなり無理があることが分かると思います。

リファレンス通りの測定で実験してみましたが、 環境省のデータとはほとんど相関がありませんでした。

余談ですが、 この手のセンサーを使用した花粉測定装置の作例はいくつか見受けられますが、 かなりの割合で測定データが載っていません。

皆さん苦戦されているんですね。

さて、結局どうしたかというと、 測定周期を約1/10にすることと、 測定したAD値に閾値を設け、検出した数をカウントすることで対応しました。

測定周期=0.87ms

20210319の新宿の花粉飛散状況

また、単純に測定周期を短くすると、LEDの電流が足りなくなる回路なので、 LED電流チャージ用抵抗を約14Ωまで下げました。

LED電流を考えると、一見過激な負荷抵抗に見えますが、 これでもリファレンスタイミングで駆動しているときの端子電圧より 低いぐらいなので、大丈夫でしょう。

タイミングを見ると、もう少し周期を詰められそうですが、 その場合、さらに抵抗を小さくする必要があります。

すでにかなり低抵抗ですから、 これ以上は回路の大幅な見直しが必要かもしれません。

もう一つの方法として、LEDを点灯しっぱなしにして、 センサー値が高くなったら割り込みをかけて、 割り込み回数をカウントするという方法を考えたのですが センサーの受光部から接続されているアンプを使いたかったので断念しました

どういうことかというと、 このセンサー、LEDに印可する電圧がパルス性でないと、反応しないみたいなんです。

だから、LED駆動部の回路乗数が厳密に規定されているのでしょうね。

回路抜粋(クリックで拡大)

顕微鏡で花粉の識別し、数を数える

中身は、変化量検出のような回路になっているのでしょうか。 分解してみましたが、知らない部品だったので解析できず、断念しました。

Results(結果)

測定結果例です

20210310の花粉

生データです

2分間の累積個数を記録しています。

20210310の花粉

1時間の累積にするとこんな感じ。

20210310の新宿

同日の環境省のデータです(新宿区役所第二分庁舎)

いい線言ってると思いませんか?!

データはnode redからambientに送信しています。

つまり、インターネット上から今日の花粉が分かります。

IoT!IoT!

20210310の新宿

別の例。この日は雨でした。

20210313の都内某所

明け方から雨のため湿度が上がり始めると、 ぴたりと花粉は0になります。

そして、雨が上がると徐々に検出されています。

Discussion(考察)

数年越しにあたためていた花粉センサーがやっと完成です

ノイズが消えなかったり、センサーに温度依存があったり、 いろいろ難関がありました。

閾値カウント方式に変えたら、キレイなグラフが出てきたときは、 ちょっと感動しました。

しかし、環境省のデータと比べると、1桁以上乖離があり、 これでも取りこぼしが多いんだなあと感じます。

原因として、風量をかなり抑えているので、 空気が取り込み切れていないのもあるかもしれません。

今後の課題(やるとは言ってない)ですね

あと、 この手の記事は、「できました!すごいでしょ!」ではなくて どのような課題があったり、問題が発生して、 それらをどのように解決したか書くといいんだよって、 偉い人が言ってました。

なので、今回はそんな書き方にしてみました。

何かのヒントになればと思います。

ではまた次の配信でお会いしましょう!

外観

配線、尻尾から出せばよかったなあ・・・


inserted by FC2 system