においセンサ(TGS2450)をArduinoで使う方法|Arduino Uno・ESP32・M5StickC PLUS

 

においセンサ(TGS2450)をArduinoで使う方法|Arduino Uno・ESP32・M5StickC PLUS
においセンサ(TGS2450)をArduinoで使う方法|Arduino Uno・ESP32・M5StickC PLUS

この記事では、においセンサTGS2450をArduinoで使う方法を解説いたします。TGS2450は、メチルメルカプタン(玉ねぎの腐ったようなにおい)やアルコールなどのガスに反応するガスセンサのひとつです。このセンサを使えば、簡単なにおいチェッカーのようなものを作ることができます。

この記事では、Arduino UnoとESP32、M5StickC PLUSのそれぞれでプログラミングしてみました。また、TTA008Bを使った安定版のにおいモジュールと、2SC1815を使った簡易版のにおいモジュールの作り方を解説します。

つかうもの

はじめに、この記事で使うものをご紹介いたします。

Arduino

お好きなArduinoをお使いください。Arduino UnoとESP32、M5StickC PLUSのそれぞれで動かしてみました。

においセンサ

TGS2450という「においセンサ」を使います。 TGS2450は秋月電子通商 で入手可能です。

▼ アナログ回路を組んでモジュール化したものをメルカリで販売中です!

TGS2450の特徴

TGS2450は空気中に含まれるガスの濃度に応じて抵抗値が変化するアナログセンサです。検知しやすいガスは次の通りです。

項目 感度
メチルメルカプタン
硫化水素
アルコール
アンモニア

その他電子部品

TGS2450の内部のヒーターを加熱するにあたって、抵抗やトランジスタが必要です。詳しい値は後ほど解説する回路図をご覧ください。

においセンサTGS2450の使い方

下図はTGS2450を下から覗いた図です。

TGS2450を下からみた図
TGS2450を下からみた図

番号が振られている4つのピン端子は、それぞれ次の役割になっています。

ピン番号 名称 備考
1 Common GNDへ繋ぐ
2 N.C. 何も接続しない
3 Sensor electrode ガス濃度に応じて約5Ω〜50kΩで変化する
4 Heater パルスで1.6Vの電圧を印加する

TGS2450をArduinoなどで扱うにあたっては、ピン3番と4番がポイントになります。

アナログ出力(3番ピン)

まず、3番ピンの説明です。このピンは、空気中に含まれるガス成分の量に応じて、抵抗値が変化するセンサ抵抗になっています。よって、センサの抵抗値を測定すればガス濃度を知ることができます。

抵抗値の変化を読み取るには、基準となる抵抗を用意して分圧し、ADコンバータで読み取ってセンサの抵抗値を算出します。

ちなみに、裏ワザでステップ応答を使うと、ADコンバータのないマイコンでも抵抗値を読み取れます。詳しくは【ラズパイ】ステップ応答による抵抗値の測定をご参考になさってみてください。

ヒータ抵抗(4番ピン)

次に、4番ピンの説明です。4番ピンは10Ω程度のヒータ抵抗につながっているようです。ここへ電圧を一定間隔の時間で印加します。具体的には、250msecを1周期として8msのあいだだけ1.6Vを印加し、のこり242msは0Vとします。

においセンサモジュールの制作(安定版)

においセンサのモジュールを、安全性を考慮してTTA008Bを使った安定版と汎用トランジスタの2SC1815を使った簡易版のそれぞれご紹介いたします。

はじめに、PNPバイポーラトランジスタのTTA008Bを使った安定版の回路図です。

においセンサの配線図
においセンサの配線図

R3の抵抗は27Ωなので1Wを指定します。

基板を手作りしてモジュール化してみました。メルカリで販売してますので、宜しければご検討ください。

Arduino Unoとの配線を下の写真のように行います。

においセンサモジュールとArduino Unoの配線
においセンサモジュールとArduino Unoの配線

ソースコード(スケッチ)

においセンサモジュールをArduino Unoで動かすスケッチをご紹介いたします。においセンサからアナログデータを取得し、シリアルモニタへ出力させるだけのスケッチです。

/**
 * @date 2023-01-22
 * @author Toshihiko Arai
 * @copyright https://101010.fun
 * @brief
 * Arduino UnoとTGS2450を使ったにおい検知デモ
 */
#include <Arduino.h>

/**
 * @brief においセンサ <-> Arduino Uno
 *        5V         <-> 5V
 *        GND        <-> GND
 *        Output     <-> A3      
 *        Sensor     <-> D15 (A1)
 *        Heater     <-> D14 (A0)
 */
#define PIN_OUTPUT 3 // A3
#define PIN_SENSOR 15 // D15(A1)
#define PIN_HEATER 14 // D14(A0)


void setup() {
    Serial.begin(115200);

    pinMode(PIN_HEATER, OUTPUT);
    pinMode(PIN_SENSOR, OUTPUT);
    pinMode(PIN_OUTPUT, INPUT);

    digitalWrite(PIN_HEATER, HIGH);  // Heater Off
    digitalWrite(PIN_SENSOR, LOW);  // Sensor Pullup Off

}

void loop() {
    int val = 0;
    delay(237);
    digitalWrite(PIN_SENSOR,HIGH); // Sensor Pullup On
    delay(3);
    val = analogRead(PIN_OUTPUT);  // Get Sensor Voltage
    delay(2);

    digitalWrite(PIN_SENSOR,LOW); // Sensor Pullup Off
    digitalWrite(PIN_HEATER,LOW); // Heater On
    delay(8);
    digitalWrite(PIN_HEATER,HIGH); // Heater Off

    Serial.println(val);
}

TGS2450を使う場合、最初に慣らし運転が必要です。とくに初めて使用する際は、数値が安定するまで数十分以上かかるのでご注意ください。シリアルプロッタなどでグラフ表示させて、数値が安定したところでにおいのあるものにセンサを近づけてみましょう。数値がガクンと下がるはずです。

においに反応して画面表示するプログラム(ESP32)

先ほどのプログラムを改造して、ESP32とTFTディスプレイST7735を使ってにおい表示するプログラムをご紹介いたします。配線はプログラム内のコメントをご参考ください。またST7735の使い方はESP32でST7735 TFT LCD液晶ディスプレイを使ってみるをご覧ください。

/**
 * @date 2022-11-27
 * @author Toshihiko Arai
 * @copyright https://101010.fun
 * @brief
 * ESP32とTGS2450を使ったにおい検知テスト(メチルメルカプタンやアルコール)
 */
#include <Arduino.h>

/**
 * @brief においセンサ <-> ESP32
 *        5V         <-> 5V
 *        GND        <-> GND
 *        Output     <-> G14      
 *        Sensor     <-> G27
 *        Heater     <-> G26
 */
#define PIN_OUTPUT 14
#define PIN_SENSOR 27
#define PIN_HEATER 26

const int SMELL_BAD = 1000;
const int SMELL_NORMAL = 2600;
const int SMELL_DIFF = SMELL_NORMAL - SMELL_BAD;  // // 2500 - 2000

void setup() {
    Serial.begin(115200);

    pinMode(PIN_HEATER, OUTPUT);
    pinMode(PIN_SENSOR, OUTPUT);
    pinMode(PIN_OUTPUT, INPUT);

    digitalWrite(PIN_HEATER, HIGH);  // Heater Off
    digitalWrite(PIN_SENSOR, LOW);  // Sensor Pullup Off

    // gpio_pulldown_dis(GPIO_NUM_25);  // Disable pull-down on GPIO.
    // gpio_pullup_dis(GPIO_NUM_25);    // Disable pull-up on GPIO.
}

void loop() {
    int val = 0;
    int val_origin = 0;
    float rate = 0.0;

    delay(237);
    digitalWrite(PIN_SENSOR, HIGH);  // Sensor Pullup On
    delay(3);
    val = analogRead(PIN_OUTPUT);  // Get Sensor Voltage
    delay(2);
    digitalWrite(PIN_SENSOR,LOW); // Sensor Pullup Off
    digitalWrite(PIN_HEATER,LOW); // Heater On
    delay(8);
    digitalWrite(PIN_HEATER,HIGH); // Heater Off

    Serial.println(val);
}

こちらのプログラム実行の様子をYouTubeの アイデアノート channel で公開中です。ぜひご参考になさってみてください。

においセンサモジュールの制作(簡易版)

こちらは2SC1815を使った簡易版の配線図(電子回路図)です。冒頭のM5StickC PLUSの写真では、この簡易版の回路でカット基板をエッチングし、HATモジュールを作りました。2SC1815はNPNなので、先ほどのPNPのTTA008Bとはヒーター制御のプログラミングが異なりますのでご注意ださい。

においセンサの配線図
においセンサの配線図

エミッタに10Ωの抵抗直列に通して、4番ピンのヒータ抵抗へつなぎました。コレクタには5V電源を接続しました。オシロスコープで観察したところ、この設計でだいたい1.5Vの電圧がヒータ抵抗に印加されました。ちなみに、2SC1815のコレクタ電流定格は150mAです。

いろいろな方のTGS2450を使った記事を拝見したところ、配線方法は人によってさまざまでした。トランジスタを使わない方もいらっしゃいました。においの絶対値を測るわけではないので、結構アバウトでもなんとかなってしまうというのが現実のようです。

正し、プログラミングミスにより定格を超えた電流を流して壊れてしまう可能性はあります。心配な方は安定版をお使いください。

ソースコード(スケッチ)

次にM5StickC PLUSに書き込むスケッチを紹介します。

においに応じて100点満点評価の表示ができるように工夫してみました。センサに反応するにおいを検知すれば点数が下がります。また、点数に応じて画面の色が緑色から赤色に変化させています。

#include <M5StickCPlus.h>

#define PIN_HEATER 0
#define PIN_SENSOR 26
#define PIN_OUTPUT 36

uint16_t getColor(uint8_t red, uint8_t green, uint8_t blue){
  return ((red>>3)<<11) | ((green>>2)<<5) | (blue>>3);
}

const int SMELL_BAD = 1000;
const int SMELL_NORMAL = 2600;
const int SMELL_DIFF = SMELL_NORMAL - SMELL_BAD; // // 2500 - 2000

void setup() {
    M5.begin();
    M5.Axp.ScreenBreath(9);
    M5.Lcd.setRotation(3);
    M5.Lcd.fillScreen(BLACK);
    M5.Lcd.setTextColor(WHITE);


    pinMode(PIN_HEATER,OUTPUT);
    pinMode(PIN_SENSOR,OUTPUT);
    digitalWrite(PIN_HEATER,LOW); // Heater Off
    digitalWrite(PIN_SENSOR,LOW); // Sensor Pullup Off
    
    pinMode(PIN_OUTPUT, INPUT);
    gpio_pulldown_dis(GPIO_NUM_25); // Disable pull-down on GPIO.
    gpio_pullup_dis(GPIO_NUM_25); // Disable pull-up on GPIO.

//    analogSetAttenuation(ADC_6db);

    Serial.begin(115200);

}

void loop() {

    int val = 0;
    int val_origin = 0;
    float rate = 0.0;
    
    delay(237);
    digitalWrite(PIN_SENSOR,HIGH); // Sensor Pullup On
    delay(3);
    val = analogRead(PIN_OUTPUT); // Get Sensor Voltage
    delay(2);
    digitalWrite(PIN_SENSOR,LOW); // Sensor Pullup Off
    
    digitalWrite(PIN_HEATER,HIGH); // Heater On
    delay(8);
    digitalWrite(PIN_HEATER,LOW); // Heater Off

//    Serial.println(val);
    val_origin = val;

    if (SMELL_BAD > val) {
        val = SMELL_BAD;
    } else if (SMELL_NORMAL < val) {
        val = SMELL_NORMAL;
    }
    val -= SMELL_BAD;
    rate = float(val) / float(SMELL_DIFF);
    Serial.println(rate);
    int red = int((1.0 - rate) * 255.0);
    int green = int(rate * 255.0);
//    Serial.println(red);
    M5.Lcd.fillScreen(getColor(red,green,0));
    M5.Lcd.setTextSize(2);
    M5.Lcd.setCursor(10, 10);
    M5.Lcd.printf("%d", val_origin);
    M5.Lcd.setTextSize(6);
    M5.Lcd.setCursor(80, 40);
    M5.Lcd.printf("%d", (int)(rate * 100.0));
    
}

▼G36をアナログ入力として使ったので、必ずG25をフローティングしてください。

gpio_pulldown_dis(GPIO_NUM_25); // Disable pull-down on GPIO.
gpio_pullup_dis(GPIO_NUM_25); // Disable pull-up on GPIO.

フローティングをしなければならない理由は、M5StickC PLUSの内蔵ADコンバータで電圧測定で解説しました。

さて、プログラムをデバックするにあたって、センサの値をシリアルプロッターでモニター表示するとやりやすいです。マジックペンなどを近づけますと、このように値がグンと下がります。

においセンサの値をシリアルプロッターでグラフ化
においセンサの値をシリアルプロッターでグラフ化

トランジスタによって変わるヒーターのオンオフの注意点

▼ においセンサを操作するプログラムは、 秋月電子通商電子の使用例 を参考にしました。センサの出力電圧を読み取りつつ、ヒーターをオンオフしています。秋月電子の回路ではPNPトランジスタを使っていましたが、ここではNPNのトランジスタを使ったので、ヒータのHIGH、LOWは秋月電子のプログラムとは逆になってますのでご注意ください。

delay(237);
digitalWrite(PIN_SENSOR,HIGH); // Sensor Pullup On
delay(3);
val = analogRead(PIN_OUTPUT); // Get Sensor Voltage
delay(2);
digitalWrite(PIN_SENSOR,LOW); // Sensor Pullup Off

digitalWrite(PIN_HEATER,HIGH); // Heater On
delay(8);
digitalWrite(PIN_HEATER,LOW); // Heater Off

また、読み取ったアナログ値では分かりずらいので、0〜100点評価に換算(正規化)しています。評価点数を調整したい場合は、SMELL_BADSMELL_NORMALの値を変更してみてください。

M5StickC PLUSでTGS2450を使ってにおいの検知
M5StickC PLUSでTGS2450を使ってにおいの検知

写真のように、マジックペンを近づけると値がグンと下がります。TGS2450は、アルコールに対してかなり敏感に反応するようです。玉ねぎスライスに近づけると、なんと点数は0点。即死亡状態といった感じになります(笑)

その他、いろいろにおいを測定して遊んでみましたが、意外と部屋の中が臭うということに気づきました>< 人間の嗅覚はなれてしまうので、一人暮らしだと怖いですねぇ。。。

トイレなどでも数値は変動しますので、掃除の目安にもなりますね!ただし「必ずしも人間にとって臭いもの」に反応するとは限らないので、過度に数字を気にしすぎても仕方なさそうです。

においセンサはなかなか楽しいので、みなさんもぜひ作ってみてくださいね(^_^)

記事に関するご質問などがあれば、お問い合わせ までご連絡ください。
関連記事