ひとしれずひっそり

主にソフトに関することをメモしていきます。過程をそのまま書いていたりするので間違いが含まれます。鵜呑みしない様に。

M5Unifiedで機種(ボード)判定

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位までの距離で反応した。

M5AtomS3でソニーテレビの赤外線リモコン信号を送信 · GitHub