ESP32でリモート操作できる自動給餌機を作ろう

# 動機
2年ほど前から熱帯魚を買い始めました。
昨年は帰省できなかったので特に何も考えなかったのですが、今年は年末年始に帰省できそうということで、帰省の間の餌やりはどうしよう？という問題が発生しました。

Amazonなどで自動給餌器を調べると大体2000〜3000円で売っているようです。
Googleで調べると自作している人もいます。

どうせなら、リモート操作できるのを作ってみようということで、ゴールの設定は次のようにしました。

# ゴール
* スマホから任意のタイミングで餌やりができること
* AmazonEchoShowで餌やりをリモートで見る

# いざ製作
## 全体構想
どのような仕組みで餌やりを実現するかを考えてみます。
市販されている自動給餌器を見ると、大体が餌を入れたケースを回して餌を落とすタイプが多いようです。
ということでシンプルにサーボを使って餌を入れたケースを任意のタイミングで動かすことで餌やりを実現します。

## まずは材料集め
* サーボ
* サーボをコントロールするためのマイコン
* 餌を入れるケース

### サーボ
何かのお試しキットに付いてきたのが余ってました。
SG90 回転角180度
Amazon等で購入すると1つ300〜400円で手に入るようです。

### マイコン
Arduino系のデバイスかつネットワーク接続できるものとして、家にあるデバイスを集めてみると以下のデバイスが遊んでました。
・ESP8266
・ESP32-WROOM-02
・M5Stick-C

液晶が付いてて、サイズがコンパクトなM5Stick-Cを採用します。
他のはブレッドボードが必要になるしね。

### 餌入れ
これは、100均チョップで良さそうなサイズの小さな円形のタッパーを購入。3個入で100円でした。
餌が落ちるように、2mmのドリルで6個ほど穴を開けました。

## プログラミング
やりたいことをまずは以下の作業に分解します。

* 餌入れを回すためにサーボを動かしてみます
* リモート操作するためにBlynkを試します
* 監視に利用するEchoShowを試します

### サーボを回す
これは、もうググるだけでいっぱいサンプルが出てきます。
サーボを動かすためのライブラリがあるので、回転角を指定するだけで動きます。
180度を3秒で回すとかはできないようなので、間にディレイを入れて調整しています。
0 -> 180 -> 0 と回転するようにしたので、0度の位置にある餌の穴が真下を2回通過するようになっています。

```c
void feed(){
  int pos = 0;
  for (pos = 0; pos <= 180; pos += 1) {
      servo.write(pos);
      delay(10);
    }
    for (pos = 180; pos >= 0; pos -= 1) {
      servo.write(pos);
      delay(10);
    }
}
```

### リモート操作
Blynkを使うと自分でアプリを作らなくても、UIのパーツを画面に貼り付けるだけでアプリっぽいものが作れてしまいます。
しかも、チュートリアルでボタンをON/OFFするサンプルが作れてしまいます。
※Blynkの利用には会員登録が必要になります。

以下、チュートリアル(QuickStart)の進め方です。
1.まずはデバイスのタイプを選択します。写真はESP8266を選んでますが、今回のM5Stick-CはESP32なのでESP32を選びます。その下のデバイスの接続タイプはWiFiを選択します。
![クイックスタート1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54521/973691ef-61f0-369a-ab69-6e53ac01b457.png)

2.次はどのIDEを利用するか聞かれます。自分はArduinoIDEなのでArduinoを選択します。
![クイックスタート2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54521/e1cdb26f-1b38-d49b-7ce4-d4c757650e4b.png)

3.Blynkを使うためのライブラリをインストールする手順を教えてくれます。
![クイックスタート3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54521/b155197d-027f-8a9d-16c1-6da7f4ee0264.png)

4.WiFiのSSIDとパスワードを入れると、右にQuickStartのサンプルコードが出てくるのでこのままArduino
IDEに貼り付けます。
![クイックスタート4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54521/8aae7e98-344a-6d39-6c23-1dd5a26534e3.png)

5.接続が成功すると「Your device is online」の表示に変わります。
![クイックスタート4-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54521/559574e6-86bd-844d-6f13-5ac03183930a.png)


サンプルコードの状態で、ボタンのON/OFFを取得するコードが生成されているので、先のサーボを動かすプログラムをボタンのON/OFFに合わせて動くように埋め込みます。


```c
BLYNK_WRITE(V0)
{
  // Set incoming value from pin V0 to a variable
  int value = param.asInt();

  // Update state
  Blynk.virtualWrite(V1, value);

  feed();
}
```

### AmazonEchoShowで監視
これは、監視したいデバイスにコールするだけで実現です。ちょっと映像の赤みが強い感じがありますが、映ればOKです。無事水槽が移りました。
同一WiFiネットワークじゃなくて、外の4G回線からも繋がることを確認しておきます。
![IMG_1340.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54521/2085442f-085d-c37e-a883-6ca64d3a63ee.jpeg)

### そして完成！
こんな感じで、家に余っていた2mmのアルミ線(これも100均)がサーボの固定にちょうど良く、水槽の縁に立つように設置しました。サーボむき出しでいかにもお手製という感じでしが、今回は要件を満たせば良いのです。
![IMG_1347.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54521/e0fdaea3-9763-ef3c-1d8b-4dd5a44ab9c0.jpeg)

# 実際の動作
お正月に帰省して実際の動画を撮影してみました。
餌をあげると魚たちが左上に寄って行くのがわかるかと思います。
自宅に戻ってきてからも継続して利用していますが、サーボの音がすると餌が落ちてくるのが分かるのか、音がし始めた段階で魚が寄ってきます。
<iframe width="560" height="315" src="https://www.youtube.com/embed/y-gJl0sTmKg" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

# まとめ
コード断片の寄せ集めですが、ゴールは達成できました。
Blynkは便利ですね。リモート操作できるちょっとしたアプリが簡単に作れてしまいます。
M5Stick-Cについているディスプレイが勿体ないので、温度センサーでもつなげて表示してみようかな。

ちなみに照明は照明自体にタイマー機能が付いているので、自動でON/OFFのスケジュール設定ができてしまいます。CO2はスマートコンセントに電磁弁を繋いで、スマートコンセントの機能でON/OFFをスケジュール管理しています。
餌やりもスケジュール管理してしまえば、定期的な水換えだけで後は何もしなくても良くなりそうです。