返回文章列表

MicroPython 嵌入式開發板實戰

本文深入淺出地介紹如何使用 MicroPython 開發嵌入式系統,涵蓋 PyBoard、BBC micro:bit 和 Adafruit Circuit Playground Express 等熱門開發板,從韌體更新、REPL 操作到程式碼範例,帶領讀者逐步掌握嵌入式開發的精髓。

嵌入式系統 Python

MicroPython 作為 Python 3 的精簡高效能實作,特別適用於微控制器和嵌入式系統。本文將引導讀者設定 PyBoard、BBC micro:bit 和 Adafruit Circuit Playground Express 等開發板的開發環境,並提供實用的程式碼範例。從硬體連線、韌體更新到 REPL 互動,循序漸進地說明 MicroPython 的應用,讓讀者快速上手嵌入式開發。文章涵蓋了不同開發板的特性和差異,例如 PyBoard 的檔案系統操作、micro:bit 的 LED 矩陣控制以及 Circuit Playground Express 的豐富感測器應用,並提供程式碼範例和解析,幫助讀者理解 MicroPython 在嵌入式系統中的實際應用。

PyBoard 開發環境設定

硬體需求與韌體更新

首先,您需要準備一條適合的導線來連線 DFU(Device Firmware Update)針腳與 3.3V 針腳。這些針腳在 PyBoard 的背面有標示,在正面也可以透過圖片(如圖 2-4 所示)辨識。

圖 2-4:PyBoard 正面的 DFU 和 3.3V 針腳

要更新 PyBoard 的韌體,您需要下載最新的 MicroPython 韌體。下載完成後,請斷開 PyBoard 與所有裝置的連線,並使用一條公對公的跳線將 DFU 針腳與 3.3V 針腳連線。

更新韌體

更新 PyBoard 的韌體需要使用 DFU 工具。有兩個可用的選項:dfu-utilpydfu。您可以根據自己的作業系統從 dfu-util 專案的網站下載安裝說明,或從 MicroPython 的 GitHub 儲存函式庫下載 pydfu 指令碼。

  1. 安裝 DFU 工具

    • dfu-util 的安裝說明可參考其官方網站。
    • pydfu 可從 MicroPython 的 GitHub 儲存函式庫下載,並依賴 libusbpyusb
  2. 更新韌體

    • 使用 dfu-util 更新韌體:
      $ sudo dfu-util --alt 0 -D firmware.dfu
      
      請將 firmware.dfu 替換為您從 MicroPython 官網下載的最新韌體檔案。
    • 使用 pydfu 更新韌體:
      $ sudo python pydfu.py -u firmware.dfu
      

連線 PyBoard 與電腦

更新完韌體後,請斷開 PyBoard 與電腦的連線,並移除 DFU 和 3.3V 針腳之間的跳線。重新連線後,PyBoard 將顯示為一個可移除的 USB 磁碟,內含四個檔案:boot.pymain.pyREADME.txtpybcdc.inf

  • boot.py:在裝置啟動時執行,設定各種組態選項。
  • main.py:包含您的主要程式碼,在 boot.py 之後執行。
  • README.txt:包含有關 PyBoard 的基本資訊。
  • pybcdc.inf:Windows 驅動程式,用於設定 USB 序列連線。

編寫第一個 MicroPython 程式

  1. 開啟 main.py 檔案,並將原有的程式碼註解替換為以下程式碼:

    import pyb
    pyb.LED(4).on()
    

    這段程式碼會開啟 PyBoard 上的藍色 LED(LED 4)。

  2. 儲存並關閉 main.py,然後離開(或解除安裝)USB 磁碟。

  3. 按下 PyBoard 上微型 USB 連線埠下方的 RST 按鈕以重置板子。藍色 LED 應該會亮起。

連線 REPL

要與 PyBoard 互動,您需要透過 REPL(Read-Eval-Print Loop)連線到板子。

  • 在 Windows 上: 使用 putty.exe 連線到板子。您需要使用裝置管理員來找出 PyBoard 所連線的 COM 連線埠。

  • 在 macOS 和 Linux 上: 您可以使用 picocomscreen 命令來連線 REPL。

    • 使用 picocom
      $ picocom --baud=115200 /dev/tty.usbmodem*
      
      $ picocom --baud=115200 /dev/ttyACM0
      
    • 使用 screen
      $ screen /dev/tty.usbmodem* 115200
      
      要離開 screen,請輸入 CTRL-A CTRL-\

REPL 操作範例

>>> print("Hello, World!")
Hello, World!
>>> 1 + 1
2
>>> 7 / 5
1.4
>>> "hello".upper()
'HELLO'
>>> import pyb
>>> pyb.LED(1).on()
>>> pyb.LED(1).off()
>>> while True:
...     pyb.LED(1).toggle()
...     pyb.delay(500)
...

請記得使用 CTRL-C 中斷無限迴圈。

BBC micro:bit:開啟數位創意的關鍵

BBC micro:bit 是一款專為初學者設計的簡易而強大的運算裝置。它體積小巧、價格親民且易於使用。英國廣播公司(BBC)推出這款裝置的目的是為了促進數位創意,培養人們使用電腦創造有趣事物的技能和信心。

歷史脈絡與啟發

事實上,BBC 並非第一次為初學者開發運算裝置。在 1980 年代,我曾經在 8 位元的 BBC 微電腦上學習程式設計(見圖 3-1)。每個英國學校都配備了一台這樣的電腦,而我的父親恰好是一位校長。

某個週末,他帶回了幾個大箱子,裡面裝著顯示器、電腦、連線線和各種手冊。他的本意是學習如何在學校裡使用這台電腦。然而,不到半個小時,我和弟弟就接管了這台裝置(當時我才八歲)。

與現代電腦相比,這台 BBC 微電腦並不特別強大,也不太易用。當你開啟它的電源時,它會發出「嘀嘀」的聲音,並顯示一個閃爍的游標。對於當時的我來說,它就像在挑戰我輸入一些東西。

我記得自己第一次與電腦互動時,輸入了「HELLO」,按下 ENTER 鍵,然後得到了「Mistake」的結果。

我完全不知道為什麼電腦會認為我犯了錯誤,但我記得當時感到非常興奮,因為電腦居然對我輸入的內容做出了反應。後來我才知道,原來我犯了一個語法錯誤:電腦無法理解我的指令。我很快就學到了,電腦並不懂英文。

然而,BBC 微電腦能夠理解一種簡單的程式語言,叫做 BBC BASIC。這是一種友好的語言,因為許多讓電腦執行有趣任務的指令都是英文單詞。此外,BASIC 中的所有指令都寫在編號的行上,所以你清楚地知道自己在程式中的位置,以及指令執行的順序。

以下是我當初寫的第一個 BASIC 程式。你能猜出它是做什麼的嗎?

10 CLS
20 PRINT "YOU ARE AN IDIOT"
30 GOTO 20

內容解密:

  • 10 CLS:清除螢幕上的內容,讓畫面變乾淨。
  • 20 PRINT "YOU ARE AN IDIOT":在螢幕上顯示「YOU ARE AN IDIOT」這段文字。
  • 30 GOTO 20:跳回第 20 行繼續執行,形成無限迴圈,不斷顯示「YOU ARE AN IDIOT」。

這讓我覺得自己像是在施展一種特殊的魔法,讓電腦按照我的意願運作。我只需要想出正確的「咒語」或「法術」。

BBC micro:bit 的硬體設計

BBC micro:bit 的大小約如信用卡,內含多種標示清晰的硬體元件。

裝置正面有兩個按鈕,分別標示為 A 和 B。按鈕之間是一個 5x5 的 LED 矩陣,可作為簡單的顯示螢幕(見圖 3-2)。這些 LED 可以以九種不同的亮度發出紅光。

裝置底部的邊緣聯結器用於將裝置連線到其他裝置。這就是通用輸入/輸出(GPIO),它允許裝置接收來自其他元件的輸入,或向其他元件輸出訊號。

邊緣聯結器由多個稱為「針腳」(pins)的連線點組成。這些針腳之所以被稱為「pin」,是因為許多其他型別的裝置上的 GPIO 硬體介面通常是實際的針腳,而非邊緣聯結器。其中一些針腳較寬,可以標示名稱,並可夾上鱷魚夾。其他的針腳最好透過將裝置插入連線到麵包板(一個可以輕鬆放置和重新排列電子元件的裝置)的女性邊緣聯結器來存取。

整個佈局看起來像一張臉。兩個按鈕像是眼睛,LED 矩陣像是鼻子,而邊緣聯結器則像是牙齒。這種擬人化的設計讓裝置看起來很有趣,即使在關閉狀態下也頗具吸引力。

裝置背面揭示了各種標示清晰的元件,這些元件使裝置運作(見圖 3-3)。

邊緣聯結器(標示為 PINS)在背面繼續延伸。在它上方和左側分別是裝置的針(NXP/Freescale MAG3110 三軸磁力計感測器)和加速度計(NXP/Freescale MMA8652)。這些感測器使裝置能夠判斷其指向的方向、在空間中的方位,並檢測諸如搖晃或翻轉等手勢。

在這些感測器上方是裝置的微控制器「大腦」。它是一個 32 位元的 Nordic nRF51822 ARM Cortex-M0 處理器,執行頻率為 16 MHz,擁有 256 KB 的快閃記憶體、16 KB 的 RAM,以及支援藍牙低能耗(BLE)網路的 2.4 GHz 無線電模組。無線電的天線就在微處理器的上方(看起來像城堡上的垛口圖案)。

為何 BBC micro:bit 能夠激發新一代程式設計師?

BBC micro:bit 不僅是一款裝置,也代表著一種理念。正如當年長官 BBC 微電腦開發團隊的人所說:

我們的目標是讓運算變得民主化。我們不希望人們被電腦控制,而是希望人們能夠控制它。 — David Allen,BBC 電腦識讀計畫專案編輯

如果沒有深刻體會到自己能夠讓電腦做出有趣的事情,我就不會成為今天的程式設計師。BBC micro:bit 繼承了這種精神,並且在現代技術的基礎上進一步發展,為新一代的初學者提供了更便捷、更具創意的學習工具。

BBC micro:bit 開發者設定

BBC micro:bit 是一款專為教育設計的微控制器板,具備多種硬體功能,包括 LED 顯示矩陣、按鈕、加速度計、針等。其硬體設計完全開放,軟體方面同樣遵循開放原始碼的原則。

硬體特性與開放性

micro:bit 的硬體設計具有高度的開放性,其電路圖完全公開,並採用寬鬆的開放原始碼授權。這意味著任何人都可以自由地使用、修改甚至製造該裝置。

  • 微型 USB 連線埠:裝置頂部設有一個微型 USB 連線埠,用於連線電腦進行程式燒錄和電源供應。
  • 重置按鈕:USB 連線埠右側設有重置按鈕,用於重新啟動裝置。
  • 電池連線埠:裝置右上角設有電池連線埠,可連線電池供電。

值得注意的是,micro:bit 的藍牙功能在 MicroPython 中未被支援,因為相關軟體需要佔用大量的快閃記憶體和 RAM。然而,MicroPython 提供了一個簡易的無線模組,使裝置間能夠進行簡單的無線通訊。

開發環境設定

將 micro:bit 連線到電腦後,它會顯示為一個 USB 磁碟機。與 PyBoard 類別似,也可以連線到 MicroPython 的 REPL 環境。

燒錄程式到 micro:bit

與 PyBoard 不同的是,micro:bit 通常需要將 MicroPython 執行環境和使用者程式碼合併成一個 hex 檔案,然後將該檔案燒錄到裝置上。這個過程是透過將 hex 檔案複製到 USB 磁碟機來完成的。燒錄後,裝置會重新啟動,並還原成一個相對空的 USB 磁碟機。

# 以下是一個簡單的範例程式,用於展示如何讓 micro:bit 的 LED 矩陣顯示一個笑臉
from microbit import *

# 無窮迴圈
while True:
    # 顯示笑臉圖案
    display.show(Image.HAPPY)
    # 等待 2 秒
    sleep(2000)
    # 清除顯示
    display.clear()
    # 等待 1 秒
    sleep(1000)

程式碼解析:

  1. from microbit import *:匯入 micro:bit 模組的所有功能。
  2. while True::建立一個無窮迴圈,不斷執行迴圈內的程式碼。
  3. display.show(Image.HAPPY):在 LED 矩陣上顯示一個預定義的笑臉圖案。
  4. sleep(2000):暫停程式執行 2 秒,讓圖案保持顯示。
  5. display.clear():清除 LED 矩陣的顯示內容。
  6. sleep(1000):暫停程式執行 1 秒,然後再次進入迴圈。

使用檔案系統

micro:bit 內建了一個小型的檔案系統(約 20kB),儲存在快閃記憶體中。每次燒錄新的 hex 檔案時,這個檔案系統會被清空。然而,如果只燒錄 MicroPython 執行環境(不包含使用者程式碼),則可以手動複製 main.py 到裝置中,MicroPython 會在啟動時自動執行該檔案。

瀏覽器編輯器與 Mu 編輯器

開發者可以使用瀏覽器編輯器或 Mu 編輯器來撰寫和燒錄程式到 micro:bit。瀏覽器編輯器的使用方式是下載 hex 檔案後拖曳到 micro:bit 的 USB 磁碟機中。

Mu 編輯器則提供了一個更友善的開發環境,支援 Windows、macOS、Linux 和 Raspberry Pi 等多種作業系統。使用者只需按下「燒錄」按鈕即可將程式碼燒錄到 micro:bit,並且可以直接存取 REPL 環境和檔案系統。

Mu 編輯器的設計理念

Mu 編輯器遵循極簡主義哲學:

  • Less is more. 只保留最基本的功能,避免介面過於複雜。
  • Keep it simple. 簡單易學,降低新手使用門檻。
  • Walk the path of least resistance. 提供唯一的最佳實踐路徑,簡化操作流程。
  • Have fun. 讓學習過程變得有趣,能夠快速建立並測試程式碼。

綜上所述,BBC micro:bit 提供了一個強大且靈活的開發平台,無論是對於初學者還是有經驗的開發者,都能夠滿足不同的需求。透過 MicroPython 和相關開發工具,可以輕鬆地進行各種創意專案開發。

Adafruit Circuit Playground Express:探索嵌入式開發的新世界

Adafruit的Circuit Playground Express是一款功能強大的嵌入式開發板,讓Python程式設計師能夠輕鬆地探索嵌入式開發的世界。這款開發板具備多種感測器和反饋模式,讓使用者能夠快速學習嵌入式開發的基礎知識。

Circuit Playground Express 的特色

Circuit Playground Express 讓使用者能夠像科幻小說中的角色一樣,使用先進的技術來探索世界。它具備多種感測器和輸出裝置,例如LED燈、喇叭和加速度計,讓使用者能夠創造出各種有趣的專案。

使用 MicroPython 進行開發

與BBC micro:bit類別似,Circuit Playground Express也支援MicroPython,讓使用者能夠使用Python語言進行開發。使用者可以使用Mu編輯器或其他Python編輯器來編寫和上傳程式碼到開發板上。

REPL 和偵錯

使用者可以使用REPL(Read-Eval-Print Loop)來與開發板互動,偵錯和測試程式碼。Mu編輯器提供了REPL功能,讓使用者能夠輕鬆地與開發板互動。

開始使用 Circuit Playground Express

要開始使用Circuit Playground Express,使用者需要先安裝必要的工具和程式函式庫。首先,需要安裝uf2工具,用於將程式碼上傳到開發板上。接著,使用者可以使用Mu編輯器或其他Python編輯器來編寫和上傳程式碼。

安裝 uf2 工具

$ pip install uf2

使用 Mu 編輯器上傳程式碼

使用者可以使用Mu編輯器來編寫和上傳程式碼到開發板上。首先,需要將開發板連線到電腦,然後在Mu編輯器中選擇正確的開發板。接著,使用者可以編寫程式碼並上傳到開發板上。

範例程式碼

import time
from adafruit_circuitplayground.express import cpx

while True:
    cpx.red_led = True
    time.sleep(0.5)
    cpx.red_led = False
    time.sleep(0.5)

程式碼解析:

此範例程式碼使用了 adafruit_circuitplayground.express 模組來控制 Circuit Playground Express 開發板上的紅色LED燈。程式碼中,首先匯入了 time 模組和 cpx 物件。接著,使用無窮迴圈來控制LED燈的閃爍。在迴圈中,LED燈被開啟和關閉,每次持續0.5秒。

Adafruit Circuit Playground Express 硬體與開發環境介紹

Adafruit Circuit Playground Express 是一款功能豐富的開發板,具備多種輸入(感測)和輸出(訊號)功能。與前述開發板相同,使用者可透過兩種方式與裝置互動:儲存在板載快閃記憶體檔案系統中的程式碼和 REPL(互動式直譯器)。

連線與互動方式

當透過 micro USB 線將裝置連線到電腦時,裝置會顯示為一個快閃記憶體儲存裝置,並且可以像 PyBoard 和 micro:bit 一樣存取 REPL。

硬體規格與特色

市面上有兩種版本的 Circuit Playground Express:舊版使用 ATmega32u4 微處理器,不支援 MicroPython;新版則使用 ATSAMD21G18 ARM Cortex M0 微處理器,是本文所使用的版本。

主要元件與功能

  • 緣邊的 14 個焊墊便於使用鰐魚夾連線其他裝置,其中部分焊墊具備電容式觸控感應功能。
  • 電源連線埠可接受 3.5V 至 6.5V 的直流電壓,並自動調節至 3.3V,適合使用 3 x AAA 電池盒或其他電池方案。
  • 10 個 NeoPixel LED 位於焊墊內側,可獨立設定 RGB 顏色,用於狀態指示或視覺回饋。
  • 三個按鈕(A、B 和 RESET)提供使用者輸入功能,其中 A 和 B 按鈕可用於任意開/關互動。
  • 位於電池連線埠上方的滑動開關可用於保持狀態的開/關輸入。
  • 紅外線發射器和接收器位於重置按鈕兩側,允許裝置之間進行紅外線通訊。
  • 各類別環境感測器包括:
    • 位於按鈕 A 上方的類別比光感測器,用於測量環境光亮度。
    • 按鈕 B 上方的熱敏電阻,用於測量環境溫度。
    • 重置按鈕下方的三軸加速計,可測量 X、Y 和 Z 軸的重力加速度,用於偵測傾斜、運動和手勢。
    • 按鈕 B 下方的麥克風,用於檢測音訊訊號。
  • 按鈕 A 下方的小型揚聲器可用於輸出簡單的聲音或旋律。

微控制器規格

ATSAMD21G18 微控制器運作頻率為 48 MHz,具備 256 KB 的板載快閃記憶體和 32 KB 的 RAM,並額外提供 2 MB 的快閃記憶體儲存空間。

開發環境:CircuitPython

Adafruit 使用名為 CircuitPython 的 MicroPython 分支作為開發環境。CircuitPython 是一個開放原始碼專案,歡迎社群貢獻,並且會跟蹤 MicroPython 的主要版本更新。雖然目前仍標示為「測試版」,但大多數 API 已趨於穩定。

安裝與更新 CircuitPython

Circuit Playground Express 可能未預先安裝 CircuitPython,因此建議更新至最新版本的韌體以取得最新的錯誤修復和功能。更新過程非常簡單,透過 UF2 引導程式,只需將裝置置於引導模式,然後將 .uf2 檔案拖曳至裝置即可。

  1. 將裝置連線到電腦,並雙擊重置按鈕以進入引導模式。裝置會顯示為名為 CPLAYBOOT 的 USB 大容量儲存裝置。
  2. 從 GitHub 下載最新的 CircuitPython UF2 版本至裝置。

透過使用 CircuitPython,開發者可以確保在 Adafruit 各類別開發板上保持 API 的一致性,從而輕鬆將技能和知識轉移至其他支援 CircuitPython 的 Adafruit 裝置。

#### CircuitPython 的主要優勢

  • 確保跨 Adafruit 開發板的一致性
  • 穩定的 API(儘管專案仍在持續開發中)
  • 簡化的開發體驗,特別是在 Adafruit 生態系統內