初玩 CircuitPython:給微控制器的「另一種」MicroPython — — 使用 Adafruit Metro M4、Arduino Nano-33 IoT 及 Seeeduino XIAO

CircuitPython:給 SAMD21/51 及 nRF52 處理器的 Python

UF2 bootloader:拖拉檔案就能上傳程式到開發板的神奇科技

如果說 CircuitPython 是另一個版本的 MicroPython,那聽起來可能沒什麼好稀奇的。問題就在於,CircuitPython 有個秘密武器 — — UF2 (USB Flashing Format) bootloader。(bootloader 簡單地說,就是安裝在開發板上、用來將使用者程式燒錄到板子的程式。)

micro:bit 的雙處理器架構
Photo by Darius Soodmand on Unsplash

安裝或更新 CircuitPython 韌體

Adafruit Metro M4

實際看到的會因你的版本及你放的檔案而有所不同
Adafruit CircuitPython 5.3.1 on 2020–07–13; Adafruit Metro M4 Express with samd51j19
UF2 Bootloader v3.10.0 SFHWRO
Model: Metro M4 Express
Board-ID: SAMD51J19A-Metro-v0

Arduino Nano 33 IoT

  1. 尋找並下載 update-bootloader-nano33iot-v3.10.0.ino
UF2 Bootloader v3.10.0 SFHWRO
Model: Arduino NANO 33 IoT
Board-ID: SAMD21G18A-NANO-33
Adafruit CircuitPython 5.3.1 on 2020-07-13; Arduino Nano 33 IoT with samd21g18

Seeeduino XIAO

當然 Seeeduino 的點子也許不是新的,因為 2017 年就有出現這塊 Nerdonic Atom X1,同樣是超小型的 SAMD21 開發板,有 reset 鈕但腳位較少。
UF2 Bootloader v3.7.0-33-g90ff611-dirty SFHWRO
Model: Seeeduino XIAO
Board-ID: SAMD21G18A-XIAO-v0
Adafruit CircuitPython 5.3.1 on 2020-07-13; Seeeduino XIAO with samd21g18
Photo by Petri Heiskanen on Unsplash

撰寫 CircuitPython 程式

下載並設定 Thonny IDE 編輯器

下載 Thonny IDE,這是個簡單易用的 Python 編輯器,自身帶有 Python 3.7 環境(3.2.7 版),而且也支援 ESP 家族 MicroPython、micro:bit 版 micro:bit 和 CircuitPython。

>>> help('modules')__main__          digitalio         pulseio           sys
analogio gc random time
array math rotaryio touchio
board microcontroller rtc usb_hid
builtins micropython storage usb_midi
busio neopixel_write struct
collections os supervisor
Plus any modules on the filesystem

最基本的 LED 閃爍程式

在上面的編輯器畫面新增一個 .py 檔案,然後輸入

import board, digitalio, timeled = digitalio.DigitalInOut(board.D13)
led.direction = digitalio.Direction.OUTPUT
while True:
led.value = not led.value
time.sleep(1)

按鈕和 LED 燈

現在加入一個按鈕(D10 並啟用上拉電阻)和一個實體 LED 燈(D9)。注意一下 Gnd 腳位在哪:

import board, digitalio, timeled = digitalio.DigitalInOut(board.D9)
led.direction = digitalio.Direction.OUTPUT
switch = digitalio.DigitalInOut(board.D10)
switch.direction = digitalio.Direction.INPUT
switch.pull = digitalio.Pull.UP
while True:
led.value = not switch.value
time.sleep(0.05)

類比輸出入

下面的程式是讀取類比信號(接在 A7 的光敏電阻)來控制一顆外部 LED 燈(A0)的亮度。

import board, analogio, timeanalog_in = analogio.AnalogIn(board.A7)
analog_out = analogio.AnalogOut(board.A0)
while True:
print(analog_in.value)
analog_out.value = analog_in.value
time.sleep(0.05)

PWM

若要用 A0 以外的腳位輸出類比信號,就得用 PWM(Pulse Width Modulation)了,PWM 的 duty cycle 同樣可設為 0~65535 之間的值:

import board, analogio, pulseio, timeanalog_in = analogio.AnalogIn(board.A7)
pwm = pulseio.PWMOut(board.D2, frequency=5000, duty_cycle=0)
while True:
print(analog_in.value)
pwm.duty_cycle = analog_in.value
time.sleep(0.05)

儲存程式到開發板

想把 Python 草稿碼上傳到板子上也很簡單:把你剛才編輯的檔案另存成 code.py,貼上到板子的磁碟區根目錄下。以後開發板通電時,它就會自動執行 code.py 的內容。(這就像 MicroPython 會自動執行板子上的 main.py。)

Photo by Mae Mu on Unsplash

結語

本文我們講到什麼是 CircuitPython(當然,我們沒討論 Python 基礎知識),以及如何在一些開發板上使用 CircuitPython。

Photo by Yuiizaa September on Unsplash

Former translator, after-hours Maker, sunny-day analog film shooter. Currently a junior tech-book editor based in Taiwan. https://krantasblog.blogspot.com

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store