1.概要
①パーティションをカスタムで区切ってそれぞれにアプリを入れます。
②まずは、メインとして各アプリを切り替えるランチャ部分を作ります。
ここでは、普通にIDEで作り書き込みします。
➂次に、アプリ1~3をコンパイルしてバイナリファイルとして保存します。
④最後にアプリ1~3のバイナリファイルをflash_download_toolを使って
指定されたアドレスに書き込んで終了です。
2.各フォルダの内容
◆全体のフォルダツリー

①mainフォルダに下記の2つのファイルを作成します。
*IDE設定
・esp32s3 Dev
・USBCDCOnBoot="Enabled"
・Flash Size=16MB
・Partition Scheme: "Custom"
・PSRAM="Disabled"
*IDE設定
・esp32s3 Dev
・USBCDCOnBoot="Enabled"
・Flash Size=16MB
・Partition Scheme: "Custom"
・PSRAM="Disabled"
(1)main.ino
//main.ino
//V2025/01/31 By JK1VCK
//blog URL:https://gijin77.blog.jp/archives/46648023.html
//esp32s3 Dev USBCDCOnBoot="Enabled" Flash Size=16MB Partition Scheme: "Custom" PSRAM="Disabled"
//partitions.csv
//# Name, Type, SubType, Offset, Size, Flags
//nvs, data, nvs, 0x9000, 0x5000,
//otadata, data, ota, 0xe000, 0x2000,
//factory, app, factory, 0x10000, 3M,
//app1, app, ota_0, 0x310000, 3M,
//app2, app, ota_1, 0x610000, 3M,
//app3, app, ota_2, 0x910000, 3M,
//storage, data, spiffs, 0xC10000, 3M,
#include <esp_ota_ops.h>
#include <esp_partition.h> // パーティション操作に必要
void bootApp(int index) {
// 定数名を ESP_PARTITION_SUBTYPE_APP_OTA_x に修正
esp_partition_subtype_t subtype = (esp_partition_subtype_t)(ESP_PARTITION_SUBTYPE_APP_OTA_0 + index);
// 指定したサブタイプのパーティションを探す
const esp_partition_t* target = esp_partition_find_first(ESP_PARTITION_TYPE_APP, subtype, NULL);
if (target != NULL) {
Serial.printf("Switching to: %s\n", target->label);
esp_ota_set_boot_partition(target);
delay(1000);
esp_restart();
} else {
Serial.println("Error: Partition not found!");
}
}
void setup() {
Serial.begin(115200);
delay(2000);
const esp_partition_t* running = esp_ota_get_running_partition();
Serial.printf("現在起動中のパーティション: %s\n", running->label);
Serial.println("\n--- MAIN MENU ---");
Serial.println("Send '1', '2', or '3' to switch apps.");
}
void loop() {
if (Serial.available()) {
char c = Serial.read();
if (c == '1') bootApp(0);
if (c == '2') bootApp(1);
if (c == '3') bootApp(2);
}
}
(2)partitions.csv
*各アプリに3Mのサイズを確保しています。ここを調整することでアプリ数を
増やすことが出来ます。
*各アプリに3Mのサイズを確保しています。ここを調整することでアプリ数を
増やすことが出来ます。
# Name, Type, SubType, Offset, Size, Flags
nvs, data, nvs, 0x9000, 0x5000,
otadata, data, ota, 0xe000, 0x2000,
factory, app, factory, 0x10000, 3M,
app1, app, ota_0, 0x310000, 3M,
app2, app, ota_1, 0x610000, 3M,
app3, app, ota_2, 0x910000, 3M,
storage, data, spiffs, 0xC10000, 3M,
②app1のフォルダ
*IDE設定
・esp32s3 Dev
・USBCDCOnBoot="Enabled"
・Flash Size=4MB
・Partition Scheme: "Huge APP(3MB)"
・PSRAM="Disabled"
・esp32s3 Dev
・USBCDCOnBoot="Enabled"
・Flash Size=4MB
・Partition Scheme: "Huge APP(3MB)"
・PSRAM="Disabled"
(1)app1.ino
//app1.ino
//V2025/01/31 By JK1VCK
//blog URL:https://gijin77.blog.jp/archives/46648023.html
//esp32s3 Dev USBCDCOnBoot="Enabled" Flash Size=4MB Partition Scheme: "Huge APP(3MB)" PSRAM="Disabled"
#include <esp_ota_ops.h>
#include <esp_partition.h>
void setup() {
Serial.begin(115200);
delay(1000);
pinMode(0, INPUT_PULLUP);
// 次回リセット時はメイン(Factory)に戻るように設定
// 定数名を ESP_PARTITION_SUBTYPE_APP_FACTORY に修正
const esp_partition_t* factory = esp_partition_find_first(ESP_PARTITION_TYPE_APP, ESP_PARTITION_SUBTYPE_APP_FACTORY, NULL);
if (factory != NULL) {
esp_ota_set_boot_partition(factory);
Serial.println("Next boot: Main Menu");
}
Serial.println("Greetings from [App 1]! (Reset to go back)");
}
void loop() {
Serial.println("Runnig [App 1] (Reset to go back)");
delay(1000);
int d=digitalRead(0);
if (d==0) esp_restart();
// ここでアプリのメイン処理を行う
}
(2)\build\esp32.esp32.esp32s3\app1.ino.bin
(1)app2.ino
*app1.inoをコピーしてスケッチ内の「1」->「2」にしてapp2.inoとして保存します。
*app1.inoをコピーしてスケッチ内の「1」->「2」にしてapp2.inoとして保存します。
(2)\build\esp32.esp32.esp32s3\app2.ino.bin
*app1と同様にして作成します。
*app1と同様にして作成します。
④app3のフォルダ
(1)app3.ino
*app1.inoをコピーしてスケッチ内の「1」->「3」にしてapp3.inoとして保存します。
*app1.inoをコピーしてスケッチ内の「1」->「3」にしてapp3.inoとして保存します。
(2)\build\esp32.esp32.esp32s3\app3.ino.bin
*app1と同様にして作成します。4.バイナリファイルの書込み
①flash_download_tool_3.9.7.exeの実行
*書き込みツールを持っていなければ下記よりダウンロードします。
flash_download_tool_3.9.7.zip
②esp32s3を選択

➂app1~3のバイナリファイルを選択&アドレスを指定&COMとBAUDを指定

④STARTで書き込み開始

⑤FINSHが出たら「X」で終了

5.実行時のシリアル出力
①電源ONでmain.inoが実行され、シリアル端末にて「1,2,3」で実行します。
②各アプリ内では、「boot」釦でメインに戻ります。
➂繰り返します。
*************************************************************************
(1)mainが実行中
②各アプリ内では、「boot」釦でメインに戻ります。
➂繰り返します。
*************************************************************************
(1)mainが実行中
現在起動中のパーティション: factory
--- MAIN MENU ---
Send '1', '2', or '3' to switch apps. <---「1」を圧下
Switching to: app1
◆リブートメッセージ省略
Next boot: Main Menu
Greetings from [App 1]! (Reset to go back)
Runnig [App 1] (Reset to go back) <---- app1が実行中
Runnig [App 1] (Reset to go back)
Runnig [App 1] (Reset to go back)
Runnig [App 1] (Reset to go back) <----「boot」を圧下
◆リブートメッセージ省略
現在起動中のパーティション: factory <---mainに戻る
--- MAIN MENU ---
Send '1', '2', or '3' to switch apps. <---「2」を圧下
Switching to: app2
◆リブートメッセージ省略
Next boot: Main Menu
Greetings from [App 2]! (Reset to go back)
Runnig [App 2] (Reset to go back) <---- app2が実行中
Runnig [App 2] (Reset to go back)
Runnig [App 2] (Reset to go back) <----「boot」を圧下
◆リブートメッセージ省略
現在起動中のパーティション: factory <---mainに戻る
--- MAIN MENU ---
Send '1', '2', or '3' to switch apps. <---「3」を圧下
Switching to: app3
Next boot: Main Menu
Greetings from [App 3]! (Reset to go back)
Runnig [App 3] (Reset to go back) <---- app3が実行中
Runnig [App 3] (Reset to go back)
Runnig [App 3] (Reset to go back)
Runnig [App 3] (Reset to go back) <----「boot」を圧下
◆リブートメッセージ省略
現在起動中のパーティション: factory <---mainに戻る
--- MAIN MENU ---
Send '1', '2', or '3' to switch apps.
*************************************************************************
これでランチャーの基本が分かりましたのでこれから応用して行けます。


























