（試行錯誤）飲料の液量を非接触かつリアルタイム計測する

ここ数ヶ月間、下記の条件を満たす日本酒向けのIoT機器（IoTお猪口と命名）をどうにか実装できないか頭を捻ってきました。その進捗をまとめます。現在一番有力な実装は次の記事でまとめます。


## 条件

- その機器で液体（日本酒を想定）を飲むことができる
    - なるべく自然な所作で飲むことができる
- 容量が大きすぎないこと
    - お猪口サイズ
- コースター型でないこと
    - 既存プロダクトが存在している
    - 利用シーンが異なる
- リアルタイムに飲んだ（減る）、注いだ（増える）などの動作を取得したい
- 酒器として扱って壊れないこと

<br>

私の想定するお猪口のベンチマーク（生成AIで作成した画像ではなく私物）

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3948175/99eb079c-959a-44fc-af7e-5ae2c1d3dfde.jpeg" width="150">　


## これまでブログにまとめていたアプローチ

https://qiita.com/w-ta-9999/items/557321bb7fb5430958a9

https://qiita.com/w-ta-9999/items/0bfd03220f04bcdbf925

https://qiita.com/w-ta-9999/items/27e2876c41c8bbf41903

## 上記ブログで採ったアプローチの課題

- 超音波センサーを液面の上に配置している
    - センサーをずらす指の動作が自然ではない
    - 酒器の形としては異形
- 超音波センサーが濡れやすい所にある
- 精度が悪い
    - 超音波センサーがプラコップのへりに反射して突飛な値を戻してしまう

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3948175/4cd14585-e8f9-4887-b550-34b750d9fbbc.jpeg" width="150">

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3948175/07764c21-2fd8-4108-a68f-c3ffb7923fa9.png" width="150">　
↑コップのへりを検出してしまっている様子


## 試行錯誤と失敗

### 液面の上にあるセンサーとどのように折り合いをつけるか

液面の高さを直接計測する限り、センサーは液面上にある必要があります。かつ、センサーが液面を的確に捉えるためには液面の中央が望ましいです。補足すると例えば超音波センサーの計測範囲は円錐状に広がっています。この設置場所は液体を飲む際には最も邪魔になる場所ですから、飲む際には何かしらの方法で場所をずらし飲んだ後には元の場所へセンサーが戻ってくる必要があります。

前回のブログのアプローチでは輪ゴムで張ったアームを指で押し退けるようにしました。この方法のメリット・デメリットは下記です。

- メリット
    - 機構がシンプルで輪ゴムという手に入りやすい素材で作成されている
    - センサーを移動した後、正確にセンサーが元の場所に戻る
    - 飲む際に液面からセンサーがかなり離れることで飲料がセンサーにかからない可能性が高い
- デメリット
    - 指を上から下へ動かすことになり飲む動作が非常に不自然
    - センサーが液面から離れても顔には近いため非常に飲みづらさを感じる

結局デメリットを許容しがたく、別の方法を検討することにしました。

超音波は液面で反射するため超音波センサーはそれ単体で液面を計測することが可能です。そして、センサーの値段が安いため万が一壊れても容易に取り替えられます。そのため、前回の試行錯誤での超音波センサーはそのまま活かす方向で考え始めました。液面への距離を計測するタイミングでのセンサーとコップの場所は固定で、その移動方法や支持方法を変えることでデメリットを消すアプローチです。


### （試行錯誤）センサーの移動方法と支持方法

センサーの移動方法、支持方法は同時進行で改善を進めました。煩雑になりますが同時並行で説明します。

センサーを1本のアームで液面の上に固定した場合、支点を中心にアームを動かすと弧を描きます。液体を飲む際に、センサーをこの曲線に沿って移動させて顔が当たらない場所まで移動させるには相応の距離を移動させないといけません。かつ、指はお猪口を手で摘んだり包んだりする動作と同じく握り込む方向が望ましいと考えています。デバイスのアームを目一杯開いた状態が下記で、この状態でもっと飲みやすいようにして、センサーの移動にはなるべく通常飲む場合に近い動作をするようなデバイスを模索しました。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3948175/094b5f5a-89af-4212-a2e7-6444f67ebd60.jpeg" width="150">　

センサーを移動させる際に最も留意すべき点は最短経路を取り省力で移動させることです。経路が長くなるほど指で大袈裟なアクションをすることになり、自然な動作からかけ離れます。また、移動させる際に目指す地点はそのまま液面のすぐ上空というわけではありません。液面のすぐ上空は液体がセンサーに触れてしまう可能性が高く、かつ飲む動作で非常に邪魔になりますからプラコップの外側へセンサーを追いやる必要があります。

最初の改善案は縦に3cm、水平方向へ軸を中心に180°前後動かす設計です。縦に3cm降下した地点はほぼプラコップのへりと同じ高さです。水平方向への捻り180°はセンサーを支える軸を中心として回転した場合に液面から遠い地点となります。


<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3948175/b44854b5-a0d6-4b40-85fd-f3a1d081bdc5.jpeg" width="150">　
※センサーを固定する軸は別のモックに使用されてしまったため、イメージ画像として手でセンサー設置部を押さえています。写真の状態はセンサーを捻らず液面を計測するタイミングを模しています<br>

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3948175/3956defa-2383-4438-b856-7fe53fa22b47.jpeg" width="150">

↑紐を引く機構は異なるが、シリンダーを中心に捻る機構は同じものです
<br>


![cylinder_hineri_1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3948175/8e4af5c5-1069-4641-98e8-85635d4636d6.gif)


![cylinder_hineri_2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3948175/f5168446-b0bf-4a17-b8d3-0241aa10aa07.gif)



この構造の肝はセンサーを移動する機構です。シリンダーの内側にセンサーを固定している円筒をバネで上方向に突っ張っておき、それを下方向に引っ張ることで上下方向へ移動させます。下へ移動させる際に往復ネジのような溝に沿って回転する機構で円筒を捻ります。回転運動への追従が煩雑であること、また機構の機械的な精度をルーズにしても安定して動くようにするためこの引っ張る機構は紐で実装しています。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3948175/fdcfbe74-a368-4202-87c3-5c79ffb566cb.jpeg" width="250">

この機構でセンサーを思うように動かすには紐を3cm動かす必要があります。たかが3cmですが、お猪口を使って酒を飲むとして仮にその本体に3cm引くレバーがあるとかなり邪魔です。大きさもさることながら、通常付いてないものを3cm動かすという行為がかなり違和感を感じさせます。そうなると紐を引く比率を変え、理想的には3倍、妥協して2倍の比率で紐を引く機構で必要となりました。

最初に思いついたのは上下に支点を置き、その隙間に紐を通した棒を入り込ませて往復分の距離を引っ張る方法です。実装がルーズでも稼働して力の方向も変えやすく、最大2倍まで引く比率を高められます。この方法は優秀であるため何度もこの方法へ立ち戻ることになります。下記はその断面図だと考えてください。左が押す前（紐を引く前）です。右がボタンを押し込んでいる状態（紐を引いている状態）です。紐の下部が固定されていれば、押した距離の2倍紐を引ける理屈です。

![screenshot](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3948175/24fc7b92-6cda-4804-b851-1ba34b8a4bf7.png)

 <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3948175/b2da90c3-ef8d-4b3e-bb77-71fce2dc9204.png" width="250"><br>
↑上記の機構で用いた部品の一部
<br>

他の案としては上記の紐を引っ張る方法を左右2つのボタンを用いて押すように実装する案、ラックアンドピニオン機構を用いて棒を押した力で紐を巻き取る案を思いつきました。結局、人力で動作させる機構でかつ精度がルーズでも組めて力の方向を変えつつ引き効率も3倍にする策はうまく見つからず機構だけが複雑になったため、支持方法を変えることで引き効率2倍以下でも動作するような方向性で模索を続けました。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3948175/ff422db3-3afa-4007-bb28-f7130e3257bb.png" width="500"><br>
↑ラック&ピニオンで紐が引けるか試したもの。なるべくコンパクトにしつつ短い動作で紐を引くように設計した結果、引っ張る際のトルクに負けてピニオンが滑ってしまい使い物にならなかった


<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3948175/889a1f23-63f7-465f-8ff6-698fd5ab3bcd.jpeg" width="150">　<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3948175/3956defa-2383-4438-b856-7fe53fa22b47.jpeg" width="150">　<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3948175/80aa4f0a-810c-4480-8801-282a28c02dd3.jpeg" width="150">　
↑紐を引っ張る方法を左右2つのボタンを押すように実装する案
<br>

支持方法は長らく前述の捻りつつ上下に移動させる機構を洗練させる方向で考えてきましたが、支柱自体をバネにしてしまい、それを外側から角度をつけて引くことで飲みやすい場所までセンサーを移動させることを思いつきました。この機構の副次的な恩恵として紐の支点とレイアウトが自由になったため「上下に張った糸をそのまま指で握り込む機構」が新たに選択肢として加わりました。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3948175/449b468f-eb4e-47ff-b807-3ba26774ee82.jpeg" width="150">　<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3948175/c02c92e2-8db7-44b5-9eb0-7a3532cecfee.jpeg" width="150">　<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3948175/45c1672d-f9fd-47b3-89b6-dc656f92bd15.jpeg" width="150">　<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3948175/5a486fa5-07ad-4549-ada5-735706e56b1e.jpeg" width="150">　


力の方向（ベクトル）を変える機構は多数あれど加工が難しく動作もギクシャクします。場合によっては機構が途中で止まりセンサーが元の場所まで戻りません。最初のブログでのアームを円弧に沿って動かすアプローチが手軽だったのは指で「上から下へ動かす」ためでした。これはお猪口を摘んだり握り込んだりする動作とはとても相性が悪いのですが、力の方向を変えていないため非常に効率よく機構もシンプルでした。上記のバネで支える方法は同様に構造がシンプルで、動作も軽いものです。デメリットとしてはセンサーを動かした後に戻る場所がルーズとなることです。

ここまでセンサーの移動方法、支持方法の改善を紹介してきましたが、同時並行でセンサーも選定し直してセンサーの精度アップ施策にも取り組んでおりました。センサーの試行錯誤については下記に機械的な機構とは別でまとめます。

### （試行錯誤）センサー自体を変える

IoTお猪口の距測センサーの要件は下記です

- 最短計測距離が短い
- 水面を反射する
- 防水である
- 指向性が高い
    - プラコップのへりでデータが乱れないようにようにしたい
- 精度が高い（数mmレベルの誤差）
- なるべく小型が良い

超音波距測センサーで一般的なものとしてはHC-SR04が挙げられ、このセンサーは上記の条件のうち前者2つは満たしておりました。防水性がないという弱点はセンサーの動かし方次第である程度は回避できるかもしれませんが、防水に越したことはありません。しかし、飲み会の場で雑に扱うことを考えるとこのデバイスにはもっと最適なセンサーがあるかもしれません。

具体的に試したセンサーや購入したもののお蔵入りになったセンサーは下記です。

- RCWL-1670
    - 超音波距測センサーでセンサー部が防水です
    - HC-SR04と似たスペックです
        - 防水センサーでこのスペックは貴重で、特に最短計測距離が短い防水センサーは珍しいです
    - 結局使用する前に別のアイデアを思いついたためそのまま使用しませんでした
        - 超音波センサーを使うのであればこのセンサーが本命です

https://www.youtube.com/watch?v=NiroLveStYc

<br>

- Grove 超音波センサーモジュール
    - センサーのパルサーとレシーバーの間隔がHC-SR04より若干狭くなっています
    - 組み込んでみましたがプラコップのへりの高さを誤って計測してしまう頻度が下がっているかよくわからずHC-SR04より値段も高いためお蔵入りとなりました

https://akizukidenshi.com/catalog/g/g116542/

<br>

- VL53L0X
    - レーザーパルス（光）を送出し、反射して戻ってくるまでの時間（ToF）を測定します
    - 水面は透過するため、水面にバランを浮かべて計測の予定でした
        - バランが側面へ張り付くためバランに穴を開けて竹串を通す計画
        - 結局これが手間、かつ挙動が安定しなくてボツとしました
    - HC-SR04と最短計測距離が同じ
    - やや値段が高め（モジュールで1180円）
    - 距離測定の精度は良いですが、プラカップのへりを誤検出する頻度が特別少ないわけではなかったです

https://akizukidenshi.com/catalog/g/g112590/

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3948175/8e00704c-9d59-48b7-ba30-28116060baf6.jpeg" width="150">　
↑バランと竹串


<br>

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3948175/dc09b087-79ca-4841-95e4-fd4c410a6522.png" width="200">　
↑左がVL53L0X、上がHC-SR04、下がGrove 超音波センサーモジュール
<br>



### （試行錯誤）容器を選定する

結論としてはseriaのプラコップのままとしました。
下記の写真に写っている候補のプラコップはamazonで探して購入したものです。当然ですが、同じような容量であれば直径が多くなるほど高さは浅くなるためセンサーの計測精度が要求されることになります。

- seria クリアカップ 110ml（18個）
    - 株式会社まるき


- 旭化成パックス 透明デザートカップ 40個入 145ml DIP-145 口径71mm

https://amzn.asia/d/boijufG

- リスパック(Risupack) 使い捨て 容器 テイクアウト バイオカップ 90 BL 本体 106ml BL 日本製 PBPM061 クリア

https://amzn.asia/d/fiJ4Zim

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3948175/d236d330-677f-416d-9577-257c6424bb5f.jpeg" width="200">　<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3948175/74a2ba00-02c2-47c2-bf69-2d967847a17c.jpeg" width="200">　
↑左からseria クリアカップ 110ml / 旭化成パックス 透明デザートカップ 145ml / リスパック 106ml