【58hack】ランニングハッカソン!

https://github.com/F0rte/iot-ai-agent

TypeScript

C++

AWS

Python

VSCode

AIに実装して欲しい?なら走ってエージェントを起動しよう!

warisuno

Nakamura Ryo

二田三田

推しアイデア

IoTのセンサーをフックにAIコーディングが起動するVS Code拡張機能!

作った背景

PCから離れている間に、ユーザーの承認を待たずに開発を自律的に進めるAIエージェントが欲しい!

推し技術

自作のIoTとAIエージェントをAWS IoT Coreで連携!

プロジェクト詳細

概要

エンジニアって、不健康なイメージありませんか? 仕事で座りっぱなしで運動不足、ハッカソンで徹夜など...

この「ランニングハッカソン」があれば、開発のためにPCの前に座る必要はありません。 走っている間「だけ」AIが自律的に開発してくれます。

画面はこんな感じ image

技術

アーキテクチャ図

image

IoT ESP32-S3 + MPU6050 で作る IoT 活動検知デバイスAWS IoT Core につなぐまで

ESP32-S3 Super MiniMPU6050 加速度センサーを使って、活動検知(Run / Walk / None)を行い、その結果を AWS IoT Core に送信する IoT デバイス構成についてまとめます。

特に今回の技術的なチャレンジだったのが BLE を用いた書き込みシステムAWS 周り(証明書・MQTT・接続設計) です!

「ESP32 から AWS IoT Core に送るって、結局どうつながってるの?」という部分を、初心者にも分かるように整理していきます。


この記事で分かること

  • ESP32-S3 / MPU6050 / AWS IoT Core の 全体構成
  • AWS IoT Core に安全に接続する仕組み(証明書 / TLS / MQTT)
  • 実際に動かすための 設定手順(PlatformIO / AWS 証明書差し替え)
  • MQTT Test Client での 動作確認方法
  • ハマりやすいポイントとトラブルシューティング

超絶ポイント BLE経由で書き込み!

今回のハッカソン前にパソコンが壊れたこともあり、 iPadで組み込み開発をせざるを得ない状況になりました。。。 唯一できないことは「マコンへの書き込み」 そこで、パソコンでビルドしたファイルをウェブアプリ経由でiPadから書き込める サイトを開発しました! 以下に詳しくまとめてます! Topa'z Page

作ったものの概要

このファームウェアは、ESP32-S3 Super Mini 上で動作し、MPU6050 の加速度を読み取って活動状態を判定し、AWS IoT Core に定期送信します。さらに、BLE を使って Wi-Fi 設定や OTA 更新もできる構成です。

Iotだけのデモ

主な機能

  • ✅ MPU6050 による活動検知(Run / Walk / None)
  • ✅ AWS IoT Core への MQTT 接続 + センサーデータ送信(5秒間隔)
  • ✅ BLE による Wi-Fi プロビジョニング
  • ✅ BLE 経由のファームウェア OTA アップデート
  • ✅ BLE デバッグシリアルモニタ
  • ✅ ステータス LED 制御(GPIO + RGB)

全体の技術構成(まずはざっくり)

まず、全体像をシンプルに見るとこうなります。

[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 はセキュアな接続が前提なので、以下が必要です。

  1. AWS IoT のエンドポイント
  2. Root CA(Amazon のルート証明書)
  3. デバイス証明書(Device Certificate)
  4. デバイス秘密鍵(Private Key)
  5. Thing に紐づく IoT ポリシー(connect / publish 権限)

つまり、ESP32 側では「Wi-Fi 接続」だけでなく、TLS 通信の証明書設定までやって初めて AWS と話せる状態になります。

AWS IoT Core へどうつながっているか ※初挑戦!!

ここが今回の肝です。

1. ESP32 が Wi-Fi に接続する

まず ESP32 は BLE プロビジョニング経由で Wi-Fi 情報を受け取り、無線 LAN に接続します。

  • BLE は「設定の受け渡し」に使う
  • 実際のクラウド通信は Wi-Fi 経由

BLE はクラウド通信用ではなく、セットアップ用の近距離インターフェースとして使っているイメージです。

2. TLS 通信のために証明書を設定する

AWS IoT Core は HTTPS と同じく TLS で通信を保護します。

ESP32 側では secure client に対して証明書をセットします。

  • AWS_ROOT_CA:サーバー(AWS)を信頼するため
  • AWS_DEVICE_CERT:このデバイスが正規であることを証明するため
  • AWS_PRIVATE_KEY:そのデバイス本人であることを示す秘密鍵

これにより AWS 側は、

  • 「接続先が本当に 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 で確認

使用ハードウェア / 配線

必要なもの(ハードウェア)

  • ESP32-S3 Super Mini
  • MPU6050 加速度センサーモジュール(I2C)
  • USB ケーブル(書き込み用)
  • ジャンパーワイヤー

MPU6050 配線

  • SDA: GPIO 12
  • SCL: GPIO 11
  • VCC: 3.3V
  • GND: GND

ESP32-S3 の 3.3V 動作に合わせて、MPU6050 への給電も 3.3V にします。

空中配線で小型化を狙っています! リポバッテリーも入れてはいたのですが。。。

焦げたので今回は断念(T . T) image

活動検知ロジック(Run / Walk / None)

MPU6050 の加速度の大きさ(magnitude)を使って、活動状態を分類しています。

  • 30.0 → Run

  • 20.0 → Walk

  • それ以下 → None

判定イメージ

if (accel_magnitude > 30.0f) return "Run";

if (accel_magnitude > 20.0f) return "Walk";

return "None";

動作確認の目安

  • 静止していると activity: "None"
  • 手で軽く動かすと Walk
  • 大きく振る・素早く動かすと Run

閾値はセンサーの取り付け方や筐体の振動で変わるので、実運用では調整前提です。

BLE 機能(運用で効くポイント)

このファームウェアには BLE サービスとして以下が含まれています。

1) Debug Service

  • ログ通知
  • コマンド書き込み
  • ステータス確認

2) Provisioning Service

  • Wi-Fi 設定(SSID / パスワード)の書き込み

3) OTA Service

  • BLE 経由ファームウェア更新
  • ステータス通知

なぜ良いのか?

IoT デバイス運用で一番つらいのは、現地での再設定・再配布です。

BLE プロビジョニングと OTA があるだけで、開発フェーズから運用フェーズへの移行がかなり楽になります。

AIエージェント

技術スタック

  • Python
  • Amazon Bedrock
  • LangGraph / LangChain

エージェントのワークフロー image

実際にローカルで起動してみた例 (簡潔なプロンプトで動作確認)

設計書ファイルを配置しておきます。 image

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

image

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

ある程度形ができた段階で、このAIエージェントの改修自体を、AIエージェント自身に行わせたりしました。


01. VS Code Extension Dashboard

** ─ IoT × AIの状態をリアルタイムに可視化**

  • リアルタイム通信: SSE (Server-Sent Events) によるイベント駆動
  • 堅牢なUI: 接続失敗時の Mock Mode 自動切り替え(3つの状態管理)
  • 一方向ストリーム: IoTAI AgentExtension

02. 物理量 ➔ UI表現への変換

** ── セキュリティと体験の両立──**

1. 速度連動アニメーション

走行速度を CSS Sprite の animation-duration にアニメーションとして動的マッピング。 「数値」を「直感的な動き」へ変換。

2. Webview内のセキュリティ

webview.asWebviewUri() を活用し、CSP制限下で安全なローカルリソース読み込みを実現。


以下ノート

  • WebviewのCSP制限対応が最大の技術的ハードル
  • アニメーション同期は最小構成で設計し、拡張可能な構造にしている

AI活用

アイデアを決定した後のブラッシュアップと、それに対する技術選定の壁打ちにGeminiを使用しました。 AWSのIoT Coreは気になってたので、使えてハッピーでした(笑)

コーディングには、GitHub CopilotとClaude Codeを使用しました。 詳細はQiita記事書いたので、ぜひ... https://qiita.com/warisuno/items/555ecb3a4dd9063085d0

自作したAIエージェントを使って、途中からAIエージェントの改修をAIエージェント自身に行わせていました。


🎨 AI-Driven UI/UX Design

  • AI × Figma による反復試行
  1. Stitch AI × Figma: 複数案を統合・構造化
  2. Visual Feedback Loop: Figma案をAIへ再入力し最適化
  3. Seamless Implementation: 最終案から実装コードへ直接出力

--

🤖 AI Implementation

  • Grok との対話によるコンセプト創出
  • 環境制約を網羅した AI フルスタック実装
  1. asWebviewUri / CSP 等の VS Code 固有制約を事前定義
  2. ピクセル単位の座標ズレも AI 解析で自動修正

AWSとかOTA周りの実装は未知な部分なので一緒に開発しつつ、議論しながら行うことによって自身の理解度を深めつつスムーズな実装を行った。 OTAのUIに関しては、stichを用いることにより、UIの構成にかかる時間を短縮するとともに、リッチな見た目に仕上げた。  

おまけ

1日目の時点でBedrockの料金$20とか使ってました image

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

warisuno

@MountWario