Trinket M0(以下簡稱M0板)是美國電子零組件供應商Adafruit Industries推出的微型控制板,採用32位元的ATSAMD21E18 (Cortex M0+) 微控器,MCU本身的工作電壓介於1.62~3.63V。M0板的開發程式語言∕工具包括Arduino IDE、CircuitPython和微軟MakeCode(JavaScript語言),但控制板出貨時預先內建的是CircuitPython。
位於紐約的Adafruit,擁有非常熱血的Maker(自造者)靈魂,該公司研發生產的各種控制板、感應器模組和微電腦板,軟硬體全部都開源,他們也開發眾多被Arduino玩家廣泛使用的程式庫,像OLED顯示器、16路伺服馬達I2C驅動程式和其他感應器的程式庫。近年來,他們的研發資源多挹注在32位元微控制板和CircuitPython。
CircuitPython簡介
CircuitPython是一種在微控器運行的Python 3語言環境,由Adafruit公司維護並開放原始碼。CircuitPython其實是從另一個也是在微控器上執行的MicroPython移植過來的,Adafruit官網的這篇文章提到,CircuitPython和MicroPython有98%相同,解譯器核心也相同,只是有些程式庫的命名與結構不同。
MicroPython把硬體相關的指令都歸納在machine程式庫(參閱《超圖解 Python 物聯網實作入門》,3-5頁),CircuitPython則是依照硬體類型把指令歸納到不同套件:
- audioio:聲音I/O
- analogio:類比I/O
- busio:匯流排I/O
- digitalio:數位I/O
- pulseio:時脈I/O
- touchio:觸控I/O
- microcontroller:微控制器
- board:控制板
- bitbangio:Bit Banging I/O,純軟體模擬I2C或SPI介面通訊訊號,目前僅支援SAMD21系列和ESP8266。
SAMD21系列處理器微控板的CircuitPython沒有machine程式庫。
此外,為了跟電腦版Python 3區別,MicroPython的一些程式庫名稱前面會加上‘u’,如電腦版的os和request,在MicroPython改名成uos和urequest;CircuitPython沒有改名,沿用電腦版的程式庫命名。
CircuitPython也有新增API指令,例如處理儲存媒介的storage模組,完整的API指令說明,可查閱Adafruit CircuitPython線上文件。
把M0相容控制板插入電腦USB埠充電,M0板將以USB隨身碟的型式呈現。Mac和Linux系統無須安裝驅動程式,Windows 10系統會自行下載安裝驅動程式,或者,你也可以自行下載安裝驅動程式。
這是此M0板預設韌體的磁碟內容,其中的CURRENT.UF2檔是目前燒錄在MCU中的韌體。
只需按兩次控制板上的Reset鍵,再把新的韌體拖入它所代表的隨身碟,控制板將立即燒入新韌體。
M0板的韌體檔格式為UF2(USB Flashing Format,USB燒錄格式)。在Adafruit的CircuitPython開放原始碼專案網站,可下載適用於各種控制板、預先編譯好的CircuitPython韌體:
原廠M0板在進入燒錄韌體模式時,板子上的RGB LED會變成綠色。韌體燒錄完畢後,控制板會自行重新啟動,燒入CircuitPython之後的「隨身碟」名稱變成“CIRCUITPY”。
安裝Mu程式編輯器
Python程式可以用任何文字編輯器編寫,Adafruit推薦使用開放原始碼的Mu,因為它內建支援控制板的序列通訊還有數據繪圖(Plotter)功能。
Mu程式編輯器本身採用Python編寫而成,只要你的電腦系統已事先安裝好Python 3執行環境,在「命令提示字元」或「終端機」輸入底下的命令即可安裝:
在Linux系統裝置(如:樹莓派)上,pip指令要改成pip3。或者,你也可以在Mu編輯器的官方下載頁,下載Windows和Mac系統用的可執行檔。
使用Mu編寫Python程式
Mu安裝完畢後,請先把M0控制板插入USB,然後在命令行輸入mu-editor開啟程式編輯器。
第一次開啟Mu編輯器時,它會要求你選擇一種編輯模式(Mode),請選擇Adadruit CircuitPython。
Mu編輯器會自動連接插在USB的“CIRCUITPY”隨身碟。在筆者的Windows 10系統上,Mu編輯器自動呈現簡體中文介面。
編寫一個閃爍LED的Python程式測試看看。由於此M0相容板第13腳沒有連接LED,所以我改接D4腳:
import board import digitalio import time led = digitalio.DigitalInOut(board.D4) # 建立連接D4腳的數位I/O物件 led.direction = digitalio.Direction.OUTPUT # D4腳設為「輸出」模式 while True: led.value = True # 輸出高電位 time.sleep(0.5) led.value = False # 輸出低電位 time.sleep(0.5)
把程式碼命名成code.py檔儲存,Mu編輯器會自動把程式檔存入控制板的“CIRCUITPY”隨身碟,然後重新啟動控制板。 程式檔名可命名成下列4個之一:
- code.txt
- code.py
- main.txt
- main.py
CircuitPython會在開機啟動時,依照上面的順序找尋並執行找到的第一個檔案。Python程式檔習慣上以.py結尾,因此CircuitPython的程式檔通常被命名為code.py。
儲存(相當於Arduino的「上傳」)程式檔的過程中,不要按下Reset鍵,也不要將控制板從USB拔除。
儲存程式檔之後,接在D4腳的LED開始閃爍。這個自行組裝的M0相容板有個1F容量的超級電容,將它從電腦USB拔除之後,能持續控制LED閃爍約33秒。
根據微控器晶片製造商Microchip的ATSAMD21E18技術文件的Power Consumption(電力消耗)單元指出,在全速運作下,此MCU電力最高消耗約7mA,執行普通的while(1)迴圈,甚至不到4mA,遠比LED省電。
開啟序列埠窗格
CircuitPython程式中的print()敘述,將輸出在序列埠窗格。例如,修改上面程式的while迴圈再存檔:
while True: led.value = True time.sleep(.5) led.value = False time.sleep(2) print("Hello, World!")
接著按下Mu編輯器上方工具列的Serial(序列)鈕,將開啟序列埠窗格,顯示“Hello, World!”訊息:
進入與離開REPL模式
用滑鼠按一下Mu程式碼編輯器底下的序列埠窗格,然後先按下Ctrl和C鍵、再按下Entter鍵,將令M0控制板進入REPL模式。你可以在此模式下,輸入任何Python敘述並立即在控制板上執行:
按下Ctrl和D鍵,即可退出REPL模式,控制板將自動重置並重新執行之前的程式碼。