Example 2021.10.14

猫用自動エサやり機

10歳になる猫のために、自動エサやり機を作ってみました

使っているVIVIWARE Cell VIVIWARE Cell

  • Core
  • ServoDriver

その他使っているもの Other Parts

  • サーボ(2個)
  • 電池ボックス
  • 単3電池(4本)

時間通りに給餌

10歳になる猫を飼っているのですが、所用で丸一日誰も家にいなかったり、朝寝坊してご飯が遅かったりすると鳴いて暴れるので、自動エサやり機を作ってみました。

仕様は以下の通り、シンプルにしました。

 ・1日2食分 (12時間に1回) 、各回およそ20gのカリカリを皿に盛る
 ・皿に盛る直前に、飼い主の声等で知らせる

制作工程

使用したBranchVIVIWARE Cell Servo Driver 1個、あとはサーボ2個と電池だけです。

サーボを固定する台座や、カリカリを充填するシリンダーはCADを使ってモデリング、3Dプリンタで出力しました。

形状はシンプルなのでモデリングは難しくないのですが、出力してみると、カリカリを充填したシリンダーの蓋がスムーズに動かず…

うまくいかないので、今回は外しました。

(使用者が安全を確認しています。)

プログラム


これがプログラムの全体像です。


このQRコードを「ハードウェアを追加」で起動するカメラで読み込むと、プログラムをダウンロードできます。

おおまかな仕組み

1回目にエサをあげる時刻を設定して、


このように間隔を設定してから、


左上にあるToggle SwitchONにすると動作を開始します。

プログラムの中身の詳細

・1日2食分 (12時間に1回) 、各回およそ20gのカリカリを皿に盛る
・皿に盛る直前に、飼い主の声等で知らせる

というように動かしたいので、以下のように少し分解します。
1. 一定の時間間隔でトリガーを発生させる
2. トリガー発生時に音(飼い主の声)を鳴らす
3. 音を鳴らし終えたら、2つあるシリンダーの片方を選択する
 (次回トリガー発生時は、もう一方のシリンダーを選択する)
4. 選択したシリンダーのみを傾けて、カリカリを皿に盛りつけ、一定時間後にシリンダーを元の
 位置に戻す
5. 1.に戻る

1. 一定の時間間隔でトリガーを発生させる

現在時刻から「開始時刻」を引いた値を「エサをあげる間隔」で割った余りをCalculate Moduleで算出し、その余りが0の場合にCompare Moduletrueを出力するので、それをトリガーとしています。 

例えば、「開始時刻」を6時、「エサをあげる間隔」を12時間に設定し、現在時刻が17時の場合は、
  (17 - 6) % 12 = 11 
なので、Compare Modulefalseですが、現在時刻が18時の場合は、
  (18 - 6) % 12 = 0 
なので、Compare Moduletrueを出力します。
(上記「%」は、アプリ内で割り算を示す記号です)

2. トリガー発生時に音(飼い主の声)を鳴らす

トリガーが発生し、Sound player ModulePlaytrueが送られると、音が鳴ります。
 
音を鳴らし終えるとCompletetrueとなり、今度はそれをトリガーにCount ModuleRoutine Moduleが動き始めます。

Count Moduleは、2つあるシリンダーのいずれか一方を選択する役割を、Routine Moduleはシリンダーの傾きを制御する役割を担っています。

3. 音を鳴らし終えたら、2つあるシリンダーの片方を選択する

まずは、2つあるシリンダーのいずれか一方を選択します。

Sound player ModuleCompletetrueを出力する度に、「Min=1, Max=2, Loop=On, Step=1」に設定したCount Moduleがカウントアップします。

すると、Switcher ModuleOut1Out2のいずれかをtrue出力に固定できるため、2つあるシリンダーの片方を選択した上で、次回トリガー発生時は、もう一方のシリンダーを選択することができます。

4. 選択したシリンダーのみを傾けて、カリカリを皿に盛りつけ、一定時間後にシリンダーを元の位置に戻す

先ほど、2つあるシリンダーのいずれか一方を選択できたので、次は選択したシリンダーの傾きを制御して、カリカリを皿に盛り付けます。

Sound player ModuleCompletetrueを出力するとRoutine Moduleが動作を開始し、15秒間Out1trueを出力して、シリンダーを傾けてカリカリを皿に盛りつけます。
(シリンダーの傾き加減はSelect Moduleに接続したAnalog Outputで指定)

15秒経過後はOut1falseにして、シリンダーを元の位置に戻します。 

Routine ModuleSelect Moduleの間にLogical Operation ModuleANDを挟んでいるのは、先ほどのCount ModuleSwitcher Moduleの組み合わせで選択したシリンダーのみ動かすためです。

5. 1.に戻る

あとは上記動作の繰り返しです。
…と言っても、シリンダーが2つしかないので、2周回したら終了です😭

(様々な視点から安全を確認しています)

動画

サーボの動作音がそこそこあるので、使用者本人が警戒すると思い、事前に試作機で慣らそうとしているところ。
事前にお皿に2〜3粒入れておくと寄ってきますが、実際に動くと逃げ出します。


でもお腹は空いたので… 
少し離れて監視。

(遠くからも、近くからも、安全確認を怠りません!)
何度か安全確認を繰り返した後、やっと食べました。

感想と今後

最も苦労したのは、稼働時に使用者本人を驚かすことなく、使ってもらうための施策を練ることでした。
稼働前に声や音で知らせて慣らしてもダメということは、そもそも動作音が大きすぎるのか… 
(飼い主の「ごはん」コールには無反応でした…)

まだまだ試行錯誤が必要そうです。

編集後記

実はこの記事、社内ではコメントが殺到! 
音や動きに警戒するネコチャンを気遣って、どうやったら動作音が減るか、音の出ないサーボについての情報などなど・・・ 

合う合わないはやってみないとわかりませんが、試行錯誤しやすいのがVIVIWAREのいいところ!
いろいろ試して、お気に入りの一台ができますように。

そして、無理を言って、声に反応しない使用者の方の動画も撮っていただきました! 
(ストレスになっていないとよいのですが・・・)

そこそこお腹空いてるはずの時間帯に試した、二種類の動画で今回はおしまいです。
(全く振り返ってくれない版)
(反応して振り返ったけど出てこない版)

来週もお楽しみに!

(Created by Takashi Ando)

Share

share
close

Share