M5Stack社製品の開発環境 Arduino IDE編

概要

紅樹タカオさんの記事に触発されて、暖めていた記事を書くことにします。本当は英語版で書こうとしていたのですが、なかなか筆が進まないので最初に日本語記事書きたいと思います。

開発環境について

ESP32搭載ボードの開発環境はArduino環境、ESP-IDF環境、MicroPythonを利用しているブロックプログラミングのUIFlowが標準的にサポートされています。今回はArduino環境のうち、Arduino IDEを利用した開発環境の説明です。後日PlatformIOも公開予定です。

Arduino IDE開発環境とは?

Arduino IDEで開発する場合にも、実は2種類開発環境があります。

Arduino IDEでESP32を開発する場合には環境設定から、追加のボードマネージャのURLを追加する必要があります。ESP32の開発元であるEspressif社の公開する標準的な開発環境と、M5Stack社の公開するM5Stack限定開発環境の両方が公開されています。

Espressif標準開発環境

https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json

上記のURLを指定した場合です。こちらの環境では標準的なボードはすべて登録されますが、リリースから一年以上経過しています。つまりここ一年以内に発売されたボードは登録されていません。次期バージョンがリリースされることで、ボードが追加されるのですがなかなか更新されない状況です。

M5Stack環境

https://m5stack.oss-cn-shenzhen.aliyuncs.com/resource/arduino/package_m5stack_index.json

上記がM5Stack社の環境です。ボード設定以外は基本的にEspressif標準開発環境とまったく同じです。標準環境からM5Stack社の発売されているボード設定をすべて消して、最近販売されたボードを追加したものになります。

標準環境との違いはボードのみですので、最新ボードを利用する場合にはこちらの環境のほうが好ましいです。ただし、一般的なESP32ボードの設定が入っていませんので、標準環境と両方入れる方が安全です。また、ファイルのダウンロードは中国からなので、非常に時間がかかる場合がありますので、のんびり待ってください。

ボード定義一覧

EspressifM5Stackボード名転送速度フラッシュAPPSPIFFSPSRAM
1.0.41.0.6M5Stack-Core-ESP329216004MB2 x 1.3MB1.5MB
1.0.41.0.6M5Stack-FIRE92160016MB2 x 6.5MB3.6MB設定有
1.0.41.0.6M5Stick-C15000004MB2 x 1.3MB1.5MB
次期1.0.6M5Stack-ATOM15000004MB2 x 1.3MB1.5MB
次期1.0.6M5Stack-Core292160016MB2 x 6.5MB3.6MB設定有
次期1.0.6M5Stack-Timer-CAM15000004MB3MB1MB設定有
次期1.0.6M5Stack-CoreInk9216004MB2 x 1.3MB1.5MB設定有
1.0.6M5Stack-Paper92160016MB2 x 6.5MB3.6MB設定有

Espressif環境は、ATOM以降は登録はされていますが、次回リリース時に追加される状態です。M5Paperは執筆時点ではまだ登録されていませんでした。

ボード設定で気にしないといけないのは転送速度です。使っているUSBシリアルICによって、転送速度が異なります。M5StickC以降1500000という高速伝送が可能ですが、標準的な921600では転送できないICが使われています。このため、1500000で設定されているボードに関しては、1500000か115200という低速の転送速度を選ぶ必要があります。

次にフラッシュのサイズです。4MBと16MBがあるのですが、16MBのボードに4MBの設定で書き込むことはできますが、逆はできません。そしてPSRAMの設定有無です。Espressif環境ではFIREしかPSRAMを転送していないのですが、フラッシュが16MBなので転送できないボードが出てきてしまいます。

商品一覧

コア名フラッシュPSRAM転送速度GitHub
M5Stack Basic4MB, 16MB921600M5Stack
M5Stack Gray16MB921600M5Stack
M5Stack FIRE16MB4MB921600M5Stack
M5Stack M5GO16MB921600M5Stack
M5Stack Core216MB8MB921600M5Core2
M5Stack Core2 for AWS16MB8MB921600Core2-for-AWS-IoT-EduKit
M5Stick4MB921600StickWatch
M5StickC4MB1500000M5StickC
M5StickC Plus4MB1500000M5StickC-Plus
M5StickT4MB1500000M5-StickT
ATOM Lite4MB1500000M5Atom
ATOM Matrix4MB1500000M5Atom
ATOM Echo4MB1500000M5Atom
M5Stack CoreInk4MB1500000M5-CoreInk
M5Paper16MB8MB1500000M5EPD
ESP32-Camera4MB921600M5Stack-Camera
M5Camera4MB4MB921600M5Stack-Camera
M5Camera F4MB4MB921600M5Stack-Camera
M5Camera X4MB4MB921600M5Stack-Camera
Timer Camera4MB8MB1500000TimerCam-arduino
Timer Camera F4MB8MB1500000TimerCam-arduino
Timer Camera X4MB8MB1500000TimerCam-arduino

M5Stack Basicのみ困ったちゃんなのですが、途中でフラッシュの容量が4MBから16MBに増えています。ただしボード設定は4MBのみですので、16MBをそのままだと使うことができません。

商品別設定

コア名ライブラリヘッダファイルEspressifボードM5StackボードGitHub
M5Stack BasicM5StackM5Stack.h※M5Stack-Core-ESP32M5Stack-Core-ESP32M5Stack
M5Stack GrayM5StackM5Stack.h※M5Stack-Core-ESP32M5Stack-Core-ESP32M5Stack
M5Stack FIREM5StackM5Stack.hM5Stack-FIREM5Stack-FIREM5Stack
M5Stack M5GOM5StackM5Stack.h※M5Stack-Core-ESP32M5Stack-Core-ESP32M5Stack
M5Stack Core2M5Core2M5Core2.hM5Stack-Core2M5Stack-Core2M5Core2
M5Stack Core2 for AWSM5Core2M5Core2.hM5Stack-Core2M5Stack-Core2Core2-for-AWS-IoT-EduKit
M5Stick未公開M5Stack-Core-ESP32M5Stack-Core-ESP32StickWatch
M5StickCM5StickCM5StickC.hM5Stick-CM5Stick-CM5StickC
M5StickC PlusM5StickCPlusM5StickCPlus.hM5Stick-CM5Stick-CM5StickC-Plus
M5StickT未公開M5Stick-CM5Stick-CM5-StickT
ATOM LiteM5AtomM5Atom.h※M5Stick-CM5Stack-ATOMM5Atom
ATOM MatrixM5AtomM5Atom.h※M5Stick-CM5Stack-ATOMM5Atom
ATOM EchoM5AtomM5Atom.h※M5Stick-CM5Stack-ATOMM5Atom
M5Stack CoreInkM5-CoreInkM5CoreInk.h※M5Stick-CM5Stack-CoreInkM5-CoreInk
M5PaperM5EPDM5EPD.h※ESP32 Wrover ModuleM5Stack-PaperM5EPD
ESP32-Camera未公開ESP32 Dev Module※M5Stack-Core-ESP32M5Stack-Camera
M5Camera未公開ESP32 Wrover Module※M5Stack-Core-ESP32M5Stack-Camera
M5Camera F未公開ESP32 Wrover Module※M5Stack-Core-ESP32M5Stack-Camera
M5Camera X未公開ESP32 Wrover Module※M5Stack-Core-ESP32M5Stack-Camera
Timer CameraTimer-CAMcamera_pins.h※ESP32 Wrover ModuleM5Stack-Timer-CAMTimerCam-arduino
Timer Camera FTimer-CAMcamera_pins.h※ESP32 Wrover ModuleM5Stack-Timer-CAMTimerCam-arduino
Timer Camera XTimer-CAMcamera_pins.h※ESP32 Wrover ModuleM5Stack-Timer-CAMTimerCam-arduino

ざざっと一覧です。まず青くなっているところは、適切な選択ができません。M5Stack版はM5Camera系の設定が準備されていません。Espressif版から選択したほうが好ましいと思います。

次に、赤くなっているところが注意が必要なものになります。

M5Stack-Core-ESP32

基本的なボード設定ですが、フラッシュ容量が4MB固定です。16MBのコアに転送しても4MBしか利用できません。16MBを利用した場合にはM5Stack-FIREを選択し、PSRAMを利用しない設定にする必要があります。

M5Stick-C

基本的にピン設定がボード設定と違うだけなので、あまり影響はなく利用できるはずです。

ESP32 Wrover Module

PSRAM搭載しており、16MBの場合にはM5Stack FIREを選択する必要があります。ただしFIREの場合には16MB固定なので、4MBしかないボードには利用できません。そのためPSRAMを搭載しているESP32 Wrover Moduleを選択する必要があります。

ただし、FIREでもESP32 Wrover Moduleでも転送速度が921600ですので、1500000のコアには転送失敗するので、低速な115200の転送速度を指定する必要があります。

むりやり対応する方法

ちょっと選択が不便ですよね。ちょっと手間がかかりますが、対応方法はあります。ただし、ボード設定の中には、I2Cなどの標準的なピン設定もされています。用意されているボード以外を指定した場合にはピンの定義が違う可能性があります。この場合にはWire.begin()など引数無しで初期化するのではなく、Wire.begin(21, 22)などと利用するピン番号を必ず指定するようにしてください。

M5StickCを利用する(PSRAM無し、4MB限定)

PSRAMを利用せずに、4MBしかフラッシュを利用しないのであれば基本的にM5StickCの設定がすべてのコアで利用できるはずです。実は大抵の921600のボードに対しても1500000で転送することができます。

ESP32 Wrover Moduleに転送速度追加(PSRAM有り、4or16MB)

基本的はPSRAMが利用できるESP32 Wrover Moduleで、転送速度だけ1500000が選ぶことができればあとはフラッシュの容量を選択するだけになります。

  • C:\Users\%username%\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.4

Windows環境の人の場合は上記にボード設定のboards.txtがあるはずです。このファイルを編集してしまうと、壊したときに修復が大変なので差分だけ記述するboards.local.txtというファイルを作成して、差分だけ設定します。

esp32wrover.menu.UploadSpeed.1500000.windows=1500000
esp32wrover.menu.UploadSpeed.1500000.upload.speed=1500000

上記の2行のみ追記することで、転送速度が追加されます。

上記のように転送速度が追加されています。ただしPSRAMを無効にすることができないので、PSRAMを搭載していないボードには利用できません。

フラッシュの容量はいろいろ選択することができます。

独自ボード設定を追加する

上記のように通信速度を追加するのであれば、すべての設定を変更できるボード定義を追加したほうがあとあと楽だと思います。

m5lite.name=M5Lite

m5lite.upload.tool=esptool_py
m5lite.upload.maximum_size=1310720
m5lite.upload.maximum_data_size=327680
m5lite.upload.wait_for_upload_port=true

m5lite.serial.disableDTR=true
m5lite.serial.disableRTS=true

m5lite.build.mcu=esp32
m5lite.build.core=esp32
m5lite.build.variant=esp32
m5lite.build.board=M5LITE

m5lite.build.f_cpu=240000000L
m5lite.build.flash_size=4MB
m5lite.build.flash_freq=40m
m5lite.build.flash_mode=dio
m5lite.build.boot=dio
m5lite.build.partitions=default
m5lite.build.defines=

m5lite.menu.PSRAM.disabled=Disabled
m5lite.menu.PSRAM.disabled.build.defines=
m5lite.menu.PSRAM.enabled=Enabled
m5lite.menu.PSRAM.enabled.build.defines=-DBOARD_HAS_PSRAM -mfix-esp32-psram-cache-issue

m5lite.menu.PartitionScheme.default=Default 4MB with spiffs (1.2MB APP/1.5MB SPIFFS)
m5lite.menu.PartitionScheme.default.build.partitions=default
m5lite.menu.PartitionScheme.defaultffat=Default 4MB with ffat (1.2MB APP/1.5MB FATFS)
m5lite.menu.PartitionScheme.defaultffat.build.partitions=default_ffat
m5lite.menu.PartitionScheme.default_8MB=8M Flash (3MB APP/1.5MB FAT)
m5lite.menu.PartitionScheme.default_8MB.build.partitions=default_8MB
m5lite.menu.PartitionScheme.default_8MB.upload.maximum_size=3342336
m5lite.menu.PartitionScheme.default_16MB=16M Flash (2 x 6.5 MB app, 3.6 MB SPIFFS)
m5lite.menu.PartitionScheme.default_16MB.build.partitions=default_16MB
m5lite.menu.PartitionScheme.default_16MB.upload.maximum_size=6553600
m5lite.menu.PartitionScheme.minimal=Minimal (1.3MB APP/700KB SPIFFS)
m5lite.menu.PartitionScheme.minimal.build.partitions=minimal
m5lite.menu.PartitionScheme.no_ota=No OTA (2MB APP/2MB SPIFFS)
m5lite.menu.PartitionScheme.no_ota.build.partitions=no_ota
m5lite.menu.PartitionScheme.no_ota.upload.maximum_size=2097152
m5lite.menu.PartitionScheme.noota_3g=No OTA (1MB APP/3MB SPIFFS)
m5lite.menu.PartitionScheme.noota_3g.build.partitions=noota_3g
m5lite.menu.PartitionScheme.noota_3g.upload.maximum_size=1048576
m5lite.menu.PartitionScheme.noota_ffat=No OTA (2MB APP/2MB FATFS)
m5lite.menu.PartitionScheme.noota_ffat.build.partitions=noota_ffat
m5lite.menu.PartitionScheme.noota_ffat.upload.maximum_size=2097152
m5lite.menu.PartitionScheme.noota_3gffat=No OTA (1MB APP/3MB FATFS)
m5lite.menu.PartitionScheme.noota_3gffat.build.partitions=noota_3gffat
m5lite.menu.PartitionScheme.noota_3gffat.upload.maximum_size=1048576
m5lite.menu.PartitionScheme.huge_app=Huge APP (3MB No OTA/1MB SPIFFS)
m5lite.menu.PartitionScheme.huge_app.build.partitions=huge_app
m5lite.menu.PartitionScheme.huge_app.upload.maximum_size=3145728
m5lite.menu.PartitionScheme.min_spiffs=Minimal SPIFFS (1.9MB APP with OTA/190KB SPIFFS)
m5lite.menu.PartitionScheme.min_spiffs.build.partitions=min_spiffs
m5lite.menu.PartitionScheme.min_spiffs.upload.maximum_size=1966080
m5lite.menu.PartitionScheme.fatflash=16M Flash (2MB APP/12.5MB FAT)
m5lite.menu.PartitionScheme.fatflash.build.partitions=ffat
m5lite.menu.PartitionScheme.fatflash.upload.maximum_size=2097152
m5lite.menu.PartitionScheme.app3M_fat9M_16MB=16M Flash (3MB APP/9MB FATFS)
m5lite.menu.PartitionScheme.app3M_fat9M_16MB.build.partitions=app3M_fat9M_16MB
m5lite.menu.PartitionScheme.app3M_fat9M_16MB.upload.maximum_size=3145728

m5lite.menu.CPUFreq.240=240MHz (WiFi/BT)
m5lite.menu.CPUFreq.240.build.f_cpu=240000000L
m5lite.menu.CPUFreq.160=160MHz (WiFi/BT)
m5lite.menu.CPUFreq.160.build.f_cpu=160000000L
m5lite.menu.CPUFreq.80=80MHz (WiFi/BT)
m5lite.menu.CPUFreq.80.build.f_cpu=80000000L
m5lite.menu.CPUFreq.40=40MHz (40MHz XTAL)
m5lite.menu.CPUFreq.40.build.f_cpu=40000000L
m5lite.menu.CPUFreq.26=26MHz (26MHz XTAL)
m5lite.menu.CPUFreq.26.build.f_cpu=26000000L
m5lite.menu.CPUFreq.20=20MHz (40MHz XTAL)
m5lite.menu.CPUFreq.20.build.f_cpu=20000000L
m5lite.menu.CPUFreq.13=13MHz (26MHz XTAL)
m5lite.menu.CPUFreq.13.build.f_cpu=13000000L
m5lite.menu.CPUFreq.10=10MHz (40MHz XTAL)
m5lite.menu.CPUFreq.10.build.f_cpu=10000000L

m5lite.menu.FlashMode.qio=QIO
m5lite.menu.FlashMode.qio.build.flash_mode=dio
m5lite.menu.FlashMode.qio.build.boot=qio
m5lite.menu.FlashMode.dio=DIO
m5lite.menu.FlashMode.dio.build.flash_mode=dio
m5lite.menu.FlashMode.dio.build.boot=dio
m5lite.menu.FlashMode.qout=QOUT
m5lite.menu.FlashMode.qout.build.flash_mode=dout
m5lite.menu.FlashMode.qout.build.boot=qout
m5lite.menu.FlashMode.dout=DOUT
m5lite.menu.FlashMode.dout.build.flash_mode=dout
m5lite.menu.FlashMode.dout.build.boot=dout

m5lite.menu.FlashFreq.80=80MHz
m5lite.menu.FlashFreq.80.build.flash_freq=80m
m5lite.menu.FlashFreq.40=40MHz
m5lite.menu.FlashFreq.40.build.flash_freq=40m

m5lite.menu.FlashSize.4M=4MB (32Mb)
m5lite.menu.FlashSize.4M.build.flash_size=4MB
m5lite.menu.FlashSize.8M=8MB (64Mb)
m5lite.menu.FlashSize.8M.build.flash_size=8MB
m5lite.menu.FlashSize.8M.build.partitions=default_8MB
m5lite.menu.FlashSize.2M=2MB (16Mb)
m5lite.menu.FlashSize.2M.build.flash_size=2MB
m5lite.menu.FlashSize.2M.build.partitions=minimal
m5lite.menu.FlashSize.16M=16MB (128Mb)
m5lite.menu.FlashSize.16M.build.flash_size=16MB

m5lite.menu.UploadSpeed.115200=115200
m5lite.menu.UploadSpeed.115200.upload.speed=115200
m5lite.menu.UploadSpeed.256000.windows=256000
m5lite.menu.UploadSpeed.256000.upload.speed=256000
m5lite.menu.UploadSpeed.230400.windows.upload.speed=256000
m5lite.menu.UploadSpeed.230400=230400
m5lite.menu.UploadSpeed.230400.upload.speed=230400
m5lite.menu.UploadSpeed.250000=250000
m5lite.menu.UploadSpeed.250000.upload.speed=250000
m5lite.menu.UploadSpeed.460800.linux=460800
m5lite.menu.UploadSpeed.460800.macosx=460800
m5lite.menu.UploadSpeed.460800.upload.speed=460800
m5lite.menu.UploadSpeed.500000=500000
m5lite.menu.UploadSpeed.500000.upload.speed=500000
m5lite.menu.UploadSpeed.512000.windows=512000
m5lite.menu.UploadSpeed.512000.upload.speed=512000
m5lite.menu.UploadSpeed.750000=750000
m5lite.menu.UploadSpeed.750000.upload.speed=750000
m5lite.menu.UploadSpeed.921600=921600
m5lite.menu.UploadSpeed.921600.upload.speed=921600
m5lite.menu.UploadSpeed.1500000=1500000
m5lite.menu.UploadSpeed.1500000.upload.speed=1500000

m5lite.menu.DebugLevel.none=None
m5lite.menu.DebugLevel.none.build.code_debug=0
m5lite.menu.DebugLevel.error=Error
m5lite.menu.DebugLevel.error.build.code_debug=1
m5lite.menu.DebugLevel.warn=Warn
m5lite.menu.DebugLevel.warn.build.code_debug=2
m5lite.menu.DebugLevel.info=Info
m5lite.menu.DebugLevel.info.build.code_debug=3
m5lite.menu.DebugLevel.debug=Debug
m5lite.menu.DebugLevel.debug.build.code_debug=4
m5lite.menu.DebugLevel.verbose=Verbose
m5lite.menu.DebugLevel.verbose.build.code_debug=5

ちょっと長いですが、M5Liteというボード定義を追加しています。

これは私がメインで使っているボード設定ですが、転送速度もフラッシュのサイズも、PSRAMもすべて選択可能なボード設定です。ピン定義が入っていませんのでwire.begin()などと引数無しで初期化した場合には使っているボードと違うピンで初期化されてしまう危険があります。

基本的に転送速度はすべて1500000で転送できるはずですので、フラッシュが4MBで足りない場合には16MBに変更。PSRAMを利用する場合にはEnableに変更する操作ですべて共通設定で動くとは思います。

まとめ

Arduino IDEはEspressifとM5Stackの両方の環境をいれて、基本はM5Stackボード定義を利用するのがおすすめです。ただし、M5Stackの環境はあまり有名でないので知らない人も多いと思います。

とくにTimer Cameraなどは転送速度が1500000で、PSRAM搭載ですがフラッシュが4MBとなかなかボード選択が選びにくいボードです。ボード定義がすぐに反映される仕組みならいいのですが、Arduino IDE的にツール一式すべてを更新しないといけないので、なかなかリリースされないようです。

とはいえ、すべて選択できる汎用ESP32ボード定義があれば解決なのですがそれも無いんですよね。

コメント