メインコンテンツに移動

builders.flash

日常で楽しむクラウドテクノロジー

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

2025-04-02 | Author : 市川 純

はじめに

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

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

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

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

  • 指定された時間にエサをあげられる

  • 手動で好きな時間にエサをあげられる

  • エサやりのスケジュールを登録/編集できる

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


X ポスト » | Facebook シェア » | はてブ »

アーキテクチャ図

デモ動画

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

ご注意

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

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

builders.flash メールメンバー登録

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

1. デバイス関係の準備

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

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

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

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


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

  • ディスペンサーの稼働部をサーボで動かせるようにする

  • サーボとデバイスを接続する

  • ディスペンサーにサーボとデバイスを取り付ける

完成品

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

A clear plastic gumball or candy dispenser with a blue base, featuring an attached electronic component, placed on a white background. 正面

A transparent round gumball or candy machine with a blue base and lid, featuring an attached orange electronic device and wiring, possibly used for automated counting or dispensing. M5StickC 、サーボは金具で固定

A close-up image of a blue mechanical or electrical device with a lever and white component, likely part of a machine or appliance, placed on a white surface. 押すタイプのディスペンサーでしたが、稼働部の軸を 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 を利用して記述しています。今回のサンプルは以下のバージョンの環境で作成しています。

bash
node --version

v20.10.0

npm --version

10.2.3

ライブラリをインストール

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

bash
cd path/to/unziped-folder
npm install

ブートストラップ

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

bash
cd path/to/unziped-folder
npm install

デプロイ

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

bash
cdk deploy --all

Amazon CloudFront URL にアクセス

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

bash
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 コマンドを実行します。

bash
sh tools/setup.sh PetFeeder IoTPetFeederPolicyXXX_xxxx

Board Manager のインストールとライブラリをインストール

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

  • 証明書と秘密鍵の作成

  • Thing (PetFeeder) に紐付け

  • 証明書に IoT Policy を紐付け

  • M5StickC のサンプルプログラムで使うクレデンシャル情報を含むヘッダーファイル m5stickc/awsiot.h の作成


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

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

  • PubSubClient

  • ArduinoJson

Wi-Fi のアクセスポイント情報を入力

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

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

プログラム実行

Wi-Fi の情報を追加したら M5StickC を接続し、書き込み ます。書き込みが成功すると再起動され、プログラムが実行されます。

ログを確認

Arduino IDE のシリアルコンソール を使うと、以下のようなログを確認することができます。

bash
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 アプリで左上のハンバーがメニューを開くと以下のメニューがあることが確認できます。

Screenshot of a Japanese IoT dashboard sidebar menu with home, schedule list, add schedule, feed a pet, username 'petuser', and SIGNOUT button.

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

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

ペットフィーダーのスケジュール登録画面を示した日本語のユーザーインターフェース。時間を設定しスケジュールを追加・登録できるフォームが表示されている。

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

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

ペットフィーダーアプリのインターフェース画面です。「エサをあげる」と表示され、ボタンも同じく「エサをあげる」と記載されています。

6. 解説

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

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

6-2. MQTT のメッセージ

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

json
{
  "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 好きな人であれば、ぜひ試していただいて、オリジナルのペットフィーダーを作ってみるのはいかがでしょうか?

筆者プロフィール

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

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

An AWS employee wearing a branded shirt smiles while standing in an office with a wooden wall and large text in the background.

Did you find what you were looking for today?

Let us know so we can improve the quality of the content on our pages