HANWAEI製のガスセンサーMQ-4とMQ-7をArduinoでガス量を測定し、測定結果をXBeeでワイヤレス送信するガス警報器を製作します。メタンガス(CH4)と一酸化炭素(CO)の2つのセンサーで都市ガスのガス漏れや不完全燃焼を知らせます。
この情報を用いて製作したガス警報器は生命や安全に関わる用途には使用できません。万が一の時に鳴らなかったとしても、当方は、一切の責任を負いません。
ガスセンサには反応するガスの種類によって様々なタイプがあります。また目的のガス以外も検出します。使い方もセンサーの種類によって異なります。測定結果をppmなどに換算するためには変換式が必要です。さらに初期値を校正する必要があります。校正には専用の設備が必要になるので実験的には省略せざるを得ないと思います。なお、正しい測定が必要な場合は市販の測定器を使用します。
まずは測定したいガスを決めるところから始めます。下表は市販のガスセンサーの種類です。あまり一覧表になっているサイトがないので作成しました。
センサ名 | 型番 | 参考価格 | 対応ガス
LPG・煙センサー
| MQ-2
| 924円
| 天燃ガス、液化石油ガス、人工的なガス、煙
| アルコールセンサ
| MQ-3
| 639円
| アルコール、ベンジン
| メタンガスセンサ
| MQ-4
| 639円
| メタンガス、プロパンガス、ブタンガス
| LPG液化石油ガスセンサ
| MQ-5
| 639円
| LPG液化石油ガス、天燃ガス、都市ガス
| LPG液化石油ガスセンサ
| MQ-6
| 639円
| LPG液化石油ガス、ブタンガス、LNG
| 一酸化炭素ガスセンサ
| MQ-7
| 820円
| 一酸化炭素
| 水素ガスセンサ
| MQ-8
| 890円
| 水素ガス、アルコール、LPG、煙
| |
今回はこの中から(一般的なガスセンサーで必要と考えられる)一酸化炭素用(MQ-7)とメタンガス用(MQ-4)を選びました。ご契約のガスにプロパンガスを使用している場合はメタンガス用(MQ-4)よりもLPG液化石油ガス用(MQ-5やMQ-6)の方が良いでしょう。
下図はそれぞれの写真です。左側の赤いプラスチック製の方が一酸化炭素用で、右の金属性の方がメタンガス用です。
ガスセンサを選ぶときのポイントは@検出可能なガスの種類、A検出したくないガスの種類、B使い方の3つです。@は言うまでもありませんが、見落としがちなのはAです。例えば、台所のガス漏れ検出を行いたいのにアルコールや煙に反応してしまうと使い物になりません。それぞれのガスの濃度とセンサー抵抗値の関係がセンサーのデータシートに記載されています。
グラフを見るポイントは2つあります。一つ目は検出したいガスのグラフの傾きです。グラフの傾斜が大きいほど、濃度に対しての反応が高い、つまり高感度であることが分かります。
2つめは検出したいガスと検出したくないガスのセンサー抵抗値の範囲の差です。それぞれの全濃度の抵抗値の範囲について重複が無いかを確認します。それぞれのガスの濃度は同じではありませんので、一点の濃度で確認しても意味が無く、全濃度の範囲で考えなけれなりません。例えば1000ppmの部分ではメタンCH4と水素H2との間に差がありますが、H2が5000ppmに達するとCH4が100ppmと同じ抵抗値を示してしまいCH4の測定に影響することが分かります。検出したくないガスが10000ppmを超える場合を考慮するかどうかは、このセンサの目的にもよると思います。(実験レベルでは不要と思います。)
これらのセンサーは意外と消費電力が大きいです。また発熱も多く、最初に電源を入れた時は部品を壊したかと思うような臭いも放ちます。一酸化炭素センサーは約350mWです。5Vで70mAですが電源回路は150mAを電圧降下なし(4.9V以上)を保つ必要があります。発熱を抑えるために60秒間、熱して、90秒、冷やすというサイクルを繰り返す必要で、そのための外付け回路も必要になります。メタンガスセンサーは750mWと大きいです。消費電力の多くはセンサーを温めるためのヒーターの電力です。電源を入れてから24時間以上経たないと正しい値にならないようなので、通常は定められた条件で動かしっぱなしにするのが無難です。
ボクが製作に取り掛かった時点では安価なArduino用ユニバーサル基板が市販されていませんでした。2013年08月に秋月電子通商から「Arduino用ユニバーサル基板」が1枚200円の安価で売られるようになりましたので、そちらを使用するのが良いでしょう。(Arduino用ユニバーサル基板を自作したい方はArduino用のシールドを作成するを参照ください。)
下図は製作例です。きのこが3本ほど生えているような形になっています。ケースに入れた時にセンサーやブザーが露出するように考えたのと、センサーが高価なので取り外せるようにソケットで受けているので、余計に高さが増しました。左側はXBeeモジュールです。秋月の「XBee用2.54mmピッチ変換基板」を使ってユニバーサル基板に接続します。
センサーやブザーはピンソケットに接続するようにしました。一番右にメタンガスセンサ、中央付近に一酸化炭素センサ、右上にブザーを装着するようにしています。またセンサーの電源をオフにできるようにスイッチもつけています。スイッチの右側がセンサー出力信号用の負荷抵抗です。一酸化炭素ガス用が10kΩ、メタンガス用が22kΩです。
上部の中央付近のMOS FET(2N7000)とゲート入力抵抗(1kΩ)、プルダウン抵抗(10kΩ)、コンデンサ(0.1uF)は一酸化炭素センサの電源制御用の部品です。5V供給と1.4V供給の切り替えを行いつつ、1.4V供給時はArduinoのPWM出力で電圧を生成しています。なので、ソフトを入れていない状態でArduinoを動かしたり、Arduinoが暴走したりするとセンサーが壊れてしまいます。
ブザーの真下にあるのはArduinoのポート保護のためのダイオードと抵抗です。本機に衝撃が加わった時に圧電ブザーが発電してマイコンを壊してしまうのを防止します。
以上の説明だけで、ほぼ回路図が分かると思いますが、念のためにパターン面も掲載しておきます。ANALOG IN A0に一酸化炭素ガスセンサ、ANALOG IN A1にメタンガスセンサ、Digital 11にCOガスの電源制御(PWM)、Digital 2にブザーを接続しています。
次にXBee PRO ZBモジュールの接続を行います。モジュールは「PRO」を使用します。前述のとおりガスセンサが電流を多く消費するのでACアダプタでの駆動が必須です。ACアダプタで駆動する機器は、例えセンサ機器であったとしてもXBee PRO ZBモジュールを使用し、「Router」もしくは「Coordinator」として動作させた方が全体のシステムとしてバランスが良くなる場合が多いです。ここでは「Router」として使用します。
秋月の「XBee用2.54mmピッチ変換基板」を経由し、XBeeのDOUT(XBee Pin 2)とDIN(XBee Pin 3)をそれぞれArduinoのRX(DIGITAL 0)とTX(DIGITAL 1)に接続します。但し、Arduinoは5V動作でXBeeは3.3V動作なので電圧変換が必要です。そこで、DIN(XBee Pin 3)とTX(DIGITAL 1)との間に小信号ダイオード1N4148などを挿入しました。ダイオードは信号の流れと逆方向、すなわちアノード(A)側をXBeeのDIN(XBee Pin 3)にカソード(K)側をArduinoのTX(DIGITAL 1)に接続し、XBeeをプルアップします(XBee側は初期状態でプルアップされています。)。
他にリセットボタンやコミッショニングボタンもあったほうが便利です。これらのボタン用にタクトスイッチをXBeeのRESET端子(XBee Pin 5)とGNDとの間に入れます。ArduinoとXBee(XBee Pin 5)の両方のRESET信号を一つのスイッチで共用する方法もあります。この場合はダイオードによる電圧変換をXBee側に入れる必要があります。
最後にArduinoの製作についての説明です。前述のとおりガスセンサーは消費電力が350mW+750mWと通常のArduinoの電源では発熱が大きくなって今します。そこで、ArduinoのACアダプタ用DC入力から5Vを生成するレギュレータ部にRECOMのスーパー3端子レギュレータR-78E5.0-0.5を使用します。本レギュレータはDCDCコンバータなので消費電力が大きい回路であってもレギュレータ部の発熱を抑え、消費電力を低減することが出来ます。
例えば、本サイト内の「秋月電子 Arduino互換ボードの使い方」で紹介しているArduino互換機であれば、IC2と書かれた5Vレギュレータをスーパー3端子レギュレータに置き換えて使用します。
下図にその製作例を示します。なお、普段はUSBシリアル変換モジュールAE-UM232Rを使用しないので脱着式としたり、不要なLEDやリセットスイッチなども省略しました。(但し、AVRマイコンへArduinoブートローダやスケッチを書き込むのにUSBシリアル変換モジュールAE-UM232Rは必要です。)
#define/Pin | Arduino | 備考
PIN_CO
| ANALOG IN A0
| 一酸化炭素ガスセンサ
| PIN_CH4
| ANALOG IN A1
| メタンガスセンサ
| PIN_CO_VSS
| Digital 11
| COガスの電源制御(PWM)
| PIN_BUZZER
| Digital 2
| ブザー
| PIN_LED
| Digital 13
| 動作確認用LED
| RX
| Digital 0
| XBee DOUT(2)へ
| TX
| Digital 1
| XBee DIN(3)へ(電圧変換)
| |
ガスセンサ部 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
部品名 | 参考価格 | 数量 | 取扱い | 備考
一酸化炭素ガスセンサ | MQ-7 820
| 1
| スイッチサイエンス
| Sparkfun製の変換基板つき
| メタンガスセンサ | MQ-4 639
| 1
| スイッチサイエンス
| Sparkfun製の変換基板つき
| 圧電スピーカー(圧電サウンダ) | PKM13EPYH4000-A0 30
| 1
| 秋月電子
| 4KHz用
| 片面ガラス・ユニバーサル基板 | Cタイプ(72x48mm) 60
| 1
| 秋月電子
| 基板の端の方までランドがあるタイプ
| MOS-FET Fairchild 2N7000
| 20
| 1
| 秋月電子
| 10個入り200円で販売
| 抵抗1/8W 10k
| 10
| 1
| 各社
| 一酸化炭素センサ出力信号の負荷
| 抵抗1/8W 22k
| 10
| 1
| 各社
| メタンガスセンサ出力信号の負荷
| 抵抗1/8W 1k
| 10
| 1
| 各社
| FETのゲート入力抵抗
| 抵抗1/8W 100k
| 10
| 1
| 各社
| FETのゲート入力プルダウン
| 抵抗1/8W 100
| 10
| 1
| 各社
| 圧電ブザー保護用の直列抵抗
| コンデンサ 0.1uF
| 10
| 3
| 各社
| センサ電源用、FET用
| 保護ダイオード 1N5231B
| 10
| 1
| 各社
| 5.1V用
| 小型スライドスイッチ1回路2接点
| 25
| 1
| 秋月電子
| 4個入り100円で販売
| ピンヘッダ オスL型 1X40
| 50
| 29/50
| 秋月電子
| 必要な長さ(13+8+8)に切断して使用
| 丸ピンICソケット シングル40P
| 100
| 8/40
| 秋月電子
| 必要な長さ(2+2+2+2)に切断して使用
| 分割ロングピンソケット(42P)
| 80
| 3/42
| 秋月電子
| 必要な長さ(3)に切断して使用
| ワイヤレスXBee部 部品名
| 参考価格
| 数量
| 取扱い
| 備考
| XBee PRO ZBモジュール | Wireアンテナタイプ 2800
| 1
| 秋月電子
| PCBアンテナタイプは使用不可
| XBee用2.54mmピッチ変換基板
| 300
| 1
| 秋月電子
| ピンヘッダ、ソケット付属
| 小信号ダイオード 1N4148
| 5
| 2
| 秋月電子
| シリアル信号の電圧変換用
| タクトスイッチ
| 10
| 2
| 秋月電子
| リセット用(XBee_pin 5)
| Arduino部 部品名
| 参考価格
| 数量
| 取扱い
| 備考
| ATMEGA168/328用 | マイコンボード 150
| 1
| 秋月電子
| 書込みにAE-UM232Rが必要
| AVRマイコン | ATMEGA 328P-PU 250
| 1
| 秋月電子
| 書込みにAE-UM232Rが必要
| スーパー3端子レギュレータ | 5V500mA R-78E5.0-0.5 250
| 1
| 秋月電子
| DCDCコンバータ内蔵
| 丸ピンICソケット28ピン(600mil)
| 100
| 1
| 秋月電子
| AE-UM232R接続用
| 水晶振動子16MHz
| 50
| 1
| 各社
| 秋月にて5個入り200円
| 電解コンデンサ 100uF16V
| 20
| 1
| 各社
| 低背型(高さ5mmなど)
| 積層コンデンサ 0.1uF
| 20
| 4
| 各社
| 電源用など
| コンデンサ 22pF
| 10
| 2
| 各社
| 水晶振動子の整合用
| 抵抗 1kΩ
| 5
| 3
| 各社
| ダンピング用など
| 温度ヒューズ
| 10
| 1
| 各社
| 遮断値はACアダプタに合わせる
| ACアダプタ 7.5V〜9V程度
| 600
| 1
| 各社
| 9V 350mA以上
| |
#include <xbee.h> #include <LiquidCrystal.h> #include "pitches.h" #define ALERT_CO 300 // 警報音を鳴らすCOガス量 #define BEEP_CO 200 // 検出音を鳴らすCOガス量 #define ALERT_CH4 200 // 警報音を鳴らすCH4ガス量 #define BEEP_CH4 100 // 検出音を鳴らすCH4ガス量 #define PIN_LED 13 // Digital 13に動作確認用LEDを接続 #define PIN_BUZZER 2 // Digital 2にブザーを接続 #define PIN_CO 0 // ANALOG IN A0に一酸化炭素ガスセンサ #define PIN_CH4 1 // ANALOG IN A1にメタンガスセンサ #define PIN_CO_VSS 11 // Digital 11にCOガスのVSS側 #define PIN_CO_PWM 75 // COガスセンサVSS側のPWM値 #define CO_Ro 2 // COガス100ppm時のセンサ抵抗値[kΩ] #define CH4_Ro 10 // メタン1000ppm時のセンサ抵抗値[kΩ] LiquidCrystal lcd(8, 9, 4, 5, 6, 7); byte trig=0; // COガスセンサの測定状態 byte buzzer=0x00; // ブザー状態 unsigned long time; // 現在の時間 unsigned long time_next; // 次回の測定状態変更時間 boolean time_ovf = false; // 桁上がり状況のフラグ int val; // CH4,COガスの読み取り値 byte dev[]={0,0,0,0,0,0,0,0}; // XBee親機アドレス(全てゼロ) void setup(){ byte i,j=0; pinMode(PIN_CO_VSS,OUTPUT); // COガス用の電源ポートを出力に設定 digitalWrite(PIN_CO_VSS,LOW); // 出力を 0V に設定 lcd.begin(16, 2); // LCDのサイズを16文字×2桁に設定 lcd.clear(); // 画面消去 lcd.print("Gas Sensors"); // 文字を表示 xbee_init( 0x00 ); // XBee用COMポートの初期化 lcd.setCursor(0, 1); // 液晶の2行目に移動 lcd.print("Commissioning"); // 文字を表示 while( xbee_ping(dev) == 0xFF ){ // ping応答を確認 while( xbee_atai() > 0x01 ){ // ネットワーク参加状況を確認 for(i=0;i<4;i++){ tone(PIN_BUZZER,NOTE_A7,20); // ペアリング中を表す音を鳴らす delay(500); } xbee_atcb(1); // ネットワーク参加ボタンを押下 j++; if(j>10){ j=0; xbee_atcb(4); // ネットワーク初期化 } } } xbee_from(dev); // ping応答のあったアドレスを保存 time_next = millis() + 1000; // 1秒後にCOガス測定状態を変更する } void loop(){ byte i; float co=0; // COガスの測定値 float ch4=0; // CH4ガスの測定値 char s[40]; // 送信用の文字列 XBEE_RESULT xbee_result; // 受信データ(詳細)用の変数の定義 time= millis(); digitalWrite(PIN_LED,HIGH); // 動作LEDの点灯 if( time_ovf && time < 1000 ) time_ovf=false; // timerリセット(50日に一度)処理 if( time > time_next && !time_ovf){ // 状態変更時刻になった時 switch(trig){ case 0: // 測定の実行 val = analogRead(PIN_CO); // 一酸化炭素ガスセンサの値を取得 co = pow(10,2.0-1.7*log10(10*(1023/(float)val-1)/CO_Ro)); digitalWrite(PIN_CO_VSS,HIGH); // COガスの電源を 5V に設定 time_next += 60000; // 60秒後に設定 if( time_next < 60000 ) time_ovf = true; trig=1; // 測定後に60秒の過熱を実行 break; case 2: // 測定待ち analogWrite(PIN_CO_VSS,PIN_CO_PWM); // COガスの電源を 1.4V に設定 time_next += 90000; // 90秒後に設定 if( time_next < 90000 ) time_ovf = true; trig=0; // 加熱後に90秒の冷却を実行 break; } } val = analogRead(PIN_CH4); // メタンガスセンサ読み取り ch4 = pow(10,3.0-2.7*log10(22*(1023/(float)val-1)/CH4_Ro)); /* CH4の表示 */ lcd.setCursor(0, 1); // 液晶の2行目に移動 lcd.print("CH4="); // 液晶に文字を表示 if( ch4 < 10 ) lcd.print( ch4 , 2); // 変数ch4の値を表示 else lcd.print( ch4 , 0); lcd.print("ppm "); // 変数ch4の単位ppmを表示 lcd.setCursor(12, 1); // 液晶の2行目の後方へ移動 lcd.print( (time/1000)%3600 ); // 経過時間を表示 lcd.setCursor(12, 0); // COセンサ加熱状態表示 if( trig == 0 ) lcd.print("COOL"); // ※CO値はtrig=1の時のみの表示 else lcd.print("HEAT"); // につき、XBee通信部内で表示 /* XBee通信 */ if( co >= 10000. ) co = 9999.; if( ch4 >= 10000. ) ch4 = 9999.; sprintf(s, "%04d,%04d", (int)co, (int)ch4 ); // XBee送信用データ作成 if(trig==1){ // COの測定結果がある時(trig=1) xbee_uart(dev,s); // データを送信 trig=2; buzzer=0x00; if(co > ALERT_CO) buzzer=0x01; // COブザーを設定 /* 表示 */ lcd.clear(); // 液晶の画面消去 lcd.print("CO ="); if( co < 10 ) lcd.print( co , 2); // 変数coの値を表示 else lcd.print( co , 0); lcd.print("ppm"); // 変数coの単位ppmを表示 } digitalWrite(PIN_LED,LOW); // 動作LEDの消灯 /* ブザー処理 */ if(buzzer){ // ブザー値が存在する場合 if(buzzer&0x01){ // トグル動作用 if(buzzer&0x10) tone(PIN_BUZZER,NOTE_B7,100); // CH4用ブザー else tone(PIN_BUZZER,NOTE_B7,200); // CO用ブザー buzzer++; }else{ if(buzzer&0x10) tone(PIN_BUZZER,NOTE_G7,100); else tone(PIN_BUZZER,NOTE_G7,200); buzzer--; } }else if(ch4 > ALERT_CH4) buzzer=0x11; // CH4ブザーを設定 else{ if(ch4 > BEEP_CH4) tone(PIN_BUZZER,NOTE_A7,100); if( co > BEEP_CO ) tone(PIN_BUZZER,NOTE_A7,300); } for(i=0;i<50;i++){ // 約500ms間、繰り返し実行する xbee_rx_call( &xbee_result ); // データをxbeeから受信した時 if(xbee_result.MODE==MODE_UART){ if(xbee_result.DATA[0] == 0x1B){ // ESCコードが先頭だったとき if(xbee_result.DATA[1]=='B'){ // コマンドが'B'の時(Beep) buzzer=1; // 警報音を鳴らす if(xbee_result.DATA[2]==0x00){ // 値が0x00の時 buzzer=0; // 警報音を止める } }else if(xbee_result.DATA[1]=='G'){ // コマンドが'G'の時(Get) trig=0; // 次回のloopで測定して送信 } } } } } |
ガスセンサー測定のArduino用スケッチは下記からもダウンロードできます。XBee子機用のサンプルスケッチも含まれています。XBeeつきガスセンサーシールドは、当ページのセンサーシールドの電源とTX、RXを電圧変換してXBeeに接続して製作します。
ダウンロード:Arduino用ガスセンサー測定スケッチ「gas.zip」(2013/5/2->12/1) |
|
本ワイヤレスガスセンサの測定結果が#defineで設定したガス量に達すると警報音もしくは検出音を出力します。これら警報音と検出音はワイヤレスXBee通信とは無関係に出力されるので、ワイヤレス通信が到達しなかった場合であってもセンサを設置した場所に居る人へ警告することが出来ます。
本スケッチは2分30秒に一度の間隔で一酸化炭素濃度とメタンガス濃度を送信します。一酸化炭素濃度の測定時に2分30秒が必要だからです。常に測定可能なメタンガス濃度についても一酸化炭素の測定間隔に合わせて送信します。
フォーマットは一酸化炭素、メタンの順でカンマ「,」区切りの4桁固定の数字を文字として送ります。一例として、「0015,0020」の場合、一酸化炭素が15ppm、メタンが20ppmを表します。
どちらのガスについても9999ppm以上は表現できないので9999ppmとなります。
送信フォーマット |
|
親機はパソコンにXBee USBエクスプローラ経由でXBee PRO ZBモジュールを接続して製作します。XBee PRO ZBモジュールのファームウェアは「ZIGBEE COORDINATOR API」を使用し、PC用のXBeeライブラリの「tools」フォルダ内にあるATコマンド解析ツール「xbee_test.c」をコンパイルしてパソコン上で実行します。親機XBee PRO ZBの「SP値」を20秒以上に設定しておく必要があります。X-CTUで「SP値」を「07D0」以上に設定するもしくは、「xbee_test.c」の動作中に「ATSP07D0」をキーボードから入力して「Enter」を押して設定します。設定をフラッシュに書き込むには設定後に「ATWR」を入力します。
親機の「xbee_test.c」は起動しておくだけで、子機XBeeからの受信があるたびにメッセージを表示します。子機がペアリングされた時には「IDNT」のメッセージを表示し、以降、子機の放射線測定が正しく動作していれば「UART」のメッセージを表示します。
親機にArduinoを用いるのも簡単ですが、このページでは省略します。詳しくは「ArduinoではじめるXBee M2Mネットワーキング」をご覧ください。
このスケッチでは各ガスセンサーの特性グラフに近い近似変換式を使用してppmに変換しています。単純な直線近似なので誤差は大きいと思います。
また一酸化炭素ガス100ppm時とメタンガス1000ppm時の抵抗値をdefineで定義する必要があります。これはガスセンサの個体によって異なる値となります。しかし、実際の100ppm時や1000ppm時の環境を作り出すのが困難につき、設定や校正のしようがありません。そういった環境設備をお持ちの方がいましたら、一個のサンプルの代表例でも結構ですので、当方にも情報を提供していただけるようお願いいたします。
ハードウェアを製作したらテスターなどで各部の導通を確認したうえ、センサーへの電源を供給しない状態でArduinoにソフトを書き込みます。Arduinoのソフトが正しく動作することを確認してからセンサーの電源を入れて測定を開始します。ソフトが動作しているときは、Arduino本体のLED(Digital 13)が0.5秒ごとにフラッシュ点灯しますので、フラッシュ点灯を確認してからセンサーの電源を入れます。
買ったばかりのセンサーは(前述のように)しばらくの間、臭いを放ちます。これが異常なのか正常なのかを直ちに判断する必要がありますので、動作前の回路チェックは普段以上に重要です。
起動すると、自動でZigBeeネットワークへのジョインを行います。ジョインを試みている間はブザー音「ピッ」が鳴り続けます。ネットワークへのジョインが完了するとCoordinatorへ2分30秒に一度の間隔で一酸化炭素ガス「CO」とメタンガス「CH4」の空気中濃度「ppm」を送信します。数値は目安です。それぞれ一定の濃度を超えるとブザー音が鳴ります。
起動しても、しばらくは正しい値が測定できません。冷え切った状態だとブザーが鳴る場合もあります。測定動作はArduino本体のLEDの点滅でも確認できます。
まずはヒーターが動作しているかどうかを確認します。一酸化炭素センサーのヒーターの電圧はセンサーのH1端子とGND端子の間の電圧です。ヒーター加熱中は4.9V〜5.1V、冷却中は約1.4Vとなっていることを確認します。
製作した回路ではMOS FETのON抵抗が大きくて加熱中に4.6Vくらいまで下がってしまうかもしれません。気になる方はON抵抗の小さなFETに交換してください。
センサーとしてのテストに関しては当サイト内の「ガスセンサーの点検・テスト方法」に詳しく解説していますので、ご参照ください。
この製作例では実験用としての利用を想定し、可燃性、防爆性は考慮しておりません。ケースはポリプロピレン製の密閉容器を加工しました。しかし、ポリプロピレンは引火すると良く燃えるので、電気回路や部品が出火した場合、ケースに引火して火災が発生する恐れがあります。例えば、ポリイミドテープのような耐熱性と難燃性を備えた材料を内部に貼り付けて引火しにくくする方法があります。一般的なポリ塩化ビニールテープも難燃性がありますが、耐熱性に乏しいので出火時にテープが溶けてケースに引火してしまうかもしれませんし、センサーのヒーターによって接着剤が溶けて剥がれやすくなると思います。
可燃性のガスが発生するような場所で使用する場合は回路を密閉して防爆性を確保しなければなりません。この製作例ではACアダプタ用のDCプラグ、XBeeアンテナ部、ブザー部、ガスセンサ部などに開口があり、またこれらが防爆対策された部品であるかどうかを確認しておりません。とくにブザー駆動時にガスに引火する可能性も考えられます。適切な計測機器を使用し、引火・爆発に対する許容濃度を十分に下回っていることを確認の上で実験するようにして下さい。
普段、警報器として使用される場合も危険を伴います。何らかの不具合や偶発的な問題でArduinoが停止したり、センサーやブザーが故障したりする可能性があります。シールドやセンサーの接点の接触不良でならない場合もあります。そういった場合に、一酸化炭素濃度の異常やガス漏れを検出できずに事故が発生する危険性は認識をしておく必要があります。
したがって、必ず市販のガス当番などのガス警報器との併用が必要です。製作したものは、市販品の補助的な役割にしてください。例えば、日常の一酸化炭素濃度の履歴から、普段の生活における一酸化炭素中毒に対する危険性を検討するなどの用途に用いることが出来ます。石油ストーブや石油ファンヒータ、ガスファンヒータなどから発生する一酸化炭素に対して、普段から適切な換気が行えているかどうかをチェックするなどの用途です。測定値が誤っていたり警報器が鳴らなかったりしても生命にかかわる事故が発生しないような使い方を想定しています。想定内、想定外を問わず、いかなる事故や損害を被った場合であっても、当方は一切の責任を負いません。
ここではメタンガス用センサMQ4の温度及び湿度の特性を考慮した係数を求めます。湿度が一定の時の係数はデータシートから下図のように直線近似して求めます。グラフは上から順に湿度30%、60%、85%の時のセンサ値(Rs/R0)です。
次に湿度についても同様に近似して、以下の式を得ました。ソースリスト中の「ch4=」の式のlog10の値をこの値で除算すると温湿度を考慮した値が求まります。なお温湿度センサが、ガスセンサにあまりにも近接しすぎると正しく温湿度を測定できないと思いますので、製作時に考慮する必要があります。
この式から分かることは温度や湿度が低いほどRs/ROが高くなる、すなわち除算しなければlog10内の値が高くなりメタンガス濃度[ppm]を低く検出してしまいます。また温度10℃の上昇は湿度20%の上昇とほぼ同等の影響を受けます。環境にもよりますが、通常の居住空間であれば、どちらも概ね同等の影響度と思いますので、もし補正を行うのなら温度と湿度の両方を補正すべきでしょう。
・TECHNICAL DATA MQ-4 GAS SENSOR (HANWAEI ELECTRONICS)
・TECHNICAL DATA MQ-7 GAS SENSOR (HANWAEI ELECTRONICS)
・Arduinoをはじめよう (Massimo Banzi著 船田功訳 オライリージャパン)
・Arduino 日本語リファレンス http://www.musashinodenpa.com/arduino/ref/
・スイッチサイエンス http://www.switch-science.com/ (通販サイト・価格情報)