はじめに
各種ガスセンサー(MQシリーズ)の使い方です。
ガスセンサーは、特定のガス濃度を検知することで安全性を確保したり、空気の質をモニタリングしたりする際に役立ちます。
ガスセンサーとは?
ガスセンサーは、空気中の特定のガスを検知して濃度を計測できるデバイスです。
特にMQシリーズのセンサーは以下のガスに対応しています。
- MQ-2: 可燃性ガス、煙
- MQ-3: アルコール、エタノール
- MQ-4: メタン
- MQ-5: 液化石油ガス、天然ガス
- MQ-6: 液化石油ガス
- MQ-7: 一酸化炭素
- MQ-8: 水素
- MQ-9: 一酸化炭素、可燃性ガス
- MQ-135: 空気の質(有害ガス)
ガス検知のメカニズム
半導体材料の役割
MQシリーズのセンサーは、主に半導体材料を使用してガスを検知します。この仕組みは以下の通りです
- 半導体材料と酸素の反応
センサーには二酸化スズ(SnO₂)などの半導体材料が使用されています。この材料は空気中の酸素分子と反応し、電気抵抗を高くする性質を持っています。 - ガスとの化学反応
周囲に特定のガス(例:メタン、アルコール)が存在すると、酸素分子が分解され、電気抵抗が変化します。この抵抗値の変化を検出することでガスの濃度を測定します。 - ヒーターの利用
センサー内のヒーターが高温を維持し、効率的に化学反応を起こすように設計されています。
ガスによって異なる半導体材料
特定のガスに対する感度を高めるために、以下の材料が利用されることがあります
- 二酸化スズ(SnO₂)
主に可燃性ガス(メタン、一酸化炭素、プロパンなど)やアルコールに使用
MQ-2, MQ-3, MQ-4, MQ-5, MQ-6, MQ-7, MQ-9, MQ-135などで採用 - 酸化亜鉛(ZnO)や酸化タングステン(WO₃)
酸性ガスや水素の検知に使用
酸化亜鉛は特にアルコールや空気質センサーに感度を向上させる効果あり - 酸化鉄(Fe₂O₃)
一酸化炭素や水素の検知で利用されることがある
MQ-7やMQ-9に採用される場合がある
配線
OLEDの接続は以前の記事を参照ください
ガスセンサにはアナログとデジタルの2種類の出力があります。
具体的な数値が知りたい場合はアナログ出力。
設定閾値を超えたら1を出力する、という使い方をしたい場合はデジタルを使ってください。
RaspberryPi Pico | ガスセンサ |
VSYS(39番) | VCC |
GND(38番) | GND |
GP26(31番) | AOUT(アナログ出力) |
使用する場合はアナログ以外のピンならどこでも | DOUT(デジタル出力) |
ガスセンサ値をOLEDに表示する
ガスセンサの生値を取得し、その大小で濃度を判定します。
具体的な数値はガスの種類によって変換が必要です。
from machine import ADC, Pin, I2C
from ssd1306 import SSD1306_I2C
from time import sleep
# OLEDディスプレイの設定
i2c = I2C(0, scl=Pin(17), sda=Pin(16)) # I2Cピン: SCL=GP5, SDA=GP4
oled = SSD1306_I2C(128, 64, i2c) # OLEDディスプレイの初期化
# ガスセンサーの設定
adc = ADC(Pin(26)) # ガスセンサーをGP26(ADC0)に接続
def get_gas_level(voltage):
"""電圧からガス濃度を評価"""
if voltage < 1.0:
return "Safe (Low)"
elif 1.0 <= voltage < 2.5:
return "Moderate"
else:
return "High (Warning!)"
while True:
# ガスセンサーの値を取得
gas_value = adc.read_u16() # ガス濃度を16ビット値で取得
voltage = gas_value * 3.3 / 65535 # 電圧に変換(3.3V基準)
gas_level = get_gas_level(voltage) # ガス濃度を評価
# 結果をシリアルモニタに出力
print(f"Gas Sensor Value: {gas_value}, Voltage: {voltage:.2f}V, Level: {gas_level}")
# OLEDディスプレイに結果を表示
oled.fill(0) # ディスプレイをクリア
oled.text("Gas Sensor Data", 0, 0) # タイトル
oled.text(f"Voltage: {voltage:.2f}V", 0, 20) # 電圧
oled.text(f"Level: {gas_level}", 0, 40) # ガス濃度レベル
oled.show() # 表示を更新
sleep(1) # 1秒待機
より正確な濃度を知りたい場合、ガスセンサーのデータシートに記載された特性曲線を元に計算式を導入することが可能です。その場合、対象のセンサーに合わせた校正や係数の調整が必要です。
データシートは秋月電子様やスイッチサイエンス様のサイトから入手可能です。
データシートを使えば、出力電圧をセンサーの抵抗特性を用いて、ppm(parts per million:ガス濃度)に変換することができます。計算過程は以下です。
・RS/R0(抵抗比)とガス濃度の関係
データシートには、RS(センサー抵抗)とR0(校正時のセンサー抵抗)の比率に基づく特性曲線が記載されています。R0は、指定された基準ガス(例: 1000ppm LPG)で校正する必要があります。
・校正プロセス
R0を基準ガスで計測したRS値から求めます。
・濃度計算式
特性曲線を参考に、以下の式を使用して濃度を推定します
RS / R0 = 係数A × (濃度)^係数B
AとBは、特性曲線から取得する係数です。
以下にサンプルコードを示します。
from machine import ADC, Pin, I2C
from ssd1306 import SSD1306_I2C
from time import sleep
import math
# OLEDディスプレイの設定
i2c = I2C(0, scl=Pin(17), sda=Pin(16)) # I2Cピン: SCL=GP5, SDA=GP4
oled = SSD1306_I2C(128, 64, i2c) # OLEDディスプレイの初期化
# ガスセンサーの設定
adc = ADC(Pin(26)) # ガスセンサーをGP26(ADC0)に接続
# センサー定数(データシート参照)
R_LOAD = 10.0 # ロード抵抗 (kΩ)
R0 = 10.0 # 校正時の抵抗値(kΩ, 例として設定)
A = 50.0 # RS/R0と濃度の関係(特性曲線の係数)
B = -0.45 # 指数部の係数
def calculate_ppm(voltage):
"""
電圧値からガス濃度(PPM)を計算
"""
# RSを計算
rs = R_LOAD * (3.3 - voltage) / voltage # 3.3V基準
# 抵抗比(RS/R0)
rs_ro_ratio = rs / R0
# PPMを計算(特性曲線に基づく式)
ppm = A * (rs_ro_ratio ** B)
return ppm
while True:
# ガスセンサーの値を取得
gas_value = adc.read_u16() # ガス濃度を16ビット値で取得
voltage = gas_value * 3.3 / 65535 # 電圧に変換(3.3V基準)
ppm = calculate_ppm(voltage) # ガス濃度(PPM)を計算
# 結果をシリアルモニタに出力
print(f"Voltage: {voltage:.2f}V, PPM: {ppm:.2f}")
# OLEDディスプレイに結果を表示
oled.fill(0) # ディスプレイをクリア
oled.text("Gas Sensor Data", 0, 0) # タイトル
oled.text(f"Voltage: {voltage:.2f}V", 0, 20) # 電圧
oled.text(f"PPM: {ppm:.2f}", 0, 40) # ガス濃度(PPM)
oled.show() # 表示を更新
sleep(1) # 1秒待機
応用例と注意点
応用例
- 室内空気質モニタリング
- 一酸化炭素警報装置
- キッチンでのガス漏れ検知
- 飲酒検知システム
注意点
- ウォームアップ期間
MQセンサーは初回使用時に24時間程度のウォームアップが必要です。 - 測定条件
測定値は温度や湿度の影響を受けるため、必要に応じて補正を行いましょう。 - 用途の制限
一部のセンサーは低濃度ガスには適していません。仕様を確認してください。
注意事項はありますが、目に見えないガスを可視化することのできるデバイスです。ぜひ使ってみてください。
コメント