においセンサ(TGS2450)で匂いを数値化するArduinoプロジェクト、基板も作ったよ
においセンサTGS2450とESP32を使って、匂いを数値化するプロジェクトをご紹介します。TGS2450はメチルメルカプタン(玉ねぎの腐ったようなにおい)やアルコールに反応しやすいガスセンサでアナログデバイスになります。簡易的なにおいチェッカーが作れるのでアイデアが広がります。
においセンサモジュールの製作
秋月電子通商さんで販売されているTGS2450(においセンサ)ですが、そのままではArduinoなどのマイコンで扱うことができません。トランジスタを使ったちょっとした回路を組まなければならないのです。
そこでPCB基板を発注してにおいセンサモジュールを作ってみました。基板サイズは約44mmx28mmです。回路については後ほど説明します。
このにおいセンサモジュールは、ArduinoをはじめESP32やM5でも動作可能です。お好みのボードでお使いください。もちろんRaspberry Piでも扱うことは可能ですが、Raspberry Pi Pico以外の場合はアナログ電圧値を読み取るためのADコンバータが必要となりますのでご注意ください。
▼ どのArduinoを選んだら良いか分からない方はこちら。
TGS2450が感知できるガス
TGS2450は空気中に含まれるガスの濃度に応じて抵抗値が変化するアナログセンサです。検知しやすいガスは次の通りで、硫黄化合物系ガスに対して好感度です。
- ◎ メチルメルカプタン
- ◎ 硫化水素
- ○ アルコール
- ○ アンモニア
アルコールに対してかなり敏感に反応します。また、玉ねぎスライスに近づけるとさらに反応します。「必ずしも人間にとって臭いもの」に反応するとは限らないのですが、大まかに「におう」ものに反応していることは間違い無いです。口臭チェッカーや硫黄化合物系ガス検知器、空気清浄器や換気扇コントロールなどへ応用できます。
次のグラフはフィガロ技研さんが出している TGS2450のデータシート です。
Rsはセンサ抵抗値でガスによって変化します。Roは清浄大気中のセンサ抵抗値で一定です。Rsのセンサ抵抗値が低くなればなるほど、ガス濃度ppmが高くなっていることが分かります。また左側のグラフほど、においセンサ(TGS2450)で反応しやすいガスということになります。
においセンサモジュールの回路図
下図はTGS2450をArduinoなどで使えるようにするための回路図です。私が製作したにおいセンサモジュールの回路も同様のものとなります。ご自身で製作する場合はこの回路図を参考になさってみてください。回路図中のJ1はArduinoなどのマイコンボードへ、Q2はTGS2450のガスセンサーへ繋ぎます。
TGS2450は4ピンのセンサデバイスで、役割はそれぞれ次のとおりです。3番、4番ピンの制御をマイコン側で行うことになります。
ピン番号 | 名称 | 備考 |
---|---|---|
1 | Common | GNDへ繋ぐ |
2 | N.C. | 何も接続しない |
3 | Sensor electrode | ガス濃度に応じて5.62Ω〜56.2kΩで変化 |
4 | Heater | パルスで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 |
---|---|
VDD | 5V |
GND | GND |
Output (OUT) | A3 |
Sensor (SEN) | A1 |
Heater (HTR) | A0 |
Arduino Uno以外のボードで使用する場合は、適宜変更なさってください。
においセンサ動作確認用のスケッチ(ソースコード)
Arduino Unoとにおいセンサモジュールとの配線が済みましたら、次のスケッチをアップロードして動作確認してみましょう。においのアナログ値をシリアルモニタへ出力するだけの簡単なものです。Arduino IDEで開発している場合は、シリアルプロッタでグラフ表示させると分かりやすいと思います。
/**
* @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()内にブロッキングされずに他の処理を実装することが可能です。#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の使い方はこちらで解説してます。