《超圖解Python物聯網實作入門:使用ESP8266與MicroPython》附錄B,說明了編譯ESP8266開發板的MicroPython韌體與加入自製程式模組的方法。本文將介紹樹莓派(Raspberry Pi)Pico RP2040晶片的MicroPython韌體的編譯步驟。
MicroPython官網提供了預先編譯好的韌體,但有些時候你可能想要自行編譯韌體:
- 新功能嘗鮮
- 調整晶片或開發板的設置。例如,Pico板的第2個UART序列埠預設未啟用Python的互動介面(REPL),可以透過自行編譯韌體啟用。
- 加入已編譯的Python程式模組,節省主記憶體(RAM)的用量。
Python和MicroPython程式初次執行時,都會先被「編譯」成中介碼(bytecode),這個過程需要時間和記憶體空間,為了減少記憶體的使用量,我們可以事先編譯程式模組並將它加入MicroPython韌體。
本文將把自製的servo.py(伺服馬達模組)編譯到MicroPython韌體。讀者可以在《Raspberry Pi Pico微控制板(二)》貼文取得servo.py的原始碼。
編譯Pico MicroPython韌體的步驟,參考自樹莓派原廠的“Raspberry Pi Pico Python SDK”、“Getting started with Raspberry Pi Pico”以及Picotool的GitHub專案頁面,可以在Linux, macOS和Windows 10的Linux子系統上操作。筆者分別在樹莓派的Raspberry Pi 400電腦以及Windows 10測試無誤。
在Windows 10 Linux子系統中編譯Pico MicroPython韌體
在MicroPython原始碼的ports路徑,可以看到目前MicroPython.org官方支援並維護的各種微控器版本,其中的rp2代表Pico的RP2040晶片。我們將從這個GitHub網站下載MicroPython原始碼。
Windows 10系統已包含Linux子系統,只要在Microsoft Store(微軟網上商店)下載Debian, Ubuntu或其他Linux系統,即可在Windows 10中執行Linux軟體。底下是Windows Terminal(微軟推出的開放原始碼終端機)的執行畫面,它能讓使用者快速操作已安裝的Linux系統。
底下是Linux的終端機畫面,請輸入底下的命令,在使用者家目錄新建一個pico目錄,然後在其中儲存自GitHub複製的MicroPython原始碼:
cd ~ mkdir pico cd pico git clone -b master https://github.com/micropython/micropython.git
終端機操作畫面:
執行底下的命令,切換到micropython路徑並在其中下載Pico的軟體開發工具(SDK)和程式庫:
cd micropython git submodule update --init -- lib/pico-sdk lib/tinyusb
終端機操作畫面:
執行底下的命令安裝ARM處理器的C++程式碼編譯工具(gcc):
sudo apt install cmake gcc-arm-none-eabi libnewlib-arm-none-eabi build-essential~
終端機操作畫面:
在MicroPython韌體加入自製的伺服馬達程式庫
執行底下的命令編譯交叉編譯器(cross-compiler),編譯完畢後,列舉ports/rp2目錄內容,可看到存放程式模組的modules目錄:
make -C mpy-cross ls ports/rp2
終端機操作畫面:
我先在Windows管理員中,把servo.py檔存放到D磁碟的根目錄,然後在Linux終端機執行右下圖的cp(代表“copy”,複製)命令,將它複製到modules目錄裡面:
執行cp命令之前,先切換到“ports/rp2”目錄,複製完畢後,再執行ls命令,確認servo.py檔有複製到modules目錄。
cd ports/rp2 cp /mnt/d/servo.py modules/ ls modules/
終端機操作畫面:
執行make命令,開始編譯Pico MicroPython韌體:
最後執行底下的命令,把編譯好的Pico MicroPython韌體複製到D磁碟機根目錄,並改名成“pico.uf2”:
cp build/firmware.uf2 /mnt/d/pico.uf2
終端機操作畫面:
如此,你就可以參閱《Raspberry Pi Pico微控制板(一)》貼文的說明,把這個韌體燒錄到Pico板。
補充說明,如果要啟用第2個UART序列埠的REPL互動介面,請在編譯韌體之前,編輯ports/rp2路徑裡的mpconfigport.h檔,將其中的MICROPY_HW_ENABLE_UART_REPL的值改成1。
這項功能只有在「不用USB連接Pico與電腦」的場合,才用得到,例如,透過樹莓派3B+開發板的GPIO腳連接Pico板。在電腦上,我們都是透過USB連接Pico板,而Pico預設有在USB介面啟用REPL互動介面,所以上面的設置很少用,可忽略。
編譯Picotool工具軟體
Picotool是樹莓派官方提供的韌體檔案資訊檢視工具,需要先編譯才能使用。在使用者家目錄底下的pico路徑編譯picotool的完整命令如下:
cd ~/pico git clone -b master https://github.com/raspberrypi/picotool.git cd picotool sudo apt-get install libusb-1.0-0-dev mkdir build cd build export PICO_SDK_PATH=~/pico/micropython/lib/pico-sdk/ cmake ../ make
上面的指令在普通的Linux系統執行無誤,但在Windows Linux子系統中編譯時會出現底下「找不到libUSB」的錯誤訊息:
picotool cannot be built because libUSB is not found
請先在libUSB官網下載已編譯好的程式厙:
我將下載的程式庫檔案(libusb-1.0.24.7z,版本編號可能不同)解壓縮到D:\libusb路徑,然後複製include資料夾裡的 libusb.h、以及MinGW64\static的 libusb-1.0.a 到D:\libusb路徑:
回到Linux子系統的終端機視窗,輸入底下的命令,設定LIBUSB_ROOT系統變數並指定libusb路徑:
export LIBUSB_ROOT=/mnt/d/libusb
即可成功編譯picotool:
使用Picotool顯示韌體資訊
在使用者家目錄的“pico/picotool/build”路徑,執行底下的命令,顯示D磁碟的pico.uf2韌體的檔案資訊:
./picotool info -a /mnt/d/pico.uf2
終端機操作畫面如下,可看到這個韌體包含我們自製的servo(伺服馬達)程式庫模組: