Communityコーディング&開発github.com

ESP32 ファームウェア

PlatformIO を使用した ESP32 ファームウェア — Arduino フレームワーク(主要)と ESP-IDF(PlatformIO 内、または Arduino を IDF コンポーネントとして使用)— ESP32、S2、S3、C3、C6 に対応。 platformio.ini の設定、Arduino core 2.x と 3.x の API 差分、安全なピン選択(ストラップピン/フラッシュ/PSRAM/ADC2 ピン)、FreeRTOS タスクと ISR、メモリ/PSRAM、Wi-Fi/BLE、NVS/Preferences、OTA、ディープスリープ、パーティション、USB/シリアル経由のフラッシュ書き込み、Guru Meditation パニックとブートループの解析をカバーします。

ESP32 ファームウェア とは?

このスキルは、PlatformIO を使用した ESP32 ファームウェア開発に特化した包括的なガイドです。主に Arduino フレームワークをベースに、必要に応じて ESP-IDF を併用します。対応チップは ESP32、ESP32-S2、S3、C3、C6 の全主要バリエーションを網羅しています。 スキルは、まずプロジェクトの正確な特定(チップ、モジュール、フレームワーク、Arduino core バージョン、フラッシュ/PSRAM サイズ、配線)を求めます。これにより、不適切なピン割り当てやバージョン不整合による一般的な ESP32 障害を事前に防止します。特に、フラッシュピン、PSRAMピン、ストラップピン、ADC2(Wi-Fi 使用時に無効)の使用を避けるルールを強調しています。 さらに、FreeRTOS タスクスタックサイズ(バイト単位)、ISR での IRAM_ATTR 使用、電源供給(Wi-Fi TX 時のピーク電流対策)、ヒープ断片化の回避、NVS/フラッシュの書き込み寿命管理、不可逆操作(eFuse、セキュアブート、フラッシュ暗号化)への警告など、現場で頻発する失敗を防ぐための実践的なルールを提供します。 ビルド、アップロード、シリアルモニタの PlatformIO コマンドに加え、クラッシュやリセット時の解析手順(Guru Meditation、ウォッチドッグ、ブラウンアウト、ブートループ)を詳細にカバーしています。また、platformio.ini 設定、ピン/バリアント参照、RTOS/メモリ/電力管理、パニック/デバッグ、接続性/OTA/セキュリティ に関する 5 つのリファレンスファイルを参照するよう指示しており、初心者から上級者まで ESP32 開発のあらゆる局面で役立ちます。

対応~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/budenga/firmware-skills/tree/HEAD/skills/esp32-firmware

Installed? Explore more コーディング&開発 skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

お気に入りのAIに質問する

このエージェントスキルを事前に読み込んだ状態で新しいチャットを開きます。

ドキュメント

ESP32 ファームウェア(PlatformIO:Arduino 優先、必要に応じて ESP-IDF)

コード規約、アーキテクチャ、単体テスト、一般的なデバッグについては embedded-c-cpp も併せて読み込んでください。このスキルは ESP32 固有の部分を担当します。

最初に、プロジェクトを特定する

確認項目確認場所重要な理由
正確なチップとモジュール(ESP32-WROOM-32E、ESP32-S3-WROOM-1-N16R8、ESP32-C3-MINI-1...)platformio.ini の board =、ユーザー、基板シルクスクリーンコア、ピン、PSRAM、USB、ADC はバリアント間で大きく異なります
フレームワークframework = arduino、espidf、または arduino, espidfAPI と設定モデル
Arduino core バージョン(2.x または 3.x)ビルドログの行 framework-arduinoespressif32 @ x.y.z、platform = 行、または ESP_ARDUINO_VERSION_MAJORいくつかの API が 3.x で変更されました(LEDC、タイマー) — 間違ったバージョン向けに書かれたコードはコンパイルできません
フラッシュ / PSRAM サイズモジュール名(N16R8 = 16 MB フラッシュ、8 MB オクタル PSRAM)、board_upload.flash_sizeパーティション、メモリ配置
基板配線ユーザー/回路図ストラップピン、フラッシュ/PSRAM/USB/LED で使用されるピンを避ける

バリアントが不明で、タスクがピン、ペリフェラル、電源、メモリに影響する場合は、コードを書く前に確認してください — S3 で問題ないピンでも、クラシック ESP32 では起動しなくなる可能性があります。

Arduino か、ESP-IDF か?

Arduino(デフォルト)に留めるESP-IDF(PlatformIO では framework = espidf)または Arduino + IDF(framework = arduino, espidf)に移行する
プロトタイプとほとんどの製品Arduino のプリコンパイル済みコアが公開しない sdkconfig オプション(ロールバック OTA、セキュアブート、フラッシュ暗号化、PM 自動ライトスリープ、コアダンプ-to-フラッシュ、FreeRTOS 設定)を変更する必要がある場合
多くのライブラリが利用可能最新の IDF 機能、メモリ/パフォーマンスの厳密な制御
高速なイテレーションプロダクションの堅牢化

ESP32 上の Arduino は既に FreeRTOS + ESP-IDF 上で動作しているため、IDF API(esp_*、xTaskCreatePinnedToCore、nvs_*、esp_sleep_*、heap_caps_*)は Arduino コードから使用できます。「Arduino as IDF component」(arduino, espidf)は Arduino ライブラリを維持しつつ sdkconfig の制御を追加します — これが一般的な移行パスです。

セットアップ、platformio.ini テンプレート、2.x と 3.x の API 変更点:references/platformio-setup.md を参照してください。

典型的な ESP32 の失敗を防ぐルール

  1. ピン:フラッシュピン(ESP32 の GPIO6–11)、PSRAM ピン(WROVER の 16/17、S3 オクタル PSRAM モジュールの 33–37)、USB 使用時の USB ピンは決して使用しないでください。ストラップピン(ESP32:0、2、5、12、15)は「注意して使用」として扱ってください — 起動時に GPIO12 がハイになっていると、3.3V フラッシュモジュールは起動に失敗します。ADC2 は Wi-Fi オン時には動作しません(クラシック ESP32):ADC1 ピンを使用してください。各バリアントの完全なテーブル:references/pins-and-variants.md。
  2. loop() やタスクを永久にブロックしない:delay() / vTaskDelay() なしの長い while ループはタスクウォッチドッグをトリガーします。while (WiFi.status() != WL_CONNECTED) にはタイムアウトが必要です。
  3. ISR:IRAM_ATTR を付け、極めて小さく保ち、Serial.print、delay、Wi-Fi 呼び出しを行わないでください。処理はタスクに委譲してください(キュー / タスク通知 / フラグ)。共有変数には volatile + クリティカルセクション(portENTER_CRITICAL_ISR スピンロック — ESP32 はデュアルコアです)。
  4. タスクスタックはバイト単位(ESP-IDF/Arduino では、標準 FreeRTOS のワード単位とは異なります)。uxTaskGetStackHighWaterMark(NULL)(バイト単位)で測定します。Arduino の loop() はデフォルトで 8 KB です(変更するには SET_LOOP_TASK_STACK_SIZE(16 * 1024);)。
  5. 電源供給:Wi-Fi TX は約 300~500 mA のピーク電流を消費します。「ブラウンアウト検出器がトリガーされました」は電源(レギュレーター、バルクコンデンサ、ケーブル)を修正する必要があることを意味します — ブラウンアウト検出器を無効にしないでください。
  6. ヒープ:ループ内での String 連結、頻繁な new / malloc(時間経過による断片化)を避け、事前割り当てを行ってください。ESP.getFreeHeap() / heap_caps_get_minimum_free_size(MALLOC_CAP_8BIT) を時間経過で確認してください。
  7. NVS/フラッシュの摩耗:Preferences / NVS への書き込みをループイテレーションごとに行わないでください。変更時、レート制限付きで書き込んでください。
  8. 不可逆操作:eFuse の焼き付け、セキュアブート、リリースモードでのフラッシュ暗号化は永続的です。明示的なユーザー確認なしに、espefuse.py burn_* の実行、sdkconfig でのこれらオプションの有効化、データが存在するデバイスへの erase_flash を絶対に行わないでください。

ビルド、アップロード、モニター(PlatformIO)

pio run -e <env>                       # ビルド
pio run -e <env> -t upload             # USB/シリアル経由でフラッシュ
pio device monitor -e <env>            # シリアルモニター(monitor_speed / monitor_filters を使用)
pio run -e <env> -t upload -t monitor  # 両方
pio run -e <env> -t uploadfs           # data/ フォルダを LittleFS/SPIFFS イメージとしてアップロード
pio run -e <env> -t erase              # フラッシュ全体を消去(最初に確認:NVS/WiFi 認証情報が消去されます)
pio run -e <env> -t menuconfig         # ESP-IDF / arduino+espidf のみ
pio test -e native                     # ホスト単体テスト(embedded-c-cpp を参照)

アップロードに失敗し「Failed to connect / Wrong boot mode detected」と表示された場合 → BOOT(GPIO0 / C3 では GPIO9)を押しながら EN/RST をタップし、BOOT を離します。ケーブルがデータ転送に対応しているか確認し、ポートを占有している他のシリアルモニターを閉じてください。アップロード前に基板が接続され、ポートが正しいことを確認してください(pio device list)。

クラッシュまたはリセットが発生した場合

貼り付け可能なシリアル出力が重要な証拠です。monitor_filters = esp32_exception_decoder と build_type = debug を有効にして、バックトレースがファイル:行にデコードされるようにしてください。その後、references/panics-and-debug.md を参照してください:Guru Meditation の種類(LoadProhibited、StoreProhibited、IllegalInstruction、RISC-V の Load/Store アクセスフォルト)、スタックカナリア、タスク/割り込みウォッチドッグ、rst: コード、ブラウンアウト、ブートループ、JTAG デバッグ(S3/C3/C6 では debug_tool = esp-builtin)について。

リファレンスファイル

ファイルいつ読むか
references/platformio-setup.mdplatformio.ini の作成/修正、プラットフォーム/core バージョンの選択、Arduino 2.x→3.x API 変更点、PSRAM、USB-CDC シリアル、パーティションとファイルシステム、PlatformIO での ESP-IDF 使用、sdkconfig
references/pins-and-variants.mdピンの選択またはレビュー、ESP32/S2/S3/C3/C6 の比較、ADC、タッチ、ディープスリープ起床ピン
references/rtos-memory-power.mdタスク、コア、ISR、キュー、ウォッチドッグ、スタック/ヒープ/PSRAM、IRAM、ディープ/ライトスリープ、バッテリー
references/panics-and-debug.mdクラッシュ、リセット、ウォッチドッグ、ブラウンアウト、ブートループ、アップロード失敗、JTAG デバッグ、コアダンプ、リセット理由
references/connectivity-ota-security.mdWi-Fi/BLE の堅牢性、NVS/Preferences、OTA アップデートとロールバック、セキュアブート / フラッシュ暗号化の判断

Individual skills in this repo

This repo contains 2 individual skills — each has its own dedicated page.

pic-firmware

Microchip PIC and dsPIC firmware with MPLAB X IDE, XC8 / XC16 / XC-DSC / XC32 compilers and MPLAB Code Configurator (MCC Melody/Classic) for PIC16, PIC18, PIC24, dsPIC33 (F/EP/EV/CK/CH dual-core/A) and PIC32 — configuration bits, oscillator/PLL, TRIS/LAT/PORT/ANSEL, PPS, interrupts per family, 8/16-bit atomicity and hardware-stack limits, dsPIC DSP engine and Q15 fixed-point, high-speed PWM/ADC control loops, motor control and digital power, XC8 memory and optimization, headless builds, programming and debugging with PICkit 4/5, MPLAB Snap and ICD (ipecmd), reset causes and traps. Use this skill whenever the user mentions any PIC or dsPIC part (PIC16F, PIC18F, PIC24F, dsPIC33EP/CK/CH, PIC32MX/MZ), MPLAB X, MCC, XC8/XC16/XC-DSC/XC32, PICkit, Snap, ICD, `#pragma config`, motorBench, or a .X project folder — even for a short question like "o pino não lê nada no PIC" or "o meu controlo PI no dsPIC oscila". Use together with embedded-c-cpp for general C quality, testing and arc...

stm32-firmware

STM32 firmware development with STM32CubeMX / STM32CubeIDE + HAL/LL and with PlatformIO — project structure and USER CODE rules, peripherals (UART/I2C/SPI/ADC/timers/DMA), clocks, low power, flash/option bytes, building from the command line, flashing and debugging with ST-Link (STM32CubeProgrammer CLI, OpenOCD, GDB, SWV), and HardFault analysis. Use this skill whenever the user works on any STM32 / Nucleo / Discovery / Blue Pill board, a `.ioc` file, CubeMX/CubeIDE, HAL_ functions, ST-Link, or sees a HardFault — even if they just say "o meu STM32 não arranca" or paste a HAL call. Use together with embedded-c-cpp for general C/C++ quality, testing and architecture.

関連スキル