IoT を使ってねこのエサやりを自動化してみた

2025-04-02
日常で楽しむクラウドテクノロジー

Author : 市川 純

こんにちは、プロトタイピングソリューションアーキテクトの市川です。

前回の記事では ねこの体重を自動計測 する仕組みを紹介しましたので、ねこ好きの方はぜひそちらもご覧ください。

ペットを飼っていると、家を留守にした時のエサやりが困ることがあります。日中に外出するぐらいであれば、出かける前に昼ごはんをお皿に入れて出かけてしまいますが、食いしん坊な我が家のねこは、朝ごはんを食べた後にもかかわらず、すぐに昼ごはんの分も食べてしまいます。そのため、夜家に帰ってくると、お腹を空かした状態でいつも待っています。1 泊で出かける場合は複数のお皿にエサを入れておきますが、帰ってくる頃にはいつもお腹を空かせています。

市販のペットフィーダーを導入すればいいのですが、せっかくなので自作してみようと思います。必要な機能は以下のとおりです。

  • 指定された時間にエサをあげられる
  • 手動で好きな時間にエサをあげられる
  • エサやりのスケジュールを登録/編集できる

これを実現するためには、デバイスと UI が必要です。そこで、デバイスとの連携は AWS IoT Core を使います。そして UI は Web アプリとして React を利用して作成します。これらを実現する全体のアーキテクチャは以下のようにしました。(図には AWS CDK デプロイ時に作成される他のリソースは含まれていません)

出来上がったものが動いている様子のビデオはこちらからご覧ください。(デモのため、本物のエサは使っていません)
ビデオでは手動でのエサやりを Web アプリから実行しています。デバイス側は AWS IoT Core につながっているため、すぐにコマンドを受信し、サーボを動かしているのがわかるかと思います。

ご注意

本記事で紹介する AWS サービスを起動する際には、料金がかかります。builders.flash メールメンバー特典の、クラウドレシピ向けクレジットコードプレゼントの入手をお勧めします。

*ハンズオン記事およびソースコードにおける免責事項 »

Nyantech ハンズオンシリーズのその他の記事はこちら

選択
  • 選択
  • 機械学習を使って写真に写っている猫を見分けてみよう! ~ 前編 : Amazon SageMaker Ground Truth を使った画像のラベリング ~
  • 機械学習を使って写真に写っている猫を見分けてみよう! 〜中編:Amazon Rekognition Custom Labels を使った機械学習モデルの作成
  • 機械学習を使って写真に写っている猫を見分けてみよう! 〜後編:Amazon SageMaker を使った機械学習モデルの作成
  • たくさんの写真の中からうちの子 (猫) をみつけよう ! 〜機械学習と Amazon Elasticsearch Service で類似画像検索
  • Nyantech とはじめる MLOps 〜学習パイプランを使って効率的に猫を見分ける機械学習モデルを目指そう ! の巻〜
  • 猫の画像を使ってあそぶブラウザゲームを作ろう ! 〜AWS Cloud Development Kit (AWS CDK)で簡単デプロイ〜
  • Nyantech 画像生成選手権 ~ 画像生成 AI を使ってお題に近い猫の画像を生成しよう ! の巻
  • 1 クリックで立ち上がる自分だけの環境で、お猫様の画像生成をやってみた。
  • 1 クリックで立ち上がる自分だけの環境で、お猫様の画像生成をやってみた。- 拡張編 -
  • Nyantech であの猫のこんな写真を見つけたい ~ マルチモーダル埋め込みモデルを使って類似画像検索をパワーアップ ~
  • IoT を使ってお猫様の健康 (体重) をモニタリングしてみた
  • Nyantech マルチエージェントでぴったりのオトモを見つけよう !
  • IoT を使ってねこのエサやりを自動化してみた

このクラウドレシピ (ハンズオン記事) を無料でお試しいただけます »

毎月提供されるクラウドレシピのアップデート情報とともに、クレジットコードを受け取ることができます。 


1. デバイス関係の準備

デバイス側は 3D プリンターなどで作成するのもいいですが、手元に 3D プリンターがないと試行錯誤しながら作るのは厳しいので、既製品の良さそうな入れ物を探しました。フードディスペンサーキャンディーディスペンサー で検索すると色々と見つかるので、気に入った形のものを手に入れましょう。

ディスペンサーは、ハンドルを回すと中身が出るタイプと、押すと中身が出るタイプがあります。その操作をデバイスに実行させるので、私は押すと中身が出るタイプをサーボを使って動かすようにしました。

アプリケーションを動かすデバイスは引き出しにあった M5StickC を使う (今であれば、M5StickC Plus や Plus2 が良いと思います) ことにしたので、サーボは M5StickC の Hat として提供されている Hat Servo を利用しました。(サンプルコードは M5StickC Plus2 でもヘッダーファイルの読み込みを変えるだけで動きます)

サンプルコードをダウンロード »

選択するデバイスによって工作の手順は異なるので紹介しませんが、必要なことは以下の作業です

  • ディスペンサーの稼働部をサーボで動かせるようにする
  • サーボとデバイスを接続する
  • ディスペンサーにサーボとデバイスを取り付ける

最終的な工作は以下のような形になりました。

正面

M5StickC 、サーボは金具で固定

押すタイプのディスペンサーでしたが、稼働部の軸を L 字の六角レンチに置き換えて、サーボで動かすようにしています。


2. 環境の構築

今回は AWS Cloud Development Kit (AWS CDK) を使ってクラウド側に必要なリソースを構築できるようにしています。デバイス側のサンプルコードも用意しているので M5Stick-C + Hat Servo を使う場合はご利用ください。

サンプルのデプロイの前にいくつか準備が必要ですので、まずは準備を行います。説明のコマンドは Linux ベースでの説明となっています。また、AWS Lambda 関数 は Arm アーキテクチャを指定しているため、Ubuntu Server 22.04 LTS、 Arm アーキテクチャの Amazon EC2 インスタンス (t4g.small EBS 20GByte) を起動し、作業を進めるとトラブルが起きずに進められると思います。

2-1. AWS Cloud Development Kit (AWS CDK) のデプロイ

AWS CDK は使い慣れたプログラミング言語で記述することで AWS のリソースを柔軟に管理・構築することができるツールです。 AWS CDK をあまり利用したことがない場合は、以下の AWS Blackbelt Online セミナーを見ることをお勧めします。


AWS CDK は複数の言語に対応していますが、このサンプルでは Typescript を利用して記述しています。今回のサンプルは以下のバージョンの環境で作成しています。

node --version

v20.10.0

npm --version

10.2.3

ここからは、サンプルソースを AWS CDK の実行できる環境にダウンロードし、デプロイを行います。
まずは AWS CDK スタックで必要となるライブラリをインストールします。

サンプルソースを展開し、展開したディレクトリで以下のコマンドを実行しデプロイします。

cd path/to/unziped-folder
npm install

対象のリージョンで初めて AWS CDK を利用する場合は、ブートストラップが必要になりますので、以下のコマンドを実行します。CDK がインストールされていない場合は、こちらを参考 にセットアップしてください。

cdk bootstrap

以下のコマンドで、デプロイを行います。途中で Do you wish to deploy these changes (y/n)? と聞かれたら y を入力してください。10 分程度かかります。

cdk deploy --all

デプロイが完了すると以下のような Amazon CloudFront の URL や shell コマンドの出力があります。URL にアクセスすると、ペットフィーダーアプリが利用できます。これらの値は AWS CloudFormation のマネージメントコンソールで Backend Stackの Output でも確認することができます。

Backend.DeliveryEndpointXXXX = https://xxxxxxxxxxx.cloudfront.net
Backend.IoTCertCommandXXXX = sh tools/setup.sh PetFeeder IoTPetFeederPolicyXXX_xxxx

3. M5StickC のアプリの準備

サンプルでは Arduino 言語を使ったアプリケーションを用意しています。このアプリケーションは AWS IoT Core に MQTT で接続してメッセージの送受信します。接続には x509 の証明書と秘密鍵が必要となります。先ほど CDK のデプロイを行った時に出力された Backend.IoTCertCommand で始まる shell コマンドを実行します。

sh tools/setup.sh PetFeeder IoTPetFeederPolicyXXX_xxxx

このコマンドは、以下の処理を行います。

  • 証明書と秘密鍵の作成
  • Thing (PetFeeder) に紐付け
  • 証明書に IoT Policy を紐付け
  • M5StickC のサンプルプログラムで使うクレデンシャル情報を含むヘッダーファイル m5stickc/awsiot.h の作成


実行ができたら Arduino IDEm5stickc/m5stickc.ino を開きます。Arduino IDE を使ったことがない場合は、公式のセットアップガイド を参考に Board Manager のインストールと ライブラリ をインストールします。このサンプルでは以下のライブラリを利用しています。

  • M5StickC (他の M5StickC を利用する場合は m5stickc.ino で include するヘッダーファイルも変えてください)
  • PubSubClient
  • ArduinoJson

IDE を開くと awsiot.h というタブがあるので、選択して、以下の変数にご自身の Wi-Fi のアクセスポイント (M5StickC は 2.4GHz を利用します) の情報を入力してください。

const char* WIFI_SSID     = "";
const char* WIFI_PASSWORD = "";

Wi-Fi の情報を追加したら M5StickC を接続し、書き込み ます。書き込みが成功すると再起動され、プログラムが実行されます。Arduino IDE のシリアルコンソール を使うと、以下のようなログを確認することができます。

M5StickC initializing...OK
loadSchedules
[]
loadSchedules finished
Connecting to accesspoint.
....
Connect to AWS IoT Core: PetFeeder.
Connected.

4. Web アプリ用のログインユーザーを作成

このサンプルでは Amazon Cognito を認証で利用しますが、ログイン画面からユーザーのサインアップを許可していません。AWS マネジメントコンソールで Amazon Cognito を開き、作成された ApiUserPool で始まるユーザープールに ユーザーを追加 してください。
ユーザーの登録が済んだら、先の手順で表示された Amazon CloudFront の URL をブラウザで開き、ログインします (スマートフォンで利用する想定のレイアウトです)。


5. Web アプリを使う

Web アプリで左上のハンバーがメニューを開くと以下のメニューがあることが確認できます。

クリックすると拡大します

5-1. スケジュールの追加

時間になったら自動でエサやりをする場合は、スケジュールの追加を開き、時間を選択して登録ボタンで登録します。

クリックすると拡大します

5-2. 手動でエサをあげる

ねこがおねだりしてきたら、ご飯の時間でなくてもあげたくなることがありますよね ! そんな時は、手動でエサやりを実行すると、いつでもあげることができます。

クリックすると拡大します


6. 解説

6-1. スケジュールの実行について

デバイスに対してクラウドから通知してアクションを実行することはできますが、デバイスアプリは何かあった時にネット接続できない可能性があります。その場合、ネットに繋がらないせいでねこにご飯をあげられないといったトラブルが発生します。
M5StickC で利用されている ESP32 には SPIFFS と呼ばれるフラッシュにデータを保存する仕組みがあります。この領域に保存することで電源が落ちたもデータは消されず、再度起動時に利用することができます。大きなデータは保存できませんが、少ない情報であれば保存できます。Web の UI から登録されたスケジュールは、この領域に保存しているので、もし Wi-Fi に繋がらない場合でも、過去に時刻の同期ができていれば、スケジュール通りに動作することができます。

6-2. MQTT のメッセージ

手動でエサをあげる場合は {"cmd": "feed"} というメッセージを petfeeder/cmd トピックに送信します。スケジュールの更新を行うと petfeeder/cmd トピックに以下のようなメッセージを送信します。

{
  "cmd": "schedule",
  "schedule": [
    {
      "hour": 7,
      "minute": 0
    },
    {
      "hour": 12,
      "minute": 10
    },
    {
      "hour": 19,
      "minute": 20
    }
  ]
}

今回のサンプルではエサをあげた時に AWS IoT Core の petfeeder/report というトピックに {"msg": "feeded"} というメッセージを送信しています。クラウド側の実装はありませんが、拡張としてこのメッセージを受け取ったら履歴として保存し Web の UI で見られるようにすると、いつエサをあげたかわかるようになります。
今回はサンプルコードでは、デバイスがオフラインだった時にスケジュールを更新した場合、デバイス上の情報と DB で保持している情報で、差異が発生する可能性があります。確実に設定されたことを確認する場合は、デバイスでスケジュールを受信した後に受け取った ACK を返し、反映されたことを確認する必要があります。このようなユースケースで便利なのは、AWS IoT Core のデバイスシャドゥ を使うのも方法だと思います。外部で指定された変更を AWS IoT Core で管理してくれますので、変更時にデバイスがオフラインであっても、再度オンラインになった時に反映させることができ、反映したステータスも管理できるので、少ない実装で対応が可能です。


7. まとめ

いかがでしたか ?
AWS の IoT サービスを利用するとクラウド連携したペットフィーダーを自作することができました。安定性や機能の点では、既製品の方が便利と思いますが、今回のように自分で作ってみると、いろいろな仕組みがわかって楽しいですね。DIY 好きな人であれば、ぜひ試していただいて、オリジナルのペットフィーダーを作ってみるのはいかがでしょうか?

Nyantech ハンズオンシリーズのその他の記事はこちら

選択
  • 選択
  • 機械学習を使って写真に写っている猫を見分けてみよう! ~ 前編 : Amazon SageMaker Ground Truth を使った画像のラベリング ~
  • 機械学習を使って写真に写っている猫を見分けてみよう! 〜中編:Amazon Rekognition Custom Labels を使った機械学習モデルの作成
  • 機械学習を使って写真に写っている猫を見分けてみよう! 〜後編:Amazon SageMaker を使った機械学習モデルの作成
  • たくさんの写真の中からうちの子 (猫) をみつけよう ! 〜機械学習と Amazon Elasticsearch Service で類似画像検索
  • Nyantech とはじめる MLOps 〜学習パイプランを使って効率的に猫を見分ける機械学習モデルを目指そう ! の巻〜
  • 猫の画像を使ってあそぶブラウザゲームを作ろう ! 〜AWS Cloud Development Kit (AWS CDK)で簡単デプロイ〜
  • Nyantech 画像生成選手権 ~ 画像生成 AI を使ってお題に近い猫の画像を生成しよう ! の巻
  • 1 クリックで立ち上がる自分だけの環境で、お猫様の画像生成をやってみた。
  • 1 クリックで立ち上がる自分だけの環境で、お猫様の画像生成をやってみた。- 拡張編 -
  • Nyantech であの猫のこんな写真を見つけたい ~ マルチモーダル埋め込みモデルを使って類似画像検索をパワーアップ ~
  • IoT を使ってお猫様の健康 (体重) をモニタリングしてみた
  • Nyantech マルチエージェントでぴったりのオトモを見つけよう !
  • IoT を使ってねこのエサやりを自動化してみた

builders.flash メールメンバーへ登録することで
AWS のベストプラクティスを毎月無料でお試しいただけます

筆者プロフィール

市川 純
アマゾン ウェブ サービス ジャパン合同会社
AWS Prototyping Team シニア プロトタイピング ソリューションアーキテクト

2018年 に AWS へ入社し、主にIoTに関連するプロトタイピングを提供しています。Web サービスから家のデッキ作りまで、モノを作るという事であれば何でも好きな DIY おじさんです。ここ最近の趣味は新しいバイクを手に入れたので、カスタムしたりツーリングに行ったりすることです。

AWS を無料でお試しいただけます

AWS 無料利用枠の詳細はこちら ≫
5 ステップでアカウント作成できます
無料サインアップ ≫
ご不明な点がおありですか?
日本担当チームへ相談する