Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
11
Help us understand the problem. What are the problem?
@sago35

Wio Terminal で TinyGo プログラミングを始めよう

このページには、 Wio Terminal + TinyGo 0.18 を使ってマイコンプログラミングを始めるための情報を記載します。
マイコンプログラミングをしたことがある人もない人も、是非試してみてください。
主に Windows 10 で試しながら書きますが、他の OS でもほとんど同じ動きになると思います。

TinyGo とは

マイコンや WASM などの Small Places 向けの Go Compiler です。
ここでは Go の文法でマイコン開発ができるもの、という程度の認識でよいです。

このページは 2021/05/12 にリリースされた TinyGo 0.18 を対象としています。

Wio Terminal とは

Wio Terminal は Seeed 社のディスプレイ付きの開発ボードです。
320 x 240 のディスプレイ、 WiFi / BLE 搭載、ボタンに加速度センサに MicroSD カードスロットに、と非常に多機能です。

マイコンは Microchip 社の ATSAMD51P19 (Arm Cortex-M4 120MHz) が搭載されています。
基本的には Arduino などでの開発が想定されているが、 TinyGo 0.14 でサポートされました。

image.png
image.png

https://www.seeedstudio.com/Wio-Terminal-p-4509.html
https://wiki.seeedstudio.com/Wio-Terminal-Getting-Started/

WiFi / BLE 搭載ということで、技適取得済みの Version を買う必要があります。
国内では以下から購入すると良いと思います。

TinyGo のインストール

以下に従ってインストールを実施してください。
0.13.1 までは windows の native 版は日本語環境で動かない問題など色々ありましたが、 0.14 以降は native 版で大丈夫です。
docker で開発したい場合は、 docker 版を使っても問題ありません。
なお、 TinyGo の実行には Go のインストールも必要です。
事前に Go 1.16 あたりをインストールしておいてください。

Windows でのインストール例

以下をダウンロードして、 C:\tinygo\bin\tinygo.exe となるように配置します。
※実際は PATH が通っていればどこでも良いです or PATH が通ってなくても tinygo.exe を実行出来れば良いです

その後 PATH を通します。

$ set PATH=%PATH%;C:\tinygo\bin

以下で version が表示されたらインストール成功です。

$ tinygo version
tinygo version 0.18.0 windows/amd64 (using go version go1.16 and LLVM version 11.0.0)

Hello TinyGo

Hello World に相当するプログラムとして、 L チカ (LED を光らせる) を実施してみます。
パソコンと Wio Terminal を USB ケーブルで接続して、以下を実行します。

$ tinygo flash --target wioterminal --size short examples/blinky1
   code    data     bss |   flash     ram
   7720      36    6340 |    7756    6376

分かりにくいですが、以下の青 LED が 0.5 秒毎に ON / OFF を繰り返すようになれば成功です。
error: multiple serial ports available - use -port flag, available ports are COM6, COM12 の様に表示された場合は #port-を指定して書き込む を見てください。

image.png

次に点滅周期を変更してみます。
上記は TinyGo をインストールしたディレクトリのソースを直接書き込んでいたので変更ができません。
※正確には C:\tinygo\src\examples\blinky1 にあるので変更できますが、しないほうが良いです

以下からソースコードを取得して適当な場所に保存します。
https://github.com/tinygo-org/tinygo/blob/release/src/examples/blinky1/blinky1.go

package main

// This is the most minimal blinky example and should run almost everywhere.

import (
    "machine"
    "time"
)

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

        led.High()
        time.Sleep(time.Millisecond * 500)
    }
}

500 ms 待つところを 1000 ms 等に書き換えてみて、ビルドおよび書き換えができていることを確認してください。
tinygo flash は、おおよそ go buildgo get のイメージで package を指定できます。
以下のように現在のフォルダ/ディレクトリに blinky1.go しかない場合は、 tinygo flash . のようにして flash することができます。

$ dir /b
blinky1.go

$ tinygo flash --target wioterminal --size short .
   code    data     bss |   flash     ram
   7996       8    6344 |    8004    6352

ここまでで、最低限の TinyGo 入門ができました。
以降では、ディスプレイなどを使うサンプルを書いていきます。

Examples

TinyGo の参考になるソースコードは、以下にあります。
マイコン毎にボタンの有無等色々な条件があるため、そのままでは動かないものもあります。
このページでは、 Wio Terminal で動くように修正したサンプルを徐々に公開していく予定です。

Wio Terminal の周辺デバイスを使用する (準備)

Wio Terminal には以下の周辺デバイスがパッケージされています。
先に以下を go get しておいてください。
tinygo.org/x/drivers の場所に github.com/tinygo-org/drivers というような形で go get されます。

$ go get tinygo.org/x/drivers
$ go get tinygo.org/x/tinyfont
$ go get tinygo.org/x/tinydraw

周辺デバイスを使うためにはピンなどの設定名を知る必要があります。
Arduino などとほぼ同じ名前となっていますが、詳細は以下のあたりに記載されています。

image.png

※画像は オフィシャルページ にあるもの

Wio Terminal の周辺デバイスを使用する

以下にてとりあえず使い始めることができます。
Wio Terminal で動かすためには一部変更が必要なものがあります。
URL が github.com/sago35/tinygo-examples/wioterminal になっている分は、 wioterminal で直接動くようにソース修正済みです。
適宜参照してください。

Examples

wioterminal/sample

ボタン類と LED と LIS3DH と MIC と BUZZER と ILI9341 を使った簡単な Demo を作りました。

image.png

  • ① は上部のボタン A ~ C に対応して、押下で赤く光ります
  • ② は十字キーに対応して赤く光ります
    • 十字キー押下で赤く光りつつ音を鳴らします
  • ③ は LIS3DH でとった X および Y 軸の傾きを赤で表示します
    • 上図のようになっていると手前に大きく、左に少し傾いていることを表します
  • WIO_LIGHT (背面) から読み取った AD 値を表示
  • WIO_MIC (左下付近) から読み取った AD 値を表示
  • LIS3DH から読み取った X / Y / Z の値を表示

ソースコードは以下です。
uf2 ファイルも置いているので、 TinyGo の環境が無くても試せます。

build 方法は以下の通りです。

$ git clone https://github.com/sago35/tinygo-examples
$ cd tinygo-examples
$ tinygo build -o app.uf2 -target wioterminal -size short ./wioterminal/sample

困ったときは

port を指定して書き込む

tinygo flash 実行して error: multiple serial ports available - use -port flag というエラーが表示される場合は、 -port オプションを追加する必要があります。
複数のシリアルデバイスの中から tinygo に適切なポートを教えてあげる必要があります。
以下の例の場合は --port COM4 を指定しています。

$ tinygo flash --target wioterminal --size short --port COM4 github.com/tinygo-org/tinygo/src/examples/blinky1
   code    data     bss |   flash     ram
   7516       8    6344 |    7524    6352

COM4 等のシリアルポート名を調べるには デバイス マネージャーポート (COM と LPT) から確認できます。
以下の画像のように複数の選択肢がある部分は、書き込みたい WioTerminal を接続したり外したりしてあたりをつけて tinygo flash してください。

image.png

COM ポートが見つからない場合

COM ポートが見つからない場合は bootloader モードにする必要があるかもしれません。
例えば、実行直後に crash してしまうプログラムを書き込んでしまった場合などは上記の方法では tinygo flash できません。
この場合は、 bootloader モードにすることで復帰できます。
電源ボタンと一体型になっているリセットスイッチを使って、素早く 2 回リセットすることで bootloader に入れます。
※割とシビア (初回リセットから 0.5 秒以内に次のリセットが必要) なので注意

LSP / gopls が使えない

リンク

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
11
Help us understand the problem. What are the problem?