編譯ESP32 MicroPython韌體需要安裝下列工具軟體:
- 編譯與建立ESP32韌體的ESP-IDF(物聯網開發框架)
- Python 3和virtualenv套件
- 建置編譯環境的CMake
安裝必要的工具軟體
ESP-IDF是上海樂鑫科技官方提供的ESP32開發工具軟體,從專案原始碼網站的所有分支(branch)看來,目前最新版是4.3。ESP32 MicroPython專案說明頁面指出,目前的MicroPython韌體版本支援採用ESP-IDF v4.0.2, v4.1.1或v4.2編譯。
底下使用Windows 10 Linux子系統示範編譯ESP32 MicroPython。安裝ESP-IDF的過程會用到Python,首先確認Linux系統安裝的Python版本。筆者的Linux系統是Ubuntu 20.04 LTS,系統預先安裝了Python 3.8.5版:
如上圖所示,在這個Linux系統啟動Python直譯器的命令是“python3”。然而,ESP-IDF的安裝腳本將執行“python”命令而非“python3”,所以我們需要替python3命令設定一個名叫“python”的軟連結(相當於Windows的「捷徑」),避免發生「找不到python命令」之類的錯誤。
首先透過whereis命令確認python3的所在路徑,在筆者的電腦系統上,此路徑是“/usr/bin/python3”:
whereis python3
終端機操作畫面:
接著執行ln命令(代表“link”,連結)和-s參數,在“/usr/bin/”路徑建立一個名叫“python”的軟連結(symbolic link):
sudo ln -s /usr/bin/python3 /usr/bin/python
如此一來,無論執行python或python3命令,都能啟動Python 3直譯器。
筆者使用的Ubuntu 20.04 LTS系統,預設並沒有安裝pip套件管理工具和virtualenv模組,需要執行底下的命令進行安裝:
sudo apt install python3-pip pip3 install virtualenv
終端機操作畫面:
最後執行底下的命令安裝CMake工具,前置作業就準備好了:
sudo apt install cmake
編譯與安裝ESP-IDF工具
首先把ESP-IDF工具的原始碼複製到使用者家目錄,筆者複製的是v4.2分支:
cd ~ git clone -b v4.2 --recursive https://github.com/espressif/esp-idf.git
複製完成後,執行底下的命令編譯與安裝它:
cd esp-idf ./install.sh source export.sh
./install.sh安裝腳本只需執行一次,但日後再次編譯ESP32韌體時,都要在esp-idf目錄底下執行一次source export.sh,因為這個腳本包含系統變數的設定敘述,例如,把ESP-IDF工具的所在路徑設定給IDF_PATH環境變數,將來編譯MicroPython韌體時,會透過這個變數執行ESP-IDF。
下載與編譯ESP32 MicroPython原始碼
執行底下命令,在使用者家目錄中新增一個esp32目錄,然後在其中複製、儲存MicroPython主分支(master)的原始碼:
cd ~ mkdir esp32 cd esp32 git clone -b master https://github.com/micropython/micropython.git
切換到micropython路徑,編譯交叉編譯器(cross compiler):
cd micropython make -C mpy-cross
最後,執行底下的命令複製並編譯“esp32”版本的子模組(submodules),然後建立ESP32 MicroPython韌體:
cd ports/esp32 make submodules make
編譯完成的firmware.bin韌體檔將存放在~/esp32/micropython/ports/esp32/build-GENERIC/路徑裡面。執行底下的命令將它複製到Windows的D磁碟根目錄:
cp ~/esp32/micropython/ports/esp32/build-GENERIC/firmware.bin /mnt/d/
使用Thonny Python IDE燒錄ESP32 MicroPython韌體
燒錄ESP32韌體可以使用樂鑫科技的Flash下載工具(Flash Download Tool,參閱:使用ESP32控制板(二):燒錄MicroPython韌體),本文使用Thonny Python IDE示範。
選擇Thonny主功能表的「工具→選項」,切換到「直譯器」標籤頁,從中選擇 “ESP32 (MicroPython)” 直譯器以及連接埠,然後點擊右下角的「安裝或更新韌體」:
在底下的面板中,選擇開發板的序列埠(Port)、韌體檔(firmware.bin)的路徑和檔名,“Flash mode(快閃記憶體模式)”選擇Dual I/O,並且勾選“Erase flash before installing”(安裝前先清除快閃記憶體)選項:
韌體燒錄完畢後,關閉上面的面板,EP32開發板將會重置(reset),接著在互動環境(Shell)顯示MicroPython韌體的基本訊息。
老師我照著實做後,自製的韌體會出現無法啟動wifi,以及無法使用webrepl。
韌體版本:1.16
esp-idf :4.2
使用esp-idf v4.2 & micropython 1.16 編譯自訂韌體,發生以下錯誤(使用官方韌體沒有此錯誤情形):
MicroPython v1.16-135-gaecb697c7 on 2021-08-11; ESP32 module with ESP32
Type “help()” for more information.
WebREPL is not configured, run ‘import webrepl_setup’ —-flash中有webrepl_cfg.py檔案
正在連線中
Traceback (most recent call last):
File “boot.py”, line 41, in
File “boot.py”, line 31, in do_connect
OSError: Wifi Internal Error
正在連線中
Traceback (most recent call last):
File “main.py”, line 2, in
File “tbs/tbs1fsh.py”, line 64, in
File “tbs/tbs1fsh.py”, line 42, in do_connect
OSError: Wifi Internal Error —–無法啟動Wi-Fi
MicroPython v1.16-135-gaecb697c7 on 2021-08-11; ESP32 module with ESP32
Type “help()” for more information.
根據MicroPython官方的這個說明指出,ESP32版MicroPython的WebREPL是實驗功能,所以不穩定或者某些版本無法使用是可以理解的(你可以燒錄其他版本測試看看)。
如果是為了UART序列通訊的因素而採用WebREPL,ESP32支援軟體序列埠(請參閱「ESP32 MicroPython與Python的pySerial模組進行UART序列通訊」),所以你並不需要使用WebREPL。
thanks,
jeffrey