感圧センサとM5Stackで猫が食べた餌の量を自動で記録する

# 背景
- 猫を2匹飼っている
- 1匹は軽度の脂肪肝の疑い
- 肝臓の負荷を下げるため、毎日食事量を一定に保つ必要がある
- キャットフードは1日3回(朝、昼、夜)
- 1匹あたり目安は45g/日

# 問題
誰がどれだけ食べたか分からない
- 2匹ともムラ食い(食べたいときに食べたい量だけ食べる)
- 給餌皿は分けているが、自分の皿という認識はない(食べたい皿から食べる)

仕方なく、ムラ食いの度に食べた量の記録を付ける
<img width="300" alt="ムラ食いの記録" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2628523/1f85c072-5bdb-fd61-3079-7d145496c051.jpeg">

とても大変

# アプローチ
猫の餌が入った皿の重量を、自動で定期的に記録したい
(どちらが食べた問題は残るが、記録の手間は減りそう)

まずは正攻法として、感圧センサによる計測を試みる
以下の記事を参考に作る

[圧力センサーを使って、デスクワークでどれだけ寿命が縮んでるか測ってみた](https://qiita.com/s_fujii/items/7e3f27df05685ad15e0c)

# 材料
- 感圧センサ(FSR406) ... 670円
- M5Stack Core2 IoT開発キット ... 6,589円
- マイクロSDカード 16GB ... 620円
- ブレッドボード ... (自宅にあった)
- ジャンパーワイヤ ... (自宅にあった)
- 10kΩ抵抗 ... (自宅にあった)
- GROVE 4ピンケーブル20cm 5本セット ... 407円
- GROVE-ユニバーサル4ピンコネクタ 10個入り ... 220円
- 送料 ... 800円

秋月やAmazonで購入
不要なものも含まれているかも？

# 実装
GROVEケーブルがM5に刺さらないので、ツメ部分をカット
<img width="300" alt="GROVEカット" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2628523/2d00c7cc-b87a-5880-6244-3ffe8e6f9335.jpeg">

ユニバーサル4ピンコネクタのソケットがブレッドボードに刺さらない
<img width="300" alt="刺さらない" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2628523/7070dc23-7626-d074-3ccb-e0d19522947c.jpeg">

ジャンパーワイヤを無理やり繋ぐ
（GROVE4ピン-ジャンパーワイヤ オス のケーブルがあれば良かった）
<img width="300" alt="末路" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2628523/0df3dec6-d906-06ac-6fef-e6b290eab3d5.jpeg">

参照記事を改変したプログラムを書きこむ
<img width="300" alt="M5" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2628523/139e986a-78f2-8498-7ec4-75c58ad4c039.jpeg">
```c:sample.c
#include <Arduino.h>
#include <time.h>
#include <M5Stack.h>

#define ANALOG_PIN 36

int val = 0;

void setup() {
  M5.begin();
  Serial.begin(115200);  // シリアル通信速度
  Serial.println("setup");
  M5.Lcd.fillScreen(TFT_LIGHTGREY);
}

void loop() {
  val = analogRead(ANALOG_PIN);

  M5.update();

  M5.Lcd.setTextFont(7);
  M5.Lcd.setTextSize(2);
  M5.Lcd.setTextColor(TFT_BLACK, TFT_LIGHTGREY);

  M5.Lcd.setCursor(10, 40);
  M5.Lcd.print(val);

  Serial.print("value:");  Serial.println(val);
  Serial.println();

  delay(1000);
}
```


抵抗などを繋げば完成
![測定器1号.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2628523/33201a56-00e0-f0b3-ed93-7c1095ad033c.jpeg)

# 課題

実際に動かすと、以下の理由で重量が正確に計測できなかった

1. センサの淵の部分を巻き込んで皿を置くことになり意図した抵抗値の変化が起きない
→ 感圧センサが小さすぎる

2. 騒音対策などで床にクッションシートを引いているため、センサの歪みが小さくなる
→ 固い板などを敷く

3. 静止状態でも10g程度で値がぶれる
→ ノイズや接触抵抗？

1,2 は対策できるが、3の解決が難しそう

# 今後

別のアプローチを試みる

## キッチンスケールの値を読み取る
デジタルの場合
- ディスプレイに繋がる線を横取りすれば計測済みの値が使える？
- 計測しっぱなしができるか？（5分程度で電源切れる？）
- はんだ付けが必要（猫がいるので危ない？）

アナログの場合
- 目盛りを画像処理で読み取る？
- 夜など部屋が暗いときにも精度は確保できる？

## 先人の知恵を拝借する
猫IoTLT MZ工房さんの投稿から
画像処理で、餌の面積から食べた量を計測する

<iframe src="//www.slideshare.net/slideshow/embed_code/key/ajjbi333ZT9xIt" width="595" height="485" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;" allowfullscreen> </iframe> <div style="margin-bottom:5px"> <strong> <a href="//www.slideshare.net/MZFACT/mz-251223781" title="Mz工房 ねこのおもちゃと餌管理してみた" target="_blank">Mz工房 ねこのおもちゃと餌管理してみた</a> </strong> from <strong><a href="//www.slideshare.net/MZFACT" target="_blank">MZFACT</a></strong> </div>

# まとめ

一筋縄ではいかない。。。
進展があれば記事を更新します

2023/3/14追記　圧力センサーではなくロードセルで試してみた

https://qiita.com/itortie/items/dbb6c82f461e691abfb0