M5Unifiedを使用すると同じバイナリーで様々なM5の機種に対応ができるとTwitterとかで見たことがある。
内部で判定している場所があるはずなので探ってみる。
M5Unified.hpp内で _board が定義されていてここにデバイスに合わせて設定されるっぽい。
M5Unified/M5Unified.hpp at master · m5stack/M5Unified · GitHub
m5gfx::board_t _board = m5gfx::board_t::board_unknown;
M5.begin()内で判定される様だ。
M5Unified/M5Unified.hpp at master · m5stack/M5Unified · GitHub
auto board = _check_boardtype(_primaryDisplay.getBoard()); if (board == board_t::board_unknown) { board = cfg.fallback_board; } _board = board;
判定された機種はM5. getBoard()で得られる様だ。
M5Unified/M5Unified.hpp at master · m5stack/M5Unified · GitHub
/// get the board type of the runtime environment. /// @return board type board_t getBoard(void) const { return _board; }
そしてどの様な機種が定義されているかというと、M5Unifiedが依存しているM5GFXのboareds.hppに書かれている。
M5GFX/boards.hpp at master · m5stack/M5GFX · GitHub
抜粋だが、Displayの機種も下の方にある。
enum board_t { board_unknown , board_Non_Panel , board_M5Stack , board_M5StackCore2 , board_M5StickC , board_M5StickCPlus , board_M5StackCoreInk , board_M5Paper , board_M5Tough , board_M5Station , board_M5StackCoreS3 , board_M5AtomS3
前回のIR送信でM5StickCにも対応させようとすると、こうできる。
ポインターになってしまうのはしょうがないかな。
#include <Arduino.h> #include <IRremoteESP8266.h> #include <IRsend.h> #include <M5Unified.h> #ifndef USE_USEBSERIAL #define USBSerial Serial #endif static uint16_t kIrLed = 4; IRsend *irsend; void setup() { M5.begin(); switch(M5.getBoard()) { case m5gfx::board_t::board_M5StickC: kIrLed = 9; break; case m5gfx::board_t::board_M5AtomS3: kIrLed = 4; break; } irsend = new IRsend(kIrLed); USBSerial.begin(115200); irsend->begin(); } void loop() { M5.update(); if (M5.BtnA.wasClicked()) { USBSerial.println("Power off"); irsend->sendSony(0xa90, 12, 3); // 12 bits & 3 repeats //irsend.sendNEC(0x00FFE01FUL); delay(2000); } }
このまま転送しようとするとplatformioだと機種判定されて転送できないので、今回は同じバイナリーで動作できるかは追及せず環境切り替えで行うことにした。
またSerialとUSBSerialの違いもあるのでS3系はシリアル出力ではもうひと工夫が要りそうだ。
M5StickCだと2m位までの距離で反応した。