概要
M5Unifiedなどを利用していると、選択しているボードと実際に書き込みをするボードがずれることがあります。その場合デフォルトのボード定義を利用することができなかったり、M5Stackの新製品がESP32公式ボードに登録されていなくてボード定義が利用できないことがあります。そこでボード定義をボードマネージャーやM5Unifiedから収集するツールを作りました。
作成物
上記のツールとなります。実際にはESP32のライブラリマネージャーからライブラリとして利用する形で利用します。
using BoardInfo = variants_collector::esp32::esp32::m5stack_atoms3::Info;
using BoardPins = variants_collector::esp32::esp32::m5stack_atoms3::Pins;
Serial.println(BoardInfo::fqbn);
Serial.println(BoardPins::builtin_led);
たとえば上記のように利用します。variants_collectorがトップレベルのネームスペースで、その下にボード定義のfqbnが並んでいます。ボードの下にはInfoとPinsがあります。
namespace esp32
{
namespace esp32
{
namespace m5stack_atoms3
{
struct Info
{
static inline constexpr const char *fqbn = "esp32:esp32:m5stack_atoms3";
static inline constexpr const char *name = "M5AtomS3";
static inline constexpr const char *build_mcu = "esp32s3";
};
struct Pins
{
static inline constexpr uint8_t pins_soc_gpio_pin_count = 49;
static inline constexpr uint16_t usb_vid = 12346;
static inline constexpr uint16_t usb_pid = 4097;
static inline constexpr uint8_t pin_rgb_led = 35;
static inline constexpr uint8_t tx = 43;
static inline constexpr uint8_t rx = 44;
static inline constexpr uint8_t txd2 = 1;
static inline constexpr uint8_t rxd2 = 2;
static inline constexpr uint8_t g0 = 0;
static inline constexpr uint8_t g1 = 1;
static inline constexpr uint8_t g2 = 2;
static inline constexpr uint8_t g3 = 3;
static inline constexpr uint8_t g4 = 4;
static inline constexpr uint8_t g5 = 5;
static inline constexpr uint8_t g6 = 6;
static inline constexpr uint8_t g7 = 7;
static inline constexpr uint8_t g8 = 8;
static inline constexpr uint8_t g36 = 36;
static inline constexpr uint8_t g37 = 37;
static inline constexpr uint8_t g38 = 38;
static inline constexpr uint8_t g39 = 39;
static inline constexpr uint8_t g40 = 40;
static inline constexpr uint8_t g42 = 42;
static inline constexpr uint8_t adc1 = 7;
static inline constexpr uint8_t adc2 = 8;
static inline constexpr uint8_t builtin_led = 84;
static inline constexpr uint8_t rgb_builtin = 84;
};
} // namespace m5stack_atoms3
} // namespace esp32
} // namespace esp32
実際には上記のデータになります。static inline constexprなので、参照されないデータはリンク時に消えますので、容量的にはたいしたことがありません。
namespace m5stack
{
namespace esp32
{
namespace m5stack_atoms3
{
struct Info
{
static inline constexpr const char *fqbn = "m5stack:esp32:m5stack_atoms3";
static inline constexpr const char *name = "M5AtomS3";
static inline constexpr const char *build_mcu = "esp32s3";
};
struct Pins
{
static inline constexpr uint8_t pins_soc_gpio_pin_count = 49;
static inline constexpr uint16_t usb_vid = 12346;
static inline constexpr uint16_t usb_pid = 4097;
static inline constexpr uint8_t external_num_interrupts = 46;
static inline constexpr uint8_t num_digital_pins = 48;
static inline constexpr uint8_t num_analog_inputs = 20;
static inline constexpr uint8_t tx = 43;
static inline constexpr uint8_t rx = 44;
static inline constexpr uint8_t txd2 = 1;
static inline constexpr uint8_t rxd2 = 2;
static inline constexpr uint8_t ex_scl = 1;
static inline constexpr uint8_t ex_sda = 2;
static inline constexpr uint8_t in_scl = 39;
static inline constexpr uint8_t in_sda = 38;
static inline constexpr uint8_t g0 = 0;
static inline constexpr uint8_t g1 = 1;
static inline constexpr uint8_t g2 = 2;
static inline constexpr uint8_t g3 = 3;
static inline constexpr uint8_t g4 = 4;
static inline constexpr uint8_t g5 = 5;
static inline constexpr uint8_t g6 = 6;
static inline constexpr uint8_t g7 = 7;
static inline constexpr uint8_t g8 = 8;
static inline constexpr uint8_t g36 = 36;
static inline constexpr uint8_t g37 = 37;
static inline constexpr uint8_t g38 = 38;
static inline constexpr uint8_t g39 = 39;
static inline constexpr uint8_t g40 = 40;
static inline constexpr uint8_t g42 = 42;
static inline constexpr uint8_t adc1 = 7;
static inline constexpr uint8_t adc2 = 8;
static inline constexpr uint8_t in_i2c_scl = 22;
static inline constexpr uint8_t in_i2c_sda = 21;
static inline constexpr uint8_t port_a_pin1 = 33;
static inline constexpr uint8_t port_a_scl = 33;
static inline constexpr uint8_t ex_i2c_scl = 33;
static inline constexpr uint8_t port_a_pin2 = 32;
static inline constexpr uint8_t port_a_sda = 32;
static inline constexpr uint8_t ex_i2c_sda = 32;
static inline constexpr const char *usb_manufacturer = "M5Stack";
static inline constexpr const char *usb_product = "AtomS3";
static inline constexpr uint8_t builtin_led = 97;
static inline constexpr uint8_t rgb_builtin = 97;
};
} // namespace m5stack_atoms3
} // namespace esp32
} // namespace m5stack
標準ボードマネージャー側はあまり意味がないのですが、m5stack:esp32:m5stack_atoms3版にはデータが増えています。これはM5Unifiedから収集したデータで、variants_collector::esp32::esp32::m5stack_atoms3::Pins::in_i2c_sclなどで内部で利用しているI2Cピン番号がわかります。m5stack_atoms3だとあまりうれしくはないのですが、PSRAMを搭載しているm5stack_atoms3rは公式ボードマネージャにはいないのと、I2Cのピンアサインが無印ATOMS3と違うのでM5Unifiedを利用していない場合には面倒です。
まとめ
なんのために作ったのか忘れかけていますが、最近つくったライブラリを全部紹介しています。こちらはとくにM5Unifiedを利用していない画面無しのプロジェクトなどでピン番号を取得する場合に便利に使うことができます。



コメント