飛ばねぇ馬はただの馬。

Life is too short for bad code.

TinyGoを触ってみよう!

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に置き換わる時代がくるかもしれない。