LoginSignup
1
0

More than 5 years have passed since last update.

GROVE multichannel gas sensor calibration

Last updated at Posted at 2018-03-05

GROVE の Multichannel Gas sensor を使ってみています。どうやらうかつに calibration はやらないほうがいいみたい。プロダクトページの冒頭に「精確な測定はできません。値はガスの傾向を示しています」と書かれているので、数字そのものを信じないほうがよさそう。ただし calibration をすると、出てくる数字は少しまともっぽくなる様子。

いつやるか

Seeed のドキュメントには「値があやしそうなときは~」と書かれているけれど、「新しい環境では常にやるべし」と書いている人もいる(参考)。ただ、環境整えるのは結構ハードル高い気がする。

私は Calibration しようと思う前は、パッケージ開封した初期状態のままでしばらく計測していた。しかしどうも NO2 が高すぎておかしい、あるいは、アルカン類(CH4, C3H5, C4H10)の数字の並びが不自然に思えて、適当にCalibration することにした。

手順と注意点

Calibration の手順は大まかには、センサーの出力する値が安定するところまで待って、平衡状態の数字をプリセット値に書き込むということの様子。空気が少なすぎてもだめだけど、風がびゅーびゅー吹く環境もあまり適切ではなさそう。

Calibration は github のリポジトリexamples/calibration にある Arduino スケッチで行う。公式には Ardunino Uno と Seeeduino が挙げられているけれども、要件は I2C で通信することで、esp8266 でも構わなかった。ここでは Wio-Node で行う。ところでヒーターの都合上本当は 5V 電源駆動が良いという噂もある。

ピン配置を確認する。UART 側はファームウェアを書き込むのに使う。esp8266 arduino にする Wio-Node では、I2C1 側が IO4, IO5 になっている。Arduino Uno では A4(SDA), A5(SCL) になっているので、ガスセンサはそのまま I2C1 側に取り付ければよい(ドキュメント)。

esp8266 は IO15 で周辺回路に電源を供給するかどうかを制御しているので、起動直後にピン設定を行う。センサーは MiCS6814 チップだけれども、通信の際に見えている I2C は、実際はセンサボード上のマイコンが解釈している。そのためセンサボード側のマイコンが起動するまで、delay を入れるのがよいだろう。

void setup(){
  pinMode(15, OUTPUT);
  digitalWrite(15, LOW);
  delay(1000);
  digitalWrite(15, HIGH);
  delay(5000);
  // 以下続く

Calibration に先立って、まず examples/ReadSensorValue_Grove を書き込んで、値が読み出せることを確認しておく。

また examples/factory_setting を一度実行して、出てくる数字を書き留めておくこと。最悪この値を書き戻すと元の戻ることができる。

examples/GetVersion はセンサボード上のマイコンが EEPROM の特定の値を読み出せた場合に Version2 と認識され、それ以外の場合は Version1 とみなされるようになっている。

examples/calibration において Version2 になると処理フローが大幅に変わるので、ここは確実に Version2 と認識してから各種処理を行ったほうがよい。進行状況はシリアルモニタに現れるので、確認しておく。最後は Calibration ok と出て終了する。

資料

プロダクトページに「回路図」「センサチップのデータシート」「コード」へのリンクがある。

データシートによると、センサーのヒーターは 5V 駆動時点での抵抗値が載っている。回路図によると 3.3V 駆動に合わせて抵抗値が変更されている。

センサボード上のマイコンは ATmega168 だけれど、examples/new_firmware によると、単純に ADC の値を I2C に乗せたり、EEPROM の読み書きを I2C 越しにできるようにしているだけになっている。つまり、ほとんどの処理は I2C で読み出した後の MutichannelGasSensor.cpp で行っている。

データシートにも書いてあるけれど、結局センサーは 3 つ入っている。コードを見ると、それぞれのセンサーからの値を読み替えている。実際の空気は混成されているので、この値の取り扱いは注意が必要になる。それぞれのガスが単品で高濃度で出るとわかっているときに使うと効果的ということか。

sensor variable gas
NH3 ratio0 NH3 C3H8 C4H10
RED ratio1 CO CH4 H2 C2H5OH
OX ratio2 NO2

プロダクトページには calibration 時に air condition is fresh にせよと軽く書かれているが、データシートの数値は synthetic air であり、要するに N2 と O2 の「合成空気/人工空気」の環境内で計測した数値が書かれている。正しい R0 の値はこの環境で測定したものを使うべし。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0