Raspberry Pi Pico微控制板(三):編譯MicroPython韌體以及Picotool工具軟體

超圖解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原始碼。

MicroPython的GitHub官網

Windows 10系統已包含Linux子系統,只要在Microsoft Store(微軟網上商店)下載Debian, Ubuntu或其他Linux系統,即可在Windows 10中執行Linux軟體。底下是Windows Terminal(微軟推出的開放原始碼終端機)的執行畫面,它能讓使用者快速操作已安裝的Linux系統。

Windows Terminal

底下是Linux的終端機畫面,請輸入底下的命令,在使用者家目錄新建一個pico目錄,然後在其中儲存自GitHub複製的MicroPython原始碼:

cd ~
mkdir pico
cd pico
git clone -b master https://github.com/micropython/micropython.git

終端機操作畫面:

從Github複製MicroPython

執行底下的命令,切換到micropython路徑並在其中下載Pico的軟體開發工具(SDK)和程式庫:

cd micropython
git submodule update --init -- lib/pico-sdk lib/tinyusb

終端機操作畫面:

下載Pico SDK

執行底下的命令安裝ARM處理器的C++程式碼編譯工具(gcc):

sudo apt install cmake gcc-arm-none-eabi  libnewlib-arm-none-eabi build-essential~

終端機操作畫面:

安張GCC

在MicroPython韌體加入自製的伺服馬達程式

執行底下的命令編譯交叉編譯器(cross-compiler),編譯完畢後,列舉ports/rp2目錄內容,可看到存放程式模組的modules目錄:

make -C mpy-cross
ls ports/rp2

終端機操作畫面:

編譯交叉編譯器(cross-compiler)

我先在Windows管理員中,把servo.py檔存放到D磁碟的根目錄,然後在Linux終端機執行右下圖的cp(代表“copy”,複製)命令,將它複製到modules目錄裡面:

cp命令

執行cp命令之前,先切換到“ports/rp2”目錄,複製完畢後,再執行ls命令,確認servo.py檔有複製到modules目錄。

cd ports/rp2
cp /mnt/d/servo.py modules/
ls modules/

終端機操作畫面:

複製servo.py程式庫

執行make命令,開始編譯Pico MicroPython韌體:

開始編譯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。

啟用第2個UART序列埠的REPL互動介面

這項功能只有在「不用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官網

我將下載的程式庫檔案(libusb-1.0.24.7z,版本編號可能不同)解壓縮到D:\libusb路徑,然後複製include資料夾裡的 libusb.h、以及MinGW64\static的 libusb-1.0.a 到D:\libusb路徑:

libusb程式庫檔案

回到Linux子系統的終端機視窗,輸入底下的命令,設定LIBUSB_ROOT系統變數並指定libusb路徑:

export LIBUSB_ROOT=/mnt/d/libusb

即可成功編譯picotool:

設定LIBUSB_ROOT系統變數

使用Picotool顯示韌體資訊

在使用者家目錄的“pico/picotool/build”路徑,執行底下的命令,顯示D磁碟的pico.uf2韌體的檔案資訊:

./picotool info -a /mnt/d/pico.uf2

終端機操作畫面如下,可看到這個韌體包含我們自製的servo(伺服馬達)程式庫模組:

使用Picotool顯示韌體資訊
Posts created 470

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

Related Posts

Begin typing your search term above and press enter to search. Press ESC to cancel.

Back To Top