概要
M5Stack Core2は通常のESP32 for Arduino環境ではなく、M5Stack独自のArduino環境を準備しています。こちらの環境差異を調べてみました。
ESP32 for Arduinoとは
- https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json
Arduino IDEの追加のボードマネージャーに上記URLを入れることによって利用できる環境です。一般的なESP32ボードの定義とESP32開発環境一式が入手できます。
開発可能ボード
- 一般的なESP32ボード(ESP32 Dev Moduleなど)
- TTGOなどの他社製ボード
- M5Stack Core(BASIC, GRAY)
- M5Stack Fire
- M5StickC
一般的にはこちらの開発可能ボードから選択して開発を行います。
M5Stack Arduinoとは?
- https://m5stack.oss-cn-shenzhen.aliyuncs.com/resource/arduino/package_m5stack_index.json
Arduino IDEの追加のボードマネージャーに上記URLを入れることによって利用できる環境です。M5Stack社のESP32ボードの定義とESP32開発環境一式が入手できます。
開発可能ボード
- M5Stack Core(BASIC, GRAY)
- M5Stack Fire
- M5StickC
- M5Stack ATOM
- M5Stack Core2
他社製のボードがなくなって、下2つが増えています。
2つの開発環境の差分
ESP32 for Arduino | M5Stack Arduino | |
開発環境 | 同一 | 同一 |
ライブラリ | 同一 | 同一 |
ボード定義 | たくさん | 他社製ボードがない ATOMとCore2と追加 |
こんな感じの差分になっています。まず開発環境自体に差分はありません。プリインストールされているライブラリにも差分がありません。これはちょっと残念で最初からM5Stack系のライブラリを入れておけば、バージョンアップがあっても通知してくれるのですが現状は別途自分で入れる必要があります。
ボード定義に差分があるのですが、実はM5StickC Plusがありません!
ATOMとCore2は追加されているのですが、ライブラリマネージャーにもM5StickC Plusは登録されていないんですよね。。。
ボード選択の意味
ボード選択は実際のところ、結構適当でも動きます。
M5Stack Fire

M5Stack Fireを選択した画面です。
M5Stack Core2

こちらがM5Stack Core2を選択した場合です。大きな差はCPU速度が変更できるようになっていますね。ただこの設定はsetup()とかの中で関数呼び出せばいいので、ここから設定しなくても変更可能です。
設定の差分
PSRAM | 転送速度 | フラッシュ | |
M5Stack Fire M5Stack Core2 | あり | 921600 | 16MB |
M5Stack Core(BASIC, GRAY) | なし | 921600 | 16MB 4MB(初期BASIC) |
M5StickC M5Stack ATOM | なし | 1500000 | 4MB |
実際のところ一番重要なのがPSRAMと転送速度にフラッシュの容量です。PSRAMはSPI接続の拡張メモリで、接続しているボードの場合、有効化すると低速ですがメインメモリが拡張されるような感じで利用できます。搭載していても無効で動かすことも可能ですが、搭載していないボードに有効でビルドしたファームウエアを転送すると動作しません。
フラッシュ容量はすべて4MB以上搭載していますが、最近のM5Stack系は16MB搭載しています。
転送速度が結構重要で、搭載しているUSBシリアルがCP2104(M5Stack系)とCH552(M5StickC/ATOM系)で違います。デフォルトの転送速度が違うのですが、CH552(M5StickC/ATOM系)は一般的な転送速度では送信することができず、指定できる値が独特です。一方CP2104(M5Stack系)は比較的柔軟に設定が可能で、1500000でも転送できます。
これらの情報を考えると、一番互換性が高いのがフラッシュ容量を4MBにして、PSRAMを無効、転送速度を1500000にすると、どのボードでも転送が可能です。
私は上記ライブラリを使って、全ボード共通でプログラムをしているのでM5StickCのボードで転送しています。
ESP32 for Arduinoにボード定義を追加する方法
M5Stack Arduinoを設定すればいいのですが、二つの開発環境を入れるのってちょっと微妙ですよね、、、実際には差分がないのでHDD容量が無駄になるだけで、二ついれても問題になることはないと思います。
############################################################## m5stack-atom.name=M5Stack-ATOM m5stack-atom.upload.tool=esptool_py m5stack-atom.upload.maximum_size=1310720 m5stack-atom.upload.maximum_data_size=327680 m5stack-atom.upload.wait_for_upload_port=true m5stack-atom.serial.disableDTR=true m5stack-atom.serial.disableRTS=true m5stack-atom.build.mcu=esp32 m5stack-atom.build.core=esp32 m5stack-atom.build.variant=m5stack_atom m5stack-atom.build.board=M5Stack_ATOM m5stack-atom.build.f_cpu=240000000L m5stack-atom.build.flash_size=4MB m5stack-atom.build.flash_freq=80m m5stack-atom.build.flash_mode=dio m5stack-atom.build.boot=dio m5stack-atom.build.partitions=default m5stack-atom.build.defines= m5stack-atom.menu.PartitionScheme.default=Default m5stack-atom.menu.PartitionScheme.default.build.partitions=default m5stack-atom.menu.PartitionScheme.no_ota=No OTA (Large APP) m5stack-atom.menu.PartitionScheme.no_ota.build.partitions=no_ota m5stack-atom.menu.PartitionScheme.no_ota.upload.maximum_size=2097152 m5stack-atom.menu.PartitionScheme.min_spiffs=Minimal SPIFFS (Large APPS with OTA) m5stack-atom.menu.PartitionScheme.min_spiffs.build.partitions=min_spiffs m5stack-atom.menu.PartitionScheme.min_spiffs.upload.maximum_size=1966080 m5stack-atom.menu.UploadSpeed.1500000=1500000 m5stack-atom.menu.UploadSpeed.1500000.upload.speed=1500000 m5stack-atom.menu.UploadSpeed.750000=750000 m5stack-atom.menu.UploadSpeed.750000.upload.speed=750000 m5stack-atom.menu.UploadSpeed.500000=500000 m5stack-atom.menu.UploadSpeed.500000.upload.speed=500000 m5stack-atom.menu.UploadSpeed.250000=250000 m5stack-atom.menu.UploadSpeed.250000.upload.speed=250000 m5stack-atom.menu.UploadSpeed.115200=115200 m5stack-atom.menu.UploadSpeed.115200.upload.speed=115200 m5stack-atom.menu.DebugLevel.none=None m5stack-atom.menu.DebugLevel.none.build.code_debug=0 m5stack-atom.menu.DebugLevel.error=Error m5stack-atom.menu.DebugLevel.error.build.code_debug=1 m5stack-atom.menu.DebugLevel.warn=Warn m5stack-atom.menu.DebugLevel.warn.build.code_debug=2 m5stack-atom.menu.DebugLevel.info=Info m5stack-atom.menu.DebugLevel.info.build.code_debug=3 m5stack-atom.menu.DebugLevel.debug=Debug m5stack-atom.menu.DebugLevel.debug.build.code_debug=4 m5stack-atom.menu.DebugLevel.verbose=Verbose m5stack-atom.menu.DebugLevel.verbose.build.code_debug=5 ############################################################## m5stack-core2.name=M5Stack-Core2 m5stack-core2.upload.tool=esptool_py m5stack-core2.upload.maximum_size=6553600 m5stack-core2.upload.maximum_data_size=4521984 m5stack-core2.upload.wait_for_upload_port=true m5stack-core2.serial.disableDTR=true m5stack-core2.serial.disableRTS=true m5stack-core2.build.mcu=esp32 m5stack-core2.build.core=esp32 m5stack-core2.build.variant=m5stack_core2 m5stack-core2.build.board=M5STACK_Core2 m5stack-core2.build.f_cpu=240000000L m5stack-core2.build.flash_size=16MB m5stack-core2.build.flash_freq=80m m5stack-core2.build.flash_mode=dio m5stack-core2.build.boot=dio m5stack-core2.build.partitions=default_16MB m5stack-core2.build.defines= m5stack-core2.menu.PSRAM.enabled=Enabled m5stack-core2.menu.PSRAM.enabled.build.defines=-DBOARD_HAS_PSRAM -mfix-esp32-psram-cache-issue m5stack-core2.menu.PSRAM.disabled=Disabled m5stack-core2.menu.PSRAM.disabled.build.defines= m5stack-core2.menu.PartitionScheme.default=Default (2 x 6.5 MB app, 3.6 MB SPIFFS) m5stack-core2.menu.PartitionScheme.default.build.partitions=default_16MB m5stack-core2.menu.PartitionScheme.default.upload.maximum_size=6553600 m5stack-core2.menu.PartitionScheme.large_spiffs=Large SPIFFS (7 MB) m5stack-core2.menu.PartitionScheme.large_spiffs.build.partitions=large_spiffs_16MB m5stack-core2.menu.PartitionScheme.large_spiffs.upload.maximum_size=4685824 m5stack-core2.menu.PartitionScheme.minimal=Minimal (1.3MB APP/700KB SPIFFS) m5stack-core2.menu.PartitionScheme.minimal.build.partitions=minimal m5stack-core2.menu.PartitionScheme.no_ota=No OTA (2MB APP/2MB SPIFFS) m5stack-core2.menu.PartitionScheme.no_ota.build.partitions=no_ota m5stack-core2.menu.PartitionScheme.no_ota.upload.maximum_size=2097152 m5stack-core2.menu.PartitionScheme.noota_3g=No OTA (1MB APP/3MB SPIFFS) m5stack-core2.menu.PartitionScheme.noota_3g.build.partitions=noota_3g m5stack-core2.menu.PartitionScheme.noota_3g.upload.maximum_size=1048576 m5stack-core2.menu.PartitionScheme.huge_app=Huge APP (3MB No OTA/1MB SPIFFS) m5stack-core2.menu.PartitionScheme.huge_app.build.partitions=huge_app m5stack-core2.menu.PartitionScheme.huge_app.upload.maximum_size=3145728 m5stack-core2.menu.PartitionScheme.min_spiffs=Minimal SPIFFS (1.9MB APP with OTA/190KB SPIFFS) m5stack-core2.menu.PartitionScheme.min_spiffs.build.partitions=min_spiffs m5stack-core2.menu.PartitionScheme.min_spiffs.upload.maximum_size=1966080 m5stack-core2.menu.CPUFreq.240=240MHz (WiFi/BT) m5stack-core2.menu.CPUFreq.240.build.f_cpu=240000000L m5stack-core2.menu.CPUFreq.160=160MHz (WiFi/BT) m5stack-core2.menu.CPUFreq.160.build.f_cpu=160000000L m5stack-core2.menu.CPUFreq.80=80MHz (WiFi/BT) m5stack-core2.menu.CPUFreq.80.build.f_cpu=80000000L m5stack-core2.menu.CPUFreq.40=40MHz (40MHz XTAL) m5stack-core2.menu.CPUFreq.40.build.f_cpu=40000000L m5stack-core2.menu.CPUFreq.26=26MHz (26MHz XTAL) m5stack-core2.menu.CPUFreq.26.build.f_cpu=26000000L m5stack-core2.menu.CPUFreq.20=20MHz (40MHz XTAL) m5stack-core2.menu.CPUFreq.20.build.f_cpu=20000000L m5stack-core2.menu.CPUFreq.13=13MHz (26MHz XTAL) m5stack-core2.menu.CPUFreq.13.build.f_cpu=13000000L m5stack-core2.menu.CPUFreq.10=10MHz (40MHz XTAL) m5stack-core2.menu.CPUFreq.10.build.f_cpu=10000000L m5stack-core2.menu.UploadSpeed.921600=921600 m5stack-core2.menu.UploadSpeed.921600.upload.speed=921600 m5stack-core2.menu.UploadSpeed.115200=115200 m5stack-core2.menu.UploadSpeed.115200.upload.speed=115200 m5stack-core2.menu.UploadSpeed.256000.windows=256000 m5stack-core2.menu.UploadSpeed.256000.upload.speed=256000 m5stack-core2.menu.UploadSpeed.230400.windows.upload.speed=256000 m5stack-core2.menu.UploadSpeed.230400=230400 m5stack-core2.menu.UploadSpeed.230400.upload.speed=230400 m5stack-core2.menu.UploadSpeed.460800.linux=460800 m5stack-core2.menu.UploadSpeed.460800.macosx=460800 m5stack-core2.menu.UploadSpeed.460800.upload.speed=460800 m5stack-core2.menu.UploadSpeed.512000.windows=512000 m5stack-core2.menu.UploadSpeed.512000.upload.speed=512000 m5stack-core2.menu.UploadSpeed.1500000=1500000 m5stack-core2.menu.UploadSpeed.1500000.upload.speed=1500000 m5stack-core2.menu.DebugLevel.none=None m5stack-core2.menu.DebugLevel.none.build.code_debug=0 m5stack-core2.menu.DebugLevel.error=Error m5stack-core2.menu.DebugLevel.error.build.code_debug=1 m5stack-core2.menu.DebugLevel.warn=Warn m5stack-core2.menu.DebugLevel.warn.build.code_debug=2 m5stack-core2.menu.DebugLevel.info=Info m5stack-core2.menu.DebugLevel.info.build.code_debug=3 m5stack-core2.menu.DebugLevel.debug=Debug m5stack-core2.menu.DebugLevel.debug.build.code_debug=4 m5stack-core2.menu.DebugLevel.verbose=Verbose m5stack-core2.menu.DebugLevel.verbose.build.code_debug=5 ##############################################################
上記がボード定義の差分になります。この設定をESP32 for Arduinoに追加することでボードの選択に追加されます。
- C:\Users\%USERNAME%\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.4
Windows環境の場合、上記がESP32 for Arduinoライブラリのインストール場所になります。この中にboards.txtというファイルがあり、このファイルに設定が記述されています。
追記する場合にはboards.local.txtというファイルを作成し、差分だけ記述することができます。できればオリジナルのboards.txtを編集せずに、拡張用のboards.local.txtに記述するようにしましょう。
変数(variants)
ボード定義は上記のboards.local.txtでメニューに追加されたと思いますが、これ以外にボード個別の変数が定義されています。
定義名 | Core | Fire | Core2 | M5StickC | ATOM | 備考 |
TX | 1 | 1 | 1 | 1 | 1 | Serial |
RX | 3 | 3 | 3 | 3 | 3 | Serial |
TXD2 | 17 | 14 | Serial1 | |||
RXD2 | 16 | 14 | Serial1 | |||
SDA | 21 | 21 | 32 | 32 | 26 | Wire |
SCL | 22 | 22 | 33 | 33 | 32 | Wire |
SS | 5 | 5 | 5 | 5 | SPI | |
MOSI | 23 | 23 | 23 | 15 | SPI | |
MISO | 19 | 19 | 38 | 36 | SPI | |
SCK | 18 | 18 | 18 | 13 | SPI |
この値はvariantsフォルダの中にボード名ごとにpins_arduino.hファイルがあり、その中で定義されています。
一番利用するのがI2Cで利用するWireクラスなのですが、Wire.begin()とした場合この定義のピンが利用されます。私は、無指定は好ましくないと考えていましてWire.begin(32, 33)などのように明示的にピンを指定して、この変数を使わないほうがいいと思っています。
公式の開発環境ですと、そもそもライブラリが違うのでそのままソースファイルを共有化できないのと、暗黙的に定義されている変数を使うと何が指定されているのかわかりにくくなる場合があると思うからです。
M5Stack Arduinoと完全に同じ環境を作るためには、variantsの中からm5stack_core2とm5stack_atomフォルダをコピーしてきて、ESP32 for Arduinoのvariantsフォルダに入れることで同等の環境になります。
何故M5Stack Arduinoが生まれたか?
これは正式な見解はわからないのですが、ESP32 for Arduinoのリリースが全くされていないのが原因だと思います。最新版の1.0.4は2019年10月2日にリリースされたのが最後です。実はM5Stack ATOMは2020年4月に追加されているのですが、まだリリースされていないので使えない状態です。
つまり、ESP32 for Arduinoはここ一年ぐらい更新されておらず、この間に販売されたボードはすべて定義がありません!
M5Stack社のように、新製品をがんがん発売するスタイルだと辛いですね、、、
さて、リリース間隔がなぜ空いているかというと、これまではベースとなるESP-IDFというライブラリが更新されると、それに合わせてリリースがされていました。
ただ、ESP32 for Arduinoが利用しているESP-IDFが3.2系となります。現状3.3系と4.0系と4.1系がすでに出ており、3.2系の開発が止まっています!
つまり、3.2系の更新は今後ありません。。。ESP32 for Arduinoの開発しているリポジトリを見たところESP32-S2向けの開発が進んでいますので、ESP-IDF4.1系に今後入れ替える予定だと思われます。ただし、4.1系はまだ正式リリースしたばかりのバージョンなのでもう少し時間かかりそうな気がします、、、
まとめ
M5Stack Arduinoは個別開発でCore2を使いたい人は入れておいてもいいと思いますが、PSRAMを使いたいときはFireを、それ以外はM5StickCで開発していてもそれほど問題はないかと思います。
M5StickC Plusが不憫です。。。M5Stack Arduinoでもケアしてあげてほしい、、、
ESP32 for ArduinoがESP32-S2対応のESP-IDF4.1系に更新されれば、もっとリリース頻度があがると思うんですが、いつごろでるのかな。。。
コメント
“設定の差分” について
ArduinoIDEで書き込むとboard=ESP32 Dev ModuleとM5Stack-Core-ESP32はboot=qio (4線IO,bootloader_qio_80m.bin), M5Stick-Cはboot=dio(2線IO,bootloader_dio_80m.bin)になり、QIOの方が速いようです。 https://www.esp8266.com/viewtopic.php?f=33&t=3838
どちらもboards.txtの定義は esp32.build.boot=dio なのですが、前者はFlashModeのメニューがありメニューのdefaultでboot=qioになり、後者はFlashModeのメニューが無いためdioになってしまうようです。M5Stick-Cはqioでも動作するようです、実測していませんが動作が速くなるかもしれません。
そんなところにも差が、、、
今度検証してみます
私の方ではarduino IDE 1.8.11 + ESP Arduino 1.0.4で、Arduino IDE上の書き込み時の下記ログにて確認しました。bootloaderがdioのときESP32がずっとdio動作のままかは不明です。
最大1310720バイトのフラッシュメモリのうち、スケッチが824086バイト(62%)を使っています。
最大327680バイトのRAMのうち、グローバル変数が42056バイト(12%)を使っていて、ローカル変数で285624バイト使うことができます。
C:\Users\n-tom\fd_work\TuKuRutch\Arduino\portable\packages\esp32\tools\esptool_py\2.6.1/esptool.exe –chip esp32 –port COM9 –baud 750000 –before default_reset –after hard_reset write_flash -z –flash_mode dio –flash_freq 80m –flash_size detect 0xe000 C:\Users\n-tom\fd_work\TuKuRutch\Arduino\portable\packages\esp32\hardware\esp32\1.0.4/tools/partitions/boot_app0.bin 0x1000 C:\Users\n-tom\fd_work\TuKuRutch\Arduino\portable\packages\esp32\hardware\esp32\1.0.4/tools/sdk/bin/bootloader_dio_80m.bin 0x10000 C:\Users\n-tom\fd_work\TuKuRutch\ext\libraries\M5StickC\robot_pcmode\build/robot_pcmode.ino.bin 0x8000 C:\Users\n-tom\fd_work\TuKuRutch\ext\libraries\M5StickC\robot_pcmode\build/robot_pcmode.ino.partitions.bin
上記の bootloader_dio_80m.bin
たしかにbuild.bootがqioを指定していますね。。。
あっ、でも他のボードでもbootがqioで動いていますね
自作定義がM5Stackの持ってきているのでデフォルトはqioでいろいろなボードで動かしていました
bootだけでフラッシュはdioなので、起動だけ違うのかな。
どこかで検証してみたいですね