はじめる(環境構築・書き込み)
このページのゴールは、TinyGo を導入して M5StickC Plus2 に最初のプログラム(LED点滅)を書き込むところまで、迷わずたどり着くことです。インストールの細かい手順は公式に譲り、ここでは全体の流れと、実機で実際にハマったつまずきポイントを重点的にまとめます。
対象環境: macOS(Apple Silicon)。コマンドは Homebrew 前提です。
必要なもの
- M5StickC Plus2(ESP32-PICO-V3-02 / Xtensa 系 ESP32)
- USB-C ケーブル(データ通信対応のもの)
- macOS + Homebrew
1. ツールチェーンの導入
TinyGo 本体と、ESP32 への書き込みに使う esptool を入れます。
brew tap tinygo-org/tools
brew install tinygo esptool導入できたら確認:
tinygo version # => tinygo version 0.41.x ...
esptool version # => 5.xPATH に注意(Apple Silicon)
Homebrew は /opt/homebrew/bin に入ります。tinygo: command not found になる場合は、シェルの設定(~/.zprofile など)で PATH に /opt/homebrew/bin が通っているか確認してください。
- 公式インストールガイド: TinyGo / macOS
- 概要: Getting Started
2. デバイスの接続とポート確認
M5StickC Plus2 を USB-C で接続し、シリアルポートを確認します。
ls /dev/cu.*
# 例: /dev/cu.wchusbserial58FA0591591M5StickC Plus2 は WCH 製の USB シリアルチップを使っているため、cu.wchusbserial… という名前で現れます(macOS には標準でドライバが入っており、追加導入は通常不要)。
ポートが見えないとき
ケーブルがデータ通信対応か確認してください(充電専用ケーブルだと認識されません)。それでも出ない場合は WCH のドライバ導入を検討します。
3. 最初の書き込み(Lチカ)
このリポジトリでは、ビルド・書き込みを Makefile に集約しています。tinygo を直接叩く必要はありません。
make list # projects/ の一覧を表示
make flash PROJ=01-blink # ビルドして書き込み(ポートは自動検出)うまくいくと本体の赤色 LED が点滅します。これでツールチェーンから実機までの経路が通ったことの確認になります。
ポートを明示したい場合:
make flash PROJ=01-blink PORT=/dev/cu.wchusbserial58FA0591591書き込み時に出る警告・初回エラーについて
unable to read security info: ... timeout waiting for response to SLIP readは、Xtensa 版 ESP32 で出る既知の無害な警告です。書き込みは続行されます。- 初回に
open serial port ...: no such file or directory(ポート消失)が出ることがあります。USB の再列挙による一過性のことが多く、もう一度同じコマンドを実行すれば通ります。
ビルドターゲットについて
TinyGo には M5StickC Plus2 専用のターゲットが存在しません。そこで汎用の ESP32 ターゲット esp32-coreboard-v2 を使い、ピンの割り当てはコード側で指定しています(Makefile の既定値が TARGET=esp32-coreboard-v2)。
ピン配置(M5StickC Plus2)
| 機能 | ピン | メモ |
|---|---|---|
| 赤色 LED | GPIO19 | IR エミッタと共用 |
| 電源保持 (HOLD) | GPIO4 | バッテリ駆動時に HIGH 保持で電源維持 |
| ボタン A(正面の大ボタン) | GPIO37 | 押下=LOW(入力専用ピン) |
| ボタン B(側面) | GPIO39 | 押下=LOW(入力専用ピン) |
| ボタン C(電源) | GPIO35 | |
| ブザー(パッシブ) | GPIO2 | |
| 表示 SCLK | GPIO13 | SPI2 |
| 表示 MOSI | GPIO15 | SPI2 |
| 表示 RST | GPIO12 | |
| 表示 DC | GPIO14 | |
| 表示 CS | GPIO5 | |
| 表示 バックライト (BL) | GPIO27 |
これらは共通パッケージ pkg/m5stickc に定数として定義済みです。
つまずきポイント(重要)
実機で動かして分かった、TinyGo + M5StickC Plus2 特有の注意点です。
表示器 (ST7789V2) の向きとオフセット
1.14" 135×240 パネルは GRAM の原点からずれて実装されています。ところが TinyGo の st7789 ドライバ(v0.35.0)は Rotation0 のとき RowOffset/ColumnOffset を 0 に潰す実装になっており、そのままだと表示が左にずれます。
検証済みの正しい設定は Rotation180 + ColumnOffset: 53 + RowOffset: 40 です(ColumnOffset は 52 だと左端に 1px 残るため 53)。ただし Rotation180 単体だと USB-C を上にして持つ必要があり、ボタンの物理位置と向きが噛み合いません。
そこで pkg/m5stickc の NewDisplay() は、この設定を内部に持ちつつ論理座標を反転して「自然な向き」を提供するラッパ Display を返します。これにより USB-C を下にした自然な持ち方で、左上原点・文字も正立で扱えます(ゲームの操作感も自然になります)。低レベルにドライバを直接使う projects/02-display などは raw な Rotation180(USB-C 上)のままで、この挙動の違いを示しています。
ブザーは PWM が使えない
TinyGo の Xtensa 版 ESP32 は PWM(LEDC) 未対応です。そのため PWM を前提とする tinygo.org/x/drivers/tone は使えません。本リポジトリでは GPIO をソフトでトグルして矩形波を作る方式(pkg/m5stickc の Buzzer.Tone)で音を鳴らしています。
ボタンは active-low / 入力専用ピン
ボタンに使う GPIO34〜39 は入力専用で内部プルアップがありません。基板側に外部プルアップがあるため PinInput で読めます。押下時は LOW になるので、pkg/m5stickc の Button.Pressed() は反転して「押されていれば true」を返します。
WiFi / BLE は使えない
Xtensa 版 ESP32 の無線は、現時点の TinyGo では非対応です(無線対応は ESP32-C3 / S3 のみ)。本リポジトリのチュートリアルとゲームでは無線を使わないため影響はありません。
共通パッケージを使う
新しいプログラムでは、検証済みの設定が入った pkg/m5stickc を再利用できます。
package main
import (
"image/color"
"github.com/kamitsui/tinygo-m5stick/pkg/m5stickc"
)
func main() {
m5stickc.HoldPower() // 電源保持
display := m5stickc.NewDisplay() // 表示器(向き・オフセット設定済み)
display.FillScreen(color.RGBA{0, 0, 0, 255})
buzzer := m5stickc.NewBuzzer(m5stickc.BuzzerPin)
buzzer.Tone(m5stickc.NoteC5, 200) // ド を 200ms
btnA := m5stickc.NewButton(m5stickc.ButtonAPin)
_ = btnA.Pressed() // 押されていれば true
}次のステップ
- サンプルを一通り試す:
01-blink(LED)→02-display(表示器)→03-buzzer(音)→04-button(入力)→05-m5lib-demo(共通パッケージのデモ) - TinyGo とは で TinyGo の背景を知る
- ソースと進行状況: GitHub リポジトリ