張高興的 MicroPython 入門指南:(一)環境配置、Blink、部署

张高兴發表於2024-06-30

目錄
  • 什麼是 MicroPython
  • 環境配置
    • 硬體部分
    • 軟體部分
    • Hello World!
  • Blink
    • Pico 的引腳
    • 常見電子元件
      • 麵包板
      • 跳線
      • 開關
      • 發光二極體
      • 電阻
    • 使你的 Pico 閃爍
  • 部署
  • 參考

什麼是 MicroPython

MicroPython 是一個基於 Python 3.4 的高效實現,它專為微控制器和嵌入式系統設計。它提供了一個小型的 Python 環境,包含了一些標準庫的部分,並且能夠在資源受限的裝置上執行。MicroPython 支援互動式程式設計(REPL)、任意精度整數、列表解析、生成器、異常處理等高階功能,使開發者可以在邊緣裝置上編寫和執行復雜的程式。

與 MicroPython 類似的 CircuitPython,也是一種執行在微控制器上的 Python 技術。它是由一家美國設計製造開源電子硬體的公司 Adafruit 推動的,基於 MicroPython 的 Folk 版本,所以 CircuitPython 的很多內容和 MicroPython 是相似的。關鍵的區別是 CircuitPython 對 Adafruit 的開發版以及感測器的支援更好,Adafruit 基本上對推出的每一款感測器都提供了相關的 CircuitPython 包,更方便初學者以及 DIY。但 MicroPython 的社群更大,裝置支援的更廣泛。至於學習哪一項技術,也就仁者見仁,智者見智了。

環境配置

支援 MicroPython 的微控制器有很多,這裡使用 Raspberry Pi Pico。Raspberry Pi Pico 是樹莓派基金會發布的首款微控制器級產品,基於 RP2040 晶片構建,售價僅 4 美元。Pico 家族目前由 Raspberry Pi Pico(最左),Pico H(左),Pico W(右)和 Pico WH(最右)組成。

Pico 使用了一顆 RP2040 晶片:

  • 採用 40nm 工藝製造,雙核 Cortex-M0+ @ 133MHz
  • 晶片內建 264KB SRAM 和 2MB 的板載快閃記憶體
  • 30 個 GPIO 引腳,其中 4 個可用作模擬輸入
  • 2 個 UART、2 個 SPI 控制器、2 個 I2C 控制器、16 個 PWM 通道
  • 支援 UF2 的 USB 大容量儲存啟動模式,用於拖放式程式設計
  • ……

硬體部分

  1. 在 MicroPython 官網下載適用於 Pico 的 UF2 檔案:https://micropython.org/download/RPI_PICO
  2. 按住 Pico 開發板上的 BOOTSEL 按鈕,然後將 Pico 插入電腦的 USB 介面,然後鬆開 BOOTSEL 按鈕。
  3. Pico 會被識別為大容量儲存裝置。
  4. 將下載的 MicroPython UF2 檔案放入 RPI-RP2 捲上。Pico 將自動重啟,然後 MicroPython 就會開始執行。

軟體部分

MicroPython 的開發可以使用 Thonny IDE,但是作為一款開源軟體其表明了開發者的政治立場,我是比較反感的。在這裡使用 Visual Studio Code 配置一個最小開發環境。

  1. 首先下載安裝 Visual Studio Code:https://code.visualstudio.com
  2. 選擇 “擴充套件”,在 “擴充套件:商店” 的搜尋欄中輸入“RT-Thread MicroPython”,點選 “安裝”。由於 MicroPython 是執行在微控制器上的,到這裡最小開發環境就配置完成了。
  3. 如果想使用程式碼補全功能還需要 Python 環境。訪問 Python 官網,下載 Python 安裝包:https://www.python.org/downloads
  4. 在 VS Code 中安裝 Python 外掛:“Python”、“Pylance”。

在安裝完 MicroPython 外掛後,VS Code 底部會出現幾個按鈕,其中:

  1. 用於建立、開啟 MicroPython 專案。
  2. 用於連線 Pico 裝置。
  3. 用於執行 MicroPython 程式。
  4. 用於停止執行 MicroPython 程式。
  5. 用於將 MicroPython 專案下載至 Pico 裝置。

Hello World!

根據上面的步驟,新建一個 MicroPython 專案,開啟 main_example.py 檔案。

def main():
    print("Welcome to RT-Thread MicroPython!")
    
if __name__ == '__main__':
    main()

與 C、Java、C# 等編譯型語言不同,Python 是一種解釋型指令碼語言,執行時是從模組頂行開始,逐行進行翻譯執行。所以 Python 中並不需要一個統一的 main() 作為程式的入口。if __name__ == '__main__' 是一個標誌,象徵著 Java 等語言中的程式主入口。

點選“執行”按鈕後,第一個程式就在 Pico 開發板上執行了,在 Python 直譯器中可以觀察到執行結果。

當人們想到“程式設計”時,通常很自然地想到軟體。然而,程式設計不僅僅是和軟體有關,它還可以透過硬體程式設計影響現實物理世界。這也是所謂的 物理計算。顧名思義,物理計算就是用你的程式控制現實世界中的事物——硬體,而不是軟體。比如在空調上設定程式,改變可程式設計恆溫器上的溫度;或者在微波爐上選擇不同烹飪模式。這些裝置通常是由微控制器控制的。

Pico 的引腳

Pico 透過其邊緣一系列的引腳與硬體通訊。這些引腳大多是作為 通用輸入/輸出(GPIO) 引腳工作,它們可以被程式設計作為輸入或輸出,並沒有自己的固定用途。有些引腳有額外的功能和與更復雜的硬體通訊的模式,另一些則有一個固定的功能,比如供電和提供連線的功能。

Pico 的 40 個引腳被標記在板的底部,這些標籤幫助你記住編號是如何排序的。淺綠色標籤的 GPxx,就是 GPIO 引腳,大多數情況下需要對其程式設計,對外部硬體進行操作。所有引腳的用途見下面的表格。

引腳 作用 描述
3V3 3.3V 電源 Pico 的工作電壓
VSYS 2-5V 電源 可作為電源輸入引腳
VBUS 5V 電源 從 Pico 的 USB 埠獲取的 5V 電源
GND 0V 接地 接地連線
GPxx 通用輸入/輸出引腳 程式可以使用的GPIO引腳,標記為GP0-GP28
ADCx 模數轉換引腳 既可以用作模擬輸入,也可以用作數字輸入或輸出,但不能同時用作兩者
ADC_VREF 模數轉換器參考電壓 模擬輸入設定參考電壓的特殊輸入引腳
AGND 模數轉換器 0V 參考電壓 特殊的接地引腳
UARTx 串列埠協議引腳 與其他裝置進行串列埠通訊
I2Cx I2C匯流排協議引腳 與其他裝置進行 I2C 通訊
SPIx SPI 協議引腳 與其他裝置進行 SPI 通訊
RUN 啟用或禁用 Pico 其他微控制器可以透過此引腳控制 Pico,拉低用於復位

常見電子元件

麵包板

麵包板(Breadboard)是搭建基礎電路原型的試驗產品。最初人們都是在類似於切面包的木板上做電路搭接試驗,隨著技術發展直到 1970 年無需焊接的插接板變得普及,麵包板慢慢的變成了這種便捷電路原型實驗產品的統稱。麵包板上下區是橫向5位相通,一般用於接電源和接地,中間區域是縱向5位相通,通常用於放置電路元件和電路連線線。

跳線

跳線(Jumper Wire),也被稱為杜邦線。有三種不同的型別:公對母線(M2F)、母對母線(F2F)以及公對公線(M2M)。如果不使用麵包板,可以使用 F2F 將元件連線到 Pico,如果使用麵包板,可以將元件插入到麵包板中,使用 M2M 進行連線。

開關

開關(Switch),也稱為瞬時開關、輕觸開關,通常有兩條或四條腳可供選擇,按下按鈕時相當於導線被連通。按鈕是一種輸入裝置,可以告訴程式它是否被按下,然後執行任務。另一種常見的開關型別是鎖定開關,按下開關時一直保持活動狀態,直到再次切換它。

發光二極體

發光二極體(LED)是輸出裝置,從洗衣機、微波爐等小家電的指示燈,到路邊的路燈、房間的吊燈等,LED 燈隨處可見。LED 有各種各樣的形狀、顏色、工作電壓,為了防止其被擊穿,通常會配合限流電阻使用。二極體具有單向導電性,只有在連線正確的電極方向時,才能正常工作。LED 的長端為陽極,接在電源正極,短端為陰極,接在電源負極。

電阻

電阻是控制電流流動的元件,使用歐姆 Ω 為單位,歐姆的值越大,提供的阻力就越大。

有些電阻的表面塗有一些帶有顏色的環狀標誌,稱為色環電阻。色環具有特殊的意義,即電阻的值。要讀取電阻的值,從左側第一個環開始,在表的 1st/2nd Band 列中查詢它的顏色,得到第一個和第二個數字。例如下圖電阻有兩個橙色色環,橙色值為 3,總共為 33。第三個色環的顏色表示乘數,即需要用前兩個色環得到的數乘以乘數才能得到電阻的實際值。例如下圖電阻的棕色色環,意思是 ×10。前兩個色環是 33,棕色色環是 x10,33x10=330Ω 這樣就得到了電阻的值。最後一個環是電阻的容差,表示實際阻值與標稱阻值之間的偏離程度,對於大多數業餘專案來說,容差並不是很重要。

使你的 Pico 閃爍

就像在螢幕上列印“Hello, World!”是學習程式語言的第一步一樣,在電路板上透過程式設計點亮 LED 燈是學習物理計算的經典入門方式。Blink 譯為“眨眼、閃爍”,下面透過程式設計使 Pico 開發板上的 LED 燈不斷閃爍,模擬“眨眼”的效果。

Pico 上的這顆 LED 連線到 GPIO 引腳之一的 GP25,正因為這個引腳已經用於在板上連線 LED,所以 Pico 邊緣引出的 GPIO 引腳上就沒有 GP25 了。這個 LED 的工作原理和其它任何 LED 一樣:

  • 通電時,它會發光
  • 當它斷電時,熄滅。

下面新建一個 MicroPython 專案來控制這顆 LED 的閃爍。首先匯入 machine 包。

import machine

這很短的一行程式碼對於在 Pico 上使用 MicroPython 是非常關鍵的,它包含了 MicroPython 與 Pico 通訊所需的所有指令,擴充套件了用於物理計算的語言。如果沒有這一行命令,我們是無法控制 Pico 的任何 GPIO 引腳,自然也無法使板載的 LED 點亮。

接著使用 Pin() 函式獲取引腳。

led = machine.Pin(25, machine.Pin.OUT)

這一行定義了一個名為 led 的物件,呼叫 machine 庫中的 Pin() 函式,這個函式是專為處理 GPIO 引腳。第一個引數25,是我們要設定的引腳的編號; 第二個 machine.Pin.Out 是告訴 Pico 引腳應該用作輸出而不是輸入。

💡 提示

也可以在程式碼中使用字串常量 'LED' 特指與板載 LED 相連的引腳:led = machine.Pin('LED', machine.Pin.OUT)

上面的程式碼只是完成了引腳的設定,但還不能點亮LED,要點亮LED,還需要透過程式告訴 Pico 把引腳開啟。

led.value(1)

前面的行建立了物件 led,作為 GP25 引腳上的輸出,這一行將該物件的值設定為 1(二進位制中的高電平),用於'on',它也可以將值設定為 0,用於'off'。

led.value(0)

如何才能讓 LED 閃爍起來呢?我們可以在 LED 的開與關之間加入一點延時。像匯入 machine 庫一樣,將 utime 庫匯入到程式中。

import utime

這個庫處理與時間有關的所有事情。在開啟 LED 的程式碼後面新增一段延時,呼叫 utime 庫中的 sleep() 函式,這將使程式暫停輸入的秒數,這裡暫停 1s

utime.sleep(1)

建立一個迴圈後,就可以讓 LED 閃爍了。

import machine
import utime

def main():
    led = machine.Pin(25, machine.Pin.OUT)
    
    while True:
        led.value(1)
        utime.sleep(1)
        led.value(0)
        utime.sleep(1)
    
if __name__ == '__main__':
    main()

💡 提示

也可以使用 toggle() 函式把引腳當作開關一樣對待:led.toggle()

部署

上面的程式都是執行在 REPL 環境中,當斷電重置 Pico 時,程式會消失。怎樣才能將程式持久化到 Pico 中呢?在新建 MicroPython 專案時,預設提供了一個檔名為 main_example.py 的檔案,通常會在這個檔案裡編寫程式碼,進行除錯。當程式碼可以燒錄時,將檔案重新命名為 main.py,點選“同步”按鈕,或者右擊想要下載到 Pico 中的檔案或資料夾點選“下載該檔案/資料夾到裝置上”,下載完成後斷電重啟,這樣 Pico 就會執行 main.py 中的程式碼。

有些時候可能會將問題程式碼固化到 Pico 中,這時可以燒錄重置 Flash 的 UF2 flash_nuke.uf2 清空 Flash,重置完成後還需要重新燒錄 MicroPython 的 UF2,下載地址:https://datasheets.raspberrypi.com/soft/flash_nuke.uf2

參考

  1. Raspberry Pi Documentation:https://www.raspberrypi.com/documentation/microcontrollers/micropython.html
  2. Getting started with Raspberry Pi Pico:https://projects.raspberrypi.org/en/projects/getting-started-with-the-pico
  3. 樹莓派 Pico 實驗室:https://pico.nxez.com

相關文章