単子葉類プログラマーのメモ

プログラミング関連の自分用メモだけど他の人の役に立つかもしれないので公開しておく感じのブログ

M5Stackで赤外線リモコン

赤外線リモコンの信号を受信してダンプするプログラムと、それを送信するプログラムを作成した。

結論から言うとプログラムは動作したが、M5GO IoTスターターキットに入っていた赤外線送受信ユニットは射程が2mほどしかなくて、エアコンや照明の制御には使えなかった。

目次

赤外線リモコンの信号を受信

https://siroitori.hatenablog.com/entry/2020/04/25/114250を参考にして、ライブラリIRremoteESP8266Arduinoにインストール。

IRremoteESP8266のスケッチ例IRrecvDumpV3と、M5Stack - Unit - IRのスケッチ例を見つつ、リモコンの信号を受信するプログラムを作成。

#include <M5Stack.h>
#include <IRrecv.h>
#include <IRremoteESP8266.h>
#include <IRac.h>
#include <IRtext.h>
#include <IRutils.h>

const int kRecvPin = 36;  // for M5GO IR unit

int last_recv_value = 0;
int cur_recv_value = 0;

const uint16_t kCaptureBufferSize = 1024;
const uint8_t kTimeout = 50;

const uint8_t kTolerancePercentage = kTolerance;

IRrecv irrecv(kRecvPin, kCaptureBufferSize, kTimeout, true);
decode_results results;

void setup() {
  M5.begin();
  M5.Power.begin();
  Serial.begin(115200);

  digitalWrite(ir_send_pin, 1);
  M5.Lcd.setTextSize(2);
  M5.Lcd.setCursor(0, 0);
  M5.Lcd.print("Test for IR receiver: ");

  irrecv.setTolerance(kTolerancePercentage);
  irrecv.enableIRIn();
}

void loop() {
  if (irrecv.decode(&results)) {
    uint32_t now = millis();

    if (results.overflow) {
      Serial.printf(D_WARN_BUFFERFULL "\n", kCaptureBufferSize);
    }
    Serial.println(D_STR_LIBRARY "   : v" _IRREMOTEESP8266_VERSION_ "\n");
    if (kTolerancePercentage != kTolerance) {
      Serial.printf(D_STR_TOLERANCE " : %d%%\n", kTolerancePercentage);
    }
    
    Serial.print(resultToHumanReadableBasic(&results));
    
    String description = IRAcUtils::resultAcToString(&results);
    if (description.length()) {
      Serial.println(D_STR_MESGDESC ": " + description);
    }
    
    yield();
    
#if LEGACY_TIMING_INFO
    Serial.println(resultToTimingInfo(&results));
    yield();
#endif  // LEGACY_TIMING_INFO

    Serial.println(resultToSourceCode(&results));
    Serial.println();
    yield();
  }
}

信号を受信するとArduinoツール - シリアルモニタで開いたウィンドウに受信した内容が出力される。

照明のON、OFFを受信した結果。

Library   : v2.7.12

Protocol  : UNKNOWN
Code      : 0x5DF2C18E (42 Bits)
uint16_t rawData[83] = {3498, 1742,  436, 432,  434, 432,  434, 1312,  434, 1312,  434, 432,  434, 1312,  434, 432,  434, 430,  434, 432,  434, 1312,  436, 430,  434, 430,  434, 1312,  434, 432,  434, 1312,  434, 432,  432, 1314,  434, 432,  434, 432,  434, 1310,  436, 432,  434, 432,  432, 430,  434, 432,  434, 432,  434, 432,  434, 1312,  436, 432,  434, 1312,  436, 1312,  434, 430,  434, 432,  434, 1312,  436, 432,  432, 1312,  434, 1312,  436, 1312,  434, 1312,  434, 432,  434, 430,  434};  // UNKNOWN 5DF2C18E


Library   : v2.7.12

Protocol  : UNKNOWN
Code      : 0xCA0A68FC (42 Bits)
uint16_t rawData[83] = {3504, 1738,  440, 424,  440, 424,  440, 1306,  442, 1306,  466, 400,  440, 1306,  440, 426,  440, 424,  440, 424,  440, 1306,  440, 426,  440, 426,  440, 1306,  440, 426,  438, 1306,  442, 426,  440, 1306,  466, 400,  440, 426,  440, 1306,  440, 424,  440, 424,  466, 400,  440, 426,  440, 1306,  440, 1308,  440, 1306,  442, 424,  442, 1306,  442, 1306,  442, 424,  440, 426,  440, 426,  440, 1306,  442, 1306,  442, 1306,  442, 1306,  442, 1304,  442, 424,  466, 400,  440};  // UNKNOWN CA0A68FC

送信

上記の信号を送信するプログラム。

#include <M5Stack.h>
#include <IRremoteESP8266.h>
#include <IRsend.h>

template <typename T, size_t N>
size_t arraySize(T (&arr)[N]) {
  return N;
}

const uint16_t kIrSendPin = 26;  // for M5GO IR unit
const uint16_t kSendFrequencyKhz = 38;

IRsend irsend(kIrSendPin);

uint16_t rawDataOn[83] = {3498, 1742,  436, 432,  434, 432,  434, 1312,  434, 1312,  434, 432,  434, 1312,  434, 432,  434, 430,  434, 432,  434, 1312,  436, 430,  434, 430,  434, 1312,  434, 432,  434, 1312,  434, 432,  432, 1314,  434, 432,  434, 432,  434, 1310,  436, 432,  434, 432,  432, 430,  434, 432,  434, 432,  434, 432,  434, 1312,  436, 432,  434, 1312,  436, 1312,  434, 430,  434, 432,  434, 1312,  436, 432,  432, 1312,  434, 1312,  436, 1312,  434, 1312,  434, 432,  434, 430,  434};  // UNKNOWN 5DF2C18E
uint16_t rawDataOff[83] = {3504, 1738,  440, 424,  440, 424,  440, 1306,  442, 1306,  466, 400,  440, 1306,  440, 426,  440, 424,  440, 424,  440, 1306,  440, 426,  440, 426,  440, 1306,  440, 426,  438, 1306,  442, 426,  440, 1306,  466, 400,  440, 426,  440, 1306,  440, 424,  440, 424,  466, 400,  440, 426,  440, 1306,  440, 1308,  440, 1306,  442, 424,  442, 1306,  442, 1306,  442, 424,  440, 426,  440, 426,  440, 1306,  442, 1306,  442, 1306,  442, 1306,  442, 1304,  442, 424,  466, 400,  440};  // UNKNOWN CA0A68FC

void setup() {
  M5.begin();
  M5.Power.begin();
  Serial.begin(115200);

  irsend.begin();
}

void loop() {
  M5.update();

  if (M5.BtnA.wasPressed()) {
    irsend.sendRaw(rawDataOn, arraySize(rawDataOn), kSendFrequencyKhz);
    M5.Lcd.println("On");
  }
  if (M5.BtnC.wasPressed()) {
    irsend.sendRaw(rawDataOff, arraySize(rawDataOff), kSendFrequencyKhz);
    M5.Lcd.println("Off");
  }

  delay(10);
}

照明(National HK9327K)のON/OFFができたが約2m以上距離があると信号が届かなかった。

その他参考

github.com

elm-chan.org