MQ-3を使った簡易アルコールチェッカーの製作 -線形性の改善-

電子工作

前回簡単に動作確認をしましたが、今回はもう少しデバイスの仕様を考慮した電子工作をしたいと思います。

インターフェース電圧

センサーの電源電圧が5Vであることから、センサーの出力電圧値は5VMAXとなる可能性があります。一方でM5stickCのアナログ入力電圧MAXは3.3Vですので原則5V入力は禁止です(5V入力でも直ちに壊れることは無いと思います)。

また、仮に3.3V付近以上の入力を行った場合でも、3.3V以上を検出することはできません。よって、センサーのアナログ出力ととM5stickCのアナログ入力の間で電圧変換を行う必要があります。

また、M5stickCの初期状態では内部のESP32のADCの直線性はあまり良くありません。

そこで直線性を良くするためにアッテネータを-6dBに設定します。これによって、0.15V~1.75V入力での線形が良くなり精度良く図ることができます。

詳しくはespressif のドキュメントサイトhttps://docs.espressif.com/projects/esp-idf/en/latest/esp32/index.htmlをメインに他の方の一般サイトや市販の書籍を参照ください。

センサー出力の0~5Vを0~1.75Vに変換するためには、抵抗分圧で電圧をさげる方法が簡単ですので、抵抗器一式が手元にあると直ぐに実験ができるので何かと便利ですよ。

VR2/VR1 = 1.8/(5.0-1.8)=1.8/3.2 より 電源側にR1=3.3kΩ、GND側にR2=1.8kΩの直列接続します。
これでセンサーの5V出力が計算上で1.76Vへ変換されてM5stickCへ入力されます。そしてM5stickC側のプログラム上で2.84倍し5Vへ換算します。

センサーのアナログ出力電圧からアルコール濃度への変換

MQ-3のデータシートにはアルコール濃度とセンサー出力電圧の関係グラフがありますので出力電圧から濃度の変換を行うことが可能です。

一方で、エタノールガス濃度ppmとmg/Lの関係は、0.15mg/L ≒ 78ppm です。グラフより78ppm 時はVRL=約2.7Vと読み取れます。

よって、2.7Vを閾値として検出すれば酒気帯び運転の基準値であるアルコール濃度0.15mg/Lが簡易的に検出できることになります。なお、センサー個体や温度、湿度などの測定環境上の誤差もありますので、アルコールの無い大気雰囲気での初期値を確認した上で、2.5V辺りを検出すればよさそうです。

プログラム

アッテネータを-6dB設定、検出電圧を10回で平均化、2.5Vでアルコール有りを検出しM5STACKCに表示している電圧の色を赤色で表示を実装したプログラムとなります。

//alcohol simple checker
//Arduino 1.8.15 , Board manager M5Stack Arduino M5stick-C 1.0.9
//Waveshare MQ-3 gus Sensor , https://www.waveshare.com/mq-3-gas-sensor.htm

#include < M5StickC.h >
const float Vref = 1.75 2.2

; //ATT -6dB時の最大電圧
int gas_din=26; // M5stick-C IO26 Degital Input ,connect to the Dout terminal
int gas_ain=36; // M5stick-C IO36 Analog Input ,connect to the Aout terminal
int ad_value;
float gas_value;
float gas_value_ave;
float gas_value_sum;
int avenum=10; //平均値取得用の測定回数
float ATT=5.1/1.8;//抵抗分圧
float VTH=2.0;// アルコール検知のスレッシュ電圧 2.0 - 2.5V 位で設定

void setup()
{
M5.begin();
pinMode(gas_din,INPUT);
pinMode(gas_ain,ANALOG);
analogSetPinAttenuation(gas_ain, ADC_6db);//set GPIO36 ATT -6dB
Serial.begin(115200);
M5.Lcd.setRotation(3);
M5.Lcd.setTextSize(1);
M5.Lcd.fillScreen(BLACK);
M5.Lcd.setTextColor(WHITE, BLACK);
M5.Lcd.setCursor(10, 0);
M5.Lcd.print("Alcohol simple checker");
}
void loop()
{
gas_value_ave = 0;
gas_value_sum = 0;
for (int i=0 ; i < avenum ; i++)
{
int ad_value = analogRead(gas_ain);
gas_value = float(ad_value) * Vref / 4095.0; // 12bit
gas_value_sum = gas_value_sum + gas_value;
}
gas_value_ave = gas_value_sum / avenum;
Serial.println("Gas leakage");
Serial.print("gas_value:");
Serial.print(gas_value_ave);
Serial.println("V");
if (gas_value_ave * ATT > VTH) {
M5.Lcd.setTextColor(RED, BLACK);
}
M5.Lcd.setTextSize(2);
M5.Lcd.setCursor(10, 30);
M5.Lcd.printf("%.3fV", gas_value_ave * ATT);
M5.Lcd.setTextColor(WHITE, BLACK);
delay(500);
}

Arduino Sketch はgithubにも保存していますのでご参照下さい。

おわりに

アルコール検出時の画面表示をもっと凝ったものにしたり、あるいはブザー音がなるようにしたり、持ちやすい筐体に入れたりするとより良いものに仕上がると思います。

コメント

タイトルとURLをコピーしました