2020年1月24日金曜日

M5Stackで猫のトイレを体重計にする

猫様の体重を測るのが大変だったので、猫のトイレで体重計が測れれば嬉しいなと思ってやってみました。改造には何処のご家庭にもあるM5Stackとロードセルを使用しました。

概要

猫がトイレに乗ったとき、その数字をGoogleスプレッドシートに追記されるようなシステムを作ります。重量の測定にはロードセルをトイレの下に仕込み、その値をM5Stackで読み取ります。読み取った値はM5StackからHTTP通信で、GoogleスプレッドシートのGoogle Apps Scriptで作ったAPIに送信します。




ハードウェアの作成

ハードウェアの作成というと物々しいですが、今回作るものは市販の部品をパパっとハンダ付けするだけです。どんな部品を使っているのか、どう接続しているかを見ていきましょう。

用意する部品

使用する部品は次の通りです。これらの他に、ユニバーサル基盤やピンヘッダなどの小物は適宜使用します。
  • M5Stack Basic
  • ロードセル 4ポイント(薄型) 200kg(50kgx4)
    • 荷重を電気信号に変換する装置です。
    • 電気信号は微弱なため、そのままでは読み取れないので、専用のADコンバータが必要です。
    • 秋月電子で購入しました。
  • HX711使用 ロードセル用ADコンバータ モジュール基板
    • ロードセルの信号を読み取り、デジタル信号の変換するモジュールです。
    • 動作電圧は4.5V~5.5Vであるため、M5Stack
    • 秋月電子で購入しました。
  • ロジックレベル双方向変換モジュール
  • ケース
    • 百円均一のケースです。
    • トイレの近くに設置する都合上、作成する基盤が汚れないようにするのに使用します。

配線を考える

接続にはM5Stackの向かって右側のコネクタを使用します。今回は通信にはGPIOの16と17を使用しています。
余談ですがM5Stackのポートは、ディスプレイやスピーカーなど内部で接続しているものと競合するものがあります。この図では16と17を使用していますが、PSRAMと競合するため、PSRAMを使用する場合は適宜別のGPIOを使用して下さい。
具体的な配線は次の図のようになります。ロードセル用ADコンバータは5Vで動作するため、M5Stackにはロジックレベル双方向変換モジュールを介して接続しています。


ブレッドボードとサンプルスケッチで動作確認する

回路を実際にハンダ付けする前に、ブレッドボードを使って各部品を実験的に接続し、サンプルスケッチで動作確認をしましょう。秋月電子の「HX711使用 ロードセル用ADコンバータ モジュール基板」のページにArduino向けのサンプルソースがあるので、それを動かします。微調整が必要ですがそれは次の2種類です。


  • ピンアサインに関するもの
    • ADコンバータのデータ出力(DAT)とクロック入力(CLK)のピンを指定します
      • #define pin_dout  17
      • #define pin_slk   16
  • ロードセルのパラメーター
    • ロードセルが出力する信号について、ロードセルの仕様書に基づいて値を設定します。
      • #define OUT_VOL   0.0005f    // 定格出力 [V]
      • #define LOAD          50000.0f   // 定格容量 [g]

一通り動作確認が取れたら回路を作っていきましょう。

回路を作る

配線図を元に、黙々とハンダ付けします。

ハンダ付けが終わったら、テスターで想定外の繋がり方をしていないかを確認します。確認ができたら部品を乗せます。
一通り接続したらサンプルスケッチを動かし、ブレッドボードのときと同じように動くか確認しましょう。

Googleスプレッドシートを準備する

M5Stackがデータを送信する先となるGoogleスプレッドシートを準備します。作りたいものは簡単に次のようなイメージです。


  • データを受信したとき、その月のシートが無ければ作る
  • 受信したデータを書き込む
    • データは計測された値をそのまま記録する
      • センサーの故障時に気づきやすくするため、生のデータで保存する
    • 変化前と変化後の値を記録して、引き算すれば重量が計算できる


Googleスプレッドシート上には次のように見えることをイメージしています。


スクリプトを書く

Googleスプレッドシートのメニューのツール→スクリプトエディタでスクリプトエディタが開けます。
スクリプトの詳細については割愛しますが、HTTP通信のGETのパラメーターでロードセルの検知した重量の変化前(raw_weight_from)と変化後(raw_weight_to)の2つを受信するようにします。
今回作成したスクリプトは次のものになります。



スクリプトを公開する

スクリプトエディタでポチポチするだけで公開できます。

M5Stackで認証を通すのは大変なのと機密情報でもないので、今回はアクセス権限を「Anyone」にします。

スクリプトを動作確認する

公開したときのURLをcurlコマンドなどで開いてみて動作確認をしましょう。次の例ではパラメーターとしてraw_weight_fromとraw_weight_toを付け加えています。成功すればスプレッドシートにデータが追加されているはずです。
curl 'https://script.google.com/macros/s/ここにキーが入る/exec?raw_weight_from=30&raw_weight_to=40'

M5Stackのソフトウェアを作る

もっとも楽しいM5Stackのソフトウェアを作っていきましょう。
単純にロードセルの値を計測するのはサンプルスケッチで確認できました。しかしこれだけでは猫の体重を測ることはできません。それは値の計測は0.1〜0.2秒間隔で行っていますが、ゆっくりと乗ったり、乗った後に動いていると、値が安定しないからです。

値が安定したと判断する方法

値が安定するまで待つようにすればいいですが、ソフトウェア的にはどのように判断するかを決めなければなりません。幸い、この問題は高校数学で習う分散を使えば簡単に解決できます。だいたい0.1〜0.5秒間隔で計測した値を過去5〜10個くらい記憶しておき、それらの分散を計算し、分散が一定以下に下がれば安定していると見做すとすれば、それらしく動きます。この手の計算方法は他にもあるので、調べて使いやすいものを使うといいでしょう。

他にソフトウェアに必要な機能

今回作成するものの目的を達成するには、他にも次のような機能が必要になります。
  • WiFiに接続できる
    • M5Stackの標準ライブラリで可能
  • HTTPS通信でデータを送信できる
    • ルート証明書をハードコードすればHTTPClientで可能
この辺りは適宜調整して実装します。

ソフトウェアのソースコード

最終的なソースコードは次のようになりました。



組み立て

ハードウェアとソフトウェアの一通りの部品が揃ったら組み立てて行きましょう。一度にやると失敗したときにわからなくなってしまうので、一つずつ進めていきます。

猫のトイレに設置するための脚を作る

今回使用しているロードセルは次の写真のような形をしています。
このままでは取り付けられないため、固定用の部品を作ります。今回はBlenderで適当にモデリングして3Dプリンタで印刷しました。
印刷が終わった部品をロードセルに嵌め込みます。

改めて動作確認する

使用するロードセルは4つで1セットのものなので、配線をした後、仮でプラケースに取り付け、想定通りに重量が計測できるか動作確認をします。

この写真の例では6キロが計測できました(少々誤差が乗ってますが)。

ケースを作る

M5Stackと基盤は剥き出しのままでは、不意にオシッコが掛かったりしてショートしてしまうかもしれません。簡単にでもケースを作りましょう。今回は100円均一で買ったケースを使います。
まず、中に仮置きして、マジックで印を付けます。

次にカッターで切り抜きます。手を切らないように気をつけましょう。


最後に部品を納め、コードを通します。所々はテープで目張りをするといいでしょう。


設置する

一通り終わったら、ロードセルを猫のトイレに取り付けて、可動させましょう。


課題

実際に動かしているといくつかの課題があることに気づいたので紹介します。

ロードセルの値が安定するまでの閾値

ロードセルの値が安定するための閾値に分散を使用しましたが、閾値を適当に決めたのと、うち猫様はゆっくりとトイレに乗ったり、前脚だけ乗せて一回止まったりするため、数回に分けて計測されることがありました。閾値の調整が必要そうです。

静電気の話

ロードセルの信号は微弱なため、静電気で値が容易にブレます。特にこれを作っていた頃は冬場だったのもあり、絶対値で計測すると1kgくらいズレることがありました。デバッガで繋いで放置していると、少しずつ値が上昇していくこともありました。厳密な重量系の設計ならば、それらを踏まえて設計するのでしょうが、そこまで余裕はないので悩ましいところです。
とはいえ、継続的に測定していれば、体重が減少傾向か増加傾向かはわかるので、猫様の健康管理という意味では十分だと思います。

おわりに

完成してからこの記事を書き上げるまで、なんだかんだで3週間くらい間が開きましたが、適当に作った割に前述の課題が残りつつも安定稼働をしているようです。M5StackやGoogleスプレッドシート、3Dプリンター、今回は使用しませんでしたがAndroidやRaspberryPiなど、今では電子工作に便利ないろんな部品が簡単に手に入るようになりました。生活をよくするものを作れるのは楽しいので、こういうものを活用してこれからもいろいろなものを作っていきたいと思います。

左:チャーリーさん[7.2kg]、右:犀(セイ)さん[4.3kg]