2021年11月28日 星期日

Raspberry Pi Pico 學習筆記 (二) : 燒錄 MicroPython 韌體

最近因為買了兩本 MicroPython 的書, 掀起了內心冷卻已久的 maker 熱, 也想起了我之前買的三片 Pico, 上回焊好針腳後就丟一邊, 這回打鐵趁熱把 MicroPython 灌進去吧! 以下測試除了參考官網資料外, 主要是按照神人筆記 "天花板隨記" 部落格的說明.  

本系列前面的相關文章參考 :


將 MicroPython 韌體燒錄到 Pico 的方式有兩種 : 
  • 使用 UF2 檔安裝 :  
    須先下載 MicroPython 的 UF2 檔, 放入 RPI-RP2 虛擬磁碟機即完成燒錄. 
  • 使用 Thonny 安裝 : 
    利用 Thonny 直譯器選單裡的安裝與更新功能進行燒錄. 
參考 Raspberry Pi Pico 的說明文件 :



1. 上傳 UF2 檔燒錄 MicroPython 韌體 :     

UF2 是微軟所制訂的一種二進制檔案格式, 可用來為 Flash 記憶體進行快速燒錄, 參考 : 


首先到 MicroPython 官網下載 Pico 的 UF2 檔 : 


點選 Releases 下最近的穩定版本, 不要下載 Nightly Builds 下的最新版 : 


然後按住 Pico 上的 BOOTSEL 鈕不放, 將 Pico 連接到 PC 的 USB 槽後再放開 : 




這時檔案總管會出現一個新的磁碟機 RPI-RP2, 裡面內建了 INDEX.HTM 與 INFO_UF2.TXT 這兩個檔案, 點擊前者會連接到 Pico 的說明文件網頁, 後者則是 UF2 的說明文件 :




不用管這兩個檔案, 直接將所下載的 MicroPython UF2 檔案複製到此 RPI-RP2 磁碟機即可, 貼上 UF2 就會馬上進行燒錄, 很快就完成了, 這時 Pico 板會重啟, RPI-RP2 磁碟機會會被卸除, 這時開啟裝置管理員可知 Pico 已連接到 COM 埠 : 




這時開啟 Putty 連線 COM 埠, 首先會進入 Raw REPL 介面, 要按 CTRL + B 才會進入 MicroPython Shell : 




Pico 板載的 LED 接在 GPIO25, 下面就用迴圈來測試 LED 閃爍 : 

MicroPython v1.17 on 2021-09-02; Raspberry Pi Pico with RP2040
Type "help()" for more information.
>>> from machine import Pin
>>> import time   
>>> LED=Pin(25, Pin.OUT)   
>>> while True:   
...     LED.value(0) 
...     time.sleep(1)   
...     LED.value(1)   
...     time.sleep(0.5)   
...
...

由於 Pico 沒有 Reset 按鈕, 終止此無限迴圈的辦法是關掉 Putty, 移除 USB 接線接回後再重新連線. 或是把 RUN 接腳 (Pin 30) 接地亦可, 參考 :




Source : Adafruit


也可以使用 Thonny 編輯器的 Shell 介面來執行 MicroPython 程式, 點選 "執行/選擇直譯器" : 



 
切到 "直譯器" 頁籤, 上面選擇 "MicroPython (Raspberry Pi Pico)", 底下選擇所連接的 COM 埠或 "自動偵測連接埠", 確認後底下應該會出現 MicroPython 命令列 :





輸入如下指令 :

MicroPython v1.17 on 2021-09-02; Raspberry Pi Pico with RP2040

Type "help()" for more information.
>>> from machine import Pin
>>> import time
>>> LED=Pin(25, Pin.OUT)
>>> while True:
    LED.toggle()
    time.sleep(1)

就可以看到板載 LED 閃爍了 : 




此處改用 Pin 物件的 toggle() 方法來使 LED 狀態 High/Low 切換, 雖然指令較精簡, 但缺點是 ON/OFF 時間相同, 無法個別調整. 


2. 使用 Thonny 燒錄 MicroPython 韌體 :  

Python 專用編輯器 Thonny 也可以直接燒錄 MicroPython 韌體 (須網路保持連線, 因 Thonny 要從官網下載 UF2 韌體檔), 以下就用 Thonny 來燒錄另外兩片空白的 Pico 吧! 

首先開啟 Thonny, 按住 Pico 的 BOOTSEL 鈕不放, 將 Pico 用 USB 連接 PC 後再放開 BOOTSEL 鈕, 跟上面一樣檔案總管會出現名稱為 RPI-RP2 的磁碟機, 但不用管它, 接下來點選 Thonny 的 "執行/選擇直譯器" : 




上面的選單選擇 "MicroPython (Raspberry Pi Pico)" : 




下面選擇 "自動偵測連接埠", 然後按右下角的 "" :




這時 Thonny 會自動找尋最新的 MicroPython 版本, 但在跳出的視窗中按 "安裝" 卻出現 "certificate verify failed: certificate has expired (_ssl.c:1091)" 的錯誤訊息 : 





完整的錯誤訊息如下 : 

Downloading 563200 bytes from https://micropython.org/resources/firmware/rp2-pico-20210902-v1.17.uf2

Traceback (most recent call last):
  File "C:\Users\User\AppData\Local\Programs\Thonny\lib\urllib\request.py", line 1350, in do_open
    encode_chunked=req.has_header('Transfer-encoding'))
  File "C:\Users\User\AppData\Local\Programs\Thonny\lib\http\client.py", line 1277, in request
    self._send_request(method, url, body, headers, encode_chunked)
  File "C:\Users\User\AppData\Local\Programs\Thonny\lib\http\client.py", line 1323, in _send_request
    self.endheaders(body, encode_chunked=encode_chunked)
  File "C:\Users\User\AppData\Local\Programs\Thonny\lib\http\client.py", line 1272, in endheaders
    self._send_output(message_body, encode_chunked=encode_chunked)
  File "C:\Users\User\AppData\Local\Programs\Thonny\lib\http\client.py", line 1032, in _send_output
    self.send(msg)
  File "C:\Users\User\AppData\Local\Programs\Thonny\lib\http\client.py", line 972, in send
    self.connect()
  File "C:\Users\User\AppData\Local\Programs\Thonny\lib\http\client.py", line 1447, in connect
    server_hostname=server_hostname)
  File "C:\Users\User\AppData\Local\Programs\Thonny\lib\ssl.py", line 423, in wrap_socket
    session=session
  File "C:\Users\User\AppData\Local\Programs\Thonny\lib\ssl.py", line 870, in _create
    self.do_handshake()
  File "C:\Users\User\AppData\Local\Programs\Thonny\lib\ssl.py", line 1139, in do_handshake
    self._sslobj.do_handshake()
ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: certificate has expired (_ssl.c:1091)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:\Users\User\AppData\Local\Programs\Thonny\lib\site-packages\thonny\plugins\micropython\uf2dialog.py", line 271, in _perform_work
    self._download_to_the_device(download_url, size, target_dir)
  File "C:\Users\User\AppData\Local\Programs\Thonny\lib\site-packages\thonny\plugins\micropython\uf2dialog.py", line 333, in _download_to_the_device
    with urlopen(req, timeout=5) as fsrc:
  File "C:\Users\User\AppData\Local\Programs\Thonny\lib\urllib\request.py", line 222, in urlopen
    return opener.open(url, data, timeout)
  File "C:\Users\User\AppData\Local\Programs\Thonny\lib\urllib\request.py", line 525, in open
    response = self._open(req, data)
  File "C:\Users\User\AppData\Local\Programs\Thonny\lib\urllib\request.py", line 543, in _open
    '_open', req)
  File "C:\Users\User\AppData\Local\Programs\Thonny\lib\urllib\request.py", line 503, in _call_chain
    result = func(*args)
  File "C:\Users\User\AppData\Local\Programs\Thonny\lib\urllib\request.py", line 1393, in https_open
    context=self._context, check_hostname=self._check_hostname)
  File "C:\Users\User\AppData\Local\Programs\Thonny\lib\urllib\request.py", line 1352, in do_open
    raise URLError(err)
urllib.error.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: certificate has expired (_ssl.c:1091)>

看起來是 SSL 認證問題, 我檢查目前使用的 Thonny 版本是 3.3.10 : 




但官網已到 3.3.13 版, 我以為是版本太舊的關係, 就先移除 Thonny, 然後下載最新的 3.3.13 來安裝, 但結果還是一樣, 所以跟 Thonny 版本無關. 後來找到下面文章才找到解決辦法 :





原來只要去下載安裝 lets-encrypt-r3.der 憑證即可 : 


點擊下載的憑證檔按確定與下一步即可完成安裝 : 








然後回到 Thonny 再次安裝韌體即可順利進行了 :






OK! 完成了. 

沒有留言:

張貼留言