推しアイデア
IoTのセンサーをフックにAIコーディングが起動するVS Code拡張機能!
IoTのセンサーをフックにAIコーディングが起動するVS Code拡張機能!
PCから離れている間に、ユーザーの承認を待たずに開発を自律的に進めるAIエージェントが欲しい!
自作のIoTとAIエージェントをAWS IoT Coreで連携!
エンジニアって、不健康なイメージありませんか? 仕事で座りっぱなしで運動不足、ハッカソンで徹夜など...
この「ランニングハッカソン」があれば、開発のためにPCの前に座る必要はありません。 走っている間「だけ」AIが自律的に開発してくれます。
画面はこんな感じ


ESP32-S3 Super Mini と MPU6050 加速度センサーを使って、活動検知(Run / Walk / None)を行い、その結果を AWS IoT Core に送信する IoT デバイス構成についてまとめます。
特に今回の技術的なチャレンジだったのが BLE を用いた書き込みシステムとAWS 周り(証明書・MQTT・接続設計) です!
「ESP32 から AWS IoT Core に送るって、結局どうつながってるの?」という部分を、初心者にも分かるように整理していきます。
今回のハッカソン前にパソコンが壊れたこともあり、 iPadで組み込み開発をせざるを得ない状況になりました。。。 唯一できないことは「マコンへの書き込み」 そこで、パソコンでビルドしたファイルをウェブアプリ経由でiPadから書き込める サイトを開発しました! 以下に詳しくまとめてます! Topa'z Page
このファームウェアは、ESP32-S3 Super Mini 上で動作し、MPU6050 の加速度を読み取って活動状態を判定し、AWS IoT Core に定期送信します。さらに、BLE を使って Wi-Fi 設定や OTA 更新もできる構成です。
まず、全体像をシンプルに見るとこうなります。
[MPU6050 加速度センサー] │ (I2C) ▼ [ESP32-S3 Super Mini] ├─ センサー読み取り ├─ 活動判定 (Run/Walk/None) ├─ JSON化 ├─ Wi-Fi接続(BLEプロビジョニング) └─ MQTT/TLS で AWS IoT Core に送信 │ │ インターネット ▼ [AWS IoT Core] └─ MQTT Test Client で購読・確認
ポイントは、ESP32 が単に HTTP で投げているのではなく、MQTT + TLS(証明書認証) で安全に接続していることです。
AWS IoT Core 接続に必要なもの
AWS IoT Core はセキュアな接続が前提なので、以下が必要です。
つまり、ESP32 側では「Wi-Fi 接続」だけでなく、TLS 通信の証明書設定までやって初めて AWS と話せる状態になります。
AWS IoT Core へどうつながっているか ※初挑戦!!
ここが今回の肝です。
1. ESP32 が Wi-Fi に接続する
まず ESP32 は BLE プロビジョニング経由で Wi-Fi 情報を受け取り、無線 LAN に接続します。
BLE はクラウド通信用ではなく、セットアップ用の近距離インターフェースとして使っているイメージです。
2. TLS 通信のために証明書を設定する
AWS IoT Core は HTTPS と同じく TLS で通信を保護します。
ESP32 側では secure client に対して証明書をセットします。
これにより AWS 側は、
3. MQTT クライアントを初期化して AWS IoT Core に接続する
ESP32 側では MQTT クライアント(PubSubClient)を使って、AWS IoT Core の MQTT ブローカーへ接続します。
接続先は以下のようなエンドポイントです。
#define AWS_IOT_ENDPOINT "your-endpoint.iot.ap-northeast-1.amazonaws.com"
#define AWS_IOT_TOPIC "your/iot/topic"
ここで重要なのは、HTTP API の URL ではなく IoT Core の専用エンドポイントを使うことです。
4. センサーデータを JSON にして Publish する
MPU6050 の加速度データを読み取り、活動判定をした結果を JSON にまとめて、MQTT Topic に Publish します。
例(ログより):
{
“status": “Run”,
"bpm": 11.00,
".timestamp": "1970-01-01T00:03:05Z”,
"device_id": "ESP32-S3-SUPERMINI"
}
これを 5秒間隔で送信します。
5. AWS IoT Core 側で Subscribe して受け取る
AWS IoT Core コンソールの MQTT Test Client で対象トピックを Subscribe すると、ESP32 から送られてくるメッセージを確認できます。
つまり通信の流れはこうです。
MPU6050 → ESP32 (判定) → JSON化 → MQTT Publish → AWS IoT Core → MQTT Test Client で確認
使用ハードウェア / 配線
必要なもの(ハードウェア)
MPU6050 配線
ESP32-S3 の 3.3V 動作に合わせて、MPU6050 への給電も 3.3V にします。
空中配線で小型化を狙っています! リポバッテリーも入れてはいたのですが。。。
焦げたので今回は断念(T . T)

活動検知ロジック(Run / Walk / None)
MPU6050 の加速度の大きさ(magnitude)を使って、活動状態を分類しています。
30.0 → Run
20.0 → Walk
判定イメージ
if (accel_magnitude > 30.0f) return "Run";
if (accel_magnitude > 20.0f) return "Walk";
return "None";
動作確認の目安
閾値はセンサーの取り付け方や筐体の振動で変わるので、実運用では調整前提です。
BLE 機能(運用で効くポイント)
このファームウェアには BLE サービスとして以下が含まれています。
1) Debug Service
2) Provisioning Service
3) OTA Service
なぜ良いのか?
IoT デバイス運用で一番つらいのは、現地での再設定・再配布です。
BLE プロビジョニングと OTA があるだけで、開発フェーズから運用フェーズへの移行がかなり楽になります。
エージェントのワークフロー

実際にローカルで起動してみた例 (簡潔なプロンプトで動作確認)
設計書ファイルを配置しておきます。

この設計書を読み、[planner]がタスク分割をし、そのタスクのループ処理を行います。
ループ内では、[coder]がコードを実装し、[reviewer]が変更をレビューします。
[reviewer]が承認すれば次のタスクへ、変更を要求すればそのタスクに沿って再度[coder]が実装します。

実際に設計書に沿って実装されたファイル

ある程度形ができた段階で、このAIエージェントの改修自体を、AIエージェント自身に行わせたりしました。
** ─ IoT × AIの状態をリアルタイムに可視化**
SSE (Server-Sent Events) によるイベント駆動Mock Mode 自動切り替え(3つの状態管理)IoT → AI Agent → Extension** ── セキュリティと体験の両立──**
走行速度を CSS Sprite の animation-duration にアニメーションとして動的マッピング。
「数値」を「直感的な動き」へ変換。
webview.asWebviewUri() を活用し、CSP制限下で安全なローカルリソース読み込みを実現。
アイデアを決定した後のブラッシュアップと、それに対する技術選定の壁打ちにGeminiを使用しました。 AWSのIoT Coreは気になってたので、使えてハッピーでした(笑)
コーディングには、GitHub CopilotとClaude Codeを使用しました。 詳細はQiita記事書いたので、ぜひ... https://qiita.com/warisuno/items/555ecb3a4dd9063085d0
自作したAIエージェントを使って、途中からAIエージェントの改修をAIエージェント自身に行わせていました。
--
asWebviewUri / CSP 等の VS Code 固有制約を事前定義AWSとかOTA周りの実装は未知な部分なので一緒に開発しつつ、議論しながら行うことによって自身の理解度を深めつつスムーズな実装を行った。 OTAのUIに関しては、stichを用いることにより、UIの構成にかかる時間を短縮するとともに、リッチな見た目に仕上げた。
1日目の時点でBedrockの料金$20とか使ってました

IoTから受け取ったデータを毎回Bedrockで要約してメッセージを表示しているため、2日目はもっと使っている気が...