Groveで広がるArduinoの世界-Step2-③ Grove Gas Sensor(MQ9)
Grove Gas Sensorは、 一酸化炭素、石炭ガス、液化ガスなどを検知できるデバイスで、MQ9が使われています。出力はアナログです。同社のガス・センサには、MQ9のほかに下記の製品があります。
●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)