親子IoTワークショップ

マイコンとクラウドを使ってIoTとプログラミングを学ぼう

[ トップ | 開催予定・概要 | 2024-12開催 | お知らせ | Facebook ]

PM2.5センサー(PMS5003)を使う

PMS5003というPM2.5センサーを使う方法を説明します。これは、粒子状物質(particulate matter: PM)の濃度を測るセンサーです。

PM(particulate matter)とは

粒子状物質(particulate matter: PM)とは、空気中を飛んでいる目に見えない物質(目に見えないほど小さい粒)のことです。だいたい直径が100マイクロ・メートル(μm)から0.01マイクロ・メートル(μm)くらいのものを指しています。1マイクロ・メートル(μm)の長さは、1 * 10^-6 m(1メートルを10の6乗で割った長さ)です。1ミリメートル(mm)が1 * 10^-3 mなので、1ミリの1000分の1の長さが1マイクロ・メートルです。

粒子状物質(particulate matter: PM)には大気汚染の原因になるものがあり、それは健康被害や環境問題(酸性雨など)を引き起こします。人間がそれを吸うと、鼻やのど、気管、肺などに悪影響を与えます。空気中の物質の多くは鼻や、のどでブロックされて、それ以上体内へ侵入できませんが、物質が小さくなれば気管や肺にも入ります。直径が5 µm以下になると、肺の奥にまで届くそうです。肺には空気中の酸素を血液に取りこむ役割があるので、その際に毒性のある物質も血液中に取りこまれる可能性があり、そうなると毒性物質が体全体へ広がることになります。

粒子状物質(particulate matter: PM)は、直径の大きさによって違うカテゴリーに分けられています。直径が10 μm以下のものをPM10、2.5 μm以下のものをPM2.5と呼びます。PM10はPM2.5を含みます(PM2.5はPM10の一部)。以下の図は、PM10とPM2.5を髪の毛と比較したものです。髪の毛の太さ(直径)は50〜70 μmなので、PM10の直径はそれの約1/5です。PM2.5はさらに小さくなります。

PM2.5よりも小さな物質のカテゴリーもあり、直径が1 μm以下のものをPM1.0、直径が0.1 μm以下のものをPM0.1と呼びます。

環境問題の観点ではPM10の濃度(concentration)が重要で、健康被害の観点ではPM2.5の濃度が重要だそうです。濃度の単位はµg/m^3です。つまり、空気1 m^3(1立方メートル)の中に含まれるPMの粒の重さ(µg)です。WHOによれば、PM10の濃度を70 µg/m^3から30 µg/m^3に減らすことができれば、世界の大気汚染に関連する死亡者数330万人(年間)を15%減らせるとのこと。また、アメリカのEPA(Environmental Protection Agency)や日本の環境省によると、PM2.5の濃度が高いほど健康被害が大きくなるとのこと。

準備

ラズパイの画面左上にあるラズベリーのアイコンをクリックし、Preferencesを選択、さらにRaspberry Pi Configurationを選択します。小さなウィンドウが表示されるので、その中の「Interfaces」のタブを選択し、「Serial Port」をon/enabledにして、「Serial Console」をoff/disabledにします。ラズパイをリブート(再起動)するかどうか聞かれたら、Yes/OKを選んでリブートしてください。

ラズパイとの接続

センサーにワイヤーが付属しているので、それをセンサーのコネクターに差しこんでください。ワイヤーの反対側の端は以下のようになっています。

ここでは、VCC、GND、TXDの3つのピンを使います。以下の表のように、この3つのピンをラズパイのGPIOピンと接続してください。

PM2.5センサーのピン ラズパイのGPIOピン
VCC 5V
GND GND(どのGNDピンでもよい)
TXD GPIO 15

センサーの動作テスト

まず、「CircuitPythonをインストールする」に書いてある作業をやってください。次にラズパイのTerminalで以下のコマンドをひとつづつ実行:

sudo pip3 install adafruit-circuitpython-busdevice

sudo pip3 install adafruit-circuitpython-pm25

センサーからPM濃度を読み取るプログラムがpm-read.pyです。このプログラムは、2秒に1回センサーからデータを読み取ってプリントします。これがずっと続くので、止めるにはCtrl-Cしてください。

関数PM25_UART()は、センサーとのやり取りをする「通信口」のようなものを返します。ここでは、それが変数sensorに入っています。その通信口を使ってsensor.read()という関数を呼ぶと、PM濃度のデータが返されます。返されるPM濃度のデータはディクショナリーで、それが変数pmDataに入っています。

pmData = sensor.read()

関数sensor.read()が返すPM濃度のデータはディクショナリー形式になっていて、以下の3つのキーを使っています。それぞれにキーに対応するのは、大きさの違うPMの濃度です。

ディクショナリーのキー ディクショナリーの値
“pm10 env” 直径が0.3〜1.0 μmのPMの濃度(µg/m^3)
“pm25 env” 直径が1.0〜2.5 μmのPMの濃度(µg/m^3)
“pm100 env” 直径が2.5〜10 μmのPMの濃度(µg/m^3)

pm-read.pyでは、以下のように3種類のPM濃度をプリントしています。

print("0.3-1.0 μm in diameter:", pmData["pm10 env"],  "μg/m^3")
print("1.0-2.5 μm in diameter:", pmData["pm25 env"],  "μg/m^3")
print("2.5-10  μm in diameter:", pmData["pm100 env"], "μg/m^3")

次のプログラムpm-concentration.pyは、PM2.5の濃度とPM10の濃度を計算してプリントします。PM2.5の濃度は、直径が2.5 μm以下のPMすべてをカウントした濃度なので、pmData["pm25 env"]pmData["pm10 env"]を足したものになります。PM10の濃度は、直径が10 μm以下のPMすべてをカウントした濃度なので、pmData["pm100 env"]pmData["pm25 env"]pmData["pm10 env"]を足したものになります。

次のプログラムpm-aqi.pyは、PM濃度からAQI(Air Quality Index)という指標値を求めるプログラムです。AQIは、PM濃度をもとにして空気の汚染度を数値化し、空気汚染のレベルを分かりやすく示すためのものです。以下のように、AQIの範囲ごとに、空気汚染のレベルが6つに分けられていています。

AQIの値 AQIのカテゴリー(空気汚染のレベル)
0 - 50 Good(良い)
51 - 100 Moderate(普通)
101 - 150 Unhealthy for Sensitive Groups(PM濃度に敏感な人たちにとっては健康に良くない)
151 - 200 Unhealthy(健康に良くない)
201 - 300 Very Unhealthy(極めて健康に良くない)
301 - 500 Hazardous(危険)

AQIの計算方法はここに書いてあります。

自習プロジェクトの目次に戻る