M5Stack Arduino環境を調べる

概要

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 ArduinoM5Stack 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
あり92160016MB
M5Stack Core(BASIC, GRAY)なし92160016MB
4MB(初期BASIC)
M5StickC
M5Stack ATOM
なし15000004MB

実際のところ一番重要なのが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でメニューに追加されたと思いますが、これ以外にボード個別の変数が定義されています。

定義名CoreFireCore2M5StickCATOM備考
TX11111Serial
RX33333Serial
TXD21714Serial1
RXD21614Serial1
SDA2121323226Wire
SCL2222333332Wire
SS5555SPI
MOSI23232315SPI
MISO19193836SPI
SCK18181813SPI

この値は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系に更新されれば、もっとリリース頻度があがると思うんですが、いつごろでるのかな。。。

コメント

  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でも動作するようです、実測していませんが動作が速くなるかもしれません。

  2. そーたメイ より:

    私の方では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なので、起動だけ違うのかな。
      どこかで検証してみたいですね