XBee ZigBee ワイヤレス ガス漏れ・一酸化炭素ガス警報器

by ボクにもわかる地上デジタル

XBeeメインメニューへ
地デジトップへ戻る


ワイヤレス ガス漏れ・一酸化炭素ガス警報器の製作例

はじめに

 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)の方が良いでしょう。
 下図はそれぞれの写真です。左側の赤いプラスチック製の方が一酸化炭素用で、右の金属性の方がメタンガス用です。


ガスセンサ 左=一酸化炭素用 MQ7、右=メタンガス用 MQ4

 ガスセンサを選ぶときのポイントは@検出可能なガスの種類、A検出したくないガスの種類、B使い方の3つです。@は言うまでもありませんが、見落としがちなのはAです。例えば、台所のガス漏れ検出を行いたいのにアルコールや煙に反応してしまうと使い物になりません。それぞれのガスの濃度とセンサー抵抗値の関係がセンサーのデータシートに記載されています。
 グラフを見るポイントは2つあります。一つ目は検出したいガスのグラフの傾きです。グラフの傾斜が大きいほど、濃度に対しての反応が高い、つまり高感度であることが分かります。
 2つめは検出したいガスと検出したくないガスのセンサー抵抗値の範囲の差です。それぞれの全濃度の抵抗値の範囲について重複が無いかを確認します。それぞれのガスの濃度は同じではありませんので、一点の濃度で確認しても意味が無く、全濃度の範囲で考えなけれなりません。例えば1000ppmの部分ではメタンCH4と水素H2との間に差がありますが、H2が5000ppmに達するとCH4が100ppmと同じ抵抗値を示してしまいCH4の測定に影響することが分かります。検出したくないガスが10000ppmを超える場合を考慮するかどうかは、このセンサの目的にもよると思います。(実験レベルでは不要と思います。)


メタンガス用センサ MQ4 の特性グラフ例

意外と消費電力が大きい

 これらのセンサーは意外と消費電力が大きいです。また発熱も多く、最初に電源を入れた時は部品を壊したかと思うような臭いも放ちます。一酸化炭素センサーは約350mWです。5Vで70mAですが電源回路は150mAを電圧降下なし(4.9V以上)を保つ必要があります。発熱を抑えるために60秒間、熱して、90秒、冷やすというサイクルを繰り返す必要で、そのための外付け回路も必要になります。メタンガスセンサーは750mWと大きいです。消費電力の多くはセンサーを温めるためのヒーターの電力です。電源を入れてから24時間以上経たないと正しい値にならないようなので、通常は定められた条件で動かしっぱなしにするのが無難です。

Arduino用ユニバーサル基板

 ボクが製作に取り掛かった時点では安価なArduino用ユニバーサル基板が市販されていませんでした。2013年08月に秋月電子通商から「Arduino用ユニバーサル基板」が1枚200円の安価で売られるようになりましたので、そちらを使用するのが良いでしょう。(Arduino用ユニバーサル基板を自作したい方は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のポート保護のためのダイオードと抵抗です。本機に衝撃が加わった時に圧電ブザーが発電してマイコンを壊してしまうのを防止します。


Arduino用ガスセンサーシールド(部品の実装例)

 以上の説明だけで、ほぼ回路図が分かると思いますが、念のためにパターン面も掲載しておきます。Analog 0に一酸化炭素ガスセンサ、Analog 1にメタンガスセンサ、Digital 11にCOガスの電源制御(PWM)、Digital 2にブザーを接続しています。


Arduino用ガスセンサーシールド(パターン面)

 次に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は必要です。)


Arduino部の製作例

Arduinoポート

ガスセンサーシールドで使用するArduinoポート
#define/Pin Arduino 備考
PIN_CO Analog 0 一酸化炭素ガスセンサ
PIN_CH4 Analog 1 メタンガスセンサ
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以上

ワイヤレスガスセンサーのArduino用スケッチ

ワイヤレスガスセンサーのArduino用スケッチ(2013/12/7)

#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 0に一酸化炭素ガスセンサ
#define     PIN_CH4         1                   // Analog 1にメタンガスセンサ
#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)
  • sample15_gas.ino  : ワイヤレスガスセンサー XBee子機用のサンプルスケッチ
  • gas.ino      : ガスセンサー用スケッチ(ワイヤレス機能なし)
  • pitches.h     : ブザー用の音階定義ファイル(Arduino標準)

警報機能

 本ワイヤレスガスセンサの測定結果が#defineで設定したガス量に達すると警報音もしくは検出音を出力します。これら警報音と検出音はワイヤレスXBee通信とは無関係に出力されるので、ワイヤレス通信が到達しなかった場合であってもセンサを設置した場所に居る人へ警告することが出来ます。

送信フォーマット

 本スケッチは2分30秒に一度の間隔で一酸化炭素濃度とメタンガス濃度を送信します。一酸化炭素濃度の測定時に2分30秒が必要だからです。常に測定可能なメタンガス濃度についても一酸化炭素の測定間隔に合わせて送信します。
 フォーマットは一酸化炭素、メタンの順でカンマ「,」区切りの4桁固定の数字を文字として送ります。一例として、「0015,0020」の場合、一酸化炭素が15ppm、メタンが20ppmを表します。
 どちらのガスについても9999ppm以上は表現できないので9999ppmとなります。

送信フォーマット
  • 9999,9999  :一酸化炭素濃度[ppm]、メタンガス濃度[ppm]の順でカンマ区切りの4桁固定アスキー文字

親機について

 親機はパソコンに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 = (0.00006385×湿度[%]−0.01576)×温度[℃]+(-0.007469×湿度[%]+1.781)
    = (6.385e-5 * hum - 1.576e-2) * temp + (-7.469e-3 * hum + 1.781);

 この式から分かることは温度や湿度が低いほど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/ (通販サイト・価格情報)


地デジトップへ戻る

XBeeメインメニューへ戻る


ガスセンサMQ-4とMQ-7でガス警報器を製作する

秋月電子 Arduino互換ボードの使い方

Arduinoで湿度を測定する

Arduino用液晶シールド

Arduino用Wi-Fi無線LAN

ArduinoとXBeeとの接続