TinyGoって?
Go compiler for small places. Microcontrollers, WebAssembly, and command-line tools. Based on LLVM.
LLVMをベースとしたマイコン、WebAssembly、CLI向けのGoコンパイラ。
TinyGoの長所・短所
いいところ
- Goの最適化とLLVMの最適化の両方を受けることができる
- Cで書かれたコード資産をCGO経由で再利用できる
- AVR系のマイコンを除きGCを持っているのでメモリ管理がラク
もうちょっとなところ
- LLVMバックエンドが大きい
- goroutineがホンモノじゃない (LLVMのcoroutineに変換される)
encoding/json
が動かない
TinyGoでLチカ (LEDチカチカ)
なにをするの?
TinyGoでコードを書いて、Arduino UnoのLEDをチカチカさせてみよう
どんなコードを書くの?
package main import ( "machine" "time" ) func main() { led := machine.LED led.Configure(machine.PinConfig{Mode: machine.PinOutput}) for { led.Low() time.Sleep(time.Millisecond * 1000) led.High() time.Sleep(time.Millisecond * 1000) } }
TinyGoでサーボモータを動かす
なにをするの?
TinyGoでコードを書いて、Arduino Unoに接続されたサーボモータを動かしてみよう
どんなコードを書くの?
package main import ( "machine" "time" ) const ( waitMilliSec = 100 * time.Millisecond ) func main() { machine.InitPWM() servo := machine.PWM{Pin: 5} servo.Configure() var pwmValue uint8 = 0 for { if pwmValue < 0 || 255 < pwmValue { pwmValue = 0 } else { pwmValue = pwmValue + 10 } servo.Set(uint16(pwmValue) << 8) time.Sleep(waitMilliSec) } }
まとめ
TinyGoはGoと全く同じ書き方でマイコン用コードを書くことができた。 TinyGoはArduinoとの統合を発表しており、これからますます機能の拡充がされていく模様。 マイコン用言語の第一歩がC/C++からTinyGoに置き換わる時代がくるかもしれない。