Go言語プログラムをマイコン(MCU)へクロスコンパイルしてくれるTinyGoの動作確認M5Stackで6機種目となりました。Arm、RISC-Vとやってきましたが今回は初のESP32マイコン(Tensillica Xtensa LX6コア)です。コンパイルは問題なし、しかし書き込みに至ってちとトラブリましたです。
※「鳥なき里のマイコン屋」投稿順Indexはこちら
TinyGoのM5Stackに関するドキュメンテーションは以下にあります。
これを読むと、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 に対応させることにしました。当初行った設定は以下のとおり。
-
- プロンプトにTinyGo対応であることを示す文字列追加
- GoとTinyGoのバイナリの在り処へのPATHの追加
- 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上で単体で動作させれば問題なく動作します。)
困ったらググれば何でも分かる今日この頃なので(そのせいで問題解決力が落ちている気がします。解決したのだし、まあいいか、という感じ)ググって以下のページを発見いたしました。ありがとうございます。
読んでビックリ。なんと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インタプリタそのものを内部に含むのだと思います。オブジェクトがデカイです。
書き込み成功、そして実行
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上ならこういう問題は起きないか?