返回文章列表

MicroPython嵌入式開發優勢

MicroPython 是一種根據 Python 3 的精簡程式語言,專為嵌入式系統設計,它結合了 Python 的易用性和嵌入式 C 的效率。本文探討 MicroPython 的特性、優勢以及在嵌入式開發中的應用,並深入剖析其與 C 語言的比較、社群支援以及發展歷程,同時介紹 PyBoard、micro:bit

嵌入式系統 Python

MicroPython 繼承了 Python 易學易用的特性,同時具備嵌入式系統所需的輕量級和高效能。它讓 Python 開發者能快速上手嵌入式開發,也讓嵌入式工程師能運用 Python 生態圈豐富的函式庫。MicroPython 適用於資源受限的微控制器,提供物件導向程式設計、動態特性、例外處理等功能,並針對不同硬體平台提供特定模組。相較於 C 語言,MicroPython 開發效率更高,程式碼更簡潔易維護,尤其在原型設計階段優勢顯著。它也允許與 C 語言模組混合使用,兼顧效能和開發速度。MicroPython 活躍的社群提供豐富的資源和支援,降低學習門檻,並持續推動其發展和應用,使其成為嵌入式開發的理想選擇,尤其在物聯網領域的應用日益廣泛。

為什麼選擇MicroPython?

MicroPython是一種根據Python 3的程式語言,專為嵌入式裝置設計。它結合了Python的易用性和嵌入式開發的靈活性,為開發者提供了豐富的功能和模組。

MicroPython的特點

MicroPython保留了Python的大部分特性,包括:

  • 物件導向程式設計(無元類別)
  • 資料型別(Unicode字串、整數、浮點數)和資料結構(列表、集合、字典)
  • Python物件的動態特性
  • 將函式視為第一級物件
  • 例外處理(try、except、finally和標準內建例外類別)
  • 生成器函式(使用yield關鍵字)、生成器表示式和列表推導式等功能
  • 在最新版本的MicroPython中支援async和await關鍵字
  • 大量的Python內建函式

由於MicroPython執行在不同能力的裝置上,因此功能的可用性可能會有所不同。具有特殊能力的裝置,如WiFi,會包含支援這些功能的模組。例如,micro:bit配備了簡化的標準函式庫中的random模組,而預設的ESP8266板則具有極簡的urandom模組。由於具有板載WiFi功能,ESP8266版本包含了json和urequests模組,而micro:bit版本則不包含,因為micro:bit沒有WiFi。兩款板上的MicroPython都配備了非常有用的math模組。

MicroPython的優勢

MicroPython的全面性和靈活性帶來了三個有趣的機會:

  1. 更廣泛的Python社群有機會使用他們喜愛的語言嘗試嵌入式開發。
  2. 使用C和其他傳統嵌入式語言的嵌入式開發人員有機會利用Python的易用性和豐富的函式庫。
  3. 初學者程式設計師有機會從簡單的專案開始,而不僅僅是「Hello, World!」。他們可以使用燈光、聲音、感測器和網路建立有趣的第一個專案。

作為一名沒有嵌入式經驗的Python程式設計師,作者在使用MicroPython時的體驗是令人滿意和有趣的。透過MicroPython的REPL讓LED閃爍是非常令人滿意的,而且正如這本文所展示的那樣,學習足夠多的知識來建立和發明有趣的嵌入式裝置並不需要太多的努力。

為什麼MicroPython比C更好?

對於經驗豐富的嵌入式開發人員來說,可能會問:「C有什麼問題?」其實C在某些情況下是絕對合適的語言,開發人員必須使用最合適的工具來解決問題。

然而,在許多情況下,MicroPython的效能優於C。在原型設計時,MicroPython提供了許多有用的功能,避免了繁瑣的樣板程式碼。一位C程式設計師報告說,只花了一個下午就完成了MicroPython的工作原型,而以前用C需要一個星期。有時幾行簡單的MicroPython程式碼就可以完成需要數百行C程式碼的工作,使其更易於維護。

MicroPython通常足夠快,並且能夠很好地管理有限的資源,因此使用C所獲得的速度或記憶體效率與Python的易用性和生產力相比是微不足道的。

在任何情況下,如果C是合適的工具,可以用C編寫MicroPython模組,並在Python程式碼中使用它們。甚至可以將內聯彙編器寫入MicroPython函式中。

MicroPython與社群

對於一些初學者程式設計師來說,讓電腦在螢幕上列印「Hello, World!」是一件令人興奮的事情。然而,對於大多數人來說,這只是一個「那又怎樣?」的問題。誰能怪他們呢?與可愛貓咪照片、視訊會議、虛擬現實和美麗渲染的多人線上遊戲相比,「Hello, World!」有點令人失望,尤其是當你被告知這是你邁向成為某種好萊塢級別超級駭客的第一步時。

使用嵌入式裝置或製作「被施了魔法的」物體有助於克服傳統初學者程式設計練習中通常遇到的幻滅感。編寫能夠隨需求發出粗魯聲音效果、使一系列燈光在服裝上動起來、在網路上傳送秘密訊息或成為自主機器人車輛核心的物體,比用問候語讓世界感到無聊要有趣得多。

這些機會讓Python程式設計師加入嵌入式社群,讓嵌入式開發人員加入Python社群,並讓初學者程式設計師在圍繞MicroPython發展的嵌入式Python社群中磨練技能。每個人都是贏家。

嵌入式程式設計很有趣,Python程式設計也很有趣。但是,把它們結合在一起,樂趣就會增加一倍以上!

為什麼這很重要?

因為社群是Python的秘密武器。也許比任何其他電腦社群都更重要的是,Python社群以友善、開放、推廣和投入社群努力而聞名。Python程式設計師(有時被稱為Pythonistas和/或Pythonauts)組織良好,建立了Python軟體基金會(PSF)作為社群的凝聚點。PSF成立的目的是推廣、保護和推進Python程式語言(其智慧財產權屬於PSF),並支援和促進多元化和國際性的Python程式設計師社群的發展。這是透過支援Python程式語言本身的發展,為更廣泛的Python社群提供技術基礎設施,舉辦和支援世界各地的大型國際Python會議(PyCons),以及向促進基金會目標的個人和組織提供補助來實作的。

有關Python語言、PSF、補助計劃、即將舉行的PyCons和世界各地的使用者群組的詳細資訊,請存取Python語言的官方網站。然而,如果您需要有關MicroPython的特定資訊,請存取該專案自己的網站。

MicroPython專案網站

為什麼MicroPython有自己的網站,而不是在主網站上設立一個區域?這是因為該專案有著非凡的歷史。這是一個偉大的故事,值得在此重述。

MicroPython 的誕生與發展

MicroPython 是由 Damien George 建立的。Damien 是一位澳洲物理學家,曾在劍橋大學擔任博士後研究員。他的研究興趣主要集中在使用額外維度的模型構建,以及這些模型在電弱尺度上的現象學,特別是在大型強子對撞機(LHC)上的測試。Damien 在大學時期曾學習機器人技術,並參加了 RoboCup,一項國際性的機器人足球比賽。他為這些機器人設計並編寫了一種名為 Hush 的指令碼語言,這種語言使得改變機器人的人工智慧變得非常容易。

顯然,Damien 具有好奇心、硬體技能和卓越的才能。2013 年,他開始思考是否能夠為微控制器編寫一個 Python 版本。根據他在機器人技術中的嵌入式系統經驗,以及之前從零開始編寫嵌入式 C 編譯器的經驗,他具備了獨特的資格,並開始了這項工作。幾個月後,他創造了一個可行的概念驗證版本。

為了評估人們對 MicroPython 的興趣並宣傳他的新興專案,Damien 發起了一項 Kickstarter 眾籌活動。他承諾,如果能夠籌集到 15,000 英鎊,他將完成 Python 的實作,並向那些支付 20 英鎊或以上的支援者提供一個名為 PyBoard 的微控制器裝置。這項活動是在「George Robotics Limited」的名義下進行的,這是他與妻子 Viktoriya 共同經營的公司。

眾籌的成功與 MicroPython 的成長

當眾籌活動結束時,Damien 已經籌集了近 100,000 英鎊。這個專案超出了所有人的預期,不僅達到了資金目標,Damien 還兌現了承諾:在 2014 年向近 2,000 名支援者交付了 PyBoard。

MicroPython 的程式碼以開源許可證的形式發布在 GitHub 上,來自世界各地的人們為該專案貢獻了功能、錯誤修復、檔案、工具以及將 MicroPython 移植到不同型別的微控制器上。

MicroPython 在太空應用中的發展

2015 年,歐洲太空總署(ESA)資助了 MicroPython 的開發,以評估該語言在太空應用中的適用性。特別是,研究重點是透過 Python 動態組態有效載荷(如衛星)。Damien 為使 MicroPython 更適合關鍵嵌入式系統而完成的重要工作被整合回更廣泛的專案中。

這是一個對所有人都有益的情況:MicroPython 獲得了在太空中飛行的潛力,而社群則收到了對通用 MicroPython 實作的改進。

BBC micro:bit 專案

大約在同一時間,英國廣播公司(BBC)宣佈計劃發布一種小型計算教育裝置,並將其交付給英國所有 11 歲的兒童(大約 100 萬台裝置)。Python 軟體基金會(PSF)成為合作夥伴,因為 BBC 希望將 Python 列為該裝置的首選語言之一。另一個未命名的合作夥伴原本要為 Python 建立 micro:bit 執行環境,但在 2015 年 4 月離開。

Damien 救場了。幸運的是,Damien 在劍橋的鄰居是 ARM 的硬體工程師,負責設計 micro:bit 專案的電路板。鄰居提供了一個原型板給 Damien,他開始將 MicroPython 移植到該裝置上。

一封發自 2015 年 5 月初的電子郵件證實,Damien 只花了一週時間就將 MicroPython 移植到了一個可用的狀態(經允許使用):

我註冊了 mbed,將 blinky 示例匯出到 mkit,並使用本地工具鏈在本地編譯。然後,我成功地讓 MicroPython 在 mkit 上編譯和執行!有驚人地大量的空間:我啟用了浮點數支援、任意精確度整數、大多數 Python 功能和一些內建模組。REPL 透過 USB-UART 工作,具有歷史記錄和標籤補全功能。它甚至有一個可用的 ctrl-C(意味著你可以跳出無限迴圈)。我實作了一個基本的“pyb”模組,具有 LED 和 Switch 類別,以及一個延遲函式。所以你可以做這樣的事情:

led = pyb.LED(1)
while True:
    led.toggle()
    pyb.delay(100)

程式碼解析:

上述程式碼範例展示瞭如何在 micro:bit 上使用 MicroPython 控制 LED 燈的切換。下面是詳細解析:

  1. led = pyb.LED(1):這行程式碼初始化了一個 LED 物件,引數 1 表示選擇第一個 LED 燈。在 micro:bit 上,這通常對應於板上的某個特定 LED。

  2. while True::這是一個無限迴圈,將持續執行迴圈內的程式碼,直到被中斷。

  3. led.toggle():在每次迴圈迭代中,這個方法會切換 LED 的狀態。如果 LED 當前是亮的,它將被關閉;如果它是關閉的,它將被開啟。

  4. pyb.delay(100):這個函式呼叫會暫停程式執行 100 毫秒。這樣就創造了一個簡單的閃爍效果,因為 LED 在每次迴圈迭代中都會切換狀態,並且每次切換之間有短暫的延遲。

這個範例展示了 MicroPython 如何讓使用者能夠輕鬆地與硬體互動,並且利用 Python 的簡潔語法實作複雜的功能。

MicroPython 的誕生與發展

MicroPython 是一種專為微控制器設計的 Python 實作,它讓開發者能夠使用 Python 語言來建立嵌入式應用。MicroPython 的誕生源於 Damien George 的一個 Kickstarter 專案,該專案旨在為微控制器開發一個高效、易用的 Python 環境。

MicroPython 的早期發展

Damien George 在 2013 年發起了 Kickstarter 專案,旨在籌集資金開發 MicroPython。該專案取得了巨大的成功,籌集了超過 9 萬英鎊。隨後,MicroPython 被移植到了多種微控制器上,包括 PyBoard、micro:bit 和 ESP8266/ESP32 等。

MicroPython 在不同裝置上的應用

MicroPython 不僅支援多種微控制器,還具備豐富的硬體功能。例如,micro:bit 具有簡單的無線電功能,非常適合 IoT 專案;而 Circuit Playground Express 則可以透過紅外線傳送和接收訊息。ESP8266 和 ESP32 則具備 WiFi 和藍牙功能,讓 MicroPython 成為 IoT 專案的理想選擇。

Circuit Playground Express 的特色

Circuit Playground Express 是 Adafruit Industries 開發的一款微控制器板,它執行著 Adafruit 自定義的 MicroPython 版本——CircuitPython。該裝置具備多種板載輸入輸出周邊裝置,如揚聲器、麥克風、觸控感應針腳和多色 NeoPixels 等。

ESP8266 和 ESP32 的 IoT 應用

ESP8266 和 ESP32 是兩款非常適合 IoT 專案的微控制器。它們具備 WiFi 功能,讓裝置能夠連線到網際網路。ESP32 還額外支援藍牙功能。MicroPython 被移植到這些裝置上,使得開發者能夠使用 Python 語言建立 IoT 應用。

MicroPython 的未來發展

MicroPython 的發展前景廣闊,因為它讓開發者能夠使用 Python 語言建立嵌入式應用。隨著物聯網(IoT)的發展,MicroPython 將在這個領域發揮越來越重要的作用。本文將探討 MicroPython 在不同裝置上的應用,包括 PyBoard、micro:bit、Circuit Playground Express 和 ESP8266/ESP32 等。

本文的組織結構

本文分為以下幾個部分:

  • 簡介四款微控制器板:PyBoard、micro:bit、Circuit Playground Express 和 ESP8266/ESP32 系列
  • 探索 MicroPython 在不同裝置上的應用
  • 提供實用的技巧和知識,以幫助讀者適應新的 MicroPython 裝置和版本

本文將探討 MicroPython 的原理、技術和知識,並提供實用的範例和專案,以幫助讀者掌握 MicroPython 的應用技巧。

# 以下是一個簡單的 MicroPython 範例,用於控制 LED 燈的閃爍
import machine
import time

# 初始化 LED 燈的針腳
led = machine.Pin(2, machine.Pin.OUT)

while True:
    # 開啟 LED 燈
    led.value(1)
    time.sleep(0.5)
    
    # 關閉 LED 燈
    led.value(0)
    time.sleep(0.5)

內容解密:

此範例程式碼展示瞭如何使用 MicroPython 控制 LED 燈的閃爍。首先,我們匯入了 machinetime 模組。然後,我們初始化了 LED 燈的針腳,將其設定為輸出模式。接著,我們進入一個無限迴圈,不斷地開啟和關閉 LED 燈,並使用 time.sleep 函式控制閃爍的頻率。

本範例程式碼適用於多種 MicroPython 裝置,只需根據具體裝置的針腳組態進行相應的修改即可。

@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle

title MicroPython嵌入式開發優勢

package "物聯網架構" {
    package "感知層" {
        component [感測器] as sensor
        component [執行器] as actuator
        component [嵌入式裝置] as device
    }

    package "網路層" {
        component [閘道器] as gateway
        component [MQTT Broker] as mqtt
        component [邊緣運算] as edge
    }

    package "平台層" {
        cloud "IoT Platform" as platform
        database [時序資料庫] as tsdb
        component [規則引擎] as rules
    }

    package "應用層" {
        component [監控儀表板] as dashboard
        component [告警系統] as alert
        component [數據分析] as analytics
    }
}

sensor --> device : 資料採集
device --> gateway : 資料傳輸
gateway --> mqtt : MQTT 協議
mqtt --> edge : 邊緣處理
edge --> platform : 雲端上傳
platform --> tsdb : 資料儲存
platform --> rules : 規則處理
rules --> alert : 觸發告警
tsdb --> analytics : 資料分析
analytics --> dashboard : 視覺化

@enduml

此圖示展示了 LED 燈閃爍的流程圖。從開始到初始化 LED 燈針腳,然後進入一個迴圈,不斷地開啟和關閉 LED 燈,並等待相應的時間。

PyBoard:MicroPython 的首選開發板

PyBoard 是專為 MicroPython 設計的第一款開發板,如圖 2-1 所示。它可以從 MicroPython 官方網站購買,並由 Damien 和 Viktoriya 的公司負責全球運送。

連線與互動

PyBoard 透過 micro USB 連線線與電腦相連,這種連線提供了兩種與裝置互動的方式:作為 USB 隨身碟和串列式 Python REPL。

  1. 正確的 USB 線: 使用者需要注意的是,必須使用能夠傳輸資料的 micro USB 線,而非僅供充電的線。如果板子能夠上電(可以看到 LED 燈亮起),但無法被電腦識別為 USB 隨身碟或無法連線到 REPL,很可能是使用了錯誤型別的 USB 線。

檔案系統與指令碼執行

PyBoard 內建了一個小型的檔案系統,作為其快閃記憶體的一部分。此外,它還具備一個 SD 卡插槽,用於擴充儲存空間。當你將 PyBoard 連線為 USB 隨身碟時,可以在板子的檔案系統中複製檔案。如果在板子的檔案系統中建立一個名為 main.py 的 Python 指令碼,MicroPython 將在啟動時執行該指令碼。這使得指令碼可以在無需連線電腦的情況下在板子上執行。

# main.py 示例
import pyb

# 初始化 LED
led = pyb.LED(1)

while True:
    # 閃爍 LED
    led.toggle()
    pyb.delay(500)

內容解密:

  • import pyb:匯入 PyBoard 的專用模組。
  • led = pyb.LED(1):初始化第一個 LED。
  • led.toggle():切換 LED 狀態(亮或滅)。
  • pyb.delay(500):延遲 500 毫秒。

硬體規格

PyBoard 在本文使用的開發板中效能最為強大。它搭載了 STM32F405RG 微控制器,包含 168 MHz Cortex M4 CPU、硬體浮點數運算單元、1,024 Kb 快閃 ROM 和 192 Kb RAM。除了 micro USB 插槽和 micro SD 卡插槽外,板子還具備三軸加速計、實時時鐘(可選電池備份)、兩個開關(重置和使用者自定義)以及四個 LED(紅、綠、黃和藍)。

連線周邊裝置

PyBoard 的 GPIO 引腳圍繞在板子的三個邊緣,用於連線周邊裝置和元件。除了 micro USB 插槽外,PyBoard 還可以透過 VIN 埠和 GND 使用電池或其他電源供電,輸入電壓需在 3.6 V 至 10 V 之間。需要注意的是,VIN 埠沒有極性保護,因此連線時需小心避免錯誤。

周邊裝置

PyBoard 有多種可用的周邊裝置,包括:

  • 彩色 LCD 顯示屏擴充套件板(圖 2-2):具備 160 x 128 畫素的 16 位元 LCD 螢幕、背光和電阻式觸控感應器。
  • 音訊擴充套件板(圖 2-3):內建麥克風和揚聲器,可用於錄音和播放聲音。

開發者設定

PyBoard 出廠時已預裝 MicroPython,但建議重新刷入最新版本的韌體,以確保獲得最新的錯誤修復和更新。刷機過程並不複雜,可以確保開發者使用最新的功能和修復。