arrow-right hamburger logo-mark social-facebook social-github social-twitter
2018.06.28

M5Stack+GPS+臭気センサをつかってトイレの臭いマップをつくりたい!

たくろーどん

電子工作レシピ
    このエントリーをはてなブックマークに追加  

公衆トイレ1級判定士を目指します!

ある日の出来事、お出掛け中……

たくろーどん
あー、トイレ、トイレ~!!トイレどこ?どこ? ドコドコ┗(^o^)┛ドコドコ┏(^o^)┓

あっ、あの公園に公衆トイレあるやん!!!!

助かったぁ~~~ L( ^ω^ )┘ム゙ォーム゙ォー└( ^ω^ )」

公衆トイレに急いで駆け込む 三└(┐卍^o^)卍ドゥルルルルル

すると……

たくろーどん
臭い、臭い過ぎる!!!!なんやこれは!!!!(`ิิд´ิ)キエエエエエー

気分、萎え萎え……。みなさん、こんな経験ありませんか?

お出掛け中に公衆トイレにお世話になるも、臭いがひどくて気分が下がってしまうなんてことありますよね?

良い(無臭)公衆トイレと悪い(悪臭)公衆トイレが、どこにあるのか分かったらいいなぁ……。

たくろーどん
無ければ自分でつくればええやん!

ということで、そんな公衆トイレマップが作れるようなデバイスをつくってみたいと思います。 たぶん、僕は先駆者なので公衆トイレ1級判定士と名乗ることにします。

とりあえずつくってみる

今回はM5Stackというとても便利な開発ボードを使ってデバイスを作成していきます(M5Stackが便利な話はこちらの記事が参考になります)。

下記がイメージ図です。

architecture

M5Stackの拡張ボードのGPSを使って位置情報を取得し、臭気センサ(TGS2450)で計測した値と紐づけます。そして、Ambient(IoT可視化サービス)を使って地図上にマッピングし、良い(無臭)公衆トイレと悪い(悪臭)公衆トイレを可視化していくといった具合です。

今回使用する電子部品たち

実装

とりあえずArduinoで臭気センサを動かしてみる

まず安定感のあるArduinoで臭気センサが動くをことを確認してみます。

TGS2450のデータシートにあるサンプル回路を試してみたのですがうまくいきませんでした(要検証)。なので、検索した結果、トランジスタを2つ使用した回路が良く使われているようです。

回路図は以下の通りです。

circuit

配線がジャングルになりながらも……

circuit2

下記のプログラムを動かすと……

#include <Arduino.h>

int val = 0;

void setup() {
    pinMode(3,OUTPUT);
    pinMode(4,OUTPUT);
    Serial.begin(115200);
}

void loop() {
    for (int i = 0; i <= 3; i++){
        delay(242);
        digitalWrite(4,HIGH);
        delay(8);
        digitalWrite(4,LOW);
    }     
    delay(237);
    digitalWrite(3,HIGH);
    delay(3);
    val = analogRead(5);
    delay(2);
    digitalWrite(3,LOW);
    digitalWrite(4,HIGH);
    delay(8);
    digitalWrite(4,LOW);
    val = 1023 - val;
    val = val * 5;
    Serial.println(val);
    // 3msec loop
    delay(3000);
}

自室ではこのようにデータが取れました。部屋の中では約345、ユニットバスの中では約360です。

graph
これをM5Stackに応用していきます。

M5Stackに実装

M5StackにGPSモジュールをスタックします。そして、先ほどの回路図に従って回路をつくり、ジャンパワイヤを使ってM5Stackとつなげます。

配線後は以下の様になります。

circuit3

プログラム

#include <M5Stack.h>
#include <TinyGPS++.h>
#include <math.h>
#include <Ambient.h>

WiFiClient client;
Ambient ambient;

//臭気の強度が代入される変数////////////
int val = 0;
/////////////////////////////////////

//デザリングパスワード/////////////////
//屋外で使用するのでスマートフォンのデザリングを使用します
//これでAmbientにデータを送信できます
//const char* ssid = "yourSSID";
//const char* password = "yourPW";
/////////////////////////////////////

//Ambientの設定//////////////////////
unsigned int channelId = yourID; // AmbientのチャネルID
const char* writeKey = "yourWriteKey"; // ライトキー
////////////////////////////////////

//GPSの設定/////////////////////////
HardwareSerial GPS_s(2);
TinyGPSPlus gps;
////////////////////////////////////

void setup(){
  //WiFi////////////////////////////////////////////////////////
  WiFi.begin(ssid, password);  //  Wi-Fi APに接続
  while (WiFi.status() != WL_CONNECTED) {  //  Wi-Fi AP接続待ち
      delay(100);
  }
  //////////////////////////////////////////////////////////////

  //臭気センサ//////////////////////////////////////////////////
  pinMode(21,OUTPUT);
  pinMode(22,OUTPUT);
  //////////////////////////////////////////////////////////////
  Serial.begin(115200);
  M5.begin();
  GPS_s.begin(9600);

  ambient.begin(channelId, writeKey, &client);
}

void loop(){
  char buf[16];

  M5.Lcd.setCursor(0, 70);
  M5.Lcd.setTextColor(WHITE, BLACK);

  while(!gps.location.isUpdated()){
    while(GPS_s.available()>0){
      if(gps.encode(GPS_s.read())){
         break;
      }
     }
   }

   Serial.printf("lat: %f, lng: %f\r\n", gps.location.lat(), gps.location.lng());
   M5.Lcd.printf("lat: %f, lng: %f\r\n", gps.location.lat(), gps.location.lng());

  //GPS測定と臭気の測定&Ambientへ送信////////////////
  if(M5.BtnA.wasPressed()){
    //臭気をAmbientに送信///////
    //計測データの平均値を送信//
    for (int i = 0; i <= 3; i++){
        delay(242);
        digitalWrite(22,HIGH);
        delay(8);
        digitalWrite(22,LOW);
    }     
    delay(237);
    digitalWrite(21,HIGH);
    delay(3);
    val = analogRead(36);
    delay(2);
    digitalWrite(21,LOW);
    digitalWrite(22,HIGH);
    delay(8);
    digitalWrite(22,LOW);
    val = 1023 - val;
    val = val * 5;
    Serial.println(val);
    // 3msec loop
    delay(3000);
    ambient.set(1,val);
    /////////////////////////////////////////

    //経度・緯度をAmbientを送信///////////////
    dtostrf(gps.location.lat(),12,8,buf);
    ambient.set(9, buf);
    dtostrf(gps.location.lng(), 12, 8, buf);
    ambient.set(10, buf);
    ambient.send();
    /////////////////////////////////////////
  }
//////////////////////////////////////////////////
    m5.update();

}


動作確認

実際に完成したデバイスを動かしてみます。

M5Stackのボタンを押すと計測されたデータと位置情報がAmbientに表示されるようになりました。自室で試してみたところ以下の図のようになりました(具体的な地名は隠してあります)。

map
屋内なのでGPSに誤差があるようですね。ですが、臭気の強さが強いほど赤く、弱いほど青くマッピングされていることがわかります。

しかし、疑問があります。それは、「臭気センサの値が高すぎる!」ということです。

Arduinoの値が信頼できそうなので、明らかにM5Stackで検出した値は間違っていると考えられます。回路は変更していないのですが……「なんでだろう?」という感じです……。

とりあえずフィールドワーク

field
とりあえず、完成した(?)デバイスをもってフィールドワークに出かけてみます。公衆トイレを探しに行きます(在籍している大学で探します)。

※ここで公衆トイレとは、「屋外にあるトイレ」を意味します。

意外と公衆トイレはないものですね……。臭気の数値は正しい値ではないので、この臭気マップは参考になりませんが……

map2
このデバイスにはどうやら改良が必要のようです……。

おわりに

M5Stackと拡張モジュールのGPSを使うと簡単に位置情報を取得できることがわかりました。また、Ambientを使えばマッピングも自由自在です。

さらにセンサを組み合わせて使えば、ロガーのようなものが簡単につくれるでしょう。

しかし、今回は周期を計測する回路がArduinoでは正常で、M5Stackではうまく計測データがとれないという問題がおこりました。おそらく回路を改良する必要があると思います。

どうやら、公衆トイレ1級判定士の道のりはまだまだ長いようです……。

    このエントリーをはてなブックマークに追加