あっきぃ日誌

鉄道ブログのような技術系ブログのようななにか

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

GPSロガーをいよいよまじめに作ろうとする

Raspberry Pi Advent Calendar 2020の24日目です。クリスマスですね。特に関係ない話題で行きます。

adventar.org

秋に買ったGPSモジュールでたまに遊んでいましたが、このカレンダーではまだ扱っていなかったので(ああでも1日目にちょっと書いてたか)、今日明日はこの話題でフィニッシュになるかしらん。

初期

前回はとりあえずLCDに座標を出して、それを人力で読み取ってGoogle Mapsで読んでキャッキャしていました。

akkiesoft.hatenablog.jp

ちょっと作り込む

人力で読み取るのは面倒なので、11月末くらいにはPythonスクリプトにWebサーバーを仕込んでHTMLにGoogle MapsのリンクやLCDに出していた情報も出すようにしていました。

f:id:Akkiesoft:20201223230047p:plain

チャリ散歩で使おうとするとこんな感じになり、わりと不審者!

f:id:Akkiesoft:20201223230059j:plain

OSMを埋め込む

ファイル保存周りを書くのが面倒で脱線が続き、OSMで現在位置を表示したり、画面表示中に取得した値を10秒ごとに点で打つなどの昨日をつけて遊んでました。ただし、記録していないのでリロードすると点は消えます。これも11月末くらいの話。

f:id:Akkiesoft:20201223230252p:plain

ファイル保存を作る

ここからが今日の話。やはりファイル保存できないと色々進まないので、作っていきます。

ファイル保存の開始と終了をWebサーバーのAPIとして実装して、GETで特定のURLが叩かれたら開始・終了できるようにしました。WebUIには開始と終了のボタンを用意して、APIをたたけるようにします。

f:id:Akkiesoft:20201223230649j:plain

WebUIでは毎秒GPSの座標を取得するようにしていますが、ここに現在記録中のファイル名を含めることにして、ファイル名があれば記録中、0が入ってたら記録していない、という判定ができるようにしました。Pythonスクリプト側でも記録中かどうかは同じような判定ができます。便利

Python側のファイル保存は、APIが呼ばれた時点でCSVファイル名前ぎめ(日付と時刻)とヘッダーを書き込みをして、それ以降は記録用スレッドが10秒ごとにファイルに追記していくようにしました。

で、説明だけじゃわからんと思うので今日までのスクリプトを一旦ぶんなげました。

github.com

実際に記録してみる

今日はクリスマスだというのに渋谷に出社する用事があったので、渋谷でテスト。と思ったらテザリングの調子が非常に悪く、Web操作が何もできなくなるアクシデントが発生。2.4GHz帯が混雑しているところでの操作は要改善です。LCDがあるのでボタンで操作とかですかね……。

とりあえずつながっている間のスクショ。

f:id:Akkiesoft:20201224133738p:plain

ログファイルはスタートしてしまえばテザリングが切れてしまっても続くので、ちゃんとデータが取れています。

f:id:Akkiesoft:20201224134535j:plain

ただ、座標だけ見せられても正直わからんので、CSVを読み取ってOSMに点を打つ機能がほしいところです。

あと、途中の鷺沼でLCDを写した様子。電車内はGPS拾えませんでした。シビア。

f:id:Akkiesoft:20201224135244j:plain

まとめ

GPSロガーの11月くらいにちょっといじっていた部分の紹介と、昨晩から作ったロガー部分を今日試したというお話でした。

次はCSVをなんかいい感じにする機能で、ちょっとラズピッピから話題がそれちゃいそうなので、もしかしたらあしたはなんか違う話題(シメ的なやつ)にしちゃうかもです。

Folding@HomeがRaspberry Pi(ARM64マシン)に対応してたので試す

Raspberry Pi Advent Calendar 2020の23日目です。

adventar.org

さすがに12月も後半なので、最近は冷え込みがだいぶ厳しいですね。自宅ではもうだいぶ前からエアコンの暖房が稼働開始していますが、朝は起きる30分くらい前から動かしていてもここ数日は足元がひんやりしています。

そこでふと気づいて、しばらく動かしていなかったFolding@HomeでCPUやGPUをぶん回して足元の暖房代わりにしようと電源を入れてみました。まあ、そううまくいくわけもなく、寒かったです。買ったばかりのM75q-2はいい排熱をしていたので、こちらは排熱を足に吹きかけるように置けば可能性はありそうです。

Folding@Homeといえば以前ベータ版だったRaspberry Pi向けのやつはどうなったかなと思って調べたら、1ヶ月前くらいに正式リリースされていたようでした。

foldingathome.org

前回は9月くらいでした。

akkiesoft.hatenablog.jp

さて、前置きが長かったですがFolding@HomeRaspberry Piにインストールして動かしてみる話です。

インストール

さっそくインストール、の前にダウンロードページを見てほしいのですが、Raspberry Pi向けのパッケージと言いつつ、debパッケージは基本的にarm64向けにビルドされています。

foldingathome.org

よって、Raspberry Pi OS 32-bitでは動作させられず、/boot/config.txtでarm_64bit=1を書いてもダメでした。なので、まだベータ版扱いのRaspberry Pi OS 64-bitを使うことにしました。ここから最新版をダウンロードして、SDカードに書き込んで起動します。

www.raspberrypi.org

起動したら3つのパッケージをダウンロード・インストールします。

$ wget (各パッケージのURL)

(GUIアプリケーション付きで入れるなら関連パッケージのインストールと全部のFAHパッケージをインストール)
$ sudo apt update ; sudo apt install libgl1-mesa-glx libglu1-mesa freeglut3
$ sudo dpkg -i fahclient_7.6.21_arm64.deb fahcontrol_7.6.21-1_all.deb fahviewer_7.6.21_arm64.deb

(GUIアプリケーションなしでいいならclientのみでOK)
$ sudo dpkg -i fahclient_7.6.21_arm64.deb


fahclientのインストール途中では色々質問されるので適宜答えます。まずはユーザー周り。すでにアカウントがあるならその情報を入れます。

Folding@home User Name: (すでに参加している場合は自分のユーザー名を入力)
Folding@home Team Number: (所属しているチームがあればチームの番号を入力)
Folding@home Passkey: (パスキーがあるならパスキーを入力)

どのくらいの計算リソースを使うかの設定。

light      - Recommended for laptops.
medium     - Higher performance setting recommended for most desktops.
full       - Contribute as much as possible.

自動起動の確認。自動起動していいなら「はい」を選択します。

Should FAHClient be automatically started?

Web画面の設定

とくにGUIアプリ無しでインストールを勧めている場合は、WebUIが使えると便利です。設定ファイルに以下の通り追記しておくと、WebUIから状態の確認と操作・設定ができるようになります。192.168.29.0/24はうちのネットワークなので、適宜自分のネットワークアドレスに書き換えてください。

$ sudo vi /etc/fahclient/config.xml

<config>
(中略)
<allow v='127.0.0.1 192.168.29.0/24'/>
<web-allow v='127.0.0.1 192.168.29.0/24'/>
<command-allow-no-pass v='127.0.0.1 192.168.29.0/24'/>
</config>


$ sudo systemctl restart FAHClient

再起動直後は403エラーを返しますが、忘れた頃にページが開けるようになっているはずです。いいんだろうかそれで🤔

動いてるのを見る

GUIアプリケーションを入れると、スタートメニューからたどってビューアー、コントローラーをそれぞれ開けます。開いて思ったけどビューアーはいらんかったな。

f:id:Akkiesoft:20201221190234j:plain

WebUIの方はこんな感じです。Raspberry Piでブラウザを開いて https://client.foldingathome.org/ にアクセスしても同じ画面が見られます。ちなみにCOVID-19に切り替えるのが遅くてちがうプロジェクトのwork unitを拾った模様。

f:id:Akkiesoft:20201221193300j:plain

topコマンドで見た負荷状況。しっかり4コア分のCPUを使っていますね。なお、GPUは未対応なのか設定で無効化されていて使用されていませんでした。

top - 11:41:59 up 6 min,  2 users,  load average: 1.42, 0.69, 0.35
Tasks: 125 total,   2 running, 123 sleeping,   0 stopped,   0 zombie
%Cpu0  :  0.0 us,  0.3 sy, 99.0 ni,  0.3 id,  0.0 wa,  0.0 hi,  0.3 si,  0.0 st
%Cpu1  :  0.3 us,  0.0 sy, 99.3 ni,  0.3 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu2  :  0.7 us,  0.3 sy, 99.0 ni,  0.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu3  :  0.0 us,  0.0 sy, 99.7 ni,  0.3 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
MiB Mem :   3798.2 total,   3206.5 free,    118.1 used,    473.7 buff/cache
MiB Swap:    100.0 total,    100.0 free,      0.0 used.   3592.2 avail Mem 

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND                               
 1942 root      39  19  427592  57976  11096 R 396.4   1.5   1:17.64 FahCore_a8 

まとめ

以前はRosetta@homeやFold For Covidなど他のプロジェクトでしかRaspberry PiでCovid-19関連の計算には参加できませんでしたが、いよいよFolding@Homeでも参加できるようになりました。うちも久々にタワーを組んでガッツリぶん回してみようかしらん🤔?

興味がある方、私と同じく足元暖房に計算機を使いたいと企んでいる方はぜひ試してみてはいかがでしょうか?

240px四方の1.3インチLCDにコンソールとかデスクトップとかを映す!

Raspberry Pi Advent Calendar 2020の22日目です。19日目はまめもさんの自作ファンコントローラー、20日目はつぼさんのネットワーク遅延装置づくり、21日目はgyaboさんでPi 4のベアメタル環境で V3Dレジスタにアクセスするまでのお話でした。

adventar.org

今日からはまた私のターン!今日は18日に1.3インチLCDでfbtftができるできないを追記でごっちゃにしたので整理していきます。

できました

まず、18日目の記事ではfbtftがカーネル5.xに上がったと同時に動いてたものが動かなくなったりなんだりしていて情報が錯綜していると書きましたが、なんとか1.3インチLCD(ST7789v)でも動作させられるようになりました。表示させられるようになって満足した!

やりかた

基本的にはPimoroniのフォーラムで書かれている方の手順でOKです。

forums.pimoroni.com

以下から最新のdtsをダウンロードします(フォーラムでは直接Rawのリンクになってますが、元のページ見れたほうがいい場合もあるよね)。

device tree overlay to use pidi with fbtft driver for rpi 2 B · GitHub

$ wget https://gist.githubusercontent.com/hgroll/2731ae6d05350df663b123615f765bf5/raw/f8fe3829136296c20ba670dcd572e8a5c60da995/pidi-overlay.dts

dtsをダウンロードしたらエディターで開いて、regの行を0から1に書き換えます。regは何かというと、Chip Selectの値が当てはまるらしく、CE0(BCM8)なら0、CE1(BCM7)なら1となるようです。Pimoroniの1.3インチLCDは、Breakout Garden向けモジュールも、PirateAudioもCE1が使われていたため、regが0では動作しなかったというわけでした。

(参考) Raspberry Pi - SPI device tree changes - Stack Overflow

reg = <0>;
↓
reg = <1>;

また、バックライトの設定がなぜか反対?になっていて消灯してしまっていたので、1から0に書き換えてみたところ点灯しました。13の値はPirateAudioの場合のバックライトLED用ピン番号で、ブレイクアウトのときは19になります。もしかするとconfig.txtの方で上書きできるかもしれないですが、やり方は不明なので必要に応じてここを書き換えてしまうのも手です。

led-gpios = <&gpio 13 1>;
↓
led-gpios = <&gpio 13 0>;

書き換えたらdtcコマンドでdtsをコンパイルします。

$ sudo dtc -@ -I dts -O dtb -o /boot/overlays/pidi.dtbo pidi-overlay.dts

/boot/config.txtにpidiを読み込む設定を追記します。

dtoverlay=pidi

/boot/cmdline.txtにコンソール向け設定を追記します。rootwaitのあとにスペースを入れてから続けて追記します。

 fbcon=map:10 fbcon=font:VGA8x16

コンソールセットアップで、コンソールの文字サイズの設定を変更します。

$ sudo dpkg-reconfigure console-setup

以下の通り選択する
コンソールで使うエンコーディング: UTF-8
コンソールフォントとしてサポートすべき文字セット: 最適な文字セットを指定してください
コンソールのフォント: システムに適当なフォントを選ばせる
フォントのサイズ: 8x16

あとはSPIの有効化も忘れずにやります。

$ sudo raspi-config nonint do_spi 0

ここまでできたら再起動して、1.3インチLCDにコンソールが出ることを確認します。

f:id:Akkiesoft:20201221174338j:plain

GUIも出したいときは

小さくてあまり使い物になりませんがfbcpを使えばGUIも出ます。

github.com

インストールは略しますが、手順通り設定すればデスクトップが映るようになります。ただ、解像度の設定次第では何がなんだかわからない感じになるので、VGAくらいに設定しておくと良いかもしれません。

f:id:Akkiesoft:20201221174328j:plain

また、Pimoroniのフォーラムやdtsファイルのコメントにも書かれているとおり、結構ちらつきが激しいです。dtsのinitパラメーターをいじっらた改善できるんかしら?

まとめ

Pimoroni製品についてる1.3インチ240x240LCDを最近(Linux Kernel 5.4くらい)のRaspberry Piでfbtftとして使う手順でした。

映るには映ったんですが、まあ文字が小さくて読み安くはないので、IPアドレスを読み取るとか、CM4でカーネルクラッシュしたときの表示を軽く拾う(拾えるのか?)とか、そんくらいの用途になりそうです。

2021/1/13追記

2021年初めから流行ってて私も入手していたマジョカアイリス方面から参照されていてチビッた。私も後でそちらを参考にさせてほしいですー(超絶他力本願寺)。あと、fbcpの代わりにX11に設定書いちゃうのもいけます。こっちのが多少は早いはず。

$ sudo vi /etc/X11/xorg.conf.d/99-fbdev.conf

Section "Device"  
  Identifier "myfb"
  Driver "fbdev"
  Option "fbdev" "/dev/fb1"
EndSection

qiita.com

今日の検車区

駅前をPokemonGo散歩でもしようと外に出て、電車が見えたところで唐突に思い出し、検車区を見に行く用の休日回数券の残数を見たら残り3往復分で、機嫌が明日まででした。検車区散歩ですら使い切れないのか……🤔🤔🤔🤔🤔

f:id:Akkiesoft:20201219225952j:plain

というわけで1往復ぶんを使うことにして検車区を見てきました。最初と用事が変わっているので、検車区を見に来るにはもう出遅気味な時間です。

f:id:Akkiesoft:20201219230003j:plain

最近納入された2141Fが検車区にいました。投資計画の予定数を越してるやつだとかで、ハイペースというかオーバーペース?IR無線の撤去工事をやるから予備を作る、とかなんでしょうかね。しらんけど。写真は8630Fを重視気味に。

f:id:Akkiesoft:20201219230056j:plain

3000系の工事も淡々と進んでおり、3011Fも今週?戻ってきたようです。8628Fを重視気味に。

f:id:Akkiesoft:20201219230438j:plain

定番撮影スポット。2本しか8500系がいないところに若干の寂しさを感じるところ。今週は仕事などでわりとよく出かけてたんですけど、見かけはするけど乗れなくなりましたね。

f:id:Akkiesoft:20201219230644j:plain

2138Fがいる線が架線の電源を切ってなにかやってました。が何をしていたかはわからず。

f:id:Akkiesoft:20201219230545j:plain

ミク。

f:id:Akkiesoft:20201219230629j:plain