- 解錠制御(MQTT受信):
- Subscribe:
interphone/cmd - コマンド
open: 即時解錠(サーボ 70° → 0°)open_if_detected: 次回の呼び出し音検知時に自動解錠し、実行後はNORMALに戻るping: 疎通確認。受信時にログへ応答をPublish
- Subscribe:
- 通知/ログ(MQTT送信):
- Publish:
interphone/log - 送信する主なイベント: 起動・接続・検知・解錠・PING応答
- Publish:
- 呼び出し音の検知仕様:
- センサー:
G36に接続したKY-038のアナログ入力 - 判定: 128サンプルのピークtoピーク値で判定
- しきい値: 立ち上がり > 200 を約50ms継続で検知/< 100 が500ms継続で解除
- センサー:
- デバイス操作:
- 本体ボタン
BtnAで手動解錠
- 本体ボタン
- 画面表示(LVGL):
- マイクレベル(値とバー)、接続状態(WiFi/MQTT/OK)、最終コマンドと時刻、モード、検知中インジケータ
- 接続:
- AWS IoT Core へ TLS(8883) で接続
- UDPパケットによる手動解錠・インターフォン検知情報の送信
- UDPローカル制御:
- 送信: 検知時に
detectedを192.168.1.255:4210へブロードキャスト - 受信:
192.168.1.255:4210(ブロードキャスト/ユニキャスト問わず)を受信し、open/open_if_detected/pingをMQTTと同様に処理 - ポート:
4210(m5stick_prj/src/main.cppのUDP_PORT)
- 送信: 検知時に
- M5Stick C Plus
- SG90サーボモーター x2
- KY-038マイクモジュール
- Grove I2C HUB
- Adafruit PCA9685 PWM/Servo Driverの互換モジュール
- DC電源プラグ
マイクモジュールからマイク素子を延長して、インターホンに近づける。3.3V駆動のためアナログ出力の値が非常に小さいが、近くで音が鳴らないと閾値を超えないのでOKとする。
- POST経由で外部から
interphone/cmdトピックにコマンドをPublish - M5StickCPlusは
interphone/cmdトピックをSubscribeし、コマンドに応じて処理を実行(解錠・モード変更など) - M5StickCPlusは
interphone/logトピックにログをPublish
docs/: 写真・図面などのドキュメントlambda/: クラウド連携用のAWS Lambdaコードm5stick_prj/: M5StickC Plus向け PlatformIO プロジェクトm5stick_ui/: SquareLine Studio プロジェクト(UI定義)stl/: 3Dプリント用STL(筐体/ホルダー)
- KY-038のマイク素子は半田こてで外して、延長してインターフォンのマイクにテープで留める。
- KY-038のアナログ出力をM5Stickの
G36に。GNDと3.3Vも接続する。 - サーボモーターはAdafruit Driver, HUB経由でGroveコネクタに接続。
- Adafruit Driverには外部電源を適当に用意(5V3AのACアダプタを使用)
- ホルダーを3Dプリントして各パーツをねじ止め、ホルダーは壁に画鋲で留める。
SquareLine StudioでExport UI Filesを行い、m5stick_prj/lib/ui/以下にエクスポートする。- AWS IoT Coreで
モノの登録を行なって証明書を登録。参考: マイコン ESP32 を使って AWS IoT Core と Pub/Sub 通信するまで
証明書作成時のポリシーは以下の通り。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "iot:Connect",
"Resource": "arn:aws:iot:<YOUR_AWS_REGION>:<YOUR_AWS_ACCOUNT_ID>:client/interphone"
},
{
"Effect": "Allow",
"Action": "iot:Subscribe",
"Resource": "arn:aws:iot:<YOUR_AWS_REGION>:<YOUR_AWS_ACCOUNT_ID>:topicfilter/interphone/cmd"
},
{
"Effect": "Allow",
"Action": "iot:Receive",
"Resource": "arn:aws:iot:<YOUR_AWS_REGION>:<YOUR_AWS_ACCOUNT_ID>:topic/interphone/cmd"
},
{
"Effect": "Allow",
"Action": "iot:Publish",
"Resource": "arn:aws:iot:<YOUR_AWS_REGION>:<YOUR_AWS_ACCOUNT_ID>:topic/interphone/log"
}
]
}m5stick_prj/src/secrets.hにWiFI接続情報、証明書情報を入力- PlatformIOでビルド、M5Stickに書き込み。
- M5StickAのボタンを押すと解錠側のサーボモータが動く
- AWS Lambdaを作成
lambda/send_cmd.pyのような内容で作成する。IOT_DATA_ENDPOINTの部分は自分のエンドポイントに書き換える。
Lambdaの実行ロールに以下のポリシーをアタッチする。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "iot:Connect",
"Resource": "arn:aws:iot:<YOUR_AWS_REGION>:<YOUR_AWS_ACCOUNT_ID>:client/interphone"
},
{
"Effect": "Allow",
"Action": "iot:Publish",
"Resource": "arn:aws:iot:<YOUR_AWS_REGION>:<YOUR_AWS_ACCOUNT_ID>:topic/interphone/cmd"
}
]
}Lambdaをデプロイし、関数URLを有効化する。
- 作成した関数URLを使用して、外部からLambda経由で解錠コマンドが送れることを確認。
curl -X POST \
-H "Content-Type: application/json" \
-d '{"message": "OPEN"}' \
"https://XXXXXXXXXX.lambda-url.XXXXX.on.aws/"- Lambdaをセキュアにする
- M5Stick側のコード整理
- ログを適切に貯めてどこかで表示する
- 通話側のサーボを使用していないので、自動応答などを作る
- いい感じのフロントエンドで外から自動解錠受け付けるなど
- I2Cの余ったところに気温センサつける
- 家の鍵にもモーターつける


