學 Go 玩創客,TinyGo 初體驗(5):使用其他開發板 — — DigiSpark、Arduino Nano 33 IoT、 Adafrut Metro M4 及 Bluepill

Alan Wang
20 min readJul 9, 2020

就和很多專業或業餘的 Maker 一樣,筆者家裡有個小抽屜塞滿了各式各樣的開發板,有些會在某個時候拿去做專案用掉,也有的是留著測試用的。因此在我摸索 TinyGo 的這段期間,自然也試過在不同的板子上跑 TinyGo。

我在本系列的第一篇說過:TinyGo 的特色之一是它支援非常多元的開發板/處理器類型。而且,只要硬體規格許可,程式碼是幾乎不需修改就能共用的。因此,這篇就來展示一下筆者手邊有的幾塊板子,以及要如何讓它們執行標準的 TinyGo blinky1 範例程式。各位有志之士有興趣的話,或許能研究一下如何讓更多開發板也獲得 TinyGo 支援。

DigiSpark:ATTiny85 迷你開發板

ATTiny85 是 AVR 8 位元處理器家族的成員,乃 Uno/Nano 使用的 ATmega328P 的近親。不過它的規格就簡單許多:預設時脈 16.5 MHz,記憶體 512 bytes(對,只有 ATmega328P 的四分之一),6 個 GPIO 腳位,其中 2 個支援 PWM,4 個支援類比輸入。板子上有內建 LED 燈,大多是接在 P1,但也有的是在 P0。

市面上賣的一般稱為 DigiSpark,大多數跟副廠 Uno/Nano 一樣蠻便宜的,只可惜腳位得自己焊。USB 接頭則有標準跟 micro USB 兩種。真要說的話,它最大的優勢就是非常小吧。

在本文撰寫時,TinyGo 只支援 ATTiny85 的數位腳位輸出入而已,能做的事仍不多。不過,它倒是可以簡單地控制 NeoPixel 燈條(而這也是其中一個開發者在展示時最常用的例子之一 — — 你看,龐大的 Go 語言能在 0.5 KB 的裝置上跑!)

以下以 Windows 環境為例講解怎麼讓它準備好能使用 TinyGo。筆者手邊還沒有多的板子可以測試 Linux 環境。

安裝 bootloader(libusb-win32)

下載 Zadig 這個執行檔,並以系統管理員權限執行。把 DigiSpark 插上電腦,Zadig 內應該會看到一個 Unknown device。在右下選擇 libusb-win32 然後按 Install driver。稍待片刻,不要拔掉裝置(你會聽到裝置斷線的音效,那是正常的),直到 bootloader 裝好。

附帶一提,裝了 bootloader 後,你也可以把 ATTiny85 拿去 Arduino IDE 用。網路上對這部分有教學,本文就不提了。

ATTiny85 很有趣,它會在通電的頭 5 秒鐘進入 bootloader 模式,然後切到正常程式(假如有的話)。所以,不管 TinyGo 或 Arduino IDE 在燒錄時都不需指定通訊埠,而是編譯後才要求你接上板子(Arduino IDE 會等待 60 秒),等燒錄程式偵測到 bootloader 模式後再上傳。

下載燒錄工具 micronucleus

接著,我們需要一個能燒錄程式到板子上的 command line 工具。在這裡下載 micronucleus.exe,丟到硬碟內某處,然後把它的路徑加入 PATH 系統變數(或者你能像我一樣,找個已經在 PATH 內的位置借放它)。

完成以上準備後,打開 Windows 命令提示字元輸入:

micronucleus -help

這時你應該會看到

> Please plug in the device ... 
> Press CTRL+C to terminate the program.

這時把 DigiSpark 從 USB 拔下和重接到電腦上,程式找到後就會吐出以下訊息:

> Device is found!
connecting: 20% complete
connecting: 27% complete
connecting: 34% complete
connecting: 40% complete
> Device has firmware version 1.6
> Available space for user applications: 6012 bytes
> Suggested sleep time between sending pages: 8ms
> Whole page count: 94 page size: 64
> Erase function sleep duration: 752ms
> Error opening -help: No such file or directory
> Error loading or parsing hex file.

這樣就代表 micronucleus 與板子都運作正常,我們也能用 TinyGo 來上傳程式給 DigiSpark 了。

Photo by Vasily Koloda on Unsplash

燒錄 blinky 範例程式

下面是經典的 Blinky1 範例程式,其實完全就是之前的版本:

package mainimport (
"machine"
"time"
)
func main() {
led := machine.LED
led.Configure(machine.PinConfig{Mode: machine.PinOutput})
for {
led.High()
time.Sleep(time.Millisecond * 500)
led.Low()
time.Sleep(time.Millisecond * 500)
}
}

這裡我們就直接使用現成範例 examples/blinky1,使用以下指令來上傳:

tinygo flash -target digispark examples/blinky1

你會看到以下訊息出現(在看到 Please plug in the device 這行時,拔掉 USB 線和重接一次):

> Please plug in the device ... 
> Press CTRL+C to terminate the program.
> Device is found!
connecting: 16% complete
connecting: 22% complete
connecting: 28% complete
connecting: 33% complete
> Device has firmware version 1.6
> Available space for user applications: 6012 bytes
> Suggested sleep time between sending pages: 8ms
> Whole page count: 94 page size: 64
> Erase function sleep duration: 752ms
parsing: 50% complete
> Erasing the memory ...
erasing: 55% complete
erasing: 60% complete
erasing: 65% complete
> Starting to upload ...
writing: 70% complete
writing: 75% complete
writing: 80% complete
> Starting the user app ...
running: 100% complete
>> Micronucleus done. Thank you!
Photo by Valerie Blanchett on Unsplash

在 TinyGo 的網站上會列出每種開發板的 machine 套件內容,這可用來查詢各種板子的腳位定義。

Arduino Nano 33 IoT:SAMD21 + NINA-W102

第一篇文提過 2019 年春時,Arduino 推出四款新的 Nano 開發板:這四片板子的尺寸和腳位配置與舊的 Nano 一模一樣,但規格更加強大。最低階的 Nano Every 使用 ATmega4809(48 MHz,6 KB 記憶體),Nano 33 IoT 使用 SAMD21(48 MHz,32 KB 記憶體),Nano 33 BLE 則使用 nRF52840(64 MHz,1 MB 記憶體!)。Nano 33 BLE Sense 就是標準 BLE 加裝一堆感測器的豪華版,專門設計給 Tensorflow Lite 之類的套件使用。

本質上,Nano 33 IoT 其實就是較早推出的 Arduini MKR1010 WiFi 的縮小版,它們都有一個基於 ESP32 的 NINA-W102 WiFi 模組。此外,兩者也都附有 LSM6DS3 三軸加速計/陀螺儀。

算筆者幸運,台灣剛好有人代理這些板子。由於腳位和舊 Nano 一樣,所以能沿用後者的擴充板。不過這些擴充板會透過 5V 腳位吃電,而若要讓新 Nano 的 5V 腳位輸出電力,你必須把背面 VUSB 的接點焊起來。

有意思的是,你不能反過來從 5V 腳位供應電力給板子,而這其實是個更安全的設計;筆者自己就有過幾次因對舊 Nano 輸入電流太大的電源,導致電源轉換晶片燒壞的悲劇。

安裝燒錄工具 BOSSA

下載並安裝 BOSSA,這是專門給 SAM 家族微處理器用的燒錄程式。不過,安裝時必須記得把安裝路徑改為 C:\Program Files\BOSSA\(不是預設的 C:\Program Files (x86)\BOSSA\)。然後,把 C:\Program Files\BOSSA\ 路徑加入 PATH 系統變數。

在命令提示字元輸入以下指令來測試 BOSSA:

bossac --help

如果看到以下結果,就代表 BOSSA 運作正常:

Usage: bossac.exe [OPTION...] [FILE]
Basic Open Source SAM-BA Application (BOSSA) Version 1.9.1
Flash programmer for Atmel SAM devices.
Copyright (c) 2011-2018 ShumaTech (http://www.shumatech.com)
...(下略)
Photo by Jon Tyson on Unsplash

燒錄 blinky 範例程式

在上傳程式之前,你必須按兩下 Nano 33 IoT 上的白色 reset 鈕,好讓它進入 bootloader 模式。(Arduino IDE 有能力在不需你動手的情況下讓它自動切換,而 TinyGo 就多了這個步驟。)

要注意 SAMD21 這類晶片在正常模式跟 bootloader 模式的 COM port 是不一樣的(看通訊埠號碼的方式請參閱第一篇)。以筆者的板子為例,它在 bootloader 模式時會出現在 COM9:

tinygo flash -target arduino-nano33 -port COM9 examples/blinky1

接著你會看到 BOSSA 跑了一串訊息:

Device       : ATSAMD21x18
Version : v1.1 [Arduino:XYZ] May 17 2020 17:56:43
Address : 0x0
Pages : 4096
Page Size : 64 bytes
Total Size : 256KB
Planes : 1
Lock Regions : 16
Locked : none
Security : false
BOD : true
BOR : true
Erase flash
Done in 0.819 seconds
Write 8196 bytes to flash (129 pages)
[==============================] 100% (129/129 pages)
Done in 0.174 seconds
Verify 8196 bytes of flash
[==============================] 100% (129/129 pages)
Verify successful
Done in 0.781 seconds

此外你有興趣的話,TinyGo drivers(參見第三、四篇介紹)有板子上的 LSM6DS3 及 NINA-W102 的範例程式,雖然目前 TinyGo 在 IoT 方面的應用仍非常原始,感覺主要目的還是用來傳資料到雲端伺服器:

tinygo flash -target arduino-nano33 -port COM9 tinygo.org/x/drivers/examples/lsm6ds3tinygo flash -target arduino-nano33 -port COM9 tinygo.org/x/drivers/examples/wifinina/webclient

注意那個 webclient 範例得修改裡面的 ssid 和 pass(你的 WiFi 名稱及密碼)。

Adafruit Metro M4:SAMD51

接著的例子是美國 Adafruit 公司的 Metro M4 開發板,使用 SAMD51 處理器(Cortex M4,120 MHz,192 KB 記憶體)。這算是個比較特別的例子,畢竟筆者也是為了研究才特地訂了一片,加運費可真不便宜哩。

Adafruit 的開發板後面寫 M0 就是 SAMD21,M4 則是 SAMD51,有 BLE 或 Blue- 的則是 nRF52。他們也有做 AVR 處理器開發板,但並不是公司主打的產品。而從 M4 的規格看來,就不難想見它是該公司最高檔的系列了。

我買這塊 Metro M4 就是看上它做得像 Uno(那時我自己還不會焊接,換成買 Feather M4 或 ItsyBitsy M4 就傷腦筋了)。不過更令人訝異的是它的軟體面:Adafruit 在自家產品會安裝 UF2 bootloader(SAMD51 也是按 reset 兩下來進入燒錄模式),這時再搭配 Adafruit 的 CircuirPython 韌體,任何 M0/M4 開發板就能直接在電腦上產生一個 USB 碟。(這點也使它能夠直接用在微軟的 MakeCode Maker 圖形積木式編輯器。)

Photo by Steve Johnson on Unsplash

此外,雖然腳位引出的方式和 Uno 很像,但還是有些不同:它有獨立的 I2C 腳位,類比輸入的 A0 和 A1 有 DAC(digital to analog converter,可以直接輸出真正的類比訊號而不只是 PWM,因此可以用來放音樂)。板子上除了內建 LED 燈外,也有一顆 NeoPixel 燈可用。

(參閱:Metro M4 的腳位machine 套件

Metro M4 貴雖貴,但也不得不承認其 PCB 板的作工非常精緻。稍後我會再寫一篇文討論 CircuitPython 跟其韌體的安裝。

燒錄 blinky 範例程式

按兩下 reset 進入 bootloader 模式,然後使用以下指令(筆者的板子出現在 COM6):

tinygo flash -target metro-m4-airlift -port COM6 examples/blinky1

就這樣,完成後也沒有額外訊息。拜 UF2 bootloader 之賜,你也可以用 tinygo build 編譯出 .hex 檔,然後手動貼到它的燒錄模擬磁碟區裡。

你會注意到 target 的名字有點不太一樣,因為 TinyGo 支援的對象其實是 Metro M4 AirLift,也就是 Metro M4 加上 WiFi 模組的版本。不過只要我不使用 WiFi 功能,這倒是不影響使用。

P.S. 如果你想閃爍的是板子上的 NeoPixel,直接拿本系列第三篇的範例程式來跑就行了,但記得腳位要改成 D40。此外,燈的陣列數量至少得設為 2 顆,免得最後寫入陣列時產生問題。

Bluepill:STM32F103C8T6

本文介紹的最後一個,是俗稱 Bluepill(藍色藥丸)的核心板,處理器為 STM32F103C8T6(Cortex M3,72 MHz,記憶體 20 KB)。

藍色藥丸典故來自《駭客任務》。當時確實也曾有過「紅色藥丸」板,但似乎已經絕跡了。

由於價格極其低廉,處理器的規格又不錯,所以蠻受歡迎的。當然規格上的完整性被犧牲不少,所以它需要外部的軟硬體燒錄工具。

筆者之前是有試過在 Bluepill 上面灌有人寫的 STM32duino bootloader,可以直接透過 USB 在 Arduino IDE 上傳程式,但後來發現能用的周邊驅動程式庫實在很少。也許這是難得 TinyGo 已經比較吃香的地方吧。

環境準備

首先,你需要買個 ST-LINK/V2 燒錄器:(接線方式可參考這篇

有了 ST-LINK,要拿來在 Arduino IDE 上傳程式也比較方便。同樣的這就請各位自行參考網路教學了。

接著下載 OpenOCD 0.10.0。解壓到比如 C:\ 底下,並把資料夾內的 bin 路徑(裡面有 openocd.exe)加入 PATH 環境變數。

燒錄 blinky1 範例程式

若是在 Windows,你必須使用 TinyGo 0.15.0 版,這版修正了在 Windows 下傳遞路徑給 OpenOCD 的問題。不過,對 Linux 環境就沒有差別了。

tinygo flash -target bluepill examples/blinky1

不需要寫 -port 參數,只要把 ST-LINK 接上 USB 即可。

稍微麻煩一點的是,為了確保燒錄成功,你可能得在執行上面的指令前按住 Bluepill 的 reset 鍵。等到 OpenOCD 的第一段訊息出現的瞬間再放開,這樣就能順利燒錄程式了。

Open On-Chip Debugger 0.10.0
Licensed under GNU GPL v2
For bug reports, read
http://openocd.org/doc/doxygen/bugs.html
Info : auto-selecting first available session transport "hla_swd". To override use 'transport select <transport>'.
Info : The selected transport took over low-level target control. The results might differ compared to plain JTAG/SWD
adapter speed: 1000 kHz
adapter_nsrst_delay: 100
none separate
Info : Unable to match requested speed 1000 kHz, using 950 kHz
Info : Unable to match requested speed 1000 kHz, using 950 kHz
Info : clock speed 950 kHz
Info : STLINK v2 JTAG v34 API v2 SWIM v7 VID 0x0483 PID 0x3748
Info : using stlink api v2
Info : Target voltage: 3.231196
Info : stm32f1x.cpu: hardware has 6 breakpoints, 4 watchpoints
target halted due to debug-request, current mode: Thread
xPSR: 0x01000000 pc: 0x08000714 msp: 0x20000800
** Programming Started **
auto erase enabled
Info : device id = 0x20036410
Info : flash size = 128kbytes
target halted due to breakpoint, current mode: Thread
xPSR: 0x61000000 pc: 0x2000003a msp: 0x20000800
wrote 4096 bytes from file C:/Users/xxxx/AppData/Local/Temp/tinygo750737859/main.hex in 0.341090s (11.727 KiB/s)
** Programming Finished **
** Resetting Target **
shutdown command invoked

(緊急參戰!)Seeeduino XIAO

在寫完這篇不久後,TinyGo 發布了 0.14.0,加入 Seeeduino 的 XIAO、Wio Terminal 等新板子。

我在另一篇文章「初玩 CircuitPython:給微控制器的『另一種』MicroPython」對這塊板子有多一點介紹。簡單地說,XIAO 出廠時已經裝有 UF2 bootloader,因此想將 TinyGo 程式上傳到 XIAO,就跟前面的 Metro M4 一樣簡單。而且,你還不必手動去按板子上小小的重設鈕接點 — — TinyGo 會自己幫你重設它。

tinygo flash -target xiao -port COM25 examples/blinky1

就這樣,輕鬆簡單。

ESP8266/ESP32 呢?

0.15.0 版終於迎來了令人期待已久的更新:新增對 ESP 家族開發板的支援。只要安裝一些工具後,就能直接從終端機上傳 TinyGo 程式到這些板子上了。

但遺憾的是,目前這些支援是非常有限的,而且仍存在著一些 bug,所以連基本的運用都有很大的限制。因此,筆者會等到有後續改善時再來一併介壽。

結語

本篇旨在展示 TinyGo 要如何在幾種不同的開發板上燒錄程式。依據板子規格的不同,有些需要比較複雜的準備作業,不過各位可以看到,燒錄上去的程式本身是一模一樣的,直接套官方範例照樣可以跑。

就筆者所知,已有人在嘗試開發 TinyGo 的圖形積木式編輯器。或許將來 TinyGo 能有像 Arduino IDE 一樣的整合編輯器,將相關的燒錄工具一網打盡吧!

以基本腳位的控制來說,SAMD21/51 家族是目前支援最完整的。所以筆者在測試 TinyGo 程式時,大多會選在 micro:bit 跟 Nano 33 IoT/XIAO 上執行。之後還有續篇的話,或許就會繼續以這幾塊板子為中心吧。

Photo by Nicholas Bartos on Unsplash

(待續?)

--

--

Alan Wang

Technical writer, former translator and IT editor.