CO2mini(ZG053U), ZGm27 による CO2 濃度の計測

私自身が自宅の換気システムのチェックと改修を行う時点で必要になった 屋内全室と屋外 CO2 濃度の測定で使っている手法をまとめておきます。

当初はアナログ出力の CO2 センサを A/D 変換して、 常時稼働の FreeBSD サーバーにデータを集めていましたが、 CO2mini が USB 接続で使えることがわかった時点で、 ほぼ全てを CO2mini に切替えました。 その後、ZGm27 も USB 接続可能であることがわかって、 追加しています。

1. CO2mini(ZG053U), ZGm27 の概要

CO2-mini は USB 接続できる Dual Beam NDIR (Non Dispersive InfraRed) 方式の コンパクトな CO2 測定器で、台湾の ZGm053Uの OEM と思われますが、アメリカの販売店の CO2miniでは、より多くの関連情報が得られます。

なお、(株)ジェイ・シー・ティ販売の Radiant 二酸化炭素濃度測定器 ZGm27 も、CO2mini とまったく同じ USB インタフェースで、CO2 濃度、気温に加えて、 相対湿度も取得できますので、 後記のプログラムでは ZGm27 も扱えるようにしてあります。

私自身は引退後の自宅になった高断熱高気密住宅の換気問題で必要になった、 外気と全個室の CO2 測定で、過去数年使ってきましたが、 非常にコスト・パフォーマンスの良い製品なので、 その使い方をまとめておこうと思います。

2. 複数の CO2mini をどう扱うか

複数の CO2mini を使う場合、 CO2mini から取得できる情報では、 どこに設置されたものかが、わかりませんので、 CO2mini を接続する USB HUB のどの port に接続されたかを PC (コンピュータ) が識別できるようにする必要があります。

最も確実な方法は、HUB を PC に接続した時点で、 HUB に接続されている CO2mini を一定の順序で 一つづつ少し時間を置いて接続してくれるように設計されている USB HUB を使うことで、 例えば、StarTech 7300USB3B (7 port) や ST103008U2C (10 port) が、 こういった設計になっています。 使われているチップセットは VIA Lab VL812 です。

複数の CO2mini/ZGm27 のうち 1 つを抜き差ししたときは、 HUB と PC を接続しているケーブルを抜いて、 数秒後に再度接続しておかないと、 PC が認識している CO2mini/ZGm27 の順番が変わってしまいますので、 注意が必要です。

3. 遠距離の CO2mini をどう扱うか

USB は手近(近距離)で使う想定のインタフェースですが、 家庭内だと、CO2mini の設置場所まで LAN ケーブルを引いて、 USB エクステンダー 例えば、SANWA SUPPLY USB-RP40 とか USB-LAN-EXT などの 安価な製品でも屋外の設置場所を含めてカバーできます。

4. CO2mini のプログラミング

USBmini のハードウェアは HOLTEKMCU(Micro Controller Unit)を使った製品のようで、 製造元では Windows で使える Windows 用 binary を提供していますが、 Unix の場合は、自分で書くしかありません。

このデバイスの計測値の取得に必要な PC 側の操作は次ぎのようになっています。

  1) End point 00 にコントロール転送で 8 byte のデータを送る
     (例えば 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 などデータの内容は
      何でもよいらしい)
  2) End point 01 からバルク転送で 8 byte のデータ 9 パケットを読み取る
     (必要なのは先頭が 0x42 と 0x50 だけ)
送られてくるデータと最終的な測定値は
  +----+----+----+----+----+----+----+----+
  |Item| MSB| LSB| Sum| \r |0x00|0x00|0x00|
  +----+----+----+----+----+----+----+----+

  Item: 0x50 ('P') .. CO2 (CO2 concentration)
        0x42 ('B') .. 室温 (Room Temperature)
	0x41 ('A') .. 相対湿度 (Relative Humidity)

  Sum = (Item + MSB + LSB) & 0xff .. check sum

  測定値の計算方法:
    室温 = ((MSB << 8) | LSB) / 16.0 - 273.5  (C)
    CO2  = ((MSB << 8) | LSB)  (ppm)
    湿度 = ((MSB << 8) | LSB) / 100 (%) .. ZGm27 のみ (CO2mini では 0 になる)
で計算しますが、これは最近(2020 年頃から ?)販売されている機種の場合で、 私が使い始めた頃に販売されていた機種では、暗号化されていました。 この暗号化の方法を解析してみせたのが、 Reverse-Engineering a low-cost USB CO2 monitorです。

今回、この原稿を書くにあたって、最新機種を購入し、 こちらは公開されているプロトコル USBCommunicationProtocolforCO2mini と一致していることを確認(ただし、Example of USB Protocol の例 1, 2 は間違っている)、 最近入手が容易になった ZGm27 にも対応できるようにしたうえで、 新旧、いずれの機種についても対応できるように source code を書き換えました。

また、2 つ以上の CO2mini/ZGm27 に対応できるようにしてあります。 新旧の機種識別は送信されるデータの 5 byte 目が CR (0x0d) かどうかで行うことができます。 ついでに、利用者の多い Linux (ubuntu) での動作も確認しておきました。

現時点でのプログラミングの方針としては

  1) libusb だけで書く
  2) libhidapi で書く
FreeBSD の場合、libhidapi は ports/comms/hidapi からインストールできて、 プログラムも簡単なりますが、古い OS ではサポートされていないので、 libusb を使うほうが汎用性があります。 このパッケージでは両方を入れておくことにしました。 この他、 libusbhid を使う方法もありますが、library 自体を書き換えない限り、 VENDOR_ID, PRODUCT_ID を取り出す機能がないため、 struct hid_item の _usage_page とか usage を使う識別法しかなくて、 古いシステムならともかく、今はやめておくほうが良いと思います。

ソースコード (source code)

注1 - CO2 センサの校正

一般に CO2 濃度測定に使われるのはNDIR (Non Dispersive Infrared Gas Anaryzer 非分散型赤外線吸収法)センサですが、 赤外光源として使われる小型白熱電球の放射強度の変化などによる 長期間使用時のドリフト対策として定期的校正が必要になります。ただ、 正確な校正を行うには窒素ガス(CO2 0 ppm 標準)と 標準気体(CO2 400 ppm の新鮮な空気など) が必要で、かなりの費用と手間がかかります。

多くの簡易測定器で使われているのは ABC Calibration(Automatic Baseline Calibration) と呼ばれる方法で、 センサの設置場所が、週に一度は無人で CO2 発生源がなく、 測定場所の CO2 濃度が外気と同じになるだろうという期待に基づいたものです。 つまり、8 日間といった区間に於ける CO2 濃度の最低値(base line)を 400 ppm に校正してしまいます。 しかし、住宅、オフィスなどの施設は常時居住者が居て、 CO2 の最低レベルは 600 〜 800 ppm になりますから、 これを使うと実際の濃度より 200 〜 400 ppm 低い測定値が得られ、 大きな誤差が出ます。 しかも、都市部では年間を通して外気 CO2 濃度自体が 400 ppm まで下がること自体が 期待できません。注2に述べるように、 私の自宅では、700 ppm を越えることさえあって、建築常識が使えません。

そのため、 CO2mini を含めて、たいていの測定器では ABC Calibration をしないように設定できますから、 住宅内とか都市部の外気測定で使う場合はこの設定にしなければならないわけですが、 中には NetAtmo など、 この ABC 校正を止める方法がないものもあって、 住宅で使うのは無理で、 何故これが住宅用として販売されるのか理解に苦しみます。

NDIR 最大の誤差要因となる光源のドリフト対策としては、 単一光源を二つのビームに分けて一方を光源の強度測定のみ、 他方を CO2 の NDIR 測定に使う dual beam 方式の製品があって、 最近は CO2minii(ZGm053U), ZGm27 等、比較的安価なものが出て来ましたので、 他の原理による CO2 濃度測定器を使う場合は、 簡単な校正とか精度確認用に持っていると良いと思います。

注2 - 外気 CO2 変動と気象条件

法的規制や建築業界を含めて、外気 CO2 濃度は 400 ppmが常識ですが、 計測システムを整備して観測を始めてみると、 400 ppm を切る程度から 700 ppm 程度まで、 大きな変動があることがわかりました。 建築法規や過去の設計ルールが役にたたないほどの値ですから、 1000 ppm 以下を目標とする屋内換気は極めて難しくなります。

観測場所は小田急線豪徳寺駅から 3 分程度の住宅地で、 近くには多量の自動車が通る幹線道路はありません。 夕方から夜間かけて上昇し、 深夜から明け方にかけて下降するパターンが多く、 それにベースラインの変動が加わるのですが、 当初は原因がわかりませんでした。

その後 2 年間の気象観測データにより、CO2 濃度ベースラインの変動が 大気の流れに起因する地域全体の換気によるものであることがわかりました。 風速が大きければ外気 CO2 濃度が下がるのです。 つまり、都市のスケールでの気象的換気の影響を大きく受けるわけで、 建築以前に都市計画を考えなければならないことになるのですが、 現在の建築法規や設計基準では、この観点が抜けていて、 風が弱い大都市では換気不足が常態化することを意味します。

平林 浩一, 2017-01-08, 2022-06-22, 2022-08-23