By David Peaslee

危険レベルの CO を知らせる CO (Carbon Monoxide) 検出器を作るには、ガス センサー、Arduino(または他のマイクロコントローラー)といくつかの抵抗があれば十分です。 オペアンプを追加すれば、環境中に存在するCOの量を測定するための感度を上げることができます。 この知識を発展させれば、自分自身で大気質のモニタリングステーションを作り、地元の気象台が報告するレベルと自分の家の裏庭を比較することができます。

必要な材料

  • 1 Arduino Uno
  • 1 マルチメーター (DMM)
  • 1 各種ジャンパー線付きのブレッドボード
  • 2 抵抗 10 kΩ
  • 1 抵抗 100 kΩ
  • 1 SPEC CO Gas Sensor (Digi-Key Part Number。以下同じ) 。 1684-1000-ND)

プロジェクトストーリー

ガスセンサ会社で働いていたとき、空気の質を測定する多くの素晴らしいアイデアを持つスタートアップ企業と一緒に仕事をしました。 いつの日か誰もが携帯電話やコンピュータにガスセンサーを搭載できるようになることを心から願っていますが、今は、一般のユーザーが自分で空気のモニタリングシステムを構築できるようにしたいと考えています。

  • 電気化学式ガスセンサには、2電極式と3電極式の2つの基本的なタイプがあります。 どちらも基本的な動作原理は同じです。 ガスがセンサーの中に拡散し、作用電極に到達します。 そこでガスは触媒と反応し、イオン(荷電分子)を生成する。 これらのイオンは電解質(電池の酸に似ていることもある)の中を移動し、対向電極で再び反応し、電子が解放(または収集)されて回路内を移動する。 反応させるガスと触媒によって、電子はどちらの電極にも流入したり流出したりする。 この電子の流れ(電流)を測定することで、1秒間にどれだけの粒子が反応するかを知ることができます。
  • 第三の電極(参照電極)を追加すると、参照電圧と動作電圧の間に一定の電圧差を作り出すことができます。 これがバイアス電位と呼ばれるものです。 例えば、基準電圧が1.25Vで、動作電圧が1.35Vの場合、バイアスは+100mVと言います。 化学反応は1.25Vと1.35Vには関係なく、作用電極に+100mVの電位があることだけが問題なのです。 この電気化学セルにはもっとたくさんのことが書かれていますが、始めるにあたって本当に必要なことはこれだけです。
  • 最後に、PPM(parts per million)とは、濃度を表す基準の一つです。 たとえば、1ppm は、存在するガスの全粒子 100 万個あたり特定のガスの粒子 1 個です。

SPEC Sensor - Carbon Monoxide

図 1. 2電極構成で接続された3電極のガスセンサ。 (画像提供:SPEC Sensors)

免責事項1:ご注意ください。 これから、加圧された一酸化炭素ガスで行ったテストの結果をお見せします。 COの小型ボンベはネットで入手できますが、致死量です。 プロジェクトでCOを使うことを決める前に、このことについて読んでおくべきです。1 免責事項2:COの代替源を見つける必要がある場合、タバコは吸い込んだ流れに約300ppmのCOを発生させます。

How-to

基本的なガスセンサープロトタイプの設定.

Figure 2. ガス センサの基本的なプロトタイプのセットアップ。 (画像提供: SPEC Sensors)

Part 1 – Basic sensor setup

最も基本的な回路から始めて、センサー、10 kΩ 抵抗、マルチメーターだけで測定する方法を紹介します。

i. ラベルの付いていない2本のピンをカットし(図2参照)、ブレッドボード上のセンサを中央に配置します。

ii. 短いジャンパーを使用して、RとCピン(カウンターとリファレンス)を短絡させます。 別の短いジャンパーを使用して、W1ピンとW2ピンを短絡させます(ピンはPCB上ですでに短絡しているため、これは電流の経路を増やすだけです)

iii. マルチメーターのプラスリードをセンサーのR/C側に接続します。 マルチメーターのマイナス側をセンサーのW1/W2側に接続します。

iv. 最後に10kΩ抵抗(R1)を使用して、R/CピンをW1/W2ピンに接続します。

この時点で、センサをテストする準備ができています。 マッチや煙でも構いませんが、密閉された容器に入れるとより効果的です。 パイレックス/ガラス製の皿で、上部が密閉されたものが効果的です。 マッチに火をつけてから息を吹きかけ、それをセンサーの入った皿に入れてみてください。 電気配線を通すために穴を開ける必要があるかもしれません。 私の装置では、200ppmのCOを毎分約100立方センチメートルの速度で流しましたが、これはかなり遅い速度です。 図3に示すように、センサーにはマルチメーターしか接続されていない

CO センサーのセットアップ(マルチメーターのみ接続)

Figure 3. 出力を表示するためにマルチメータのみを接続したCOセンサのセットアップ。 (画像提供: SPEC Sensors)

必要な計算:

期待できる測定値は、セットアップとセンサーの感度に依存します。 この 2 電極モードでは、感度が約半分となるため、センサが 4.0 nA/ppm と表示した場合、約 2 nA/ppm となります。 mVをppmに変換するには、オームの法則を用います。 電圧 (V) = 電流 (A) x 抵抗 (Ω). 例えば、

図3のセットアップでは、ガスがない状態で0.2 mVから始まり、約200 ppmがボックス内に流れ込み、通気口から外に出た状態で4.8 mVで終わります。 その時の電圧差は4.6mVです。 抵抗R1は10kΩなので、電流は0.0046V/10,000Ω、つまり460nAとなります。 ppmを求めるには、測定した電流を感度で割ると、460 nA / ~2 nA/ppmで、230 ppmとなる。 これは、私が箱に入れた値、200ppmにかなり近い。 新しい感度を計算するには、mVとppmを使用します。 新しい感度は、4.6 mV/200 ppm または 0.23 mV/ppm です。

図 4 は、電流が回路を通過する方向を示しています。 端子AはDMMのプラス側リード、端子Bはマイナス側(コモン)リードです。 作用電極で電子を使い切り、対極/参照電極で電子を生成していることが想像できます。 もしセンサーのリード線が逆に入っていたら、代わりにマイナスの電圧を測定することになります。

 センサーセットアップにおける電流の流れる方向

図4. センサーのセットアップにおける電流の流れる方向。 (画像提供:SPEC Sensors)

Part 2 – Advanced sensor setup

さて、このプロジェクトに Arduino Uno を組み込んでいきます。 Arduino Unoの制限を克服するために、いくつかの変更を加えますが、実際には、マルチメータと同じ方法で接続できます。 プラス側はアナログピンA0とセンサーのR/Cピンを接続し、マイナス側はGNDとセンサーのW1/W2ピンを接続することになります。 これで、analogRead()を使って、センサーと抵抗R1にかかる電圧を測定します。

ArduinoのADCの注意点:

上の計算から、1ppmで0.23mVの電圧が発生することが分かります。 これはArduinoの10bit ADCにとって問題で、Unoの最小分解能は4.88mV(5V/1024レベル)だからです。

最初の改善策は、アナログ基準を内部基準の1.1Vに変更することです。 これにより、最小分解能が4.7ppmになり、より改善されます。 これについては、https://www.arduino.cc/en/Reference/AnalogReferenceにある説明をお読みください。 次の修正は、平均化を実装することです。 analogRead()の最大読み取り速度は1秒間に10,000回です。 この読み取りの束を1秒間に256回と平均化すれば、かなり分解能が向上します。2

UH-OH MOMENT

最後に、分解能を上げたことで、ArduinoのADCでゼロが0Vでなくなったことが分かると思います。 これを解決するには、そのゼロ電圧(ゼロ電流の意味)をADCで読み取れる高い値に持っていく必要があります。 ここでは、100kΩと10kΩの抵抗を追加して、ボルテージラダーを実装します。 センサーから発生する電流がゼロのとき、2 つの新しい抵抗の間の電圧を測定します。 抵抗に流れる電流は3.3 V/ (100,000 +10,000 Ω)、すなわち30マイクロアンペアとなります。 つまり、新しい2つの抵抗の間で、10,000Ω×30マイクロアンペア、0.3ボルトを測定することになります。 このボルテージラダーは30マイクロアンペアを使用しますので、バッテリーの寿命のために電力を節約したい場合は、100kΩの抵抗の値を大きくしてみてください。 これで、新しいゼロ電圧は0.3ボルト近くになり、これより上はCOガスが抵抗R1に電圧を発生させるためです。

Arduino ボード

によるCOセンサープロトタイプ。 ArduinoボードによるCOセンサーのプロトタイプ。 (画像提供: SPEC Sensors)

では、最後の例として、このセットアップで 0.355 ボルトを測定しています。 まず、ゼロ電圧の 0.3 V を差し引くと、0.055 V または 55 mV になります。 ここで、新しい感度 0.23 mV/ppm で割ると、240 ppm の CO を測定していることになり、これは長時間呼吸するのには危険なレベルです。 図 6 は、Arduino、いくつかの抵抗、センサー、およびいくつかの平均化で可能なことを示したものです。 次のステップは、センサーを3電極構成にして、安定性を高め、信号を増幅させることです。 そのための部品は、デュアルオペアンプ、または2つのデュアルオペアンプと、いくつかの抵抗器です。

Arduino センサーセットアップのデータ平均化出力

Figure 6. データの平均化を伴う Arduino センサー セットアップの出力。 (画像提供:SPEC Sensors)

今後の記事では、3電極回路やこれらのセンサーのデジタル版を使用するなど、他のプロジェクトも紹介する予定です。 このプロジェクトで使用した Arduino コード:

Copy Code

/*
Analog input, Serial output
Reads an analog gas sensor at pins A0,
Also prints the results to the serial monitor.
The circuit:
Gas sensor pin W (Working) connected to middle of resistor ladder (I used 10k and 100k).
Gas sensor C (counter) and R (reference) connected together and then jumped to analog pin A0.
10 kOhm resistor between W1/W2 and C/R.
created 01 Jul. 2017
by David Peaslee
*/
// these constants won't change. They're used to give names to the pins used:
const int analogInPin = A0; // Analog input pin that the sensor is attached to
const int resValue = 9700; // Value of 10kOhm resistor !change this to match your resistor
const float Vref = 1.1; //This is the voltage of the internal reference
const long int cOff = 68286; //286mV offset due to resistor ladder. Try taking the average of a long
//measurement of the counts without a sensor in place. This should give a good Zero.
const float Sf = 2.11; // sensitivity in nA/ppm,
//this is roughly about 1/2 the sensitivity of the barcode on the sensor. Try finding a known
//concentration of CO to measure, or just approximate.
const int extraBit = 256; //Number of samples averaged, like adding 8 bits to ADC
long int sensorValue = 0; // value read from the sensor
float currentValue = 0; // current read from the sensor
void setup() {
// initialize serial communications at 9600 bps:
Serial.begin(9600);
// !!!set analog reference to 1.1 Volts!!!
analogReference(INTERNAL);
}
void loop() {
// read the analog in value:
sensorValue = 0;
for (int i = 0; i < extraBit; i++) {
sensorValue = analogRead(analogInPin) + sensorValue;
delay(3); // needs 2 ms for the analog-to-digital converter to settle after the last reading
}
sensorValue = sensorValue - cOff; //subtract the offset of the resistor ladder * 256.
// print the results to the serial monitor:
Serial.print("PPM = ");
Serial.print( ((float) sensorValue / extraBit / 1024 * Vref / resValue * 1000000000) / Sf);
Serial.print("\tnA = ");
Serial.print( (float) (sensorValue) / extraBit / 1024 * Vref / resValue * 1000000000);
Serial.print("\tCounts = " );
Serial.println(sensorValue);
//Trying to make each loop 1 second
delay(218); //1 second – 3ms*256ms (each adc read)-14ms (for printing)= 218ms
}

各種 ULP センサーで動作するその他の Spec Sensor ライブラリについては、GitHub のこのリンクをご覧ください。 https://github.com/SPEC-Sensors/ULPSM

Articles

コメントを残す

メールアドレスが公開されることはありません。