Skip to content

はじめる(環境構築・書き込み)

このページのゴールは、TinyGo を導入して M5StickC Plus2 に最初のプログラム(LED点滅)を書き込むところまで、迷わずたどり着くことです。インストールの細かい手順は公式に譲り、ここでは全体の流れと、実機で実際にハマったつまずきポイントを重点的にまとめます。

対象環境: macOS(Apple Silicon)。コマンドは Homebrew 前提です。

必要なもの

  • M5StickC Plus2(ESP32-PICO-V3-02 / Xtensa 系 ESP32)
  • USB-C ケーブル(データ通信対応のもの)
  • macOS + Homebrew

1. ツールチェーンの導入

TinyGo 本体と、ESP32 への書き込みに使う esptool を入れます。

bash
brew tap tinygo-org/tools
brew install tinygo esptool

導入できたら確認:

bash
tinygo version   # => tinygo version 0.41.x ...
esptool version  # => 5.x

PATH に注意(Apple Silicon)

Homebrew は /opt/homebrew/bin に入ります。tinygo: command not found になる場合は、シェルの設定(~/.zprofile など)で PATH に /opt/homebrew/bin が通っているか確認してください。

2. デバイスの接続とポート確認

M5StickC Plus2 を USB-C で接続し、シリアルポートを確認します。

bash
ls /dev/cu.*
# 例: /dev/cu.wchusbserial58FA0591591

M5StickC Plus2 は WCH 製の USB シリアルチップを使っているため、cu.wchusbserial… という名前で現れます(macOS には標準でドライバが入っており、追加導入は通常不要)。

ポートが見えないとき

ケーブルがデータ通信対応か確認してください(充電専用ケーブルだと認識されません)。それでも出ない場合は WCH のドライバ導入を検討します。

3. 最初の書き込み(Lチカ)

このリポジトリでは、ビルド・書き込みを Makefile に集約しています。tinygo を直接叩く必要はありません。

bash
make list                 # projects/ の一覧を表示
make flash PROJ=01-blink  # ビルドして書き込み(ポートは自動検出)

うまくいくと本体の赤色 LED が点滅します。これでツールチェーンから実機までの経路が通ったことの確認になります。

ポートを明示したい場合:

bash
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)

機能ピンメモ
赤色 LEDGPIO19IR エミッタと共用
電源保持 (HOLD)GPIO4バッテリ駆動時に HIGH 保持で電源維持
ボタン A(正面の大ボタン)GPIO37押下=LOW(入力専用ピン)
ボタン B(側面)GPIO39押下=LOW(入力専用ピン)
ボタン C(電源)GPIO35
ブザー(パッシブ)GPIO2
表示 SCLKGPIO13SPI2
表示 MOSIGPIO15SPI2
表示 RSTGPIO12
表示 DCGPIO14
表示 CSGPIO5
表示 バックライト (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/m5stickcNewDisplay() は、この設定を内部に持ちつつ論理座標を反転して「自然な向き」を提供するラッパ Display を返します。これにより USB-C を下にした自然な持ち方で、左上原点・文字も正立で扱えます(ゲームの操作感も自然になります)。低レベルにドライバを直接使う projects/02-display などは raw な Rotation180(USB-C 上)のままで、この挙動の違いを示しています。

ブザーは PWM が使えない

TinyGo の Xtensa 版 ESP32 は PWM(LEDC) 未対応です。そのため PWM を前提とする tinygo.org/x/drivers/tone は使えません。本リポジトリでは GPIO をソフトでトグルして矩形波を作る方式(pkg/m5stickcBuzzer.Tone)で音を鳴らしています。

ボタンは active-low / 入力専用ピン

ボタンに使う GPIO34〜39 は入力専用で内部プルアップがありません。基板側に外部プルアップがあるため PinInput で読めます。押下時は LOW になるので、pkg/m5stickcButton.Pressed() は反転して「押されていれば true」を返します。

WiFi / BLE は使えない

Xtensa 版 ESP32 の無線は、現時点の TinyGo では非対応です(無線対応は ESP32-C3 / S3 のみ)。本リポジトリのチュートリアルとゲームでは無線を使わないため影響はありません。

共通パッケージを使う

新しいプログラムでは、検証済みの設定が入った pkg/m5stickc を再利用できます。

go
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 リポジトリ

参考リンク

Released under the MIT License.