學 Go 玩創客,TinyGo 初體驗(1):安裝環境並在 Arduino Uno/Nano 執行第一支程式

Photo by Fab Lentz on Unsplash

一條迷你狗走天下

Photo by Riccardo Annandale on Unsplash
  1. 32 位元 ARM Cortex M0+ 家族:SAMD21、nRF51
  2. 32 位元 ARM Cortex M3:STM32F1
  3. 32 位元 ARM Cortex M4:SAMD51、nRF52、STM32F4

TinyGo 尚未成熟(但值得關注)

不過,我也得說,在寫這篇文的時候,TinyGo 離實用化其實還有一段距離。

Photo by Ian Schneider on Unsplash

環境安裝與設定

在 Windows 安裝 Go/TinyGo

1、下載和安裝 Go(比如 go1.16.windows-amd64.msi),安裝至 C:\。安裝程式應該會自動將 Go 的路徑加入你的系統 Path 變數。

C:\tinygo\bin
tinygo version
tinygo version 0.16.0 windows/amd64 (using go version go1.15.5 and LLVM version 10.0.1)
Photo by Mariya Pampova on Unsplash

在 Linux 安裝 Go/TinyGo

1、先確保系統在最新狀態:

sudo apt-get updatesudo apt-get dist-upgrade -y
sudo apt-get install golang-go 
sudo add-apt-repository ppa:longsleep/golang-backportssudo apt update
sudo wget https://github.com/tinygo-org/tinygo/releases/download/v0.17.0/tinygo_0.17.0_amd64.debsudo dpkg -i tinygo_0.17.0_amd64.deb
sudo wget https://github.com/tinygo-org/tinygo/releases/download/v0.17.0/tinygo_0.17.0_arm.debsudo dpkg -i tinygo_0.17.0_arm.deb
nano ~/.bashrc
export GOPATH=$HOME/goexport PATH=$PATH:$GOROOT/bin:$GOPATH/binexport PATH=$PATH:/usr/local/tinygo/bin
tinygo version
tinygo version 0.16.0 linux/arm (using go version go1.15.5 and LLVM version 10.0.1)

更新 Go 與 TinyGo

將來當 Go 或 TinyGo 有更新時,照上面的方式安裝新版即可(在 Windows 要先刪掉舊的 tinygo 資料夾)。已經加入的路徑不用再重加一次。

設定 VSCode

筆者目前是在 Windows 上用 Visual Studio Code 來編輯 TinyGo 程式,不過由於我不是業界開發人士,所以並不熟 VSCode。但使用 VSCode 有很多好處,包括能依語法標示顏色、存檔時還會自動排版/import 套件等等,相當方便。

"go.goroot": "C:\\Go,C:\\tinygo,","go.gopath": "C:\\Users\\你的使用者名稱\\go",

安裝 AVR 上傳工具(for Arduino Uno/Nano)

為了能把編譯好的程式寫入 Arduino Uno 或 Nano,我們必須安裝額外的工具。這些其實在 Arduino IDE 內也有提供。

C:\avr-gcc-10.1.0-x64-windows\bin
sudo apt-get install gcc-avrsudo apt-get install avr-libcsudo apt-get install avrdude

編譯和上載 blinky 範例程式

Photo by Pavan Trikutam on Unsplash

在 Windows 檢查連接埠號碼

將你的 Arduino Uno 或 Nano 接上電腦。若在 Windows,到控制台→裝置管理員,看看你的板子是在連接埠的幾號 COM。以筆者的例子來說是 COM5。

C:\Users\使用者> mode裝置 COM1 的狀態:
------------
傳輸速率: 1200
同位檢查: None
資料位元: 7
停止位元: 1
逾時: OFF
XON/XOFF: OFF
CTS 交握: OFF
DSR 交握: OFF
DSR 敏感度: OFF
DTR 電路: ON
RTS 電路: ON
裝置 COM5 的狀態: <--- 這個就是 Arduino Uno
-------------
傳輸速率: 0
同位檢查: None
資料位元: 0
停止位元: 1
逾時: OFF
XON/XOFF: OFF
CTS 交握: OFF
DSR 交握: OFF
DSR 敏感度: OFF
DTR 電路: OFF
RTS 電路: ON

在 Linux 檢查連接埠名稱

在 Linux 系統,連接埠通常會是 /dev/ttyACM0,也有可能是 /dev/ttyUSB0。如果真的不確定,在終端機用以下指令來查詢:

dmesg | grep tty

上傳 TinyGo 範例程式

打開命令提示字元(從 VSCode 的 Terminal 也可),輸入以下這行指令:

tinygo flash -target arduino -port COM5 examples/blinky1
tinygo flash -target=arduino -port=COM15 examples/blinky1
avrdude: AVR device initialized and ready to accept instructionsReading | ################################################## | 100% 0.01savrdude: Device signature = 0x1e950f (probably m328p)
avrdude: NOTE: "flash" memory has been specified, an erase cycle will be performed
To disable this feature, specify the -D option.
avrdude: erasing chip
avrdude: reading input file "C:\Users\Admin\AppData\Local\Temp\tinygo454908831\main.hex"
avrdude: writing flash (558 bytes):
Writing | ################################################## | 100% 0.15savrdude: 558 bytes of flash written
avrdude: verifying flash memory against C:\Users\Admin\AppData\Local\Temp\tinygo454908831\main.hex:
avrdude: load data flash data from input file C:\Users\Admin\AppData\Local\Temp\tinygo454908831\main.hex:
avrdude: input file C:\Users\Admin\AppData\Local\Temp\tinygo454908831\main.hex contains 558 bytes
avrdude: reading on-chip flash data:
Reading | ################################################## | 100% 0.13savrdude: verifying ...
avrdude: 558 bytes of flash verified
avrdude: safemode: Fuses OK (E:00, H:00, L:00)avrdude done. Thank you.

上載自己的程式

建一個資料夾,在 VS Code 開啟該資料夾(File → Open Folder…),這即為你的專案工作區。然後在編輯器的檔案瀏覽視窗裡新增一個 main.go。最後點 Terminal → New Terminal 新開一個終端機,你會看到它已經切到資料夾的路徑。

package main

import (
"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)
}
}
tinygo flash -target arduino-nano -port COM10 main.go
  1. PWM 只能調 duty cycle,還無法調頻率。
  2. 由於記憶體不夠,許多 TinyGo 驅動程式跑不動。(之後會講如何下載並使用這些驅動程式。)
  3. 由於記憶體不夠,Go 的 concurrency(可以平行跑兩個以上的程序)功能在 AVR 處理器上預設是關閉的。
Photo by Kevin Schmid 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