パブロフの猫:IoTディナータイマーで猫を調教しよう
必要な部品と材料
| 部品 | 数量 | 備考 |
|---|---|---|
| Arduino MKR IoT Bundle | 1 | MKR1000、サーボ、フォトトランジスタ、ブザー等含む |
使用アプリとオンラインサービス
- Telegram(メッセージングアプリ、ボット機能利用)
プロジェクト概要
猫のしつけは難しいですが、パブロフの犬の古典的条件付けをIoTで実装。「特定のメロディー=ご飯」という関連付けを学習させ、光センサーで猫が来たか検知。Telegramボットから遠隔操作・データ収集が可能。MKR IoT Bundleの部品のみで段ボール工作とArduinoプログラミングで完成します。
注意:このチュートリアルは古い可能性があります。最新版はこちらを参照してください。
仕組み(要約)
- サーボモーターで段ボール箱の蓋を開閉し、エサを排出
- ブザーで2種類のメロディー再生:「ご飯ありメロディー」と「ご飯なしメロディー」
- フォトトランジスタ(光センサー)で猫が箱に近づいたか検知
- Telegramボットで「ご飯あり/なし」「量(1-3回分)」を指定して実行
- Webサーバー機能(APモード)で統計データをブラウザ表示可能(Pro Tip)
学習目標
- Telegramボットのカスタムキーボード活用
- MKR1000でのWebサーバー(APモード)構築
主要コンポーネントと配線
- サーボモーター:蓋開閉
- フォトトランジスタ+220Ω抵抗:アナログ入力(A6)で光量測定
- ブザー:
tone()関数でメロディー再生
Telegramボットとカスタムキーボード
Telegramのカスタムキーボードで直感的な操作UIを実現。絵文字はUnicodeで指定。
// キーボード定義
TelegramKeyboard keyboard_one;
const char* MusicAndFood = "\U0001F3B6 + \U0001F36A"; // 🎶 + 🍪
const char* MusicNoFood = "\U0001F3B6 NO \U0001F36A"; // 🎶 NO 🍪
const char* OnePortion = "\U0001F408"; // 🐈
const char* TwoPortion = "\U0001F408 \U0001F408"; // 🐈🐈
const char* ThreePortion = "\U0001F408 \U0001F408 \U0001F408"; // 🐈🐈🐈
const char* row_one[] = {MusicAndFood, MusicNoFood};
const char* row_two[] = {OnePortion, TwoPortion, ThreePortion};
keyboard_one.addRow(row_one, 2);
keyboard_one.addRow(row_two, 3);
ボットはメッセージ受信時にこのキーボードを返送。ユーザーはボタンタップでコマンド送信。
猫検知ロジック
unsigned long timer;
bool startDetecting = true;
int threshold = 200; // 環境に合わせて調整
void loop() {
if (startDetecting) {
int value = analogRead(A6);
if (value < threshold) { // 光が遮断された=猫検知
Serial.println("cat detected!");
startDetecting = false;
} else if (millis() - timer > 120000) { // 2分タイムアウト
Serial.println("no cat detected in the past two minutes");
startDetecting = false;
}
}
}
millis()でノンブロッキングタイマー実装。閾値は環境光に合わせて調整。
メロディー再生
Arduino標準例題「toneMelody」をベースに、ブザーで短いジングルを再生。
サーボ制御
#include <Servo.h>
Servo myservo;
int PortionAmount = 1; // Telegramで変更可能
void moveServo() {
for (pos = 0; pos <= 90; pos++) { myservo.write(pos); delay(15); }
delay(PortionAmount * 300); // 開放時間=量に比例
for (pos = 90; pos >= 0; pos--) { myservo.write(pos); delay(15); }
}
Pro Tip: Webサーバー(APモード)で統計表示
MKR1000のAPモードでWebページをホスト。Telegramで「Server」コマンド送信→ボットがIPアドレス返信→ブラウザでアクセス→猫の反応履歴(ご飯あり/なし、来た/来ない、到達時間)をテーブル表示。「Back」ボタンでボットモードに復帰。
// APモード起動トリガー
if (m.text == "Server") {
IPAddress ip = WiFi.localIP();
web_server_mode = true;
bot.sendMessage(m.chat_id, "To see the webpage go to https://" + IpToString(ip), keyboard_one);
telegram_client.stop(); delay(1000);
server.begin();
}
// Webサーバー内で「Back」ボタン検知
if (currentLine.endsWith("GET /BACKBUTTON")) {
web_server_mode = false; client.stop(); delay(1000);
bot.begin(); bot.sendMessage(OldChatId, "Back online!", keyboard_one);
}
HTML/CSS基礎知識が必要。データ永続化にはFlashStorageライブラリや「The Nerd」プロジェクト参照。
関連プロジェクト(MKR IoT Bundleシリーズ)
- I Love You Pillow
- Puzzle Box
- Pavlov's Cat(本プロジェクト)
- The Nerd
- Plant Communicator
3Dプリント・レーザーカッター用データ
2mm段ボール用DXFファイル:pavlovcase_ShVm1OJRIF.dxf
回路図
フォトトランジスタ、サーボ、ブザーの接続図を掲載
完全なスケッチ
基本版とPro Tip版(Webサーバー付き)の2種類を提供
製造プロセス