AIで実現! しょうゆとソースを間違えない幸せな食卓
![](/category/make/mobility/dmln5300000swac5-img/dmln5300000swacu.jpg)
調味料は料理の味を左右する、とても重要なものです。ところが、しょうゆとソース、塩と砂糖など、ひと目では見分けにくいものが数多く存在します。そして、食卓で特に多いのが、しょうゆとソースのかけ間違いです。誰もが一度は、経験したことがあるのではないでしょうか。そのような不幸を二度と起こさぬよう、ものづくりの力で解決してみましょう。
なぜ不幸が起きるのか
そのほとんどは、調味料が隣り合った場所にあるために起きるものです。離れているとユーザビリティが低くなるため、仕方がないことではあります。
![photo](/category/make/mobility/dmln5300000swac5-img/dmln5300000swath.jpg)
食堂でよく遭遇するのが、定位置間違いです。使い終わった後、誤った場所に戻すために発生します。いろんな人が使用すると、ミスは発生してしまいがちです。
![photo](/category/make/mobility/dmln5300000swac5-img/dmln5300000swat3.jpg)
視認のしにくさにより発生することもあります。文字が読みにくかったり、容器が区別しにくかったりすることもあるのではないでしょうか。
![photo](/category/make/mobility/dmln5300000swac5-img/dmln5300000swasp.jpg)
こういった不幸を解決する手っ取り早い方法は、ひとつのパッケージで、しょうゆかソースを自動で判断し、適量をかけてくれるガジェットだと思います。ユーザーの認知能力に依存しない、スマートなしょうゆさしを作ってみましょう。
構成を考えよう
もちろんしょうゆとソースが混ざり合うわけにはいきません。2つの容器が、1つのガジェットにまとめつつ、自動で出力を判定すると良いでしょう。プッシュ式の容器とサーボモーターを使うことで、下図のような仕掛けが実現できそうです。
![サーボモーターの回転方向で出力対象を変更できます。](/category/make/mobility/dmln5300000swac5-img/dmln5300000swarx.jpg)
次に自動で判定する仕組みを考えます。AIが料理を認識し、しょうゆとソース、どちらをかけるべきか判定します。実現可能なハードウェアはたくさんありますが、食卓へコンパクトに設置させたいため、M5Stack UnitV2 AIカメラを選定しました。48×24×18.5mmで、重量18gの小型AIカメラです。
![ユーザーが簡単にAI認識アプリケーションを構築できます。 (引用)https://www.switch-science.com/catalog/7160/](/category/make/mobility/dmln5300000swac5-img/dmln5300000swarj.jpg)
(引用)https://www.switch-science.com/catalog/7160/
これらの構想をもとに、ハードウェアを設計してみました。AIカメラの認識結果に応じ、マイコンで指定した方向にサーボモーターを動かします。
![食卓で扱いやすいよう、バッテリー駆動にしました。](/category/make/mobility/dmln5300000swac5-img/dmln5300000swar5.jpg)
さすがに全ての料理に対応するのは難しいので、しょうゆ代表「目玉焼き」と、ソース代表「メンチカツ」で試します(目玉焼きほど派閥が分かれるものはない気がしますが、私はしょうゆ派なので許してください)。よって、AIカメラが目玉焼きを検出したらしょうゆをかけ、メンチカツを検出したらソースをかけるように実装します。
準備するもの
- プッシュ式 しょうゆ差し ×2個(1430円)
- TowerProサーボモーター MG996R ×1個(1080円)
- M5Stack ATOM Lite ×1個(1287円)
- M5Stack UnitV2 AIカメラ ×1個(9592円)
- モバイルバッテリー cheero Canvas 3200mAh ×1個(2,500円)
- 3Dプリント部品 ×1(1000円)
- 配線・基板 ×1式(500円)
- ボルト ×1式(500円)
※価格は参考
全ての部品はAmazonや秋月電子、スイッチサイエンスで購入可能です。合計金額は1万7889円でした。ちなみに、モバイルバッテリーの電力は5V/2.1A。UnitV2の消費電流は0.5A、MG996Rはストール電流1.4A、ATOM Liteが0.1A未満なので、なんとか賄える容量になっています。
![photo](/category/make/mobility/dmln5300000swac5-img/dmln5300000swaqd.jpg)
組み立てよう
まずは、UnitV2とMG996Rを3Dプリント部品に取り付けます。
![photo](/category/make/mobility/dmln5300000swac5-img/dmln5300000swapl.jpg)
バッテリーを搭載します。USBコネクター出力口に、電源取り出し用の基板と配線を取り付けます。ここから5Vを出力します。
![取り付ける前にバッテリーの電源がOFFであることを確認しましょう。](/category/make/mobility/dmln5300000swac5-img/dmln5300000swap7.jpg)
バッテリーを覆うようにして、取っ手付きの3Dプリント部品を取り付けます。
![photo](/category/make/mobility/dmln5300000swac5-img/dmln5300000swaot.jpg)
電源の分配基板に配線を接続します。バッテリーの5V電源をMG996RとATOM Liteに分配し、PWM信号の接続もここで行います。
![電源分配基板はユニバーサル基板で自作しました。コネクターはJSTのPHシリーズです。](/category/make/mobility/dmln5300000swac5-img/dmln5300000swaof.jpg)
ATOM Liteを3Dプリント部品に取り付けます。GPIOに配線します。G25からPWM信号が出力されます。
![photo](/category/make/mobility/dmln5300000swac5-img/dmln5300000swao1.jpg)
3Dプリント部品同士をボルトで締結し、Unit2に配線します。
![GROVE 4ピンケーブルを使用します。](/category/make/mobility/dmln5300000swac5-img/dmln5300000swann.jpg)
最後にしょうゆさしを2つ取り付け、落下防止用の3Dプリント部品で固定したら完成です。
![しょうゆさしは簡単に脱着可能です。](/category/make/mobility/dmln5300000swac5-img/dmln5300000swan9.jpg)
動きを確認してみよう
このガジェットは、UnitV2で料理を認識し、MG996Rで適切なしょうゆさしをプッシュすることで機能します。
![重さは約300gで、とても持ちやすいものに仕上がりました。](/category/make/mobility/dmln5300000swac5-img/dmln5300000swamh.jpg)
まずはMG996Rのみを動かし、プッシュ機能をテストします。ボタンを押すとプッシュするようにプログラミングしてみました。
![プッシュ具合は微調整しました。](/category/make/mobility/dmln5300000swac5-img/dmln5300000swam3.gif)
とても良い感じですね。次はUnitV2の動作確認です。UnitV2はPC側でドライバーをダウンロードし、USBTypeCケーブルで接続するだけで簡単に使用可能です。Webブラウザーでhttp://10.254.239.1/へアクセスすると、GUIが表示されます。
![たくさんの機能が用意されています。](/category/make/mobility/dmln5300000swac5-img/dmln5300000swalp.jpg)
試しに「FaceDetector」モードを使用してみると、とても精度良く顔認識ができました。
![photo](/category/make/mobility/dmln5300000swac5-img/dmln5300000swalb.jpg)
では、ここから目玉焼きとメンチカツの画像を学習させていきます。
学習させよう
まずはデータセットを用意します。自身で撮影した写真に加え、インターネット上の写真も有効活用していきます。無料写真素材を検索してくれる「O-DAN」というサイトがオススメです。ここでは、自由に利用して良いことが明示されている、クリエイティブ・コモンズ ゼロ(CC0)の写真が多く取り扱われています。
https://o-dan.net/ja/
![40以上の有名ストックフォトサイトから横断検索できるサービスです。](/category/make/mobility/dmln5300000swac5-img/dmln5300000swakj.jpg)
学習には「V-Traning」を使用します。「V-Traning」はM5Stack社が提供している、AI学習モデルを作ってくれるクラウドサービスです。M5フォーラムのユーザーアカウントでログインし、使用できます。
http://v-training.m5stack.com/build/index.html
![カスタムな認識モデルを簡単に構築できます。](/category/make/mobility/dmln5300000swac5-img/dmln5300000swak5.jpg)
「Start」を押すと、「Select Pictures」画面に遷移します。ここでは、学習モデルに使用する写真をインポートします。画像は30枚以上必要ですが、枚数が多いほど精度は向上します。画像のインポート完了後、「Next」を押すことで「Select Project Type」が表示されますが、現在だと「Object Detection」のみ選択可能です。
![photo](/category/make/mobility/dmln5300000swac5-img/dmln5300000swajr.jpg)
その後、「Annotate」画面に遷移します。「Create Labels」では、認識されたオブジェクトのラベル名を作成する必要があります。例えば、犬を認識したらDogというラベル付けをするようなものです。ここではFriedEgg(目玉焼き)とCutlet(カツ)の2種類を作成します。
![photo](/category/make/mobility/dmln5300000swac5-img/dmln5300000swai7.jpg)
次に、作成したラベルとオブジェクトの関連付けを行います。対象のオブジェクトをドラッグしてフレームで囲み、タグ付けしていきます。
![画像枚数が増えると、なかなか大変な作業になってきますね。](/category/make/mobility/dmln5300000swac5-img/dmln5300000swaiz.jpg)
全ての処理を終えたら「Next」を押します。「Select Training Mode」が表示されますが、こちらも現在「Efficient Mode」のみなので、そのまま「UPLOAD!」を選択しましょう。
![「V-Traning」は日々開発が進んでいるので、いずれ機能が増えるかもしれません。](/category/make/mobility/dmln5300000swac5-img/dmln5300000swail.jpg)
アップロードが完了すると「Train」画面に遷移し、トレーニング完了まで待ちます。「Status」列を見ることで状態を確認することができ、「Completed」で成功、画像の数が足りなかったりすると「Failed」で失敗となります。状態に変化がない場合、左上の「Refresh」を押すことで更新されます。画像枚数100枚以下の場合、トレーニングは数分で完了します。「Completed」表示後、「Download」を押しデータを取得しましょう。
![ここでは過去の結果を確認することもできますが、修正はできません。](/category/make/mobility/dmln5300000swac5-img/dmln5300000swaht.jpg)
また、「Training loss」を確認することもできます。これは、学習データに対する損失関数の値で、目標と実際の出力の誤差のことです。この値が小さいほど、誤差が少ない適切な出力だと捉えることができます。
![](/category/make/mobility/dmln5300000swac5-img/dmln5300000swahf.jpg)
プログラミングしよう
学習を終えたら、その結果をUnitV2に組み込みます。UnitV2をPCへ接続し、データをアップロードしましょう。「Object Recognition」モードで「upload」を押し、学習データを選択します。すると項目が増え、学習データが使用可能になります。
![「run」を押すと、目玉焼きを認識してくれました。](/category/make/mobility/dmln5300000swac5-img/dmln5300000swah1.jpg)
次に、あらかじめUnitV2の動作モードをATOM Liteから指示する必要があります。Setup関数で以下のようなJSON形式の文字列を送信すると、学習結果を含む「Object Detection」モードが使用できます。
![「SmartDispenser」という文字列が、学習結果のファイル名を示します。](/category/make/mobility/dmln5300000swac5-img/dmln5300000swagn.jpg)
UnitV2は何も設定せずとも、そのデータをUART経由で出力します。よって、ATOM Liteでシリアル受信機能を実装すれば、その内容を簡単に取得できます。「Arduino_JSON」というライブラリを使用してみました。
https://github.com/arduino-libraries/Arduino_JSON
尚、取得データはJSON形式なので、簡単に必要な値を選択できます。ここでは「type」が「FriedEgg」である情報を、目玉焼きの判定基準に使用しました。
![メンチカツも同じように「type」が「Cutlet」で判定します。](/category/make/mobility/dmln5300000swac5-img/dmln5300000swag9.jpg)
作成したプログラムはこちらからご確認ください。
https://github.com/CH1H160/SmartSauceDispencer
料理をおいしくいただこう
それでは試してみましょう。まずは目玉焼きを作り、皿に盛ります。そして、目玉焼きめがけてスマートしょうゆさしを傾けます。するとサーボモーターが動き、しょうゆが出てきました。
![photo](/category/make/mobility/dmln5300000swac5-img/dmln5300000swafh.gif)
![適量で良い感じです。](/category/make/mobility/dmln5300000swac5-img/dmln5300000swaf3.gif)
次はメンチカツです。一見、成功したように見えましたが、残念ながらしょうゆがかかってしまいました。悲劇が起きたのです。
![仕方がないので、しょうゆで美味しくいただきました。](/category/make/mobility/dmln5300000swac5-img/dmln5300000swaep.gif)
原因は対象物の誤判定です。学習データが少ないせいでもありますが、私の安直なプログラム判定が招いた結果でもあります。実装したロジックを確認してみましょう。
UnitV2が出力するJSONファイルには、さまざまな要素があるのですが、私はこの「type」のみで判定処置をしていました。しかし、「prob(確率)」という要素も大切だったのです。つまり、目玉焼きの確率が半分以下程度でもしょうゆをかけるようにしていたため、誤判定しやすくなっていました。
![photo](/category/make/mobility/dmln5300000swac5-img/dmln5300000swaea.jpg)
これを解決すべく、「prob」の判定をATOM Liteのプログラムに組み込み、70%以上であれば対象の調味料をかけるようにロジック変更しました。これで学習データ数を増やさずとも、精度が向上するはずです。それでは、リトライしてみましょう。
![素晴らしい!](/category/make/mobility/dmln5300000swac5-img/dmln5300000swi13.gif)
無事成功しました。これで目玉焼きもメンチカツも、おいしくいただくことができますね。
![いただきます!](/category/make/mobility/dmln5300000swac5-img/dmln5300000swi0p.jpg)
もっと幸せな食卓を実現する為に
今後もどんどん登録食材を増やしていけば、より便利なガジェットへ進化していくのではないでしょうか。寿司でしょうゆを出したり、トンカツでソースを出したり。
![](/category/make/mobility/dmln5300000swac5-img/dmln5300000swi1l.jpg)
また、AIカメラの機能をもっと活用することで、人の好みを判定させることもできそうです。例えば、人の顔を学習させておいて、その人の方向を向けることで、好みの調味料を出してくれる機能は面白いですよね。ものづくりの力を駆使しながら、スマートなガジェットを実装し、食卓をより一層幸せにしていきましょう。