TinyGo のインストールから L チカまで

# この記事は
Go Advent Calendar 2024 の一日目の記事です。
TinyGo は Go 言語のサブセットで、組み込み用途や、WASM ビルドに用いられています。
この記事では、TinyGo をはじめて触る Gophers に TinyGo のインストールから、L チカまで紹介します。Go 言語の延長で組み込み開発ができるのは、めちゃ楽しいので、ぜひ TinyGo おすすめです。

本記事は sago さんへのトリビュート記事です
[Wio Terminal で TinyGo プログラミングを始めよう -- @sago35](https://qiita.com/sago35/items/92b22e8cbbf99d0cd3ef#tinygo-%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)

##  ところで TinyGo Keeb Tour とは
TinyGo Keeb Tour というイベントを各地で開催しています。前半で、自作キーボードのはんだ付けを行い、後半で作った自作キーボードを TinyGo で制御するハンズオンを行います。2024 年は、神戸、東京、仙台、福岡で開催しました！2025 年は、香川県高松市を皮切りに、全国を Tour しますー！

## TinyGo Keeb Tour よみものたち
- [TinyGo Keeb Tour 2024 というイベントの紹介 - sago さんの記事](https://sago35.hatenablog.com/entry/2024/10/29/095629)
- [はたらきながら◯◯する - micchie さんの書籍](https://techbookfest.org/product/deGyLTL1gYU0cDmW5fr7TB)
- (まだふえるよ)

# TinyGo とは
組み込みと Wasm 用途向けの Go 言語サブセットです。
[Offisial site](https://tinygo.org/)
[TinyGo Repository](https://github.com/tinygo-org/tinygo)

## TinyGo がサポートしているマイコンたち
[TinyGo Supported microcontroller board  - Official site](https://tinygo.org/docs/reference/microcontrollers/)
TinyGo Keeb では RP2040-Zero ボードを使用しています。


# TinyGo のインストール
すでに Go 1.23 以降がインストールされている前提です
TinyGo では Go の最新のバージョンと一つ前のバージョンがサポートされています

## Windows
1. [TinyGo Relases](https://github.com/tinygo-org/tinygo/releases)のページから Windows 向けの Zip をダウンロードします
    - 2024/12/01 時点での最新版は 0.34.0 です
    - [tinygo0.34.0.windows-amd64.zip](https://github.com/tinygo-org/tinygo/releases/download/v0.34.0/tinygo0.34.0.windows-amd64.zip)
1. Zip を伸展します
    - 例えば `C:\` 直下
1. TinyGo のフォルダを環境変数 `PATH` へ設定します
    - スタート > 検索ボックスに "環境変数" と入力します
    - "システム環境変数の編集" が候補として表示されるので、クリックします
    - "環境変数(N)..." をクリックします
    - <img src='https://i.gyazo.com/528235440dc611163e90297835e041ff.png' width='500px'> 
    - "Path" を選択し、"編集" をクリックします
    - "新規" をクリックし、`C:\tinygo\bin` を入力し "OK" をクリックします 
    - <img src='https://i.gyazo.com/30e0772a1ad4b7670d47d7e7227dc708.png' width='500px'>
1. スタート > 検索ボックスに `cmd` と入力し、コマンドプロンプトを起動します
1. `$ tinygo version` ｔ入力し、バージョンが表示されればインストール完了です

## macOS
1. 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` を実行し、下記のような表示になればインストール完了です。


```sh
$ 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](https://github.com/sago35/tinygo_keeb_workshop_2024/blob/main/01_blinky1/main.go) こちらを参考に進めます

Ubuntu/Debian を例にすすめますー

```go
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 ボードに書き込んでみます

1. RP2040-Zero とPCをUSB Type-cケーブルで接続します
1. RP2040-Zero の "Boot" と "Reset" ボタンを同時押しして、ブートローダにはいります
    - <img src='https://i.gyazo.com/5b920f8ddaff2ba5c1037c436b1045fc.jpg' width='500px'>
1. USBマスストレージとして認識されていることを確認します


```sh
$ ls /media/$(whoami)
```


1. `01_blinky1` というディレクトリを作成します
    - `$ mkdir /path/to/your/working/directory/01_blinky1`
1. `$ go mod init 01_blinky1 && go mod tidy` を実行します
1. 上記の内容の `main.go` ファイルを作成し内容をコピーします
    - `$ touch /path/to/your/working/directory/01_blinky1/main.go`
    - `$ vim /path/to/your/working/directory/01_blinky1/main.go`
1. 以下のコマンドを実行します


```sh
$ tinygo flash --target waveshare-rp2040-zero --size short ./01_blinky1
```

実行結果は、こんな感じです。

(写真がのるよ)


# おわりに

TinyGo で組み込み開発の入口を体験していただきました。
TinyGo Keeb Tour 2025 へのご参加もぜひご検討ください！

ex-twitter で [#tinygo_keeb](https://x.com/search?q=%23tinygo_keeb&src=typed_query&f=top) のハッシュタグで検索していただくと、いろいろな作例を見ていただけます。

各地での開催情報は、[TinyGo Keeb Tour](https://tinygo-keeb.connpass.com/) のページでご確認いただけますー！

どっとはらい