あっきぃ日誌

ラズピッピブログのようなオタクブログのようななにか

PM2.5センサーのPMS5003をラズピッピにつないで遊ぶ

Raspberry Pi Advent Calendar 2020の25日目、最終日です。

adventar.org

最終日はGPSの続きだと地味なのでなにか……と思っていたら、昨晩皿洗い中に特に強打したわけでもないのに突然左親指が内出血して痛めてしまった*1ので、最後の最後でアレですが、積みセンサー消化的な省エネなネタで、PM2.5センサーで遊びます。2.5を倍にしたら25だし今日にぴったりだなガハハwww(🤔?)

PM2.5

まずPM2.5についてざっくりお勉強しました。

微小粒子状物質PM2.5)とは
大気中に浮遊している2.5μm(1μmは1mmの千分の1)以下の小さな粒子のこと

http://www.env.go.jp/air/osen/pm/info.html#ABOUT

特定の何かというわけではなく、2.5μm以下の粒子は基本的にPM2.5というものとのこと。で、環境基準も以下の通り定まっているそうです。

1年平均値 15μg/m3以下 かつ 1日平均値 35μg/m3以下

http://www.env.go.jp/air/osen/pm/info.html#STANDARD

PM2.5センサー

だいぶ前にお仕事つながりの方からセンサー類をごそっと頂いた中にPMS5003というPM2.5センサーが入っていました。これはシリアル通信で値が取れるもののようですが、センサーから出ているピンのピッチが細かくて、Raspberry Piはもちろん他のボード類でも接続するにはちょっとしんどいなあと思って放置していました。

しばらくすると、我らがPimoroniでも同じセンサーの取扱が始まって、Pythonライブラリの公開やブレイクアウトボードの発売など、扱いやすい環境が整備されました。Pimoroni本当に心強い。ブレイクアウトボードをポチポチまではしたのですが、なぜかまた放置していました。

f:id:Akkiesoft:20201225120324j:plain

セットアップ

というわけでこの辺から本題。重い腰をあげてセットアップし、値を見てキャッキャしていきます。用意するのはPMS5003センサー、それのブレイクアウトボード、メス-メスのケーブル6本です。PMS5003センサーは放置するにはだいぶお高いですね。。

PMS5003 Particulate Matter Sensor with Cable – Pimoroni

Particulate Matter Sensor Breakout (for PMS5003) – Pimoroni

配線はこんなかんじ。5V、GND、TX、RXは連続して配線できるので配線はラクです。RESETとENは1つ開けて反対の列に2つ連続で配線(BCM27とBCM22)と言った具合です。

f:id:Akkiesoft:20201225120300j:plain

続けてPythonライブラリの用意。今日はVirtualEnvを用意してそこにセットアップします。VirtualEnvは環境を汚さない利点がありますし、activate中は環境内のbinディレクトリにパスが通るので、スクリプトを中に置けば実行が簡単になります。

# VirtualEnvが入っていないようならインストール
pi@usbpi32:~ $ sudo apt update;sudo apt install -ypython3-virtualenv

# /home/pi/py-pms5003にVirtualEnv環境を作る
pi@usbpi32:~ $ virtualenv py-pms5003

# Python環境を作成したVirtualEnv環境に切り替える
pi@usbpi32:~ $ source py-pms5003/bin/activate
# activate中はプロンプトにVirtualEnvの名前が入る
(pms5003) pi@usbpi32:~ $ 
# deactivateコマンドでもとのPython環境に戻る
(pms5003) pi@usbpi32:~ $ deactivate
pi@usbpi32:~ $ 

# ~/py-pms5003/binに https://github.com/pimoroni/pms5003-python のサンプルスクリプトをダウンロードして実行できるようにする
pi@usbpi32:~ $ cd py-pms5003/bin
pi@usbpi32:~/py-pms5003/bin $ wget https://raw.githubusercontent.com/pimoroni/pms5003-python/master/examples/all.py
pi@usbpi32:~/py-pms5003/bin $ wget https://raw.githubusercontent.com/pimoroni/pms5003-python/master/examples/specific.py
pi@usbpi32:~/py-pms5003/bin $ chmod +x all.py specific.py

センサーはシリアル通信なので、シリアル通信を以下の通り投入します。

pi@usbpi32:~ $ sudo vi /boot/config.txt

[all]
enable_uart=1
dtoverlay=pi3-miniuart-bt
>||

反映には再起動が必要になるので、ここで一旦再起動します。

>||
pi@usbpi32:~ $ sudo reboot

動かしてみる

セットアップは以上です。では動かしてみましよう。

f:id:Akkiesoft:20201225120348j:plain

まずはVirtualEnv環境に切り替えます。

pi@usbpi32:~ $ source py-pms5003/bin/activate
(pms5003) pi@usbpi32:~ $

先述のとおり、サンプルスクリプトを配置した先はパスが通っているのでall.pyを以下のように実行します。うまく接続していると、数秒ごとに以下のようなデータが出力されます。all.pyでは、PM1.0、PM2.5、PM10と、微粒子のサイズごとの値が出てきました。

測定は机の上でやっており、窓を開けたり締めたりしてみましたがそれほど大きな値は出ず、基準値以下?な感じでした。

(pms5003) pi@usbpi32:~ $ all.py

PM1.0 ug/m3 (ultrafine particles):                             2
PM2.5 ug/m3 (combustion particles, organic compounds, metals): 3
PM10 ug/m3  (dust, pollen, mould spores):                      3
PM1.0 ug/m3 (atmos env):                                       2
PM2.5 ug/m3 (atmos env):                                       3
PM10 ug/m3 (atmos env):                                        3
>0.3um in 0.1L air:                                            432
>0.5um in 0.1L air:                                            137
>1.0um in 0.1L air:                                            19
>2.5um in 0.1L air:                                            1
>5.0um in 0.1L air:                                            0
>10um in 0.1L air:                                             0

つづけてspecific.pyの方を実行してみます。こちらはPM2.5の値だけを出力するサンプルのようです。

(pms5003) pi@usbpi32:~ $ specific.py
PM2.5 ug/m3 (combustion particles, organic compounds, metals): 3
PM2.5 ug/m3 (combustion particles, organic compounds, metals): 2
PM2.5 ug/m3 (combustion particles, organic compounds, metals): 2

今度はベランダに出して計測します。室内よりはちょっと値が大きくなりましたが、基準値以下っぽいですね。

(pms5003) pi@usbpi32:~ $ all.py

PM1.0 ug/m3 (ultrafine particles):                             7
PM2.5 ug/m3 (combustion particles, organic compounds, metals): 9
PM10 ug/m3  (dust, pollen, mould spores):                      9
PM1.0 ug/m3 (atmos env):                                       7
PM2.5 ug/m3 (atmos env):                                       9
PM10 ug/m3 (atmos env):                                        9
>0.3um in 0.1L air:                                            1083
>0.5um in 0.1L air:                                            338
>1.0um in 0.1L air:                                            50
>2.5um in 0.1L air:                                            3
>5.0um in 0.1L air:                                            0
>10um in 0.1L air:                                             0

tenkijpでは今日のPM2.5分布予測というものがあるらしく、東京各地の測定値はいまのところ10ug/m3前後っぽいので、なんとなくあっていそう?な雰囲気です。

tenki.jp

ちなみに、以下は昨晩指を痛めて撃沈する前に窓開け換気しながら机の上で動かしていたときのデータです。こちらは基準値オーバーのようですが、もしかするとしばらく放置していた間にセンサーの中にゴミが溜まってしまってこのような結果になったのかもしれませんね。

PM2.5 ug/m3 (combustion particles, organic compounds, metals): 37
PM2.5 ug/m3 (combustion particles, organic compounds, metals): 38
PM2.5 ug/m3 (combustion particles, organic compounds, metals): 38
PM2.5 ug/m3 (combustion particles, organic compounds, metals): 38
PM2.5 ug/m3 (combustion particles, organic compounds, metals): 39

まとめ

PimoroniのブレイクアウトPythonライブラリのおかげで積みセンサーを動かせたというお話でした。長期間動かしてデータを取り続けてみるのも面白そうですし、PM2.5予測で多い日を狙って取得して変化が見られるとそれも良さそうです。

PMS5003センサーは小さいファンで空気を取り込んでデータを採るので、静かな場所に置くとファンの音が気になるかもしれません。まあ、軽く動かしてみた感じよほど耳を近づけないとわからないレベルではありました。

そして今日でRaspberry Pi Advent Calendar 2020は終了です。無事完走することができました。めでてえ。途中ご参加頂いた皆様、本当にありがとうございました。全部一人だったら流石にネタ切れで終わるところでしたw

それでは、メリークリスマス!!

f:id:Akkiesoft:20201225122710j:plain

(今朝玄関を開けたらアマゾンサンタからミクぬいぐるみが届いていたのですが、どなたでしょうかね?w)

*1:ググったところアッシェンバッハ症候群と言うそうな。整形外科で見てもらっても骨とか関節に異常はなく経過観察になりました。とはいえ年の瀬の病院が閉まる時期にこう言うよくわからんのを発症するのは精神衛生的に嬉しくはないですね。