この記事は
Go Advent Calendar 2024 の一日目の記事です。
TinyGo は Go 言語のサブセットで、組み込み用途や、WASM ビルドに用いられています。
この記事では、TinyGo をはじめて触る Gophers に TinyGo のインストールから、L チカまで紹介します。Go 言語の延長で組み込み開発ができるのは、めちゃ楽しいので、ぜひ TinyGo おすすめです。
本記事は sago さんへのトリビュート記事です
Wio Terminal で TinyGo プログラミングを始めよう -- @sago35
ところで TinyGo Keeb Tour とは
TinyGo Keeb Tour というイベントを各地で開催しています。前半で、自作キーボードのはんだ付けを行い、後半で作った自作キーボードを TinyGo で制御するハンズオンを行います。2024 年は、神戸、東京、仙台、福岡で開催しました!2025 年は、香川県高松市を皮切りに、全国を Tour しますー!
TinyGo Keeb Tour よみものたち
TinyGo とは
組み込みと Wasm 用途向けの Go 言語サブセットです。
Offisial site
TinyGo Repository
TinyGo がサポートしているマイコンたち
TinyGo Supported microcontroller board - Official site
TinyGo Keeb では RP2040-Zero ボードを使用しています。
TinyGo のインストール
すでに Go 1.23 以降がインストールされている前提です
TinyGo では Go の最新のバージョンと一つ前のバージョンがサポートされています
Windows
-
TinyGo Relasesのページから Windows 向けの Zip をダウンロードします
- 2024/12/01 時点での最新版は 0.34.0 です
- tinygo0.34.0.windows-amd64.zip
- Zip を伸展します
- 例えば
C:\
直下
- 例えば
- TinyGo のフォルダを環境変数
PATH
へ設定します - スタート > 検索ボックスに
cmd
と入力し、コマンドプロンプトを起動します -
$ tinygo version
t入力し、バージョンが表示されればインストール完了です
macOS
- Homebrew でインストール可能です
$ brew tap tinygo-org/tools
$ brew install tinygo
Linux
x86_64, Ubuntu/Debian の場合を記載します
$ wget https://github.com/tinygo-org/tinygo/releases/download/v0.34.0/tinygo_0.34.0_amd64.deb
$ sudo dpkg -i tinygo_0.34.0_amd64.deb
また、tinygo flash
, tinygo monitor
などのコマンド実行には、デバイスファイルを動的に管理するデーモン udev のルールを作成する必要があります
RP2040を例にします。
echo "ATTRS{idVendor}=='2e8a', ATTRS{idProduct}=='[01]*', MODE:='0666', ENV{ID_MM_DEVICE_IGNORE}='1', ENV{ID_MM_PORT_IGNORE}='1'" | sudo tee /etc/udev/rules.d/99-rp2040-udev.rules
tinygo version の実行
各 OS でターミナルを開いて $ tinygo version
を実行し、下記のような表示になればインストール完了です。
$ tinygo version
tinygo 0.35.0-dev-3b806217 linux/amd64 (using go version go1.23.2 and LLVM version 18.1.2)
サンプルファイルの在処
TinyGo にはサンプルファイルが同梱されています
いろいろあって楽しそうですね!
$ tinygo env TINYGOROOT
でtinygo
を配置したファイルパスが取得できます!
# Windows
$ for /F "tokens=*" %x in ('tinygo env TINYGOROOT') do dir %x\src\examples
# Ubuntu/Debian
$ ls $(tinygo env TINYGOROOT)/src/examples
今回は TinyGo Keeb Tour のリポジトリから
01_blinky1/main.go こちらを参考に進めます
Ubuntu/Debian を例にすすめますー
package main
import (
"image/color"
"machine"
"time"
pio "github.com/tinygo-org/pio/rp2-pio"
"github.com/tinygo-org/pio/rp2-pio/piolib"
)
type WS2812B struct {
Pin machine.Pin
ws *piolib.WS2812B
}
func NewWS2812B(pin machine.Pin) *WS2812B {
s, _ := pio.PIO0.ClaimStateMachine()
ws, _ := piolib.NewWS2812B(s, pin)
return &WS2812B{
ws: ws,
}
}
func (ws *WS2812B) PutColor(c color.Color) {
ws.ws.PutColor(c)
}
var (
white = color.RGBA{R: 0x20, G: 0x20, B: 0x20, A: 0x00}
black = color.RGBA{R: 0x00, G: 0x00, B: 0x00, A: 0x00}
)
func main() {
ws := NewWS2812B(machine.GPIO16)
ws.PutColor(white)
for {
time.Sleep(time.Millisecond * 500)
ws.PutColor(black)
time.Sleep(time.Millisecond * 500)
ws.PutColor(white)
}
}
この内容を作業ディレクトリにコピーして、RP2040-Zero ボードに書き込んでみます
- RP2040-Zero とPCをUSB Type-cケーブルで接続します
- RP2040-Zero の "Boot" と "Reset" ボタンを同時押しして、ブートローダにはいります
- USBマスストレージとして認識されていることを確認します
$ ls /media/$(whoami)
-
01_blinky1
というディレクトリを作成します$ mkdir /path/to/your/working/directory/01_blinky1
-
$ go mod init 01_blinky1 && go mod tidy
を実行します - 上記の内容の
main.go
ファイルを作成し内容をコピーします$ touch /path/to/your/working/directory/01_blinky1/main.go
$ vim /path/to/your/working/directory/01_blinky1/main.go
- 以下のコマンドを実行します
$ tinygo flash --target waveshare-rp2040-zero --size short ./01_blinky1
実行結果は、こんな感じです。
(写真がのるよ)
おわりに
TinyGo で組み込み開発の入口を体験していただきました。
TinyGo Keeb Tour 2025 へのご参加もぜひご検討ください!
ex-twitter で #tinygo_keeb のハッシュタグで検索していただくと、いろいろな作例を見ていただけます。
各地での開催情報は、TinyGo Keeb Tour のページでご確認いただけますー!
どっとはらい