M5Stackで猫のトイレを体重計にする技術猫の工作室プログラム、電子工作、Webサービスを問わず、オープンな技術を使った工作活動を行なっています。工作の手順やノウハウだけでなく、それらのイベントへの展示について記事にしていきます。2020年1月24日金曜日M5Stackで猫のトイレを体重計にする猫様の体重を測るのが大変だったので、猫のトイレで体重計が測れれば嬉しいなと思ってやってみました。改造には何処のご家庭にもあるM5Stackとロードセルを使用しました。猫がトイレに乗ったとき、その数字をGoogleスプレッドシートに追記されるようなシステムを作ります。重量の測定にはロードセルをトイレの下に仕込み、その値をM5Stackで読み取ります。Scriptで作ったAPIに送信します。ハードウェアの作成ハードウェアの作成というと物々しいですが、今回作るものは市販の部品をパパっとハンダ付けするだけです。どんな部品を使っているのか、どう接続しているかを見ていきましょう。使用する部品は次の通りです。これらの他に、ユニバーサル基盤やピンヘッダなどの小物は適宜使用します。Basicいわずとしれたディスプレイ付きの開発モジュールです。200kg(50kgx4)荷重を電気信号に変換する装置です。電気信号は微弱なため、そのままでは読み取れないので、専用のADコンバータが必要です。秋月電子で購入しました。モジュール基板ロードセルの信号を読み取り、デジタル信号の変換するモジュールです。動作電圧は4.5V~5.5Vであるため、M5Stack秋月電子で購入しました。ロジックレベル双方向変換モジュールM5Stackとロードセル用ADコンバータの電圧差の調整に使用します。千石電商で購入しました。ケース百円均一のケースです。トイレの近くに設置する都合上、作成する基盤が汚れないようにするのに使用します。配線を考える接続にはM5Stackの向かって右側のコネクタを使用します。今回は通信にはGPIOの16と17を使用しています。余談ですがM5Stackのポートは、ディスプレイやスピーカーなど内部で接続しているものと競合するものがあります。この図では16と17を使用していますが、PSRAMと競合するため、PSRAMを使用する場合は適宜別のGPIOを使用して下さい。具体的な配線は次の図のようになります。ロードセル用ADコンバータは5Vで動作するため、M5Stackにはロジックレベル双方向変換モジュールを介して接続しています。ブレッドボードとサンプルスケッチで動作確認する回路を実際にハンダ付けする前に、ブレッドボードを使って各部品を実験的に接続し、サンプルスケッチで動作確認をしましょう。モジュール基板」のページにArduino向けのサンプルソースがあるので、それを動かします。微調整が必要ですがそれは次の2種類です。16ロードセルのパラメーターロードセルが出力する信号について、ロードセルの仕様書に基づいて値を設定します。[g]一通り動作確認が取れたら回路を作っていきましょう。回路を作る配線図を元に、黙々とハンダ付けします。ハンダ付けが終わったら、テスターで想定外の繋がり方をしていないかを確認します。確認ができたら部品を乗せます。一通り接続したらサンプルスケッチを動かし、ブレッドボードのときと同じように動くか確認しましょう。Googleスプレッドシートを準備するM5Stackがデータを送信する先となるGoogleスプレッドシートを準備します。作りたいものは簡単に次のようなイメージです。データを受信したとき、その月のシートが無ければ作る受信したデータを書き込むデータは計測された値をそのまま記録するセンサーの故障時に気づきやすくするため、生のデータで保存する変化前と変化後の値を記録して、引き算すれば重量が計算できるGoogleスプレッドシート上には次のように見えることをイメージしています。スクリプトを書くGoogleスプレッドシートのメニューのツール→スクリプトエディタでスクリプトエディタが開けます。スクリプトの詳細については割愛しますが、HTTP通信のGETのパラメーターでロードセルの検知した重量の変化前(raw_weight_from)と変化後(raw_weight_to)の2つを受信するようにします。今回作成したスクリプトは次のものになります。https://gist.github.com/cattaka/f369c412261e147700ebbac3e39b857dスクリプトを公開するスクリプトエディタでポチポチするだけで公開できます。M5Stackで認証を通すのは大変なのと機密情報でもないので、今回はアクセス権限を「Anyone」にします。スクリプトを動作確認する公開したときのURLをcurlコマンドなどで開いてみて動作確認をしましょう。次の例ではパラメーターとしてraw_weight_fromとraw_weight_toを付け加えています。成功すればスプレッドシートにデータが追加されているはずです。'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で可能この辺りは適宜調整して実装します。ソフトウェアのソースコード最終的なソースコードは次のようになりました。https://gist.github.com/cattaka/360437a9968500e3ec1a4ba6fedce588組み立てハードウェアとソフトウェアの一通りの部品が揃ったら組み立てて行きましょう。一度にやると失敗したときにわからなくなってしまうので、一つずつ進めていきます。猫のトイレに設置するための脚を作る今回使用しているロードセルは次の写真のような形をしています。このままでは取り付けられないため、固定用の部品を作ります。今回はBlenderで適当にモデリングして3Dプリンタで印刷しました。印刷が終わった部品をロードセルに嵌め込みます。動作確認する使用するロードセルは4つで1セットのものなので、配線をした後、仮でプラケースに取り付け、想定通りに重量が計測できるか動作確認をします。この写真の例では6キロが計測できました(少々誤差が乗ってますが)。ケースを作るM5Stackと基盤は剥き出しのままでは、不意にオシッコが掛かったりしてショートしてしまうかもしれません。簡単にでもケースを作りましょう。今回は100円均一で買ったケースを使います。中に仮置きして、マジックで印を付けます。次にカッターで切り抜きます。手を切らないように気をつけましょう。最後に部品を納め、コードを通します。所々はテープで目張りをするといいでしょう。設置する一通り終わったら、ロードセルを猫のトイレに取り付けて、可動させましょう。実際に動かしているといくつかの課題があることに気づいたので紹介します。ロードセルの値が安定するまでの閾値ロードセルの値が安定するための閾値に分散を使用しましたが、閾値を適当に決めたのと、うち猫様はゆっくりとトイレに乗ったり、前脚だけ乗せて一回止まったりするため、数回に分けて計測されることがありました。閾値の調整が必要そうです。静電気の話ロードセルの信号は微弱なため、静電気で値が容易にブレます。これを作っていた頃は冬場だったのもあり、絶対値で計測すると1kgくらいズレることがありました。デバッガで繋いで放置していると、少しずつ値が上昇していくこともありました。厳密な重量系の設計ならば、それらを踏まえて設計するのでしょうが、そこまで余裕はないので悩ましいところです。いえ、継続的に測定していれば、体重が減少傾向か増加傾向かはわかるので、猫様の健康管理という意味では十分だと思います。おわりに完成してからこの記事を書き上げるまで、なんだかんだで3週間くらい間が開きましたが、適当に作った割に前述の課題が残りつつも安定稼働をしているようです。M5StackやGoogleスプレッドシート、3Dプリンター、今回は使用しませんでしたがAndroidやRaspberryPiなど、今では電子工作に便利ないろんな部品が簡単に手に入るようになりました。生活をよくするものを作れるのは楽しいので、こういうものを活用してこれからもいろいろなものを作っていきたいと思います。