M5Stack用赤外線送受信ユニット

概要

M5Stack社のユニット紹介シリーズです。今回は何度も使っているけれど単体での紹介がいなかった赤外線送受信ユニットの紹介になります。

非常に便利で使い勝手もいいので、一つぐらい持っていてもいいユニットだと思います。

商品

非常にシンプルなユニットで赤外線送信用LEDと受信用センサーが搭載されています。

こんな感じで、コネクタは特殊用途の黒ですね。これはI2Cなどではなく送信と受信でデジタル入出力だからですね。上に2つ丸が見えますが右側の黒い方が受信で、左側の透明な方が送信になります。

外側の白が受信で、内側の黄色が送信みたいですね。

推奨ライブラリ

上記のIRremoteESP8266が非常におすすめです。IRremoteというライブラリをESP8266とESP32向けにカスタマイズしたものになります。本家のIRremoteは受信専用なのでESP32の場合にはこちらのライブラリを使ってみてください。

リモコン信号の解析(IRrecvDumpV2)

IRremoteESP8266のスケッチ例のIRrecvDumpV2がよく使われています。OTAに対応したV3もあるのですが、普通に使うのであればV2の方がシンプルです。もう少し古いIRrecvDumpもありますが、こちらは非推奨みたいです。

const uint16_t kRecvPin = 33; // 受信用GPIO(33:M5StickC, Core2)

スケッチ例を開いて、ピン番号を変更すれば動きます。接続したGrove端子の外側のピン番号になります。

本体接続先送信PIN受信PIN
M5StickCPortA3233
M5StickC PlusPortA3233
M5Stack Core2PortA3233
ATOM LITEPortA2632
ATOM MATRIXPortA2632
ATOM ECHOPortA2632
M5Stack FIREPortB(Black)2636
M5Stack FIREPortC(Blue) ※非推奨1716

上記の対応になると思います。M5Stack BASICとGRAYはPortAがI2C専用のため利用できません。

上記のようなものを使うことで、GROVEポートは増設できそうです。内部のM-BUSにはGPIOがきていますので、配線をするためのパーツになります。

リモコンの受信例

#include <IRrecv.h>

const uint16_t kRecvPin = 36; // 受信用GPIO(33:M5StickC+Core2, ATOM:32, FIRE:36)

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

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

void setup() {
  // シリアル初期化
  Serial.begin(115200);
  delay(50);

  // 受信初期化
  irrecv.enableIRIn();
}

void loop() {
  // 受信
  decode_results results;
  if (irrecv.decode(&results)) {
    // 受信
    if (results.decode_type == NEC && results.address == 0x00) {
      // NECのアドレス0のみ今回は処理する
      Serial.println(results.command);
    }
  }

  delay(1);
}

最小限の項目のみに削ってあります。

今回は、上記のキットにはいっている赤外線リモコンを使ってテストしています。リモコンによってプロトコルが違うので、Dumpで確認してからプログラムをしたほうが良いです。

普通のテレビのリモコンなど確認できるのですが、確認のたびにテレビが動くのは面倒なのでリモコン付きのキットや、ダイソーのリモコンライトなどを持っていると便利です。

リモコンの送信例

#include <IRsend.h>
  
const uint16_t kIrLed = 26;             // 送信用GPIO(32:M5StickC+Core2, ATOM:26, FIRE:26)
  
IRsend irsend(kIrLed);                  // IR送信を宣言
  
const uint32_t IR_ADDRESS = 0x0000;     // アドレス
const uint32_t IR_COMMAND = 22;         // コマンド
 
void setup() {
  // シリアル初期化
  Serial.begin(115200);
  delay(50);

  irsend.begin(); // IR初期化
}
  
void loop() {
  // 送信
  uint64_t send = irsend.encodeNEC(IR_ADDRESS, IR_COMMAND);
  irsend.sendNEC(send);
  
  delay(1000);
}

毎秒NECプロトコルでアドレス0にコマンド22を送信するスケッチです。

まとめ

リモコンデータの解析で使うので一個は持っていてもいいユニットです。実際に使うときは送信ばかりなので、M5StickC本体のIRなどの方が楽なのですが飛距離がいまいちだったりするので、その場合にはこのユニットを使ったりします。

コメントする

メールアドレスが公開されることはありません。

管理者承認後にページに追加されます。公開されたくない相談はその旨本文に記載するかTwitterなどでDM投げてください。またスパム対策として、日本語が含まれない投稿は無視されますのでご注意ください。