酸素濃度測定機

photo

幹の中の酸素濃度を測りたい。

メタン生成菌は嫌気性の古細菌であるから,幹内部でのメタン生成が確認されている以上,嫌気的な環境が幹内部にあるはずだ。だから実際に測ってみるために,酸素濃度を簡単に測るツールが必要になった。

まずは幹内部のガスを採取しなくてはならないが,それはわりと簡単にできる。幹に開けた穴に挿し込んでゴム栓をしたステンレスパイプから,注射針でゴム栓越しにサンプルするのだ(Mochidome et al., 2025などでも使っている)。今回つくる機器は,採取したガスの酸素濃度を測ることができれば良い。

ざっくりとした要件は以下の通り

  • 簡単に持ち運べる
  • 0.2mL程度の少量のガス中の酸素濃度をある程度の精度で測ることができる
  • Arduinoで処理してSDカードに保存し,持ち帰ってPCで解析する

このページでは,この酸素濃度測定器の構成やプログラミングなどの技術的な側面について書き留めておこうとおもう。

目次

  1. 全体の構成と測定の原理
  2. 酸素センサーと空気回路
  3. ロガー部分
  4. 表示と操作部分
  5. はんだ付け
  6. プログラム
  7. 筐体

1. 全体の構成と測定の原理

構成は下図のようになっている

photo

空気のループ回路がある。このループはバルブで開放/閉鎖をすることができる。ポンプがループ内の空気を強制的に循環させていて,センサーは流れてくる空気の酸素濃度を1秒に1回測定する。

ループを閉めた状態でセプタムを注射針で貫通させ,サンプルを注入する。それまでのループ内の酸素濃度は大気(約20%)と等しいが,サンプルの酸素濃度がそれよりも低ければ,ループ内の酸素濃度も一定のレベルまで減少する。

photo

測定の例

このとき,(A)ループ内の酸素濃度の減少分は,(B)サンプルの酸素濃度,(C)ループの体積と注入サンプルの体積の比,によって変わる。(A)と(C)がわかると,(B)を逆算できる。

センサーで毎秒測定された酸素濃度はロガー部でSDカードに記録される。さらに,各部が機能していることをモニターできるような表示部も設けた。

2. 酸素センサーと空気回路

酸素センサーは,イギリスの SST Sensing Ltd. というメーカーの LuminOx を使用した。Aliexpressで1.5万円くらいで買った。簡単なデータシートはこちら!

photo

酸素センサーは化学電池式のものが一般的だけど,今回は蛍光ベースのセンサーを使うことにした。化学電池式にくらべて,コンパクトで,レスポンスが早く,センサーの向きなどに制限がなく,メンテナンスも少なくていいらしい。しかも,ICを搭載していて,気圧補正した酸素濃度をデジタル通信で送ってくれるのだ。めっちゃ楽ちん。

今回測りたいサンプルの体積は0.2mLととても小さいので,これほど少量のサンプルを注入して濃度変化を検知するには,空気回路全体の体積をとても小さくする必要がある。最終的に,2.3mLくらいに収めることができた。これには測定室の体積が小さいこのセンサーだからこそ実現できた。

空気回路には,ループを開閉するために,トグルスイッチで動く5ポートバルブを取り付けた。サンプルの注入ポートは,T継ぎ手でできていて,袋ナットとそこら辺にあったゴムセプタムを組み合わせて作った。空気回路の組み立てには,外径4mmのチューブと,クイック継ぎ手,それにソフトシリコンチューブを使い,細針金で締めてシールした。

ポンプは流量の小さいダイヤフラムポンプを探した。1.5Vでも動くものはかなり低流量でダイヤフラム室の体積もとても小さい。AmazonやAliexpressで数百円で買える。

photo

これを(←),こう(→)。針金で締め上げてシールする前の状態。

空気漏れに神経質になりすぎる必要はない。一定のリークであれば,注入後の酸素濃度がわりときれいに上昇するので,線形回帰して"注入した瞬間の真の濃度"を推定できるからだ。

3. ロガー部分

センサーからシリアル通信で毎秒データが送られる。この受信をトリガーとして,その瞬間のタイムスタンプを付け足した文字列をSDカードに書き込む。

これを実現するために,Arduinoというマイコンボードを使う。

Arduinoってなんやねん:データの受信,処理,書き込みなどにはマイコンを使う必要がある。なにかと敷居の高いマイコンであるが,「Arduino」という,マイコンとよく使う回路がセットになった商品を使えば,簡単にできちゃうのだ。プログラミングの開発環境も整っていて,しかも世界中にユーザーがたっくさんいるので,ネット上に解説記事なども多くて,とってもFancyなアイテムなのである

photo

秋月電子HPより引用

Arduinoに加えて,RTC(リアルタイムクロック)というモジュールが必要である。Arduinoはプログラム動作中の経過時間を数えることはできても,それが年月日時分秒といった構造に落とし込まれているわけではない。加えて,電源供給が止むと日時データを保存しておけない。そこで,日時を覚えて数え上げる専門の部品,RTCモジュールが必要になる。RTCモジュールにはボタン電池がついていて,Arduinoの起動いかんにかかわらず,日時を数え続けてくれる。今回はDS3232というRTCを搭載したモジュールを使った。

photo

Amazonより引用

SDカードへの保存にはSDカードモジュールを使う。SDカード内部にはおそらくマイコンが入っていて,本体からの電力とデータの供給を受けてデータの保存を実行しているようなのである。SDカードは3.3Vで,Arduinoは5Vで駆動するシステムであるので,信号のやり取りのときには抵抗で分圧して信号電圧を落とす(レベルシフト)などの必要がある。(micro)SDカードを建て付けよく固定し,レベルシフトその他の機能を備えているのがSDカードモジュールである。場合によってはArduinoと繋ぐときにダイオードを介する必要もあるので要確認。

photo

Amazonより引用


Rなどのプログラミングがぶん回せるようになって自信がついてきた私であったが,現実のモノを扱う電気工作/プログラミングでは意味不明のエラーや,予期せぬ動作,あるいは動作が起こらないことが頻発し,何度も泣きそうになった。現実世界の難しさである。とくに,RTCであるDS3232が不具合の連続であった。

結局のところ,その原因は搭載されているRTCチップの違いにあった。これはちょっと小慣れている人には有名な話らしいのだが,RTCモジュールのZS-040に搭載されているRTCにはDS3232SNとDS3232Mという2種類があり,DS3232SNのほうが高精度高機能,DS3232Mは廉価版と言ってもよいのだが,Amazonなどで買うとそのどちらが送られてくるかは確率的なものなのである! このサイトこのサイトにくわしいのでぜひ参照してほしい。

4. 表示と操作部分

こうした野外測定機器に取り付けられた表示部のもっとも大切な役割は,測定データの表示ではなく,エラーの表示である。その場で対処できないエラーであっても,それが起きているのを知れることはとても貴重である。
私はSDカードの入っていないロガーを使って,芦生の森を1日かけてデータを測定してまわったことがある。もちろん測定されたデータの電圧はSDカードホルダーの空中に浮いたピンを虚しく刺激することしかなかった。

今回の表示部は,もっともポピュラーな16字×2段のLCDディスプレイの上段に年月日時分秒を,下段に測定データとエラーを表示させ,さらに万全を期すために,SDカードへの保存が正しく為されたときにだけ一瞬光る赤LEDを設けた。このLEDが毎秒光っているのを見ることで,私はひとまず安心することができるというわけだ。

photo

Amazonより。ピン数を減らすためのI2C通信変換モジュール(裏の黒い部分)とセットになったものを買うと良い

また機器全体の操作には,SDカードの不正な書き込み終了を避けるために2重のスイッチを使うことにした。
すなわち,マイコンに電源を投入し,センサー,RTC,SDカードモジュールを起動する主電源スイッチ,もう1つは,空気回路のポンプとSDカードへの書き込みを操作するスイッチ。測定が終わったら,SD書き込みスイッチを切り,"安全に書き込み終了"の表示が出てから主電源を落とす。

さらには空気回路のバルブスイッチもあるから,3つのスイッチを操作することになる。

photo

5. はんだ付け

Arduinoとモジュールの接続は,まずブレッドボードという仮配線が簡単にできる道具で試験して,うまくいったらユニバーサル基板できちんとはんだ付けでつなぐ。Arduinoの形に即したユニバーサル基板が市販されていて,これを使うとArduinoの上に被せるようにモジュールの集合を接続することができる。

以下に,結線図と基板上の配置図を載せる。Dxと書いたピンは,プログラム内で任意にピン番号を指定できるピン。

photo

モジュール間の概念的な配線図をユニバーサル基板の穴配置に落としていき,あーでもないこーでもないと配線を変えて,具体的な配線に落としていく作業が私は好きだ。

6. プログラム

さてさて,ArduinoのプログラムはArduinoIDEという環境でコードする。ここで使うArduinoIDE言語はC++をベースにしているらしい。巷にはたくさんの解説記事があるので詳細はそちらを参照されたい。

一般的に,Arduinoのコードには,①変数宣言部,②起動時のみ実行部,③繰り返し実行部,がある。さらに,②③の見た目をスッキリさせるために一定の処理のブロックを関数としてまとめてしまって,コードの末尾に追い出すことがある。すると,①変数宣言部,②起動時のみ実行部,③繰り返し実行部,④関数記述部になる。

photo

この記事を書くなかでプログラムにバグが見つかったので修正中...
でき次第,コードを掲載します

7. 筐体

各モジュールごとに正常に動作しているか試験をし,さらにそれを組み合わせても正常であることがわかったら,いよいよハコに収める。このステップができて初めて,「Arduino使って野外調査しちゃう系研究者」の末席にチョコンと正座することができるのである。

とはいえ私はなんちゃってなので,耐候ボックスにネジとスペーサーで固定,などといった技は使えない。タッパーにハンダこてで開けた穴に通した細い針金で固定する。これで済むなら安く上がって良い。

photo

はんだ付けされ,組み上がった測定器をタッパーのなかに3次元的に収める。この作業はちょっとした断線や接触不良のような現実世界のエラーと向き合わなくてはならず,正直なとこ苦手である。