Groveで広がるArduinoの世界-Step2-③ Grove Gas Sensor(MQ9)

 Grove Gas Sensorは、 一酸化炭素、石炭ガス、液化ガスなどを検知できるデバイスで、MQ9が使われています。出力はアナログです。同社のガス・センサには、MQ9のほかに下記の製品があります。

  • MQ2 可燃性ガス、煙
  • MQ3 アルコール、ベンジン、CH4、ヘキサン、LPG、CO
  • MQ5 LPG、天然ガス、タウンガス

Grove Gas Sensor(MQ9)のおもな特徴

  • 動作電源 5V
  • 検出するガス 一酸化炭素、石炭ガス、液化ガス
  • 検出濃度 200~11000(CO)/10000(CH4)/10000(LPG)ppm
  • ヒータ 0.5~340mW

接続

 Groveコネクタでつなぎます。

センサ Arduino UNO
GND GND
Vcc Vcc
NC NC
SIG A0

(NC No Connection;何もつながっていないが、通常何もつながないで解放にする)

スケッチ

 アナログ・ポートのA0につないだ事例です。電圧が表示されます。ガス濃度の増減を検出するためのしきい値として使用します。

void setup() {
    Serial.begin(9600);
}
 
void loop() {
    float sensor_volt;
    float sensorValue;
 
    sensorValue = analogRead(A0);
    sensor_volt = sensorValue/1024*5.0;
 
    Serial.print("sensor_volt = ");
    Serial.print(sensor_volt);
    Serial.println("V");
    delay(1000);
}

 きれいな空気の環境で動かします。とりあえず、机の上で動かすと、値はだんだん下がっていき、数時間後、約1.3Vになりました。

void setup() {
    Serial.begin(9600);
}
 
void loop() {
    float sensor_volt;
    float RS_air; //  Get the value of RS via in a clear air
    float R0;  // Get the value of R0 via in LPG
    float sensorValue = 0;
 
    /*--- Get a average data by testing 100 times ---*/
    for(int x = 0 ; x < 100 ; x++)
    {
        sensorValue = sensorValue + analogRead(A0);
    }
    sensorValue = sensorValue/100.0;
    /*-----------------------------------------------*/
 
    sensor_volt = sensorValue/1024*5.0;
    RS_air = (5.0-sensor_volt)/sensor_volt; // omit *RL
    R0 = RS_air/9.9; // The ratio of RS/R0 is 9.9 in LPG gas from Graph (Found using WebPlotDigitizer)
 
    Serial.print("sensor_volt = ");
    Serial.print(sensor_volt);
    Serial.println("V");
 
    Serial.print("R0 = ");
    Serial.println(R0);
    delay(1000);
 
}

 上記のスケッチを動かします。半固定抵抗を左に回し切ったときシリアルモニタに表示されたR0は110付近です。右に回し切ったときは0.28です。左から2目盛りぐらいで1.8なので、この値を次のスケッチに入れて動かします。


#define R0 1.8

void setup() {
    Serial.begin(9600);
}
 
void loop() {
 
    float sensor_volt;
    float RS_gas; // Get value of RS in a GAS
    float ratio; // Get ratio RS_GAS/RS_air
    int sensorValue = analogRead(A0);
    sensor_volt=(float)sensorValue/1024*5.0;
    RS_gas = (5.0-sensor_volt)/sensor_volt; // omit *RL
 
          /*-Replace the name "R0" with the value of R0 in the demo of First Test -*/
    ratio = RS_gas/R0;  // ratio = RS/R0
          /*-----------------------------------------------------------------------*/
 
    Serial.print("sensor_volt = ");
    Serial.println(sensor_volt);
    Serial.print("RS_ratio = ");
    Serial.println(RS_gas);
    Serial.print("Rs/R0 = ");
    Serial.println(ratio);
 
    Serial.print("\n\n");
 
    delay(1000);
}

 実行している様子です。

  Webページ(データシート)から換算グラフを転載します。Rs/R0値は0.1から10の間に入っていればよいように読み取れます。

 息を吹きかけると、RS-ratioは0.6ぐらい、Rs/R0は3~4を示しました。この変化は、データシートから、温度と湿度の影響だと思われます。

 ウイスキーの瓶の口にセンサを近づけたときの様子です。上記のグラフのように低い値になりました。スケッチではLPGを補正の根拠に使っていますが、センサ自体が揮発性のアルコールにも反応するからかもしれません。

コラム

 A0~A5はアナログ入力ですが、Arduino UNOでは下記のように、ディジタル・ポートでも使えます(C:\Users\ユーザ名\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.3\variants\standard\pins_arduino.h)。

 右のカッコ内の数字がディジタル・ポート番号です。

#define PIN_A0 (14)
#define PIN_A1 (15)
#define PIN_A2 (16)
#define PIN_A3 (17)
#define PIN_A4 (18)
#define PIN_A5 (19)
#define PIN_A6 (20)
#define PIN_A7 (21)

前へ

Groveで広がるArduinoの世界-Step2-② Grove HCHO sensor

次へ

Groveで広がるArduinoの世界-Step2-⑤ Grove Alcohol Sensor