ESP32コアを変更するとか、なんかいろいろ実験してみたけど、結論は、普通にArudino側から制御できるみたい。なーんだ。時間の無駄。

#include "USB.h"
// 新しいVIDとPIDを定義
#define CUSTOM_VID 0x303A
#define CUSTOM_PID 0x4002
void setup() {
// USBデバイスのVIDとPIDを設定
USB.VID(CUSTOM_VID);
USB.PID(CUSTOM_PID);
// その他の設定(オプション)
USB.productName("AtomS3 Lite Custom");
USB.manufacturerName("kinneko no usui honya");
USB.serialNumber("123456");
// USB CDC(シリアル通信)を開始
USB.begin();
}
void loop() {
// メインループ
}
結構苦労してたのに、結論は簡単じゃん...

何をやりかったかというと、セルフでPIDを変更して起動できるようにすること。
こんな感じね。
#include <Arduino.h> // ESP32の基本機能
#include "USB.h"
#include <Preferences.h>
#include <FastLED.h> // LED制御のためにFastLEDライブラリを使用
// --- ハードウェア定義 ---
#define BUTTON_PIN 41 // ATOMS3 LITEのボタンのGPIOピン
#define LED_PIN 35 // ATOMS3 LITEのLEDのGPIOピン
#define NUM_LEDS 1 // LEDの数
CRGB leds[NUM_LEDS]; // FastLED用のLEDオブジェクト
Preferences preferences;
// --- USBプロファイル定義 ---
#define DEVICE_VID 0x303A
#define DEVICE_MANUFACTURER "My Company"
struct USBProfile {
uint16_t pid;
const char* productName;
CRGB ledColor; // プロファイルごとのLEDの色
};
const USBProfile profiles[] = {
{0x4001, "AtomS3 Lite - Mode A", CRGB::Blue},
{0x4002, "AtomS3 Lite - Mode B", CRGB::Green},
{0x4003, "AtomS3 Lite - Mode C", CRGB::Red}
};
const int num_profiles = sizeof(profiles) / sizeof(profiles[0]);
// --- ボタンの状態管理 ---
// チャタリング(短時間のON/OFFの繰り返し)を防ぐための変数
unsigned long last_debounce_time = 0;
unsigned long debounce_delay = 50; // 50ミリ秒
void setup() {
Serial.begin(115200);
// ボタンピンを入力モードに設定(プルアップ抵抗を有効化)
pinMode(BUTTON_PIN, INPUT_PULLUP);
// LEDの初期化 (FastLEDを使用)
FastLED.addLeds<NEOPIXEL, LED_PIN>(leds, NUM_LEDS);
FastLED.setBrightness(20); // 明るさを設定 (0-255)
// 1. NVSから現在のプロファイル番号を読み出す
preferences.begin("usb-profile", true);
int profile_index = preferences.getUInt("profile_idx", 0);
preferences.end();
// 2. 読み出したプロファイル番号に対応する情報を取得
const USBProfile& current_profile = profiles[profile_index];
// 3. 取得した情報でUSBデバイスを設定
USB.VID(DEVICE_VID);
USB.PID(current_profile.pid);
USB.manufacturerName(DEVICE_MANUFACTURER);
USB.productName(current_profile.productName);
USB.begin();
Serial.printf("プロファイル %d (%s) で起動しました。\n", profile_index, current_profile.productName);
Serial.printf("VID: 0x%04X, PID: 0x%04X\n", DEVICE_VID, current_profile.pid);
Serial.println("ボタンを押すと次のプロファイルに切り替わります。");
// LEDで現在のプロファイルを視覚的に示す
leds[0] = current_profile.ledColor;
FastLED.show();
}
void loop() {
// ボタンの状態を読み取る
// INPUT_PULLUPなので、押されていない時はHIGH(1)、押されている時はLOW(0)
int reading = digitalRead(BUTTON_PIN);
// ボタンが押された瞬間を検出(チャタリング防止処理を含む)
if (reading == LOW) {
if ((millis() - last_debounce_time) > debounce_delay) {
// --- ボタンが押された時の処理 ---
Serial.println("ボタンが押されました。プロファイルを切り替えます...");
// LEDを白く光らせてフィードバック
leds[0] = CRGB::White;
FastLED.show();
// NVSから現在のインデックスを読み出し、次のインデックスを計算・保存
preferences.begin("usb-profile", false);
int current_index = preferences.getUInt("profile_idx", 0);
int next_index = (current_index + 1) % num_profiles;
preferences.putUInt("profile_idx", next_index);
preferences.end();
Serial.printf("次のプロファイル %d に設定しました。再起動します。\n", next_index);
delay(1000);
ESP.restart();
}
// last_debounce_timeを更新しないことで、長押し中の連続実行を防ぐ
} else {
// ボタンが離されたら、次の押下を検出できるように時間をリセット
last_debounce_time = millis();
}
}
ボタンを押すとPIDを書き換えて再起動する感じ。選んでいるPIDが変わったことを目で確認できるように、多色LEDの色を変える。再起動中は白。NVSに状態を保管しているので、起動してきたときにはそれを読んで再現する。
普通にできてつまらん... CORE見たりしてた苦労を返して...
もっと、小さくて安いマイコンでできないのもなと思ったのだけど、PIDの書き換えは、STM32系とESP32系しかサポートしていない感じ。うーん。しかも、NanoC6ではできない感じ。小さくていいのに。
100円投げ銭 https://kinneko.booth.pm/items/1963720
オリジナル投稿:
ESP32 S3でUSB VID/PID書き換え実装|kinneko|pixivFANBOX
https://kinneko.fanbox.cc/posts/10516869



