パイプの液体を検出するセンサを作ってストローをIoT化してみた。

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

IoT straw

ニフティIoTデザインセンターの矢部です。
IoTデザインセンターの専属のエンジニアチーム「ニフティIoTラボ」では、IoTに関わるテクノロジーの研究、デバイスを使用した実験などを日々行っています。

今回はストローにセンサ(自作)を取付け、ストロー内部を液体が通っているかをインターネット経由で取得する方法を説明します。
センサとマイコンボードの接続およびインターネットへの接続は比較的簡単なので、液体検出センサの作り方を中心に解説します。

  • 電子工作の性質上、やけどや感電、火災等の危険を完全に排除することは難しいため、実際に試される際は事故に十分注意して作業してください

目次

  • 動機
  • 機器構成
  • 液体センサーの検出原理
  • Grove接続の液体センサーの作り方
  • ストロー状態の取得
  • インターネット接続
  • 結果
  • まとめ

動機

  • 飲料が配管を通っているのかを調べたい
  • 管内の液体に接触しないセンサがいい
  • 既存のセンサはまぁまぁ高価
  • ストローにつけられるくらい手軽に使えるセンサを作りたい
  • 静電容量式と光方式があるが、管の透明度に依存しない静電容量式がいい

使用したもの

  • ストロー
  • アルミテープ
  • 静電容量式液体センサ(これから自作)
  • I2C タッチセンサ(Grove接続)
  • GrovePi+
  • Raspberry Pi x2 (センサ値取得用・ライト点灯用)
  • パトライト(一部自作)

  • インターネットに接続可能な回線

  • はんだ吸い取り線
  • 半田ごて
  • はんだ

以下は動作確認用に使用

  • Arduino(Groveベースシールド装着)
  • 動作確認用LED(Grove接続)

静電容量式液体センサーの検出原理

静電容量式液体センサは管内の液体の有無により、
管に取り付けた2つの電極の静電容量が変化することを利用したセンサです。

コンデンサの仕組みを平行板コンデンサで考えます。
コンデンサの静電容量は電極の面積と電極の間隔、電極間に存在する誘電体の誘電率で決まります。

Dielectric

ストローに巻く電極は平行ではなく、離れているため静電容量はごくわずかですが、コンデンサの形成はできます。

管内部が空の場合が静電容量が最も低い状態です。
液体で管が満たされると、液体が導体の役割を果たし静電容量が増加します。

atemptyatfulfilled

この静電容量の変化を計測することで液体の有無を検出できます。

Grove接続の液体センサーの作り方

ストローの液体の有無を検出したい部分に少し間隔をあけてアルミテープを巻きます。
アルミ箔の場合はテープ等で固定してもOKですが、アルミテープを用いると簡単です。
このとき、飲み物に触れない場所に巻く必要があります。

electrode

静電容量の変化を検出するため、
Freescale Semiconductor社のMPR121という静電容量センサのコントローラICを使用します。
MPR121はタッチセンサーなどのコントローラに使用されているものです。

組み立てを容易にするため、MPR121を搭載したGrove用のタッチセンサモジュールを使用します。

GROVE – I2C タッチセンサ は1つの基板で最大8つまでタッチ基板を接続することができます。
タッチ基板とにコネクタ付きの配線がついたものが4つ付属していますが、
そのうちひとつのタッチ基板を取り外し、タッチ基板の代わりに先に作っておいたアルミ箔の電極に接続します。

アルミ箔の電極は半田付けができないため、
ミノムシクリップを取り付けるか、アルミ箔と銅線を撚って接続します。

このとき、黒い配線はグランド側の電極で、赤い配線がセンサ側の電極になります。
赤い配線の電極は手で触れたり、グランドと接触してしまうとセンサが誤作動してしまうため、電極の位置に注意します。

straw electrode

GROVE – I2C タッチセンサ はセンサ電極とグランド間の静電容量の変化を検出する方式のセンサですが、信号グランドがタッチ基板に接続されているので、センサやマイコンの接地状態が変化しても安定して静電容量の変化を検出できるようです。

ストロー状態の取得

ストロー内の液体を検出するプログラムを作成します。
マイコンボードはGroveのベースシールドを取り付けたArduinoを使用します。
ArduinoでGroveのタッチセンサモジュールを使用するため、外部のライブラリをインポートします。
ライブラリは製造元のGitHubからzip形式でダウンロードすれば容易にインポートできます。

ライブラリを追加すると、スケッチの例にタッチセンサの例が追加されるので、
Grove_I2C_Touch_Sensor -> example -> i2c_touch を選択します。

例をそのままコンパイルして動作確認します。
ストローで飲み物を飲んでいる間だけシリアルモニタに「pin 0 was touched」などと出力されれば成功です。

ソースコード

シリアルモニタで確認してもいいのですが、
LEDなどで目立つようにしたかったのでGroveのRGB LEDに出力しました。

Arduino LED

以下がソースコードです。

トラブルシューティング

配線等の誤りが無くうまく動かない場合の対処は主に2つあります。

  1. ストローに形成したコンデンサの初期容量と液体が通っているときの容量を調整する
  2. タッチセンサコントローラのタッチ判定の閾値を調整する

両方試してみましたが、判定の閾値変更はあまり効果がありませんでした。
コンデンサの容量変更は、先に 静電容量式液体センサーの検出原理 で説明した
静電容量に関係する要素を変更します。

静電容量を全体的に大きくしたい場合は、
アルミ箔とストローが接触している面積を広くします。
初期の静電容量だけを増やしたい場合はセンサ電極とグランド電極を縞模様のように複数取り付け、
センサ電極-グランド電極-センサ電極-グランド電極と交互になるようにします。

ストローが厚い場合や、径が細い場合は容量が不足しやすくなります。

また、コントローラから伸びる赤と黒の配線はツイストしていないとノイズが乗る原因になりますが、
延長している場合ではツイスト線に生じる寄生容量が大きくなるため、
センサ基板の配線を延長する場合は注意が必要です。

インターネット接続

iot_structure

今回作成したセンサをRaspberry Piと接続してインターネットに接続します。
Raspberry PiとGroveセンサの接続にはGrovePi+を使用します。
GrovePi+で開発するためにライブラリは以下から入手できます。筆者はPythonのタッチセンサの例を参考にしました。

MQTTブローカーは自分で構築しても、パブリックなサービスで問題ありません。
筆者は、RaspberryPi間の通信にニフティクラウドのMQTTブローカーを使用しました。

subscribe側のRaspberryPiにはLEDなどセンサが反応したことがわかるものを接続します。
筆者は、GPIOでON/OFF出来るパトライトを使用しました。

plight

結果

ストローをIoT化し、飲み物を飲んでいるかどうかのイベントを通知することが出来ました。
実際に飲み物を飲んでいるときの様子は動画をご覧ください。

まとめ

  • ストローと液体センサ、Raspberry Piを組み合わせた
  • 液体検出センサをGrove接続の静電容量式タッチセンサを改造して製作した
  • Arduino でストロー内の液体有無を取得することができた
  • インターネット経由のイベント通知にはRaspberry Piを用いた
  • インターネット経由でストローの液体有無をイベントとして通知できるようにした
パイプの液体を検出するセンサを作ってストローをIoT化してみた。
  • このエントリーをはてなブックマークに追加

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です