M5StickC Plus (ESP32) とTinyGoでLチカ


はじめに

最近、仕事でGO使ってて、趣味ではESP32を使ってるので、TinyGoでESP32をプログラミングしたくなってきた。ということで、Lチカすることにした。

環境

macOS Big Sur Ver 11.1

インストール

TinyGo

tinygoは、ここを参考にして、インストールした。
macOS :: TinyGo - Go on Microcontrollers and WASM

いろいろ書かれてるけど、これだけで動くはず。

brew tap tinygo-org/tools
brew install tinygo

ESP32のためのツール群

これにしたがって下記ツールを入れた。

ESP32 - mini32 :: TinyGo - Go on Microcontrollers and WASM

  • pyserial
  • Espressif toolchain
  • esptool

コマンド的にはここらを実行した。pipとかpyserialはすでに入ってた気がする。

sudo easy_install pip
sudo pip install pyserial
mkdir -p ~/esp
cd ~/esp
tar -xzf ~/Downloads/xtensa-esp32-elf-osx-1.22.0-80-g6c4433a-5.2.0.tar.gz

PATHも追加した。

.zshrc
export PATH="$PATH:$HOME/esp/xtensa-esp32-elf/bin"

Lチカ

みんな大好きLチカ

コード

これを真似させてもらった。
GitHub - tinygo-org/tinygo: Go compiler for small places. Microcontrollers, WebAssembly, and command-line tools. Based on LLVM.

M5StickC Plusの組み込みLEDのPINが10なので、そこだけ修正した。

blink.go
package main

import (
    "machine"
    "time"
)

func main() {
    led := machine.Pin(10)
    led.Configure(machine.PinConfig{Mode: machine.PinOutput})

    for {
        led.Low()
        time.Sleep(time.Millisecond * 1000)
        led.High()
        time.Sleep(time.Millisecond * 1000)
    }
}

書き込み

こんな感じでコンパイルして書き込めた。USBのポートを指定しなくても探してくれるみたい。
終わるのがむちゃくちゃ速い。ちゃんと書き込めたか不安になる。かかったの4秒くらい。Arduino環境だと、3倍くらいはかかってる気がする。

ちなみに、複数あったらどうなるんやろう?

~/p/tinygo ❯❯❯ tinygo flash -target=esp32-mini32 blink.go
esptool.py v3.0
Serial port /dev/cu.usbserial-xxx
Connecting....
Chip is ESP32-PICO-D4 (revision 1)
Features: WiFi, BT, Dual Core, 240MHz, Embedded Flash, VRef calibration in efuse, Coding Scheme None
Crystal is 40MHz
MAC: xxxx
Uploading stub...
Running stub...
Stub running...
Configuring flash size...
Flash params set to 0x030f
Compressed 3072 bytes to 2396...
Wrote 3072 bytes (2396 compressed) at 0x00001000 in 0.2 seconds (effective 111.7 kbit/s)...
Hash of data verified.

Leaving...
Hard resetting via RTS pin...

指定するときはこんな感じ。

# tinygo flash -target=esp32-mini32 -port=/dev/tty.usbserial-E9526A3192 blink.go

動き

特に何の変哲もないLチカだけども。

シリアル通信(UART)

シリアル通信(UART)もできるみたい。println()で送信。ついでに確かめた。

コード

package main

import "time"

func main() {
    for {
        println("hello world!")
        time.Sleep(time.Second)
    }
}

動作

下記コマンドで接続。
デフォルト115200bpsで接続してるみたい。

~ ❯❯❯ screen /dev/tty.usbserial-E9526A3192 115200

おわりに

Lチカすんなりできてよかった。
コンパイルと書き込み速度がとんでもなく速い。Lチカだけやから?にしても速い。衝撃。

APPENDIX

ESP32の対応(2021/03/17現在)

ちょっとしか対応できてないみたい。。。もっと使うには、自分も貢献すべきか。。。

ここ参照。
ESP32 - mini32 :: TinyGo - Go on Microcontrollers and WASM