鳥なき里のマイコン屋(157) M5StackでもGo!TinyGoで6機種目

Joseph Halfmoon

Go言語プログラムをマイコン(MCU)へクロスコンパイルしてくれるTinyGoの動作確認M5Stackで6機種目となりました。Arm、RISC-Vとやってきましたが今回は初のESP32マイコン(Tensillica Xtensa LX6コア)です。コンパイルは問題なし、しかし書き込みに至ってちとトラブリましたです。

TinyGoのM5Stackに関するドキュメンテーションは以下にあります。

M5Stack | TinyGo

これを読むと、M5Stack用にGoソースをクロスコンパイルしてオブジェクトをFlashに書き込むために以下の2つが必要なようです。

    • ESP32用のツールチェーンを含むESP-IDF
    • Flash書き込みツール esptool.py

手元のWindowsPCには、以下のバージョンのESP-IDFをインストール済で時々ESP32搭載ボード向けに使用中です。インストールフォルダ内には「Pythonスクリプトの」esptool.py もありでした。

ESP-IDF 4.3

ESP-IDFのGitHubはココです。そこにあるESP-IDFのバージョン毎のライフサイクルを眺めると、最新版は4.4みたいですが、4.3も2023年頃までメンテされるみたいなのでOKかと。ESP-IDFはPython依存?のツールチェーンで、CLIで使うときは、idf.py というPythonスクリプトのツール1本でビルド、フラッシュ書き込みなど皆できます。そのコマンドライン環境として、cmd.exe版と、PowerShell版がインストール済です。今回はcmd.exe版の設定用のBATCHファイルをチョイ変して TinyGo に対応させることにしました。当初行った設定は以下のとおり。

    1. プロンプトにTinyGo対応であることを示す文字列追加
    2. GoとTinyGoのバイナリの在り処へのPATHの追加
    3. esptool.py の在り処もPATHに含める <==後でココが問題になったので外した

ESP-IDF環境に乗っかる感じで、TinyGoを使えるようにしたわけです。

実験用の吉例Lチカコード

M5Stackに書き込むオブジェクトとしては「いつもの」Lチカコードです。接続は、M5Stackの右側面のピンソケットから

    • 電流制限抵抗とLED直列の回路の電源に3.3V電源を接続
    • IO3番端子を上記直列回路のLEDのカソードに接続

としました。IO3番にしたのは、3.3V電源がとれる右側のピンソケットの中で一番端にあるからです。他意はありません。

ソースが以下に。

package main

import (
    "machine"
    "time"
)

func main() {
    led := machine.IO3
    led.Configure(machine.PinConfig{Mode: machine.PinOutput})
    for {
        led.Low()
        time.Sleep(time.Millisecond * 500)

        led.High()
        time.Sleep(time.Millisecond * 500)
    }
}
ビルドは出来たのだけれど flash書き込みでフェイル

上記ソースのビルドはノーエラーで出来るのですが、flash書き込みで落ちます。こんな感じ。not a valid Win32 application とか言われても esptool.py はPythonのスクリプトだぜ。

$ tinygo flash -target=m5stack m5stack_blink.go
error: failed to flash ~Tempパス~\tinygo3525915197\main.bin: fork/exec ~esp-idfパス~\components\esptool_py\esptool\esptool.py: %1 is not a valid Win32 application.

手元のESP-IDF環境では、Pythonスクリプトである esptool.py はPATHの通ったフォルダには配置されておらず、CMD.EXE用CLI環境では alias(DOSKEY)でパスを与えて起動できるようになってます。いちおう以下のPythonスクリプトのあるフォルダをPATHに含めたのですが、どうもこいつが起動できないでいるみたいです(勿論CMD.EXE上で単体で動作させれば問題なく動作します。)PythonEsptools

困ったらググれば何でも分かる今日この頃なので(そのせいで問題解決力が落ちている気がします。解決したのだし、まあいいか、という感じ)ググって以下のページを発見いたしました。ありがとうございます。

ESP32 向けに TinyGo をセットアップする

読んでビックリ。なんとWindows上では、EXE化された版のesptool.pyを以下のようなファイル名にリネームしてPATHの通ったフォルダに配置せよと。

esptool.py.exe

どうも tinygo は Windows上でesptool.py という名のファイルを起動しようとするのだけれど、それはEXE形式でないとダメなようです。上記ページを読ませていただいてようやく腑におちました。PythonスクリプトのEXE化ツールはいくつもあるようですが自分でEXE化する必要はありませぬ。espressif/esptool のGithubからバイナリがダウンロードできました。解凍後、上の方のPythonスクリプトに対応する exe ファイル群が得られます。PythonのEXE化はGo言語のコンパイルとは違って、Pythonインタプリタそのものを内部に含むのだと思います。オブジェクトがデカイです。ExeEsptools

書き込み成功、そして実行

esptoolさえ起動できるようになってしまえば、後は簡単、M5StackをUSBポートに接続しておいてコマンド1発で書き込み成功しました。こんな感じ。

$ tinygo flash -target=m5stack m5stack_blink.go
esptool.py v4.0
Serial port COM10
Connecting......
Chip is ESP32-D0WDQ6 (revision 1)
Features: WiFi, BT, Dual Core, 240MHz, VRef calibration in efuse, Coding Scheme None
Crystal is 40MHz
MAC: a4:cf:12:44:60:fc
Uploading stub...
Running stub...
Stub running...
Configuring flash size...
Flash will be erased from 0x00001000 to 0x00001fff...
Warning: Image file at 0x1000 is protected with a hash checksum, so not changing the flash mode setting. Use the --flash_mode=keep option instead of --flash_mode=dout in order to remove this warning
Compressed 3136 bytes to 2356...
Wrote 3136 bytes (2356 compressed) at 0x00001000 in 0.3 seconds (effective 93.7 kbit/s)...
Hash of data verified.

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

WindowsPCには複数のUSBシリアルが接続してあるので、その中からM5Stackをちゃんと見つけられるかな、と心配しましたが全く問題なしでした。

フラッシュ書き込み後、吉例Lチカしております。しかしな~ esptool.py.exe は予想外だったな。。。Linux上ならこういう問題は起きないか?

鳥なき里のマイコン屋(156) Wio TerminalでもGo!TinyGoで5機種目 へ戻る