赤外線受信モジュールを使ってみる(IR LEDで送信も)(Arduino)
赤外線を使ったリモコンが家庭内でも多く使われています。
今回はこのリモコンのデータを受信してみます。
また、赤外線(IR)LEDを使ってデータ送信をしてみます。
今回使う電子部品は、
赤外線受信モジュール 、赤外線(IR)LED、抵抗と、
送信用のリモコンですが、テレビ、エアコン、照明など
家庭にあるものでよいと思います。
私は、JVCのAV用リモコンを使います。
参考:
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" と送信されていました。
では、送受信のスケッチですが、
スケッチでは、IRremoteライブラリを使用します。
最新バージョンは 3.3.0 ですが、
インストールは 2.6.1 を選択します。
これは、2.x.xバージョンに付属する
スケッチ例 "IRrecvDumpV2" を利用したいためです。
このスケッチは、シリアルモニタに受信データの情報が
分かりやすく表示されます。
※あくまで私の個人の使用感です。
IRremoteライブラリのインストールです。
メニュー「スケッチ」→「ライブラリをインクルード」
→「ライブラリ管理」を選択します。
表示されたライブラリマネージャ画面の検索欄に、
"IRremote"と入力し、
表示さた IRremote 欄の、
バージョンから 2.6.1 を選択し、「インストール」をクリックします。
"バージョン 2.6.1 INSTALLED"が表示され、
インストールが完了したら、「閉じる」ボタンを押します。
※最新バージョン等の他のバージョンを使用したい場合は、
この項目のバージョン選択欄から、
利用したいバージョンを選択し、「インストール」をクリックすれば、
いつでもバージョンを切り替えることができます。
インストールの確認は、
メニュー「ファイル」→「スケッチ例」
→ カスタムライブラリのスケッチ例欄の「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" が送信されているのが分かります。
※実行時に赤外線(IR)LEDが発光しているか確認できないですが、
スマホなどのカメラを通して確認するとほんのりピンク色に
光っているのが確認できます。
(うっすら光っている感じで、よく見ないと分からないかも)
※回路が正常に動作しているのかが分からない時は、
※回路が正常に動作しているのかが分からない時は、
赤外線(IR)LEDを一般のLED(赤色など)と、
それに合わせた抵抗値の抵抗を、
交換して動作させると、LEDが光るので動作確認が
できると思います。
(赤外線(IR)LEDと一般の赤色LEDでは、IF値がかなり
違うと思いますので、抵抗の交換を忘れずに!)