HOME IP Messenger FastCopy Tech-memo Diary 作者Twitter [English]

ラズパイでコーヒーポットIoT(朝日ネット in 歌舞伎座タワー)

リスト 作成: 2017/11/16
更新: 2018/07/15
(株)朝日ネット 技術戦略研究所 白水啓章

概要

coffee-sample

その昔(1991~1993年頃)、ケンブリッジ大学のコーヒーポットをWebカメラでモニタすることで、遠隔からガラス製ポットの残量を目視できるシステムが話題になったことがあります。(世界初のライブカメラ)

さて、私の所属する朝日ネットは、歌舞伎座タワー21Fという眺めの良い場所にあります。ただ、1フロアがそこそこ広く、コーヒーポットのある休憩ルームは少し遠い廊下を隔てた別室にあります。

そこで気付いたのは、休憩ルームまで足を運んで、コーヒーポット(ステンレス製)を持ち上げた直後に「コーヒーポットが空だった…」と居室に戻っていく人が意外と多いこと。

そこで、

  1. 居室から、ポット2台の残量をリアルタイムで確認できる
  2. 休憩ルームで、ポット2台を持ち上げなくとも残量が見える

という仕組みがあると良いなと思い、懐かしのコーヒーポット・ライブカメラの現代版ということで、ラズパイ+重量センサで、コーヒーポットIoT と名付けた仕組みを作ってみました。
(右上の図は、実際に稼働しているコーヒーポットIoTのWeb画面で、居室や休憩ルームから参照することができます)

ラズパイ3

センサデータを取得したりアップロードするデバイスは、無線LAN付きでDebian系Linuxが動いて、sshで遠隔メンテナンスもし易い、Raspberry Pi 3 にしました。
ただ、1点注意が必要なのは Arduino等と違って、アナログ入出力がない点です。アナログセンサと接続する場合、別途、ADコンバータを接続する必要があります。(今回は HX711 というアンプ付きADコンバータを利用)

FSR薄膜センサ方式はうまくいかず

さて、現在のコーヒーポット(2台)はステンレス製魔法瓶タイプのため、ケンブリッジ大学のようにWebカメラで残量確認、という手は使えません。

fsr

そこで、FSR402薄膜センサ をポットの下に差し込む、という手を考え、トライしてみました。

FSR402はアナログセンサ(重量の変化が抵抗値の変化となる)ですが、ラズパイの持つセンサ用入出力はデジタルのみです。そのため、ラズパイとの間に アナログ/デジタル変換(ADコンバータ) MCP3002 を経由させて抵抗値の変化(=重量の変化)を読み取るようにしました。

fsr_graph

ところが、実際にいろいろなパターンで重量を測定して判ったことですが、このFSRの特性は「試行毎の誤差」以上に「定常的な負荷に対して徐々に抵抗値が小さくなる(=重くなる)」という問題のあるものでした。

最初の数分で大きく抵抗値が下がっていき、それ以降もずっと値が小さくなっていき(12時間以上)、また時折、値がジャンプするようです。
(右のグラフは、2つのFSR402に同じ1.5kgくらいの荷重を載せて、9時間近くモニタした時のグラフです。正確には固定抵抗とセンサ(可変抵抗)を直列につないセンサ側の電圧をAD変換)

これでは定量的な測定には使えそうにないため、FSR以外の方法を考えました。

ロードセルでの重量取得はOK

sensor

次に考えたのは、デジタル体重計等で一般に使われている、ロードセル(歪ゲージ式) を使うという方法です。
最初からこれで実験しなかったのは、このセンサーは 1cmくらいの厚みがあるため(さらに上下に隙間を入れる必要もある)、ポットの隙間に差し込むには、あまりにも厚さがあるためでした。

あれこれ考えた挙句、ロードセルに右上のような金属板を取り付け、僅かなコーヒーサーバと机との隙間(4mm)に入れて計測する形を思いつき、材料調達やらドリル等であれこれ工作した結果、実用になる値を計測することが出来るようになりました。
(ちなみに手元で試した範囲でも、ロードセルのセンサ精度は高く&時間経過によるドリフト等もない様子で、とても優秀)

なお、歪みゲージは抵抗値の変化が非常に小さいことから、アンプ機能を持った高精度 ADコンバータ「HX711」 をセンサ毎に挟む必要があります。

ラズパイ+Webサーバ連携で完成

system

一番大事な点はクリアできたので、あとは常時センサー値をWebサーバにアップロードし、それをグラフ化した上でブラウザから閲覧できるようにれば OK なので、それらを行うPythonスクリプトと HTML/JavaScript を書きました。
主に下記の4つです。

  1. ラズパイで HX711とGPIO通信してセンサー値を取得し、WebサーバにアップロードするPythonスクリプト
  2. ラズパイからのアップロードデータを受け取って、PostgreSQLに格納する Python CGI
  3. Webアクセス用に、PostgreSQLからデータを取り出し、グラフ生成のHTML/JSを吐き出す Python CGI
  4. 上記のWeb画面内で随時最新データを取得しながら、グラフを動的更新していくJavaScript

(ちなみに、Webブラウザ内でのグラフ表示には HTML5 でグラフが作れる、Google Charts を使いました。おすすめです)
そして、ラズパイ+ロードセル+HX711の物理配線を行い、各経路の通信確認を行います。

淹れて欲しい投票

vote

さて、これだけではツマらないので、2つのポットの両方が200ml以下になると「淹れて欲しい人投票」というボタンが出現するようにしました。

コーヒーポットの近くにも右の画面が出ているので、ボランティア精神あふれる人が休憩ルームにいて、このメッセージを目にすると、新しくコーヒーを作ってくれるというわけです。

さらに常時コメント欄が出ており、ここに「投票しました」とか「コーヒー淹れました」等のメッセージを書き込むことで、居室と休憩ルームとの連携(?)がしやすくなっています。

これで、当初の狙い通りの「コーヒーポットIoT」が完成しました。

今後の改良

ポット下部に温度センサを挟むことで、重量と共に温度変化もグラフ表示する予定です。
(また、新しくコーヒーが出来上がったタイミングで、bot系を使って通知するのも面白いかも)

もう1点、計測精度の改善…実用的には概ね大丈夫とはいえ、現在±100gくらいの誤差が発生しています。これはセンサー精度ではなく設計の問題です。(センサー自体は10g未満の誤差)
設計の問題とは「コーヒーサーバを下から支えている4点のうち、1点だけをロードセルで計測している」点です。そのためポットが(コーヒーメーカー上の定位置から)数mmずれるだけで重量変化(=誤差)として現れるという次第。
コーヒーサーバ全体をロードセルの上に載せるのが一番ですが、まずはセンサ増設による解決を考えています。

physical(=40)

余談

朝日ネットにお世話になって約2年、ここは東大マイコンクラブOBが多いせいか、見ただけで「お、歪センサを使ってる!」と言う人がいたり、さらに話を脱線させると、Haskellの達人(業務でもHaskellを使っている)が「私は東大大学院でやっていけなくなったから朝日ネットに来た。俺は落ちこぼれなんだ」などと訳の分からないことを言いつつ、「プレスバーガー算術とは…」などと説明を始める人もいたりして面白いところですね。

ソースコード

参考までに、githubに実際に使っているスクリプト群を置きました。
https://github.com/shirouzu/coffeepot-iot

履歴

2018/07/15 ソースコード追加
2017/11/16 初版作成