使用 CircuitPython 透過微控制器進行快速原型製作和開發所需的基本知識
資料提供者:DigiKey 北美編輯群
2019-03-14
雖然 Python 語言已經讓更多人有能力設計程式,但依據原本的設計,此語言主要是在擁有許多處理能力、記憶體及週邊裝置資源的個人電腦以及其他機器上執行。嵌入式系統對於資源和介面有更嚴格的限制,對此,針對微控制器最佳化的 MicroPython 版本已漸普及。就連開放原始碼社群,也持續將 MicroPython 針對特定的微控制器和開發板進行改編,支援嚴謹的微控制器開發任務。
本文將介紹其中一種修改版,亦即 Adafruit 的 CircuitPython。本文首先將簡要探討 Python 語言,並與典型嵌入式開發語言 C++ 進行比較,然後探討 Python 是如何演化成 MicroPython 以及現在的 CircuitPython。接著將說明使用 CircuitPython 編寫軟體的過程,隨後還會介紹 Adafruit 和其他廠商提供的幾款支援 CircuitPython 環境的開發板。
選擇 Python 的理由
最初的 Arduino 開發板及許多後續版本一直是創客、玩家、學生專案,以及嵌入式原型產品常用的微控制器開發板。不過 Arduino IDE 和編程語言是以 C++ 語言作為基礎,C++ 是一種強大但複雜的編譯語言,有著怪異的句法和嚴格的標點符號規則,常令新手編程者裹足不前。
Python 是一種更新的編程語言,屬於物件導向型的互動式解譯語言,有著傑出的編程能力及非常清晰的句法。Python 以可寫性、可讀性以及更簡易的句法而著稱。這些特性結合在一起,可減少編程錯誤的數量,並可以更容易重複使用程式碼,如此即可加速軟體開發。
此語言具備的解譯特性,可即時為編程人員提供相關回饋,鼓勵嘗試實驗並有助於快速學習。為此,Python 如今已經是許多學生和創客學習的第一種編程語言。
然而,Python 有一個缺點。其原本設計在個人電腦和大型機器上執行,這些設備擁有許多 RAM、大容量儲存裝置,以及配有鍵盤、大型顯示器和滑鼠的完整使用者介面。其設計不是要作為嵌入式編程語言使用。然而,目前已經出現一種稱為 MicroPython 的精簡高效率 Python 3 編程語言實作,並特別針對在微控制器的有限資源下執行而開發和最佳化。
開放原始碼社群發現 MicroPython 作為嵌入式編程語言的前景,持續對此語言針對特定的微控制器和開發板進行改編,以便支援嚴謹的微控制器開發任務。舉例來說,Adafruit 已經開發出適合自己使用的 MicroPython 語言,目前稱為 CircuitPython。CircuitPython 的設計旨在簡化實驗及學習過程,以便在低成本微控制器板上進行編程工作,此語言是針對 Adafruit 開發板上的微控制器以及硬體資源而量身訂做。CircuitPython 已預先安裝在數種 Adafruit 的開發板上,並且也可安裝在其他開發板上。
C++ 和 Python 之間的差異
有鑑於 Arduino IDE 的發展力道和普及以及目前市面上有許多 Arduino 開發板,因此我們合理的提出疑問:「嵌入式開發為何需要使用 Python 版本語言?」若比較這兩種語言,便能得到答案。
C++ 是較舊的 C 語言之擴充版,且擁有物件導向擴充功能。儘管有這些擴充功能,C++ 程式碼依然令人難以理解,因為仍保留 Kernigan 和 Ritchie 在 1960 末至 1970 初於貝爾實驗室創立的 C 語言語法。C 語言原先的設計是要輕鬆地對應到目標處理器的機器指令中。這種偏向機器需求而非編程人員需求的傾向,在該語言的語法中顯而易見。由於商用微處理器直到 1971 年才發明,因此 C 語言原本是針對迷你電腦而開發。微處理器的 C 編譯器是在 1980 年代逐漸演化成實用的工具。C 語言一直都是編譯過的語言,如同 C++ 一樣。
丹麥電腦科學家 Bjarne Stroustrup 在 1979 年開始開發 C++。他第一本有關該語言的教科書於 1985 年出版,而 C++ 直到 1998 年才成為標準的編程語言。與 C 語言一樣,Stroustrup 的 C++ 語言原先鎖定的目標是更大型的電腦。於 2003 年開發的 Arduino IDE (整合開發環境) 使 C++ 可用於微控制器。
Python 也是物件導向語言,由荷蘭程式設計者 Guido van Rossumin 開發,並於 1991 年首次推出。Python 語法的設計強調了程式碼對人類的可讀性,這是 Python 與 C++ 之間的一個主要差異。與可讀性緊密相關的可寫性,也是 Python 受人喜愛的另一個特色。可寫性意味著 Python 可讓編程人員更快地編寫應用程式,進而鼓勵進行相關實驗,且能縮短原型製作和開發週期的時間。
第二大差異在於,Python 是一種解譯語言,這很像 Basic 編程語言,後者首次在 1960 年代出現並且是針對迷你電腦而設計。到了 1970 年代,隨著微電腦的問世,此語言才確實開花結果。如同 Basic 一樣,Python 的解譯特質可鼓勵進行相關實驗和學習,其省去編譯程式語言使用的編輯/編譯/下載/執行開發週期。不過與 Basic 不同的是,Python 是一種現代更高階物件導向語言,已經融合自從 Basic 首次問世以來,在半世紀中所累積的電腦科學成果。
舉例來說,Python 的變數在使用前不需要宣告型態;編程人員無須擔心變數應該為整數或浮點數;Python 解譯器能自行釐清並在執行時做出適當的選擇。
C++ 和 Python 之間的另外兩個差異是字串處理與標點符號。許多編程人員覺得 C++ 的字串處理既遲鈍,又令人困惑。Python 的字串處理則簡單多了,而且極易讓人回想起 Basic 簡單且受人喜愛的字串處理能力,這一直都是 Basic 長久以來公認的優點。
同樣地,C 和 C++ 的標點符號,特別是大括弧 ({}),對新手甚至是經驗豐富的編程人員來說,都是另一個經常碰到的絆腳石。程式裡似乎總是出現奇數數量的大括弧,因此編程人員必須鑽研程式碼,找出遺漏的大括弧應該放置的位置。Python 沒有如此過份講究的標點符號,不過確實使用縮排,增加 Python 程式碼的可讀性。
MicroPython 的起源
如同 C 和 C++ 一樣,Python 原本的設計是要在較大型電腦上執行。因此,該語言需要用於編程微控制器的資源太多了。澳洲的編程人員兼物理學家 Damien George 因此開發了一個名為 MicroPython 的 Python 版本,可在微控制器更有限的資源上執行。Arduino 開發板是早期針對 MicroPython 語言開發的硬體。
MicroPython 的互動特質核心在於指令介面上,此介面的正式名稱為 REPL (讀取-求值-輸出-循環) 視窗,通常是主機 PC 與微控制器開發板透過序列連接而運作。REPL 介面與 1970 和 1980 年代的 Basic 指令行介面極為相似。此介面接受使用者輸入 (單一運算式或陳述式)、評估輸入,然後透過 REPL 視窗將結果返回給使用者,或執行內嵌於陳述式中的指令。
使用 REPL 介面,便有可能查詢變數、切換 I/O 行,或傳送一串字元到連接的週邊裝置。指令列經過解譯後,一旦按下 Enter 鍵,便會立即執行。這就是解譯語言的本質。
MicroPython 的這種特性有助於探索型編程和除錯任務,也是使 MicroPython 語言易於使用的諸多層面之一,不論對初學者還是經驗豐富的編程人員都是如此。相較於 Arduino IDE 的典型「編輯-編譯-執行-除錯」週期,REPL 使用者介面能更快地完成開發週期。就連經驗豐富的編程人員也能夠使用 MicroPython 的 REPL 使用者介面,以互動方式實驗新類型的週邊裝置,並因此受益。
CircuitPython 對開發板的支援
每個微控制器都有獨特的週邊裝置組,每個開發板也不例外,而這些週邊裝置則需要支援資料庫,對於 Arduino IDE 和 MicroPython 來說也是如此。此外,還有許多附加週邊裝置,如 Adafruit 的 1655 NeoPixel 可定址 RGB LED,也需要資料庫的支援。
為了提供更進一步的支援,Adafruit 開發了自己的 MicroPython 版本,稱為 CircuitPython,以符合一些公司低價微控制器開發板的特殊需求。該公司也將其龐大 Arduino 組合中的許多週邊裝置資料庫轉換成 CircuitPython 資料庫,為 CircuitPython 提供大量且持續增加的週邊裝置支援資料庫。
Adafruit 設計出一系列明確支援 CircuitPython 的微控制器開發板,其中包括:
- 3333 Circuit Playground Express;含有十個可定址、可控制的 RGB LED (圖 1)
圖 1:Adafruit 的 3333 Circuit Playground Express;含有十個可定址、可控制的 RGB LED。(圖片來源:Adafruit)
- 3500 Trinket M0 開發板;尺寸僅 27 mm x 15.3 mm x 2.75 mm (圖 2)
圖 2:Adafruit 的 3500 Trinket M0 開發板;尺寸僅 27 mm x 15.3 mm x 2 mm。(圖片來源:Adafruit)
- 3501 Gemma M0 大小與美國 25 分錢硬幣相當,可從 USB 埠或個別電池埠對其供電 (圖 3)
圖 3:Adafruit 的 3501 Gemma M0 大小與美國 25 分錢的硬幣相當,可從 USB 埠或個別電池埠對其供電。(圖片來源:Adafruit)
- 3403 Feather M0 Express 開發板具備小試驗電路板區,可供自訂電路使用 (圖 4)
圖 4:Adafruit 的 3403 Feather M0 Express 開發板具備小試驗電路板區,可供自訂電路使用。(圖片來源:Adafruit)
這四種 Adafruit 微控制器開發板都採用 Microchip Technology (前身為 Atmel) 的 SAMD21 微控制器作為基礎,並提供原生 USB 支援。然而,CircuitPython 不僅僅支援 Adafruit 的開發板和 SAMD21 微控制器。至於其他包含不同微控制器的開發板,適用的 CircuitPython 版本也開始問世,包括 Adafruit 的 3406 Feather NRF52 與 Nordic Semiconductor 的 nRF52-DK 開發板;兩者都採用 Nordic Semiconductor 的 nRF52832 微控制器作為基礎。此外,Nordic Semiconductor 的 nRF52840-DK 開發板 (圖 5) 採用該公司的 nRF52840 微控制器作為基礎,也受到 CircuitPython 的支援。這三種開發板所採用的兩種微控制器,都內建晶片上低功耗藍牙 (BLE),並有合適的軟體支援。
圖 5:Nordic Semiconductor 的 nRF52840-DK 開發板內建 BLE 支援。(圖片來源:Nordic Semiconductor)
利用 CircuitPython 進行開發
Adafruit 採取一種獨特方法,將 CircuitPython 置入專為直接支援該語言而設計的開發板。將這幾種開發板的其中一個插入主機 PC 的 USB 埠,此開發板就成為 PC 的磁碟機。這個磁碟機的根目錄顯示重要的 CircuitPython 檔案,其中包括解譯器、使用者程式,以及內含資料庫檔案的資料夾。這樣的安排可讓主機 PC 輕鬆透過現有的檔案系統與驅動程式來存取開發板。
主機 PC 上的 CircuitPython 使用者介面需要可下載的免費開放原始碼編輯器與 REPL 介面。Adafruit 推薦一種名為 Mu 的開放原始碼應用程式,如圖 6 所示。Mu 畫面會分割成一個可在其中進行編輯的程式碼視窗,以及一個 REPL 控制與監控視窗,可讓編程人員控制該開發板的 CircuitPython 解譯器。
圖 6:Adafruit 建議使用名為 Mu 的開放原始碼編程介面。Mu 畫面會分割成一個可在其中進行編輯的程式碼視窗,以及一個 REPL 控制與監控視窗,可讓編程人員控制該開發板的 CircuitPython 解譯器。(圖片來源: codewith.mu/en/tutorials/1.0/adafruit)
藉著在程式碼視窗輸入程式並按下 Mu 的「儲存」按鈕,程式碼即可儲存在 Adafruit 的 CircuitPython 開發板上,此板則位於 SAMD21 微控制器的大型晶片上快閃記憶體當中。所有的 CircuitPython 程式碼都儲存在微控制器快閃記憶體中的開發板。請記住,CircuitPython 板對 PC 來說就像是一個磁碟機,因此從作業系統的觀點來看,這是常見的操作。
結論
Python 語言為編程人員提供許多好處,其中包括互動式編程、實驗與除錯。此語言採用簡化、更人性化的語言語法,不需要進行變數宣告型態,也沒有過度講究的標點符號。MicroPython 是 Python 3 的變化版,可使 Python 語言用於微控制器編程中。
如前面所示,Adafruit 已對 MicroPython 進行修改並衍生出 CircuitPython,可直接支援硬體,進而簡化實驗和學習,並加速軟體開發。CircuitPython 早已支援幾款採用 Microchip 的 SAMD21 微控制器而且屬於低成本的微控制器開發板,也可支援其他採用 Nordic Semiconductor 且可支援 BLE 的 nRF 微控制器開發板。

聲明:各作者及/或論壇參與者於本網站所發表之意見、理念和觀點,概不反映 DigiKey 的意見、理念和觀點,亦非 DigiKey 的正式原則。