ESP32 開發板有多種版本,有些版本有整合 CH340 或 CP2102 USB-to-UART 晶片,開發板上有 Micro USB 孔可以連電腦,除了供電還能從 COM 序列埠上傳程式跟接收 Serial.print() 回傳訊息,開發測試方便許多。

我目前玩過兩塊 ESP8266 及四塊 ESP32 開發板。ESP8266 的兩塊是 NodeMCU v3 LoLin 以及一塊 NodeMCU Lua WiFi v3;ESP32 則是 AI Thinker (安信可) 的 NodeMCU-32S、副廠 Goouuu-ESP32S (ESP32-WROOM-32) 各兩塊(為什麼同一款要買兩塊?自從踩過雷我學會「電子零件如果不貴,聰明人會多買一組」的道理,一旦遇上問題,手邊有沒有對照組,是天堂與地獄的差別呀)。不管原廠副廠,用起來其實差不多,都能正常運作,只差在原廠做工比較精緻(但我偏偏踩到雷,補聲暗),還有一點差異,就是今天要說的無法自動上傳問題。

我手上的兩款 ESP8266 及 AI Thinker NodeMCU-32S,用 VSCode + PlatformIO 寫完程式執行 Upload 程序就會自動重置開發板並上傳程式,加上以前玩 Arduino 的經驗,我一直以為這是天經地義的。後來再入手兩塊很便宜的副廠 ESP32S,上傳時卻總會出現 Timed out waiting for packet header 錯誤。

esptool.py v3.0
Serial port COM7
Connecting........_____....._____....._____....._____....._____....._____....._____

A fatal error occurred: Failed to connect to ESP32: Timed out waiting for packet header

後來看到一些前輩的經驗分享,原來有一些版子上傳時需要手動按一下板子上的 RST(EN) 鈕再鬆開,開發板才會進入上傳模式。雖然只是舉手之勞,但大家都知道我性急程度直逼王藍田,對重複做同一件事的容忍度極低,很想把這個動作省掉。

爬文得到初步結論,這個問題較常發生在副廠或沒品牌的開發板,且存在機率性,故用一款板子可能有些能自動上傳、有些得配合按鈕操作。也有同一塊版子在 A 電腦可以自動上傳,在 B 電腦不行的狀況,或是原本不行,更新 CH340/CP2102 晶片驅動程式後變成可以的案例。

網路流傳一種硬體解法,在 RST/EN 跟接地間加一顆 10uF 電容,就可以神奇地解決這個問題囉。

經過實測,真的有效。10uF 電解質電容一顆 1 元,焊在 EN 與 GND 之間,花 1 塊錢就能省去每次上傳手動按鈕的麻煩,超划算。

thumbnail

照片中的新電容是後來買的,焊接在開發板上那顆不用錢,是從我拾荒收藏中拆下來的。昨天剛好再翻到另一箱 3C 垃圾,又在其中發現 3 枚,古董滑鼠電路板上就有兩顆,10uF 電解質電容在早期表面黏著元件還不普及的電子產品中蠻常出現,如果不介意回收電容腳很短難操作,去廢五金找找,有機會用零元解決問題。

thumnail

雖然問題解決了,但我好奇背後的原理。上網查了資料,沒有電子學背景我能鑽的深度有限,是大概能理解:ESP 模組被設計成會在 EN、IO0 腳位出現特定順序電位變化進入程式燒錄模式。上傳工具 esptool.py 在上傳程式前會控制序列埠的 DTR 及 RTS 在特定時間點產生電位高低變化,開發板上將 DTR/RTS 輸出接到電晶體邏輯閘、電容轉成對映電位訊號傳入 EN、IO0 腳位,實現 EN 先 0 讓系統重啟,EN 變 1 時 IO0 變成 0 的順序,如此即可觸發開發板進入下載啟動模式。電容的作用在於延遲 EN 的電位變化時機,以符合 EN、IO0 切換的時間點。若開發板有實作 DTR/RTS 觸發 EN/IO0 的電路,但因電容或其他種種因素未在正確時間改變電位,自動上傳失敗便會失敗,額外焊上的 10uF 電容會再延後電位變化時機,使其符合 ESP32 規格,問題得以解決。由於電位變化的時機點很重要,不同電腦設備、CPU 快慢、驅動程式都有可能造成差異,可以解釋部分電腦不行以及更新驅動程式解決的現象。EN/IO0 變化的規則很單純,但我的玩具示波器只有單一輸入源,無法實地觀察驗證,就此打住。對詳細原理有興趣的朋友可以參考以下兩篇:

Tips of fixing ESP32 developlment board auto upload error by adding 10uf capacity.


Comments

# by 路過人

對照組給讚

# by 歧路人

更新驅動程式 CP210x_Universal_Windows_Driver 之後可以了+1 謝謝作者大大分享文章。

# by 歧路人

[UPDATE] 有時候還是不行,需要重試三四次才會成功。

Post a comment