ファーム書き込めるけど動作しない自作ESP32基板の話

自作ESP32基板を作っていたとき、かなり厄介なトラブルに遭遇した。

書き込みはできるのに、電源を入れても起動しない…

最初は電源を疑い、配線を疑い、はんだ不良を疑い、ESP32自体の故障まで疑った。
でも原因はもっと単純だった。

ブートストラップピン電圧の、たった “数msの立ち上がり差” だった。

※ここでいうESP32は、ESP32C5です


スポンサーリンク

起きていた現象

今回見ていたのは、電源投入直後のあるGPIOピンの電圧波形。

比較するとこんな感じだった。

正常
異常
  • 正常基板 → 約1msで立ち上がる
  • 異常基板 → 約10msかけてゆっくり立ち上がる

差はたった9ms程度。

でも、この差がESP32にとって致命的だった。


原因は「ブートストラップピン」

ESP32には「ブートストラップピン(Strapping Pin)」というものがある。

電源投入直後にこれらのピン状態を読み取って、

  • 通常起動する
  • ダウンロードモード(書き込みモード)へ入る

などを決定している。

つまり、電源投入時のほんの一瞬だけ重要になる特殊なピン。

今回、自分はそこへ不用意にコンデンサを接続してしまっていた。


なぜコンデンサで問題が起きるのか

コンデンサが付くと、信号はゆっくり立ち上がる。

例えば:

3.3V
 │
10kΩ
 │
 │ーブートストラップピン(GPIO)
 │
0.1uF
 │
GND

このような回路だと、GPIO電圧は即座にHIGHにならず、RC時定数に従ってゆっくり上昇する。

時定数は:

τ=RC\tau = RC

今回、

  • 抵抗:10kΩ
  • コンデンサ:0.1uF

なら:

τ=10000×0.1×106=1ms\tau = 10\,000 \times 0.1\times10^{-6} = 1\mathrm{ms}τ=10000×0.1×10−6=1ms

になる。

数ms〜十数msくらい、電圧が中途半端な状態になるわけだ。


ESP32はその「中途半端な瞬間」を見ている

ESP32は電源投入直後、かなり早いタイミングでブートピンの状態をサンプリングする。

つまり、

  • 本来HIGHであるべきピンが
  • コンデンサのせいでまだLOW寄り

だと、ESP32が誤ったブートモードへ入ってしまう。

結果として、

  • 書き込みはできる
  • でも通常起動しない

という非常に分かりにくい状態になる。

これ、本当に混乱する。


特に怖いポイント

今回厄介だったのは、

  • USB書き込みは普通に成功する
  • ESP32自体も壊れていない
  • 電源も正常に見える

という点。

つまり「全部動いているように見える」のに起動だけしない。

結果として、

  • ソフトウェア
  • 電源品質
  • はんだ
  • フラッシュ
  • USB-UART

などを延々疑うことになった。

原因に辿り着くまで丸1日かかった。


ESP32自作基板で注意したいこと

ESP32のブートストラップピンには、基本的に以下を慎重に接続したほうがいい。

  • 大きなコンデンサ
  • 強いプルアップ/プルダウン
  • 外部回路
  • LED
  • MOSFETゲート
  • 容量性負荷

特に、

「ただノイズ対策のつもりでコンデンサを入れた」

みたいなのが危険。


最後に

ESP32はかなり便利で強力なマイコンだけど、ブート周りは意外と繊細。

今回の件で、

「電源投入直後の数msがこんなに重要なのか…」

と痛感した。

もしESP32基板を自作する人がいたら、ブートストラップピンの扱いには本当に注意したほうがいい。