6

1 元解決 ESP32 開發板無法全自動上傳問題

 3 years ago
source link: https://blog.darkthread.net/blog/esp32-upload-timeout-fix/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client
1 元解決 ESP32 開發板無法全自動上傳問題-黑暗執行緒

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 變化的規則很單純,但我的玩具示波器只有單一輸入源,無法實地觀察驗證,就此打住。對詳細原理有興趣的朋友可以參考以下兩篇:


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK