この記事の結論
- IR受信モジュール(VS1838Bなど)はVCC・GND・OUTの3ピンで、市販リモコンの赤外線信号をデジタル信号に変換して受け取る
- IRremoteライブラリはバージョン3.0以降でAPIが刷新され、旧来の「irrecv」記法から「IrReceiver」記法に変わっている
- 市販リモコンのボタンごとのコード値をシリアルモニタで確認し、if文で分岐させれば、ボタンに応じた動作を作れる
- リレーモジュールと組み合わせれば、リモコンで家電をオン/オフする工作にも発展できる
タッチセンサーや押しボタンは、機器のすぐそばに手を伸ばして操作する入力方法でした。
それに対して、テレビやエアコンのリモコンのように「離れた場所から操作したい」というときに使われるのが、赤外線(IR)リモコンです。
この記事では、市販のリモコンの信号を受信するIRモジュールの配線と、信号を読み取って処理するためのIRremoteライブラリの使い方を整理します。
赤外線リモコンが信号を送る仕組み
テレビやエアコンなどのリモコンは、ボタンを押すと先端の赤外線LEDが、目には見えない光を点滅させて信号を送っています。

この点滅は、実際には約38kHzという高い周波数でオン/オフをくり返す「キャリア(搬送波)」の上に、ON/OFFのパターンを乗せる形で作られています。
この点滅のパターンには、メーカーごとに決められた規格に沿って「どのボタンが押されたか」を表す情報が乗せられており、受信側はこのパターンを読み取ることで、押されたボタンを判別しています。
受信モジュールの多くは、この38kHz前後の光だけを拾うように作られているため、蛍光灯や日光など他の光源のちらつきには反応しにくくなっています。
Arduinoでこの信号を受け取るためには、赤外線の点滅を検知できる専用の受信モジュールが必要で、購入する際は「38kHz用」と表記された製品(VS1838Bなど)を選んでください。
IR受信モジュールの配線、VCC/GND/OUTの3ピン
定番として広く使われているIR受信モジュールに「VS1838B」があります。
VS1838Bをはじめとする多くのIR受信モジュールは、VCC・GND・OUT(製品によってはSIGNALやYと表記)の3本のピンで構成されています。
VCCはArduinoの5Vピンに、GNDはGNDピンに、OUTは任意のデジタルピン(サンプルコードでは11番ピンがよく使われます)につなぎます。
VS1838Bは3本の足がどれもよく似た形をしているため、逆挿しによる発熱・破損の定番のつまずきどころです。
一般的なVS1838Bでは、黒い半球状のレンズを正面から見て左から「OUT・GND・VCC」の順に並んでいますが、製品によって並び順が異なる場合があるため、購入した商品の説明やデータシートで必ず確認してから配線してください。
TTP223のタッチセンサーと同じく、外部の抵抗器などは不要で、3本の線をつなぐだけで受信の準備が整います。

IRremoteライブラリの導入とバージョンの罠
受信した信号のパターンを、人間が理解できるコード値に変換してくれるのが「IRremote」というライブラリです。
ライブラリマネージャからのインストール
Arduino IDEのライブラリマネージャを開き、検索欄に「IRremote」と入力すると、作者名に「shirriff, z3t0, ArminJo」と表示されたライブラリが見つかります。
ライブラリマネージャの基本的な開き方・使い方は、ライブラリのインストール方法の記事で解説している手順と同じです。
新旧バージョンでAPIが大きく変わっている点に注意
IRremoteライブラリはバージョン3.0以降で内部の書き方(アーキテクチャ)が大きく変更されており、古い解説記事によくある「irrecv」「decode_results」といった書き方のサンプルコードは、最新版のライブラリではそのままだとコンパイルエラーになります。
インターネット上には旧バージョン向けの記事も数多く残っているため、コードをコピペする前に、自分がインストールしたライブラリのバージョンに合った書き方かどうかを確認してください。
この記事では、現行の最新版(4.x系)で使われている書き方をもとに解説します。
最新版の基本コード
最新版のIRremoteでは、まずスケッチの先頭で#include <IRremote.hpp>のように「.hpp」形式でインクルードします。
#include <IRremote.hpp>
const int irPin = 11; // IR受信モジュールのOUTをつないだピン
void setup() {
Serial.begin(9600);
IrReceiver.begin(irPin); // 受信開始
}
void loop() {
if (IrReceiver.decode()) {
Serial.println(IrReceiver.decodedIRData.decodedRawData, HEX); // 受信したコード値を16進数で表示
IrReceiver.resume(); // 次の受信に備えてリセット
}
}
setup()の中のIrReceiver.begin(irPin)で受信を開始し、loop()の中でIrReceiver.decode()がtrueを返したタイミングで、何か信号を受信したと判断します。
受信したコード値はIrReceiver.decodedIRData.decodedRawDataから取り出せ、最後に必ずIrReceiver.resume()を呼んで、次の受信に備えます。
resume()を書き忘れると、最初の1回しか信号を受信できなくなるため、忘れずに入れてください。
市販リモコンのボタンごとのコード値を読み取る
上のコードを書き込んでシリアルモニタを開き、手元のリモコンのボタンを1つずつ押してみると、ボタンごとに異なる16進数のコード値が表示されます。

この値をメモしておけば、if文でコード値ごとに処理を分けるという、応用の入り口に立てます。
下記のコード例の0xF7C03Fという値はあくまでサンプルです。必ず自分のリモコンで実際にシリアルモニタに表示された値に置き換えて使ってください。
if (IrReceiver.decodedIRData.decodedRawData == 0xF7C03F) {
Serial.println("1番ボタンが押されました");
}
NEC系のリモコンであれば、decodedRawDataの代わりにIrReceiver.decodedIRData.command(とprotocol)で比較するほうが、アドレス部の違いに左右されず安定します。
実際にボタンを読み取っていると、「同じボタンなのに値が違って見える」という現象にぶつかることがあります。
リピートコードをそのまま拾って誤動作しないように、判定処理の先頭でリピートを弾いておくと安定します。
この判定は、loop()内のIrReceiver.decode()がtrueになったブロックの先頭に置きます。
if (IrReceiver.decodedIRData.flags & IRDATA_FLAGS_IS_REPEAT) {
IrReceiver.resume();
return; // リピートコードはここで処理を打ち切る
}
応用、家電操作への発展
ボタンごとのコード値をif文で分岐できるようになると、「1番ボタンでLEDを点灯」「2番ボタンで消灯」といった、リモコンでの操作が作れるようになります。
この分岐処理の中でLEDの点灯・消灯の代わりに、リレーモジュールのオン/オフを組み合わせれば、リモコンでコンセント機器を操作する工作にも発展できます。
リモコンは離れた場所から操作できるぶん、機器の状態を目視で確認しないまま繰り返しオン/オフを切り替えることになります。
AC100Vのコンセント機器を直接切り替える工作は感電・発火の危険があるため、配線や絶縁処理に十分な知識と経験が必要です。
電子工作に慣れないうちは、USB機器や電池駆動の機器などAC100Vを使わない負荷でリレーの動作を試すことをおすすめします。

リレーモジュールのトリガー電圧や接点定格の選び方については、別の記事で詳しく整理しています。
Arduino Uno R4 WiFiを使ったスマホ連携のIoT入門記事では、スマホアプリからのオン/オフ操作を紹介していますが、赤外線リモコンでの操作もそれと似た発想で組み立てられます。
実際にボタンごとに処理を分けるコードは、先ほどのリピート除外処理と組み合わせて、次のようにif/else ifで書けます。
このうちconst int relayPin = 9;の行は、スケッチのいちばん先頭(setup()より上)に書きます。
あわせてsetup()内にpinMode(relayPin, OUTPUT);を追加し、残りのif文の部分をloop()内のIrReceiver.decode()がtrueになったブロックの先頭に置きます。
const int relayPin = 9; // リレーモジュールのINをつないだピン
if (IrReceiver.decodedIRData.flags & IRDATA_FLAGS_IS_REPEAT) {
IrReceiver.resume();
return;
}
if (IrReceiver.decodedIRData.decodedRawData == 0xF7C03F) {
Serial.println("1番ボタン:オン");
digitalWrite(relayPin, LOW); // アクティブLOW品の例
} else if (IrReceiver.decodedIRData.decodedRawData == 0xF7807F) {
Serial.println("2番ボタン:オフ");
digitalWrite(relayPin, HIGH); // アクティブLOW品の例
}
IrReceiver.resume();
まとめ:配線はシンプル、つまずきやすいのはライブラリのバージョン
IR受信モジュールそのものの配線は、VCC・GND・OUTの3本だけとシンプルです。
つまずきやすいのはむしろソフトウェア側で、特にIRremoteライブラリの新旧バージョンによる書き方の違いは、初心者が検索で見つけた記事を試してエラーになりやすいポイントです。
取り組む前に、以下の点がなんとなくつかめているか確認してみてください。
- IR受信モジュールの配線がVCC・GND・OUTの3本で完結するという見当がついている
- IRremoteライブラリのバージョンによって「irrecv」と「IrReceiver」の書き方が異なる点を意識できている
- ボタンごとのコード値を実測してからif文で分岐する、という進め方がだいたいわかっている
タッチセンサーとリモコン、両方の入力方式を知っておくと、工作の目的や設置場所に応じて操作方法を選べるようになります。
指で触れて操作する静電容量式タッチセンサー(TTP223)の使い方についても、別の記事で詳しく整理しています。



コメント