ガスセンサMQ-4とMQ-7をArduinoに接続して
ガス警報器を製作する

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

[Arduino Menu] [XBee Menu] [地デジ Menu]



製作したガスセンサ Shield をArduinoに接続した様子

はじめに

 HANWAEI製のガスセンサーMQ-4とMQ-7を使ってArduinoでガス警報器を製作します。メタンガス(CH4)と一酸化炭素(CO)の2つのセンサーで都市ガスのガス漏れや不完全燃焼を知らせます。
 上図は少し分かりにくいですがArduino用のシールドになっています。ユニバーサル基板にピンヘッダを取り付けてホットメルトで固めています。
 この情報を用いて製作したガス警報器は生命や安全に関わる用途には使用できません。万が一の時に鳴らなかったとしても、当方は、一切の責任を負いません。

ガスセンサーについて

 ガスセンサには反応するガスの種類によって様々なタイプがあります。また目的のガス以外も検出します。使い方もセンサーの種類によって異なります。測定結果を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用のシールドの製作方法について説明します。下図はユニバーサル基板にピンヘッダをハンダ付けした様子です。写真の上側のピンが2本おきになっているのは、作りやすくするためのコツです。この8ピンはユニバーサル基板のグリッドから半分だけ位置をずらす必要があります。つまりランドとランドの真ん中に端子がきます。すべてのピンを斜めに曲げればよいのですが、そうするときれいに並べてハンダ付けするのが難しくなります。そこで8本のうち3本を抜いた5本でハンダ付けしています。


ユニバーサル基板を使ったArduino用シールド

 製作後は部品面側をホットメルトで固定します。その後の製作でピンへの配線のハンダ付けをするたびに溶けますので、ハンダ付け作業中や、作業直後は固まったホットメルトに接触しないように気を付けます。


ユニバーサル基板を使ったArduino用シールド

ガスセンサーシールドの製作

 下図は製作例です。きのこが3本ほど生えているような形になっています。ケースに入れた時にセンサーやブザーが露出するように考えたのと、センサーが高価なので取り外せるようにソケットで受けているので、余計に高さが増しました。左側はXBee搭載用の空き地です。


ガスセンサ Shield (左側の空き地はXBeeを搭載するために確保)

 センサーやブザーはピンソケットに接続するようにしました。一番右にメタンガスセンサ、中央付近に一酸化炭素センサ、右上にブザーを装着するようにしています。またセンサーの電源をオフにできるようにスイッチもつけています。スイッチの右側がセンサー出力信号用の負荷抵抗です。一酸化炭素ガス用が10kΩ、メタンガス用が22kΩです。
 上部の中央付近のMOS FET(2N7000)とゲート入力抵抗(1kΩ)、プルダウン抵抗(10kΩ)、コンデンサ(0.1uF)は一酸化炭素センサの電源制御用の部品です。5V供給と1.4V供給の切り替えを行いつつ、1.4V供給時はArduinoのPWM出力で電圧を生成しています。なので、ソフトを入れていない状態でArduinoを動かしたり、Arduinoが暴走したりするとセンサーが壊れてしまいます。
 ブザーの真下にあるのはArduinoのポート保護のためのダイオードと抵抗です。本機に衝撃が加わった時に圧電ブザーが発電してマイコンを壊してしまうのを防止します。


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

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


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

ガスセンサーシールドで使用するArduinoポート
#define 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

キャラクタ液晶の接続

 測定結果を表示する液晶の配線はDF ROBOT LCD Keypad Shieldと同じです。しかし、液晶シールドを取り付けることが出来ません。したがって、秋月電子で売られているSUNLIKE SSC1602BSLBを使用し、DF ROBOT LCD Keypadと同じ結線( 8, 9, 4, 5, 6, 7)を行います。※Arduino標準ライブラリで使われている配線(12, 11, 5, 4, 3, 2)とは異なります。しかも、ピン11と2はそれぞれセンサー用の電源制御とブザーに使用していますので標準の接続では動作しません。

部品リスト

ガスセンサーシールドで使用する主張電子部品リスト
部品名 参考価格 数量 取扱い 備考
一酸化炭素ガスセンサ
MQ-7
820 1 スイッチサイエンス Sparkfun製の変換基板つき
メタンガスセンサ
MQ-4
639 1 スイッチサイエンス Sparkfun製の変換基板つき
LCDキャラクタディスプレイ
16×2行 SC1602BS-B
500 1 秋月電子 HD44780コンパチブル
圧電スピーカー(圧電サウンダ)
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)に切断して使用

ガスセンサーのArduino用スケッチ

ガスセンサーのArduino用スケッチ(2013/5/2 -> 2013/12/1)

#include 
#include "pitches.h"

#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ガスの読み取り値
float ch4,co;                  // CH4,COガスの測定値

void setup(){
  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");          // 文字を表示
  time_next = millis() + 1000;        // 1秒後にCOガス測定状態を変更する
}

void loop(){
  time= millis();
  digitalWrite(PIN_LED,HIGH);
  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++;
        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;
        break;
    }
  }
  val = analogRead(PIN_CH4);           // メタンガスセンサ読み取り
  ch4 = pow(10,3.0-2.7*log10(22*(1023/(float)val-1)/CH4_Ro));

  if(trig==1){
  // tone(PIN_BUZZER,NOTE_A7,100); delay(200);
  // tone(PIN_BUZZER,NOTE_A7,100);
    trig++;
    buzzer=0x00;
  }
  
  /* 表示 */
  lcd.clear();                  // 液晶の画面消去
  lcd.print("CO =");
  if( co < 10 ) lcd.print( co , 2);        // 変数coの値を表示
  else lcd.print( co , 0);
  lcd.print("ppm");                // 変数ch4の値を表示
  lcd.setCursor(12, 0);              // 液晶の後方へ移動
  if( trig == 0 ) lcd.print("COOLING");
  else lcd.print("HEATING");
  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の値を表示
  lcd.setCursor(12, 1);              // 液晶の2行目の後方へ移動
  lcd.print( (time/1000)%3600 );
  digitalWrite(PIN_LED,LOW);
  
  /* ブザー */
  if(buzzer){
    if(buzzer&0x01){
      if(buzzer&0x10) tone(PIN_BUZZER,NOTE_B7,100);
      else      tone(PIN_BUZZER,NOTE_B7,300);
      buzzer++;
    }else{
      if(buzzer&0x10) tone(PIN_BUZZER,NOTE_G7,100);
      else      tone(PIN_BUZZER,NOTE_G7,300);
      buzzer--;
    }
  }else if(co > 100) buzzer=0x01;          // COが優先
  else if(co >  50) tone(PIN_BUZZER,NOTE_A7,300);
  else if(ch4 > 1000) buzzer=0x11;
  else if(ch4 > 100) tone(PIN_BUZZER,NOTE_A7,100);
  
  /* 待ち時間 */
  delay(500);
}

ダウンロード

 ガスセンサー測定のArduino用スケッチは下記からもダウンロードできます。XBee子機用のサンプルスケッチも含まれています。XBeeつきガスセンサーシールドは、当ページのセンサーシールドの電源とTX、RXを電圧変換してXBeeに接続して製作します。

ダウンロード:Arduino用ガスセンサー測定スケッチ「gas.zip」(2013/5/2->12/1)
  • gas.ino      : 本サイト掲載のガスセンサー用スケッチ
  • sample15_gas.ino  : ワイヤレスガスセンサー XBee子機用のサンプルスケッチ
  • pitches.h     : ブザー用の音階定義ファイル(Arduino標準)

Arduino用ガスセンサーシールド+XBeeワイヤレス通信機能

詳しくは=
XBee ZigBee ワイヤレス ガス漏れ・一酸化炭素ガス警報器

ppmへの変換と初期値(校正値)について

 このスケッチでは各ガスセンサーの特性グラフに近い近似変換式を使用してppmに変換しています。単純な直線近似なので誤差は大きいと思います。
 また一酸化炭素ガス100ppm時とメタンガス1000ppm時の抵抗値をdefineで定義する必要があります。これはガスセンサの個体によって異なる値となります。しかし、実際の100ppm時や1000ppm時の環境を作り出すのが困難につき、設定や校正のしようがありません。そういった環境設備をお持ちの方がいましたら、一個のサンプルの代表例でも結構ですので、当方にも情報を提供していただけるようお願いいたします。

事前確認が重要

 ハードウェアを製作したらテスターなどで各部の導通を確認したうえ、センサーへの電源を供給しない状態でArduinoにソフトを書き込みます。Arduinoのソフトが正しく動作することを確認してからセンサーの電源を入れて測定を開始します。ソフトが動作しているときは、Arduino本体のLED(Digital 13)が0.5秒ごとにフラッシュ点灯しますので、フラッシュ点灯を確認してからセンサーの電源を入れます。
 買ったばかりのセンサーは(前述のように)しばらくの間、臭いを放ちます。これが異常なのか正常なのかを直ちに判断する必要がありますので、動作前の回路チェックは普段以上に重要です。

ソフトウェアの使用方法

 起動すると液晶に一酸化炭素ガス「CO」とメタンガス「CH4」の空気中濃度「ppm」を表示します。数値は前述のとおり目安です。一酸化炭素は150秒ごとに更新します。メタンガスは0.5秒毎です。それぞれ一定の濃度を超えるとブザー音が鳴ります。
 起動してしばらくは正しい値が測定できません。冷え切った状態だとブザーが鳴る場合もあります。測定動作はArduino本体のLEDの点滅でも確認できます。

動作確認の方法

 まずはヒーターが動作しているかどうかを確認します。一酸化炭素センサーのヒーターの電圧はセンサーのH1端子とGND端子の間の電圧です。液晶の1行目の右側に「HEATING」と表示されている間に4.9V〜5.1V、「COOLING」表示の時に約1.4Vとなっていることを確認します。
 とはいっても製作した回路ではMOS FETのON抵抗が大きくてHEATING時に4.6Vくらいまで下がってしまいます。気になる方はON抵抗の小さなFETに交換してください。また、Arduinoの電源レギュレータの性能やバラつきで4.9Vを多少下回ることもあります。

ガスセンサーの点検・テスト方法 ※火気厳禁・換気必須・屋外実施

 一酸化炭素ガスセンサーの動作確認は安全性を配慮すると少し難しいので、まずはメタンガスの動作確認から行います。一酸化炭素側の回路の方が複雑なので動作が不安かもしれませんが、メタンガスのテストに慣れてから実施した方が良いと思います。

 一酸化炭素、メタンガスともに引火すると爆発の恐れがあります。また、一酸化炭素は低濃度であっても長時間にわたって吸い続けると一酸化炭素中毒にかかる恐れがあり、非常に危険です。

 メタンガスセンサーの動作確認には市販のライターでガスだけをセンサーに向けて放出します。もちろん窓を開けるなど喚起を良くした状態でテストを行います。ガスはあまり近づけなくても鋭く反応しますので、直接、吹きかけるとセンサーが傷むような気がするくらいです。見かたを変えれば、それだけ大量のガスを広範囲に放出しているともいえます。
 ライターを使い慣れている人もそうでない人にとっても、普段のライターの使用方法とは大きく異なります。テストの際は換気や火気に対して十分に注意が必要です。
 ガスだけを出すことが出来ないライターも多いのですが、一度、ライターを点火してから火を消して近づける方法は、とても危険ですので絶対に点火しないでください。。  ガスセンサーの実験中にライターを点火することは、テストしたガスが思わぬ場所に残留していて引火する危険を伴います。ガス漏れ状態でテストするわけですから、火気厳禁の状態を必ず守ってください
 下図はPanasonicのガス警報器「ガス当番」のオプションとして発売されているテスト用・点検用ガスです。価格も定価105円と安価なので、安全第一で本品を使用することを強くお奨めします。


Panasonic ガス当番用テストガス・点検用ガス SH8221(税込 ¥84円)

 次に一酸化炭素センサーの動作確認です。これは屋内では無く屋外で実施します。その理由は作業のミスによる爆発の危険性が高まるのと、意図的に不完全燃焼を発生させるので一酸化炭素中毒の危険性を伴うからです。
 くどいようですが、製作した本機を屋外に持ち出します。電源はUSB充電用モバイルバッテリなどが便利です。9Vの006P電池では消費電流が得られないので動作しない場合があります。片側のセンサーを外せば動作するかもしれません。
 一酸化炭素を集めるためにガラス瓶を用意します。ジャムの空きビンくらいが良いと思います。また一酸化炭素を発生するためにライターを使用します。ガラス瓶を逆さま(開口部が下側になるよう)にして、開口部の下にライターを近づけて点火します。必ず点火していることを確認します。点火していない場合、すぐに中断してガラス瓶の中のガスが抜けるのを待ちます。※ガスがたまった状態で再点火するのは危険です。
 始めはガラス瓶の中で完全燃焼しますがガラス瓶中の酸素が減ってくると不完全燃焼に移行します。炎の色が変わってきて、やがて炎が小さくなります。炎が消える瞬間にライターのガスも止めます。すぐに止めないと一酸化炭素がライターのガスに押しのけられて抜けてしまいます。こうして生成した一酸化炭素入りのガラス瓶を逆さまのままセンサーに覆ってテストを行います。

警報器として使用することの危険性

 普段、警報器として使用される場合も危険を伴います。何らかの不具合や偶発的な問題でArduinoが停止したり、センサーやブザーが故障したりする可能性があります。シールドやセンサーの接点の接触不良でならない場合もあります。そういった場合に、一酸化炭素濃度の異常やガス漏れを検出できずに事故が発生する危険性は認識をしておく必要があります。
 したがって、必ず市販のガス当番などのガス警報器との併用が必要です。製作したものは、市販品の補助的な役割にしてください。例えば、日常の一酸化炭素濃度の履歴から、普段の生活における一酸化炭素中毒に対する危険性を検討するなどの用途に用いることが出来ます。石油ストーブや石油ファンヒータ、ガスファンヒータなどから発生する一酸化炭素に対して、普段から適切な換気が行えているかどうかをチェックするなどの用途です。測定値が誤っていたり警報器が鳴らなかったりしても生命にかかわる事故が発生しないような使い方を想定しています。想定内、想定外を問わず、いかなる事故や損害を被った場合であっても、当方は一切の責任を負いません。

参考文献

  ・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/ (通販サイト・価格情報)


Arduinoメインメニューへ戻る

XBeeメインメニューへ戻る

地デジトップへ戻る


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

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

Arduinoで湿度を測定する

Arduino用液晶シールド

Arduinoで8X8マトリクスLEDに文字表示

Arduino 赤外線リモコンコード解析

Arduino用Wi-Fi無線LAN

Arduino用 EasyVR Shield で音声認識

ArduinoとXBeeとの接続