赤外線リモコンの信号を受信してダンプするプログラムと、それを送信するプログラムを作成した。
結論から言うとプログラムは動作したが、M5GO IoTスターターキットに入っていた赤外線送受信ユニットは射程が2mほどしかなくて、エアコンや照明の制御には使えなかった。
目次
赤外線リモコンの信号を受信
https://siroitori.hatenablog.com/entry/2020/04/25/114250を参考にして、ライブラリIRremoteESP8266
をArduinoにインストール。
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以上距離があると信号が届かなかった。