においセンサ(TGS2450)で匂いを数値化するArduinoプロジェクト、基板も作ったよ

自作したにおいセンサーモジュール
自作したにおいセンサーモジュール

においセンサTGS2450とESP32を使って、匂いを数値化するプロジェクトをご紹介します。TGS2450はメチルメルカプタン(玉ねぎの腐ったようなにおい)やアルコールに反応しやすいガスセンサでアナログデバイスになります。簡易的なにおいチェッカーが作れるのでアイデアが広がります。

においセンサモジュールの製作

秋月電子通商さんで販売されているTGS2450(においセンサ)ですが、そのままではArduinoなどのマイコンで扱うことができません。トランジスタを使ったちょっとした回路を組まなければならないのです。

そこでPCB基板を発注してにおいセンサモジュールを作ってみました。基板サイズは約44mmx28mmです。回路については後ほど説明します。

においセンサモジュール
においセンサモジュール
においセンサモジュール
においセンサモジュール
においセンサモジュール
においセンサモジュール

このにおいセンサモジュールは、ArduinoをはじめESP32やM5でも動作可能です。お好みのボードでお使いください。もちろんRaspberry Piでも扱うことは可能ですが、Raspberry Pi Pico以外の場合はアナログ電圧値を読み取るためのADコンバータが必要となりますのでご注意ください。

▼ どのArduinoを選んだら良いか分からない方はこちら。

TGS2450が感知できるガス

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

  1. ◎ メチルメルカプタン
  2. ◎ 硫化水素
  3. ○ アルコール
  4. ○ アンモニア

アルコールに対してかなり敏感に反応します。また、玉ねぎスライスに近づけるとさらに反応します。「必ずしも人間にとって臭いもの」に反応するとは限らないのですが、大まかに「におう」ものに反応していることは間違い無いです。口臭チェッカーや硫黄化合物系ガス検知器、空気清浄器や換気扇コントロールなどへ応用できます。

次のグラフはフィガロ技研さんが出している TGS2450のデータシート です。

ガス感度特性
ガス感度特性

Rsはセンサ抵抗値でガスによって変化します。Roは清浄大気中のセンサ抵抗値で一定です。Rsのセンサ抵抗値が低くなればなるほど、ガス濃度ppmが高くなっていることが分かります。また左側のグラフほど、においセンサ(TGS2450)で反応しやすいガスということになります。

実際ににおいセンサーで測定してみると、意外と部屋の中が臭うということに気づきます。人間の嗅覚はなれてしまうので、他人はすぐに気づいても自分には分からないものです。一人暮らしの方は、匂いチェッカーとして活用してみてはいかがでしょうか?(笑)他にもアイデア次第で楽しいことができそうです♪

においセンサモジュールの回路図

下図はTGS2450をArduinoなどで使えるようにするための回路図です。私が製作したにおいセンサモジュールの回路も同様のものとなります。ご自身で製作する場合はこの回路図を参考になさってみてください。回路図中のJ1はArduinoなどのマイコンボードへ、Q2はTGS2450のガスセンサーへ繋ぎます。

においセンサモジュールの回路図
においセンサモジュールの回路図
TGS2450を下から見た図
TGS2450を下から見た図

TGS2450は4ピンのセンサデバイスで、役割はそれぞれ次のとおりです。3番、4番ピンの制御をマイコン側で行うことになります。

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

先ほどの回路図を元に、TGS2450内部構造も合わせて表現したものが次の図を見た方が分かりやすいかもしれません。

においセンサモジュールの回路図
においセンサモジュールの回路図

ヒーター抵抗RHは8.5Ω〜10.5Ω程度の固定になります。センサ抵抗RSはガスによって5.62Ω〜56.2kΩと変化します。もしもRSの値を導き出したい場合は次の式で計算可能です。VcはArduino UnoのGPIO出力電圧になりますので5Vです。Vcの電圧は常時印加させるのではなく断続的にする必要があります。

$$R_S = \frac{V_{OUT}}{V_c - V_{OUT}}\times R4 \tag{1}$$

式1の導き出し方は、まずRSの抵抗値に比べるとRHの値は非常に小さいのでGNDと見なすことができます。すると次の式が成り立ちますから、これをRSについて導き出せば式1が求められます。

$$ V_C : V_{OUT} = R_4 + R_S : R_S $$

秋月電子通商さん 参考資料 では、式1の分子分母が逆で間違っていると思うのですがどうでしょうか?皆さんも各自で計算なさってみてください。

また、TGS2450のヒーターを温めるにはHeaterピンからパルス波を流してQ1のトランジスタをスイッチングします。具体的には、250msecを1周期として8msの間だけパルス信号を送り、のこり242msの間はオフになるようArduino側で制御します。この時RHに1.6V電圧がかかるようにR3を設計します。ここら辺は後ほど紹介するプログラム事例を見た方が早いです。安全を考慮してトランジスタには耐圧の高いTTA008BのPNPバイポーラトランジスタを使用してます。といっても電流を流す時間は一瞬なので発熱などの心配はありません。

Arduinoとの配線

下図はArduino Unoとにおいセンサモジュールの配線図です。

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

においセンサモジュールArduino
VDD5V
GNDGND
Output (OUT)A3
Sensor (SEN)A1
Heater (HTR)A0

Arduino Uno以外のボードで使用する場合は、適宜変更なさってください。

においセンサ動作確認用のスケッチ(ソースコード)

Arduino Unoとにおいセンサモジュールとの配線が済みましたら、次のスケッチをアップロードして動作確認してみましょう。においのアナログ値をシリアルモニタへ出力するだけの簡単なものです。Arduino IDEで開発している場合は、シリアルプロッタでグラフ表示させると分かりやすいと思います。

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

/**
 * @brief においセンサ <-> Arduino Uno
 *        5V         <-> 5V
 *        GND        <-> GND
 *        Output     <-> A3      
 *        Sensor     <-> A1
 *        Heater     <-> A0
 */
#define PIN_OUTPUT A3
#define PIN_SENSOR A1
#define PIN_HEATER 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

    delay(3000);

}

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_HEATER ライブラリを使った場合

Arduino Unoのタイマーをつかったライブラリを作ってみました。 GitHub - aragig/TGS2450_HEATER: TGS2450においセンサArduino用ライブラリ

TGS2450_HEATER ライブラリを使うと次のように簡潔なコードを書くことができます。また、タイマーでヒーターを動かしているので、loop()内にブロッキングされずに他の処理を実装することが可能です。
cpp
#include <Arduino.h>
#include "TGS2450_HEATER.h"

TGS2450_HEATER sensor(2, 4, 5);

void setup() {
    Serial.begin(115200);
    sensor.init();
}

void loop() {
    uint16_t odor = sensor.readOdor();
    Serial.println(odor);
    delay(1000);
}

TGS2450は慣らし運転が必要

ただし注意点があります。TGS2450をはじめて使う場合または、しばらく使用していない場合は、数値が安定するまで慣らし運転が必要です。長い場合は数時間かかることもあります。シリアルプロッタなどでグラフ表示させ、数値が安定するまで気長に待ちましょう。慣らし運転が終わったらマジックペンなどをセンサに近づけてみてください。数値がガクンと下がるはずです。

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

においを数値化してみた

においセンサとディスプレイを使って、においを0〜100点評価に換算(正規化)してみました。次の動画でその様子がご覧いただけます。においの無い状態を100とし、においの強さに応じてゼロへと数値が変化させてます。

▼ 動画内で使用しているディスプレイはこちら

▼ TFT ST7735の使い方はこちらで解説してます。

関連記事

 
最後までご覧いただきありがとうございます!

▼ 記事に関するご質問やお仕事のご相談は以下よりお願いいたします。
お問い合わせフォーム

スマート農業(スマートアグリ)で使えるセンサー
水耕栽培はじめよう!
関連記事