M5Stack-SD-Updaterは、M5StackデバイスにmicroSDカードからバイナリファイルをロードして実行できるライブラリです。M5Stackデバイスにあらかじめアプリを書き込む必要がなく、microSDカードに複数のアプリを保存して持ち運ぶことができます。また、メニュー画面からアプリを選択して実行できるので、操作も簡単です。この記事では、「M5Stack-SD-Updater」に対応したアプリケーションの作成方法について説明します。
関連記事「M5Launcherで、SDカードからアプリを起動」
M5Stack-SD-Updaterのランチャーアプリ(バイナリ)
M5Stack-SD-Updaterのランチャーアプリのバイナルファイルは、以下から入手できます。使用したいM5Stack/Stickの機種に対応したバイナリをダウンロードして、ファイル名を「menu.bin」に変更してSDカードのルートフォルダにコピーします。
Core2の場合は、M5Core2-Launcher-*.*.*.bin を使用します。
スケッチを「M5Stack-SD-Updater」対応にする
スケッチ(アプリケーションのプロジェクト)を、「M5Stack-SD-Updater」対応にする手順を説明します。
「M5Stack-SD-Updater」ライブラリのインストール
最初に、「M5Stack-SD-Updater」ライブラリをプロジェクトにインストールします。
- PlatformIOでは、先ず「Libraries」から「M5Stack-SD-Updater」を検索します。
- 次にダウンロード後、「Add to Project」のボタンをクリックします。
- 最後にプロジェクトを選択後、「Add」ボタンをクリックしてインストールを行います。
ソースコードの修正
「M5Stack-SD-Updater」は、M5Stack Core2にも対応しています。M5Stack BasicやGrayでは、ボタンを押しながら起動すると「M5Stack-SD-Updater」のメニュー画面が表示されるようになっていました。しかし、Core2ではタッチボタンを採用しているため、同じ方法ではメニュー画面を表示することができません。そこで、Core2では起動時に指定した時間だけ「M5Stack-SD-Updater」のメニュー画面を表示するようにします。その間にボタンをクリックするか、時間が経過すると、アプリケーションが自動的に起動します。
「M5Stack-SD-Updater」の機能を組み込むには、以下の手順でソースコードを修正します。
ヘッダファイル「M5StackUpdater.h」のインクルード
最初に、ヘッダファイル「M5StackUpdater.h」をインクルードします。
スケッチで、コア ライブラリが含まれている行を見つけます。
// #include <M5Stack.h>
// #include <M5Core2.h>
// #include <LovyanGFX.h>
// #include <M5GFX.h>
// #include <ESP32-Chimera-Core.h>
// #include <M5StickC.h>
// #include <M5Unified.h>
その後に、ヘッダファイルをインクルードします。
#include <M5Unified.h>
#define SDU_ENABLE_GZ // optional: support for gzipped firmwares
include <M5StackUpdater.h>
checkSDUpdater関数の追加
setup関数内で、checkSDUpdater関数を呼び出します。
Core2
Core2では、M5.begin();の後で、以下のようにcheckSDUpdater関数を呼び出します。
SDカードから、「menu.bin」を呼び出し、5秒間表示します。
M5.begin();
checkSDUpdater(
SD, // filesystem (SD, SD_MMC, SPIFFS, LittleFS, PSRamFS)
MENU_BIN, // path to binary (default = /menu.bin, empty string = rollback only)
5000 // wait delay, (default=0, will be forced to 2000 upon ESP.restart() or with headless build )
TFCARD_CS_PIN // optional for SD use only, usually default=4 but your mileage may vary)
);
Headless setup
メカニカルスイッチを持つM5Stack(Basic, Gray等)では、以下のように起動時に、ボタンが押されていたときのみメニューを表示させることが可能です。
Serial.begin( 115200 );
if(digitalRead(BUTTON_A_PIN) == 0) {
Serial.println("Will Load menu binary");
updateFromFS(SD);
ESP.restart();
}
SD-Updater のカスタマイズ
Webページに、SD-Updater のカスタマイズについての説明がありますので参考にしてください。
SDUCfg.setCSPin ( TFCARD_CS_PIN ); // const int
SDUCfg.setFS ( &FS ); // fs::FS* (SD, SD_MMC, SPIFFS, LittleFS, PSRamFS)
SDUCfg.setProgressCb ( myProgress ); // void (*myProgress)( int state, int size )
SDUCfg.setMessageCb ( myDrawMsg ); // void (*myDrawMsg)( const String& label )
SDUCfg.setErrorCb ( myErrorMsg ); // void (*myErrorMsg)( const String& message, unsigned long delay )
SDUCfg.setBeforeCb ( myBeforeCb ); // void (*myBeforeCb)()
SDUCfg.setAfterCb ( myAfterCb ); // void (*myAfterCb)()
SDUCfg.setSplashPageCb( myDrawSplashPage ); // void (*myDrawSplashPage)( const char* msg )
SDUCfg.setButtonDrawCb( myDrawPushButton ); // void (*myDrawPushButton)( const char* label, uint8_t position, uint16_t outlinecolor, uint16_t fillcolor, uint16_t textcolor )
SDUCfg.setWaitForActionCb( myActionTrigger ); // int (*myActionTrigger)( char* labelLoad, char* labelSkip, unsigned long waitdelay )
SDUCfg.setSDUBtnPoller( myButtonPoller ); // void (*myButtonPoller)()
SDUCfg.setSDUBtnA( myBtnAPushedcb ); // bool (*myBtnAPushedcb )()
SDUCfg.setSDUBtnB( myBtnBPushedcb ); // bool (*myBtnBPushedcb )()
SDUCfg.setSDUBtnC( myBtnCPushedcb ); // bool (*myBtnCPushedcb )()
アートワーク/クレジットの追加
バイナリファイルごとにアートワーク/クレジットを追加できます。デフォルトの SD-Menu アプリケーションは、次のファイル タイプをスキャンします。
- .bin コンパイルされたアプリケーションバイナリ
- .jpg 画像/アイコン (最大 100×100)
- 寸法の説明を含む .json ファイル
- 例{“width”:120,”height”:120,”authorName”:”tobozo”,”projectURL”:”http://short.url”,”credits”:”** http://very.very.long.url ~~”}
制限事項
- SPIFFS/LittleFS ライブラリではファイル名 (パスを含む) が 32 文字に制限されていますが、ロビー画面にも表示されるため 16 文字が推奨されます。
- 長いファイル名は最終的には jpg 画像で覆われてしまうので、16 文字未満 (拡張子は含まない) に抑えることをお勧めします。
- 短いファイル名は 8.3 として扱われる場合があります (例: 2048.bin は 2048.BIN になります)。
- FAT 仕様により、SD カード上に 512 を超えるファイルが存在することは禁止されていますが、このメニューはいずれにしても 256 項目に制限されています。
参考URL
以下のWebページも参考にしてください。
GitHub – NoRi-230401/BinsPack-for-StackChan-Core2には、Core2用のSD-Updaterに対応したアプリケーションのバイナリファイルが幾つかあります。D-Updaterに対応したファイル管理(WebDav)ツールのバイナリもありました。