SNSへはこちら

マイコンでTinyGo

C や C++ だけじゃつまらない!ということで、過去に Nim や D 言語、Rust でLチカをしたことがありました。
そこで今回は TinyGo を使うと、マイコンで Go 言語が楽しめるということなので、試してみた次第です。実は以前に Go 言語をマイコンで出来ないか、と思ったことがありましたが、GC の関係で無理じゃないかと断念した事がありました。

今回は、Go 言語が TinyGo のお陰でできるようになったよ!という記事でお送りします。

TinyGoとは

本家の Go 言語を組込み向けに対応させたサブセットのようです。そうそう、確か GC の関係で以前はマイコンに向かない!ということで挑戦を断念したのでした。
各種設定ファイルや HAL を記述しておくことで(これがつらいが)、LLVM に対応しているアーキテクチャなら、Go 言語で組込みプログラミングをすることが出来ます。

インストール

Homebrew だと簡単にできます。

$ brew tap tinygo-org/tools
$ brew install tinygo

サンプルコードの所在

インストールは実行バイナリだけではなく、サンプルコードも同時にインストールされています。場所は /usr/local/Cellar/tinygo/バージョン名/src/examples です。

$ ls /usr/local/Cellar/tinygo/0.13.1/src/examples
adc/      blinky2/  echo/         mcp3008/         serial/   wasm/
blinkm/   button/   gba-display/  microbit-blink/  systick/
blinky1/  button2/  i2s/          pwm/             test/

おお、いかにもマイコンで動かしてほしそうなサンプルプロジェクトがありますね。

PCで動かしてみよう

Go 言語のサブセットだけあって、当然(?) PC 上でも動かせます。

$ cd /usr/local/Cellar/tinygo/0.13.1/src/examples
$ tinygo run test
build command-line-arguments: cannot find package "test" in any of:
    /usr/local/Cellar/go/1.14.2_1/libexec/src/test (from $GOROOT)
    /Users/yuki/.go/src/test (from $GOPATH)

え??

どうやら、フルパスとかで示さなければならないようですねぇ。

$ tinygo run ./test
Hello world from Go!
The answer is: 42
5 ** 2 = 25
3 + 12 = 15
fib(11) = 89
sumrange(100) = 5050
...

こんな感じで出力されれば、ビルド及び実行に成功しています。
詳しい文法はディレクトリ内のソースファイルを見て、Go 言語の勉強をしてください。僕もほとんど知らないので、今後勉強します。

お手軽にArduinoで

実行してみましょう。どうやら Arduino Uno を意図しているようですが、「変わらんやろ」と手元の Arduino Nano で試します。

$ tinygo flash -target=arduino ./blinky1/

avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.01s

avrdude: 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 "/var/folders/7j/4hbr695j0673v70p4rnl_tx40000gn/T/tinygo775921198/main.hex"
avrdude: writing flash (558 bytes):

Writing | ################################################## | 100% 0.24s

avrdude: 558 bytes of flash written
avrdude: verifying flash memory against /var/folders/7j/4hbr695j0673v70p4rnl_tx40000gn/T/tinygo775921198/main.hex:
avrdude: load data flash data from input file /var/folders/7j/4hbr695j0673v70p4rnl_tx40000gn/T/tinygo775921198/main.hex:
avrdude: input file /var/folders/7j/4hbr695j0673v70p4rnl_tx40000gn/T/tinygo775921198/main.hex contains 558 bytes
avrdude: reading on-chip flash data:

Reading | ################################################## | 100% 0.21s

avrdude: verifying ...
avrdude: 558 bytes of flash verified

avrdude done.  Thank you.

予めインストールしてあった avr-gccavrdude を上手く利用しているようです。すんなりと書き込みされてますね。1秒間に1回のペースでチカチカしていたらOK.
ビルドされたファイルは一時フォルダに出力されているよう。

はい

っていうお気持ちですね。要は用意された環境で、用意されたライブラリを動かしているだけなのでなんか味気ないですね。
では自分の好みのターゲットで動かすにはどうするのかということを主眼に環境構築を進めていきたいと思います。