ESP32 Simulator について
ESP32 Simulator は、ローカルの ESP32 命令レベルエミュレーターでファームウェアを起動・テストするツールです。実機がない組み込み開発向けで、MCP 経由でシリアルログ、クラッシュ情報、画面キャプチャを返し、仮想ハードウェアの操作もスクリプト化できます。
主な機能
- 01ローカルエミュレーターで ESP32 ファームウェアを起動
- 02UART 出力の確認とログパターンの検証
- 03パニック情報とディスプレイ画像の取得
- 04ボタン、GPIO、UART、タッチ入力のスクリプト制御
- 05仮想 WiFi と複数チップモデルに対応
活用シーン
- 01実機なしで ESP32 ファームウェアをテスト
- 02起動ログが期待どおりかを確認
- 03ボタン入力を模擬して応答をテスト
- 04CI でファームウェアのシミュレーション検証
MCP 対応
MCP サーバーはコーディングエージェントに実行、検証、スクリプト操作、画面キャプチャのツールを提供し、コンソールログ、停止理由、パニック情報、PNG を返します。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
6掲載時のツール一覧 · 1 週間前に更新
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
| chip | enum | いいえ | 対象チップの系列。デフォルトは s3(ESP32-S3)です。esp32 | s3 | c3 | c6 |
| wifi | string | いいえ | DHCP/DNS/NAT を備えた仮想アクセスポイントを接続します。仕様は 'ssid=demo,psk=secret' の形式です(キー:ssid、psk、chan、bssid)。オープンネットワークの場合は SSID のみを指定します。ステーションには 10.0.2.15 が割り当てられます。 |
| board | string | いいえ | ボードのモデル:S3 は 'atech14'(デフォルト)、'waveshare-lcd4b'、'waveshare-amoled18-v2'、'waveshare-cam';C6 は 'waveshare-c6-lcd147';ESP32 は 'ttgo-tdisplay'、'esp32dev-loopback';ベアモジュールの場合は 'none'。ボードのない C3 では省略してください。sim_list_boards を参照してください。 |
| appBin | string | いいえ | アプリケーションバイナリ(.bin)への直接パス。 |
| console | enum | いいえ | キャプチャするコンソールソース(デフォルト:both = UART0 + USB-Serial/JTAG)。ESP-IDF が両方のコンソールにミラー出力する行は一度だけ表示されます。uart0 | usb | both | all | none |
| ptableBin | string | いいえ | partition-table.bin への直接パス(実際の ROM 起動では appBin とともに必要)。 |
| maxSeconds | number | いいえ | エミュレーション時間の上限(秒、デフォルト:10s)。エミュレーションは通常、実時間より速く実行されます。 |
| projectDir | string | いいえ | ESP-IDF プロジェクトのルートまたはビルドフォルダーへのパス。省略した場合は、現在の作業ディレクトリを使用します。 |
| bootloaderBin | string | いいえ | bootloader.bin への直接パス(実際の ROM 起動では appBin とともに必要)。 |
| stopAfterExceptions | number | いいえ | CPU 例外が N 回発生した後に停止します(デフォルトでは未設定)。Xtensa ファームウェアで頻繁に発生するウィンドウオーバーフロー/アンダーフローも含め、すべての例外をカウントするため、クラッシュ検出器ではなくデバッグ補助機能です。panic はログから常に検出されます。 |
詳細
esp32sim-mcp
エージェントがESP32ファームウェアを作成し、起動してテストします。ボードもアカウントも不要です。
実際のClaude Codeセッションをライブで記録したものです(最後のアイドル時間のみ短縮しています)。ESP-IDFのhello_worldを編集し、ESP-IDFがインストールされていないためDockerでビルドして、エミュレーターのコンソールを確認しています。
コーディングエージェントは組み込みCの作成は得意です。しかし、実行となると手も足も出ません。手元にボードがなければ、「コンパイルできた」でフィードバックループが終わってしまいます。
esp32sim-mcpは、そのループを完結させます。Claude Code、Codex、Cursor、または任意のMCPクライアントにツール一式を提供し、エージェントが作成したファームウェアを、ローカルで動作する命令レベルのESP32エミュレーターであるesp32sim上で起動します。そして、チップが出力した内容、クラッシュの有無、ディスプレイの表示を返します。エージェントは結果を読み、コードを修正して再試行します。実機を手元で使う場合と同じ流れです。
- 🔌 ハードウェアもクラウドも不要です。 すべてお使いのマシン上で動作します。アカウント、トークン、ボードは必要ありません。
- 🧬 実際のブートチェーンを使用します。 EspressifのマスクROM、ESP-IDFブートローダー、変更していないアプリを、ESP32-S3、C3、C6、従来のESP32で実行します。
- 📡 コンソールだけではありません。 DHCP、DNS、NATを備えた仮想WiFiアクセスポイント、ボタン、ロータリーエンコーダー、GPIO、UART入力、タッチ、ディスプレイのスクリーンショットに対応しています。
- 🧪 雰囲気ではなくアサーションで検証します。
sim_expectは合否と、見つからなかった正確な行を返すため、エージェントは何を修正すべきか把握できます。 - ⚡ 高速です。 エミュレーションは通常、実時間より速く進みます。Appleシリコンでは、WiFiステーションがネットワークに接続するまでのエミュレーション上の8秒が、約0.6秒で完了します。
- 🤖 スキルが付属します。
initを実行すると、作成 → ビルド → シミュレーション → 修正の流れをエージェントに教えるスキルがインストールされます。ESP-IDFがインストールされていない場合にDockerでビルドする方法も含まれます。
クイックスタート
npx -y esp32sim-mcp setup # emulator + mask ROMs, pinned and SHA-256 verified
cd your-esp-idf-project
npx -y esp32sim-mcp init # registers the MCP server and the skill for your agents
次に、シリアルコンソールで確認できるものをエージェントに依頼します。
1秒ごとに出力するカウンターを追加してビルドし、シミュレーターで5まで増えることを確認してください。
必要条件:Node.js 22以上、およびファームウェアのビルドにESP-IDF または Dockerが必要です。エミュレーターのビルド済みバイナリはmacOS(Appleシリコン)とLinux(x64、arm64)に対応しています。詳しくはその他のプラットフォームをご覧ください。
エージェントに見える内容
実際のセッションでは、エージェントは次のように呼び出します。
{
"tool": "sim_expect",
"projectDir": ".",
"chip": "s3",
"board": "none",
"maxSeconds": 10,
"patterns": ["Hello world!", "Counter: 1", "Counter: 2", "Counter: 3", "Counter: 4", "Counter: 5"]
}
すると、次の結果が返ります。
### Expect Test: ✅ PASSED
Matched 6 / 6 patterns.
- ✅ Matched (line 54): `Hello world!`
- ✅ Matched (line 55): `Counter: 1`
...
- ✅ Matched (line 65): `Counter: 5`
#### Full UART Logs:
ESP-ROM:esp32s3-20210327
Build:Mar 27 2021
rst:0x1 (POWERON),boot:0xf (SPI_FAST_FLASH_BOOT)
...
問題が発生した場合は、代わりにパニックの情報が返されます(Guru Meditation Error、スタックオーバーフロー、アサーション失敗、ヒープ破損)。そこには、発生までのログと、見つからなかったパターンが明示されます。
ツール
| ツール | 機能 |
|---|---|
sim_run | ファームウェアを起動し、コンソールログ、停止理由、エミュレート時間、パニックがあればその内容を返します。 |
sim_expect | ファームウェアを実行し、文字列または正規表現がコンソールに表示されることをデフォルトで順番にアサートします。 |
sim_script | エミュレート時刻を指定してハードウェアを操作します:ボタンのpress/release、gpioのレベル、knobの回転、uart/serialの入力、touch、stop。 |
sim_screenshot | 指定したエミュレート時刻におけるボードのディスプレイのPNGを返します。 |
sim_list_boards | チップ、ボード、ディスプレイ、入力を一覧表示します。 |
sim_doctor | エミュレーターとROMを確認し、不足しているものの修正方法を示します。 |
すべてのツールはprojectDir(ESP-IDFビルドはbuild/flasher_args.jsonから検出されます)、または明示的なappBin/bootloaderBin/ptableBinのパスに加え、chip、board、wifi(例:ssid=demo,psk=secret)を受け取ります。UART0とUSB-Serial/JTAGコンソールの両方がキャプチャされるため、プロジェクトがどちらにログを出力していても、その内容が表示されます。
仕組み
flowchart LR
A["Coding agent<br/>(Claude Code, Codex, Cursor)"] -- "edits code,<br/>runs idf.py build<br/>(local or Docker)" --> B["ESP-IDF build/"]
A -- "MCP: sim_expect, sim_run, ..." --> C["esp32sim-mcp"]
C -- "flasher_args.json" --> B
C -- "spawns" --> D["esp32sim emulator<br/>mask ROM → bootloader → app"]
D -- "UART / USB-JTAG, panics,<br/>display, virtual WiFi" --> C
C -- "pass/fail, logs, PNG" --> A
esp32sim-mcpは、薄くテスト済みのレイヤーです。ビルドを検出し、ツール呼び出しをesp32simのコマンドラインに変換し、2つのコンソールを分離して重複を除去し、パニックを検出して、エージェント向けに結果を整えます。エミュレーション自体はesp32simが担います。
CIでの使用
エージェントなしでも同じチェックを実行でき、成功時は終了コード0、失敗時は1を返します。ファームウェアをビルドし、起動ログをアサートするGitHub Actionsジョブの例:
jobs:
firmware:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
- uses: actions/setup-node@v5
with:
node-version: 22
- name: Build
run: docker run --rm -v "$PWD:/project" -w /project espressif/idf:v5.5.4 idf.py set-target esp32s3 build
- name: Install the emulator
run: npx -y esp32sim-mcp setup
- name: Boot and check the console
run: npx -y esp32sim-mcp expect --max-seconds 10 --pattern "app_main" "Counter: 5"
このリポジトリ独自のCIでは、ボタンのスクリプト操作も含め、examples/hello-esp32に対して同様の処理を行います。
すべてのCLIコマンド
esp32sim-mcp setup # install emulator + ROMs (or: install-emulator, fetch-roms)
esp32sim-mcp init [--global] [--agent claude-code|codex|cursor|claude-desktop] [--dry-run]
esp32sim-mcp run [-p dir] [--chip s3] [--board none] [--max-seconds 5] [--wifi ssid=x,psk=y]
esp32sim-mcp expect --pattern "a" "b" [--unordered] [--script actions.txt] [...run options]
esp32sim-mcp list [--chip c6]
esp32sim-mcp doctor
esp32sim-mcp serve # the MCP server (what agents launch)
対応チップとボード
| チップ | ボード(board) |
|---|---|
| ESP32-S3 | atech14(デフォルト:ST7735 TFT、ボタン、ロータリーエンコーダー、LEDリング、オーディオ)、waveshare-lcd4b(480×480タッチ)、waveshare-amoled18-v2(368×448 AMOLEDタッチ)、waveshare-cam(OV5640カメラ)、none |
| ESP32-C3 | コンソールのみ(ボードモデルなし) |
| ESP32-C6 | waveshare-c6-lcd147(172×320 LCD)、none |
| ESP32(クラシック) | ttgo-tdisplay(135×240 TFT)、esp32dev-loopback、none |
標準のESP-IDFプロジェクトではnoneを使用してください。仮想WiFiアクセスポイントは、4種類すべてのチップで動作します。
エージェントのセットアップ
initは使用しているエージェントを検出し、それぞれを設定します。デフォルトではファームウェアプロジェクト内で実行されます。--globalを指定すると、ユーザーレベルの設定を書き込みます。
| エージェント | MCP サーバー(プロジェクト/--global) | スキル(プロジェクト/--global) |
|---|---|---|
| Claude Code | .mcp.json/claude mcp add --scope user | .claude/skills//~/.claude/skills/ |
| Codex | ~/.codex/config.toml(ユーザーのみ) | .agents/skills//~/.codex/skills/ |
| Cursor | .cursor/mcp.json/~/.cursor/mcp.json | .cursor/skills//~/.cursor/skills/ |
| Claude Desktop | --globalのみ | — |
既存のエントリーは保持され、再実行しても変更はなく、解析できない設定ファイルには手を加えません。
Claude Codeプラグイン。 initの代わりに、サーバーとスキルをプラグインとして、すべてのプロジェクトにインストールできます:
/plugin install esp32sim --marketplace stramanu/esp32sim-mcp
MCPレジストリ。 サーバーはio.github.stramanu/esp32sim-mcpとして公式MCPレジストリに公開されています。その他のMCPクライアントでは、次のようにします:
{
"mcpServers": {
"esp32sim": { "command": "npx", "args": ["-y", "esp32sim-mcp", "serve"] }
}
}
その他のプラットフォーム
setupはmacOS arm64とLinux x64/arm64に、ビルド済みバイナリをインストールします。これらは、このリポジトリのエミュレータワークフローによって、署名済みビルド来歴(gh attestation verify <archive> -R stramanu/esp32sim-mcp)付きでソースからビルドされます。それ以外の環境では、Cargoを使ってesp32simをビルドしてください(rustup)。このリリースのテスト対象となったコミットに固定されています:
cargo install --locked --git https://github.com/mikroverk/esp32sim --rev f535f3b42293a76ab64c231a0425f35857ab6cf1 esp32sim
npx esp32sim-mcp fetch-roms
ESP32SIM_PATHは別の場所にあるエミュレータバイナリを、ESP32SIM_ROM_DIRは別のROMディレクトリを指定します。ESP-IDFのインストール内にあるROMは自動的に検出されます。
比較
| ボードなしで実行可能 | アカウントまたはトークンが必要 | エージェント向けに構築 | |
|---|---|---|---|
| esp32sim-mcp | ✅ ローカルエミュレーター | 不要 | ✅ MCP サーバー + スキル |
| Wokwi CLI MCP | ✅ | はい(WOKWI_CLI_TOKEN) | ⚠️ 実験的 |
| esparagus(Espressif) | ❌ 実機に書き込み | 不要 | ✅ |
| esp32sim 単体 | ✅ | 不要 | ❌ CLI と Web UI |
esparagus は次の自然なステップです。まず esp32sim-mcp でシミュレーションし、その後、実際のボードで確認します。
制限事項
- エミュレーターはシリコンではありません。esp32sim がモデル化していない周辺機器、RF のタイミング、Bluetooth は対象外です。出荷前にハードウェアで確認してください。
- エージェント自身がファームウェアをビルドします(ローカルまたは Docker で
idf.pyを使用)。MCP サーバーはコンパイルを行いません。 - Windows でのテストは行われていません。
貢献
Issue やプルリクエストを歓迎します。開発環境のセットアップと、実際のエミュレーターを使ったエンドツーエンドテストの実行方法については CONTRIBUTING.md を、変更内容については CHANGELOG.md をご覧ください。
クレジット
- Joakim Eriksson、Alice、Mattia Fiumara による esp32sim:実際の処理を担うエミュレーター(MIT)。
- Espressif:ESP-IDF とマスク ROM の ELF(Apache-2.0)。
- Model Context Protocol。
ライセンス
MIT © Emanuele Strazzullo
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。