赤外線受信モジュールを使ってみる(IR LEDで送信も)(Arduino)

赤外線を使ったリモコンが家庭内でも多く使われています。
今回はこのリモコンのデータを受信してみます。
また、赤外線(IR)LEDを使ってデータ送信をしてみます。

今回使う電子部品は、
赤外線受信モジュール 、赤外線(IR)LED、抵抗と、
送信用のリモコンですが、テレビ、エアコン、照明など
家庭にあるものでよいと思います。
私は、JVCのAV用リモコンを使います。

赤外線受信モジュール 、赤外線LED、抵抗、送信用のリモコン
赤外線受信モジュール 、赤外線LED、抵抗、送信用のリモコン

参考:
 aitendo
 ・★特売品★赤外線受信モジュール [IR1838-RM3P]
   https://www.aitendo.com/product/10761
   ¥99-
 ・赤外線リモコン受信モジュール [VS1838B]
   https://www.aitendo.com/product/11031
   ¥40-
 ・★φ5★赤外線ダイオード(20個入) [F5-940-T01]
   https://www.aitendo.com/product/18277
   ¥100-(20個)
 ・赤外線送受信実験セット [IR38SET02]
   https://www.aitendo.com/product/20250
   ¥290-
   ※送信リモコンと受信モジュールのセットです。

 AkiExpress
 ・赤外線センサーレシーバーモジュール
   ¥34-
 ・ユニバーサルir赤外線レシーバーTL1838 VS1838B 1838 38 125khz卸売
   ¥48-(10個)
 ・発光ダイオード(赤外線)
   ¥72-(20個)
  
家電内のリモコンは38KHz付近のキャリア周波数が使用されて
いますが、メーカにより若干の上下(±2KHz程度?)があります。
そのため、赤外線の受信には、
キャリア周波数38KHzの受信モジュールを使用します。
(38KHzで光る赤外線を受信するように作られているも)
送信時には、
Arduinoで38KHzの周波数を生成し、38KHzに対応させて
赤外線(IR)LEDを発光させます。
これで、家電リモコン操作のような送受信を行うことができます。

赤外線リモコンでどのような信号が送信されているのかを、
Multi-function Tester-T7 で測定してみました。
私のAVリモコンの上ボタンを押すと、
"0x00FF18E7" と送信されていました。

Multi-function Tester-T7 での測定結果1
Multi-function Tester-T7 での測定結果1
Multi-function Tester-T7 での測定結果2
Multi-function Tester-T7 での測定結果2

では、送受信のスケッチですが、
スケッチでは、IRremoteライブラリを使用します。
最新バージョンは 3.3.0 ですが、
インストールは 2.6.1 を選択します。
これは、2.x.xバージョンに付属する
スケッチ例 "IRrecvDumpV2" を利用したいためです。
このスケッチは、シリアルモニタに受信データの情報が
分かりやすく表示されます。
※あくまで私の個人の使用感です。

IRremoteライブラリのインストールです。
メニュー「スケッチ」→「ライブラリをインクルード」
   →「ライブラリ管理」を選択します。

ライブラリ管理画面選択
ライブラリ管理画面選択

表示されたライブラリマネージャ画面の検索欄に、
 "IRremote"と入力し、
表示さた IRremote 欄の、
 バージョンから 2.6.1 を選択し、「インストール」をクリックします。

ライブラリのインストール1
ライブラリのインストール1

"バージョン 2.6.1 INSTALLED"が表示され、
インストールが完了したら、「閉じる」ボタンを押します。

ライブラリのインストール2
ライブラリのインストール2

※最新バージョン等の他のバージョンを使用したい場合は、
 この項目のバージョン選択欄から、
 利用したいバージョンを選択し、「インストール」をクリックすれば、
 いつでもバージョンを切り替えることができます。

ライブラリのインストール3
ライブラリのインストール3

インストールの確認は、
メニュー「ファイル」→「スケッチ例」
  → カスタムライブラリのスケッチ例欄の「IRremote」
    → 「IRrecvDumpV2」
が表示されていれば、2.6.1 のインストールは完了です。

スケッチ例の確認
スケッチ例の確認

リモコンからの信号受信からです。

回路は図の通りです。
   この回路図の作図には fritzing を利用させて頂いております。
   https://fritzing.org/home/

回路図
回路図
実際の回路
実際の回路

まずは、スケッチ例の "IRrecvDumpV2" で、
リモコンのデータを受信してみます。

ArduinoとPCを接続し、ボード、シリアルポートを設定します。
 ・メニュー「ツール」→「ボード:」
 ・メニュー「ツール」→「シリアルポート:」

ボード、シリアルポートの設定
ボード、シリアルポートの設定

メニュー「ファイル」→「スケッチ例」
  → カスタムライブラリのスケッチ例欄の「IRremote」
    → 「IRrecvDumpV2」を選択します。

スケッチの選択
スケッチの選択

検証し、マイコンボードに書き込み実行します。

検証し、マイコンボードへの書き込み
検証し、マイコンボードへの書き込み

シリアルモニタを開き、通信速度を "115,200" に設定します。

通信速度の設定
通信速度の設定

リモコンの送信部を赤外線受信モジュールに向けて、
何かのボタンを押します。

シリアルモニタに受信情報が表示されます。
画像は、私のリモコンで "上ボタン" を押したものです。

シリアルモニタの表示内容
シリアルモニタの表示内容

シリアルモニタには、
・Encoding: 仕様メーカー名
・Code:受信したコード
・Timing[67]: 受信したタイミング情報 ( rawData[67] )
などが表示されます。

この画面で、上、下、右、左ボタンのコードを確認します。
このコードを使って、この4つのキーが押されたことを
判別するスケッチを書いてみます。

スケッチです。

// 赤外線リモコンのデータ受信

// IRRemoteライブラリのインクルード
#include <IRremote.h>

// 受信PIN設定
int ReceivePin = 11; 

// オブジェクト生成
IRrecv irrecv(ReceivePin);   // IRrecv
decode_results results;     // decode_results

void setup() {
  // put your setup code here, to run once:
  // シリアルポート設定
  Serial.begin(115200); 
  // 赤外線受信機モジュール起動
  irrecv.enableIRIn();
  // 起動待機
  delay(500);   // 500ms停止
}

void loop() {
  // put your main code here, to run repeatedly:
  if (irrecv.decode(&results)){   // 受信情報あり
    // シリアルモニタへ受信情報表示
    Serial.print("Code: "); 
    Serial.print(results.value, HEX); // 受信値を16進数で値を出力
    Serial.print(",  bits: ");
    Serial.println(results.bits);     // 受信値長をビット数を出力

    // 指定キーの判定
    if( results.value == 0xFF18E7 ){  // 上キー(FF18E7)
      Serial.println("上キー");
    }
    if( results.value == 0xFF4AB5 ){  // 下キー(FF4AB5)
      Serial.println("下キー");
    }
    if( results.value == 0xFF5AA5 ){  // 右キー(FF5AA5)
      Serial.println("右キー");
    }
    if( results.value == 0xFF10EF ){  // 左キー(FF10EF)
      Serial.println("左キー");
    }
    // モジュールの復帰    
    irrecv.resume();
  }  
  delay(1000); // 1000ミリ秒停止
}

検証し、マイコンボードに書き込み実行します。

検証し、マイコンボードへの書き込み
検証し、マイコンボードへの書き込み

上、下、右、左ボタンと他のボタンを押してみます。
4つのボタンを押した時、その旨の表示がされます。

シリアルモニタの表示内容
シリアルモニタの表示内容

これを使えば、リモコンを使った遠隔操作が可能ですね。

最後は、Arduino側からの送信です。

回路は図の通りです。

回路図
回路図
実際の回路
実際の回路

※回路で使用している赤外線(IR)LEDですが、
 仕様では 順電圧:1.35V、100mA となっています。
 これから計算すると、抵抗は50Ω程度となりますが、
 今回は120Ωの抵抗を使用しています。
 ※非常に近づけて使用するできる場合は、
  200~300Ω程度が安心です。(過電流に注意です)
 また、赤外線(IR)LEDは高輝度での使用したい場合、
 高電流を必要とします。本来はトランジスタ(FET)
 で増幅回路を作成して使用するのが良いと思います。

スケッチです。

このスケッチは、
スケッチ例の "IRsendDemo" の loop() 関数内のみを修正し、
利用させて頂きました。

メニュー「ファイル」→「スケッチ例」
  → カスタムライブラリのスケッチ例欄の「IRremote」
    → 「IRsendDemo」を選択します。

スケッチ例の選択
スケッチ例の選択

修正利用させて頂いたスケッチです。

// 赤外線リモコンのデータ送信
/*
 * IRremote: IRsendDemo - demonstrates sending IR codes with IRsend
 * An IR LED must be connected to Arduino PWM pin 3.
 * Version 0.1 July, 2009
 * Copyright 2009 Ken Shirriff
 * http://arcfn.com
 */
// IRremoteライブラリのインクルード
#include <IRremote.h>

// IRsendの生成
IRsend irsend;

// On the Zero and others we switch explicitly to SerialUSB
#if defined(ARDUINO_ARCH_SAMD)
#define Serial SerialUSB
#endif

void setup() {
    pinMode(LED_BUILTIN, OUTPUT);

    Serial.begin(115200);
#if defined(__AVR_ATmega32U4__)
    while (!Serial); //delay for Leonardo, but this loops forever for Maple Serial
#endif
#if defined(SERIAL_USB) || defined(SERIAL_PORT_USBVIRTUAL)
    delay(2000); // To be able to connect Serial monitor after reset and before first printout
#endif
    // Just to know which program is running on my Arduino
    Serial.println(F("START " __FILE__ " from " __DATE__));
    Serial.print(F("Ready to send IR signals at pin "));
    Serial.println(IR_SEND_PIN);
}

// 送信用rawData(Timing)データ定義
const int16_t irData[67] = { 9000, 4450, 550,  600, 550,  600, 550,  600,
                              550,  600, 550,  600, 550,  600, 550,  600,
                              550,  600, 550, 1650, 550, 1700, 550, 1650,
                              550, 1650, 550, 1700, 500, 1650, 600, 1650,
                              550, 1650, 550,  600, 550,  600, 550,  600,
                              550, 1700, 550, 1600, 600,  550, 600,  600,
                              550,  600, 550, 1650, 550, 1700, 500, 1650,
                              600,  600, 550,  600, 550, 1650, 550, 1650,
                              550, 1650, 550
                           };

void loop() {
  // 赤外線LEDから発信する
  // Encodingメーカー指定による送信処理
  irsend.sendJVC(0xFF18E7, 32);       // 上キー(FF18E7)  JVC
//  irsend.sendNEC(0xFF18E7, 32);       // 上キー(FF18E7)  NEC
//  irsend.sendPanasonic(0xFF18E7, 32); // 上キー(FF18E7)  Panasonic

  // rawData(Timing)データを使用した送信処理
  // rawData(Timing)データによる送信
//  irsend.sendRaw(irData, 67, 38.0);

  delay(2000);      //  2000ms停止
}

メーカーencodingを使用して送信する場合、

  // Encodingメーカー指定による送信処理
  irsend.sendJVC(0xFF18E7, 32);       // 上キー(FF18E7)  JVC
  irsend.sendNEC(0xFF18E7, 32);       // 上キー(FF18E7)  NEC
  irsend.sendPanasonic(0xFF18E7, 32); // 上キー(FF18E7)  Panasonic

などと送信します。

また、rawData(Timinng)情報を使用する場合は、

// 送信用rawData(Timing)データ定義
const int16_t irData[67] = { 9000, 4450, 550,  600, 550,  600, 550,  600,
                              550,  600, 550,  600, 550,  600, 550,  600,
                              550,  600, 550, 1650, 550, 1700, 550, 1650,
                              550, 1650, 550, 1700, 500, 1650, 600, 1650,
                              550, 1650, 550,  600, 550,  600, 550,  600,
                              550, 1700, 550, 1600, 600,  550, 600,  600,
                              550,  600, 550, 1650, 550, 1700, 500, 1650,
                              600,  600, 550,  600, 550, 1650, 550, 1650,
                              550, 1650, 550
                           };
// rawData(Timing)データによる送信
irsend.sendRaw(irData, 67, 38.0);

などの定義と送信となります。

検証し、マイコンボードに書き込み実行します。

検証し、マイコンボードへの書き込み
検証し、マイコンボードへの書き込み

上ボタンを押してみます。
このとき、Multi-function Tester-T7 で測定してみると、
 ・irsend.sendJVC(0xFF18E7, 32);
 ・irsend.sendRaw(irData, 67, 38.0);
どちらの送信でも、
対応コード:"0xFF18E7" が送信されているのが分かります。

Multi-function Tester-T7 でのコード測定
Multi-function Tester-T7 でのコード測定

※実行時に赤外線(IR)LEDが発光しているか確認できないですが、
 スマホなどのカメラを通して確認するとほんのりピンク色に
 光っているのが確認できます。
 (うっすら光っている感じで、よく見ないと分からないかも)

カメラを通した赤外線LED(発光状態)ON
カメラを通した赤外線LED(発光状態)ON
カメラを通した赤外線LED(未発光状態)OFF
カメラを通した赤外線LED(未発光状態)OFF

※回路が正常に動作しているのかが分からない時は、

※回路が正常に動作しているのかが分からない時は、
 赤外線(IR)LEDを一般のLED(赤色など)と、
 それに合わせた抵抗値の抵抗を、
 交換して動作させると、LEDが光るので動作確認が
 できると思います。
 (赤外線(IR)LEDと一般の赤色LEDでは、IF値がかなり
  違うと思いますので、抵抗の交換を忘れずに!)

赤色LEDと抵抗を交換して回路確認
赤色LEDと抵抗を交換して回路確認
赤色LEDと抵抗を交換した実際の回路
赤色LEDと抵抗を交換した実際の回路