赤外線受信モジュールとリモコン:Arduinoでリモコン操作のプロジェクト
赤外線(IR)受信モジュールのしくみは?VS1838Bの配線、IRremoteライブラリでのボタンコードの読み取り、NECプロトコル、リモコンでのLEDとリレーの操作、赤外線LEDでの送信、ESP32とPicoでの使い方を解説します。
テレビ、エアコン、オーディオのリモコンは赤外線(IR)の光で動いています。ほとんどお金のかからない赤外線受信モジュールをArduinoに加えれば、家にあるほぼすべてのリモコンのボタンを読み取り、ランプ、LED、モーター、音楽の操作に使えます。ペアリングもアプリもインターネットも不要で、リモコンをボードに向けてボタンを押すだけです。はじめてのリモコン操作のプロジェクトへの、いちばん簡単で安上がりな近道です。

赤外線リモコンのしくみ
リモコンの先端にある赤外線LEDは、目に見えない約940 nmの光を出します。光は常に点いているわけではなく、1秒間に38,000回点滅する搬送波に乗せて送られます。受信モジュールの中の回路はその周波数でちらつく光だけに反応するため、日光や照明が信号を邪魔することはありません。受信モジュールはこのちらつきをきれいなデジタルパルスに変え、信号がある間は出力をLOWにします。
どのボタンが押されたかは、パルスの長さとパルスの間隔で表されます。その表し方にはプロトコルと呼ばれるいくつかの「言語」があります。もっとも一般的なのはNEC(アドレス1バイトとコマンド1バイト)で、Sony、RC5(Philips)、Samsungのプロトコルもよく使われています。うれしいことに復号はライブラリがやってくれるので、ボタンのコードを読むだけで済みます。
仕様(VS1838B)
| 項目 | 値 |
|---|---|
| 搬送波の周波数 | 38 kHz |
| 波長 | 約940 nm |
| 電源 | 2.7〜5.5 V |
| 到達距離 | 8〜10 m(リモコンの電池と角度による) |
| 受光角度 | 約±35° |
| 出力 | 信号がある間はLOW(アクティブLOW) |
| ピン | OUT、GND、VCC |
赤外線受信モジュールの配線
| 受信モジュールのピン | Arduino Uno | ESP32 | Raspberry Pi Pico |
|---|---|---|---|
| OUT(S) | D2 | GPIO 15 | GP16 |
| GND(–) | GND | GND | GND |
| VCC(+) | 5V | 3V3 | 3V3 |
IRremoteライブラリでボタンコードを読む
ライブラリマネージャでIRremoteを検索し、Armin Joachimsmeyer作のライブラリをインストールします。次のコードはバージョン4.x用で、ボタンを押すたびにプロトコル、アドレス、コマンドコードをシリアルモニタに表示します。ネット上の古い例でIRrecvやdecode(&results)のような命令を見かけたら、それは古いバージョンのものです。
1#include <IRremote.hpp>
2
3const int IR_PIN = 2;
4
5void setup() {
6 Serial.begin(9600);
7 IrReceiver.begin(IR_PIN, ENABLE_LED_FEEDBACK); // sinyal gelince dahili LED yanar / onboard LED blinks on signal
8}
9
10void loop() {
11 if (IrReceiver.decode()) {
12 Serial.print("Komut / command: 0x");
13 Serial.println(IrReceiver.decodedIRData.command, HEX);
14 IrReceiver.printIRResultShort(&Serial); // protokol ve adres / protocol and address
15 IrReceiver.resume(); // sonraki tuşa hazırlan / ready for the next key
16 }
17}リモコンのボタンを1つずつ押して、コードを書き留めましょう。キットに入っている21キーの小さなリモコンはたいていNECプロトコルを使い、コードはおおむね次のとおりです。ただし、自分のリモコンのコードを読んで確認してください。
| ボタン | コマンド(NEC) |
|---|---|
| CH- | 0x45 |
| CH | 0x46 |
| CH+ | 0x47 |
| PREV | 0x44 |
| NEXT | 0x40 |
| PLAY/PAUSE | 0x43 |
| VOL- | 0x07 |
| VOL+ | 0x15 |
| 0 | 0x16 |
| 1 | 0x0C |
| 2 | 0x18 |
| 3 | 0x5E |
リモコンでLEDとリレーを操作する
コードがわかれば、ボタンごとに役割を割り当てられます。次の例では、「1」ボタンでリレーのオン・オフを切り替え、VOL+とVOL-でLEDの明るさをPWMで調整します。ボタンを押し続けると、リモコンはリピート信号を送ります。オン・オフの操作ではこのリピートを無視する必要があり、そうしないとリレーがパタパタと切り替わってしまいます。リレーの配線はリレーモジュールとは?を参照してください。
1#include <IRremote.hpp>
2
3const int IR_PIN = 2;
4const int LED_PIN = 9; // PWM pini / PWM pin
5const int RELAY_PIN = 7; // aktif LOW röle / active-LOW relay
6
7bool relayOn = false;
8int brightness = 128;
9
10void setup() {
11 pinMode(LED_PIN, OUTPUT);
12 pinMode(RELAY_PIN, OUTPUT);
13 digitalWrite(RELAY_PIN, HIGH);
14 IrReceiver.begin(IR_PIN);
15}
16
17void loop() {
18 if (!IrReceiver.decode()) return;
19 bool repeat = IrReceiver.decodedIRData.flags & IRDATA_FLAGS_IS_REPEAT; // tuş basılı tutuluyor / key held down
20 switch (IrReceiver.decodedIRData.command) {
21 case 0x0C: // "1": röleyi aç-kapa / toggle the relay
22 if (!repeat) {
23 relayOn = !relayOn;
24 digitalWrite(RELAY_PIN, relayOn ? LOW : HIGH);
25 }
26 break;
27 case 0x15: // VOL+: daha parlak / brighter
28 brightness = min(brightness + 15, 255);
29 break;
30 case 0x07: // VOL-: daha sönük / dimmer
31 brightness = max(brightness - 15, 0);
32 break;
33 }
34 analogWrite(LED_PIN, brightness);
35 IrReceiver.resume(); // sonraki tuşa hazırlan / ready for the next key
36}Arduinoで赤外線信号を送る
Arduinoはリモコンの信号を受け取るだけでなく、リモコンそのものにもなれます。赤外線LED(940 nm)を100 Ωの抵抗を通してUnoの3番ピンにつなぎます。到達距離を伸ばしたいなら、トランジスタを通してLEDを駆動できます。まず、操作したい機器のリモコンを上のコードで読んでアドレスとコマンドを調べ、同じコードをArduinoから送ります。
1#include <IRremote.hpp>
2
3const int IR_SEND_PIN = 3; // IR LED, 100 Ω direnç ile / IR LED with a 100 Ω resistor
4
5void setup() {
6 IrSender.begin(IR_SEND_PIN);
7}
8
9void loop() {
10 IrSender.sendNEC(0x00, 0x46, 0); // adres, komut, tekrar sayısı / address, command, repeats
11 delay(5000);
12}ESP32とRaspberry Pi Picoで赤外線を使う
VS1838Bは3.3 Vでも問題なく動くので、ESP32やPicoに直接つなげます。IRremoteライブラリはESP32に対応しており、受信モジュールはGPIO 15など、どの入力ピンにもつなげます。ESP32なら、リモコンのボタン操作をWi-Fiでほかの機器に転送したり、スマートフォンからの命令を赤外線LEDでテレビに送る「スマートリモコン」を作ったりできます。PicoのMicroPythonでは、Peter Hinch作のmicropython_irライブラリを使います。
1from machine import Pin
2from ir_rx.nec import NEC_8 # micropython_ir kütüphanesi / library (Peter Hinch)
3import time
4
5def on_key(command, address, ctrl):
6 if command >= 0: # negatif değerler tekrar ya da hata / negatives mean repeat or error
7 print("Komut / command: 0x{:02X}".format(command))
8
9ir = NEC_8(Pin(16, Pin.IN), on_key) # GP16 → OUT
10
11while True:
12 time.sleep(1)赤外線受信モジュールとリモコンのプロジェクトアイデア
- リモコンで操作するランプ:テレビのリモコンの使っていないボタンで、リレーを通して商用電源のランプを点けます。
- カラーリモコン:数字ボタンでRGB LEDの色を変えます。
- リモコン操作のロボットカー:矢印ボタンで2つのモーターを操る車です。
- メロディーボックス:数字ボタンごとに違う曲を割り当てます。音の部分はブザーとは?を参照してください。
- 学習リモコン:ほかのリモコンのコードを記録し、1台のArduinoから送ります。
- 暗証番号ロック:正しい順番でボタンが押されたら、サーボで錠を開けます。
よくある間違いと対処法
- コードがまったく届かない:OUTの線がコードと違うピンにつながっている、受信モジュールの足が逆、またはリモコンの電池切れです。スマートフォンのカメラでリモコンを確認してください。
- サンプルコードがコンパイルできない:ネット上の古い例はIRremote 2.x用です。バージョン4.xではIrReceiver.begin()とIrReceiver.decode()を使います。
- でたらめなコードが出る:受信モジュールが直射日光や蛍光灯の方を向いているのかもしれません。日陰に移してください。
- オン・オフのボタンが2回反応する:リピート信号を無視できていません。IRDATA_FLAGS_IS_REPEATフラグを確認してください。
- tone()や3番・11番ピンのPWMがおかしい:UnoではIRremoteと同じタイマー(Timer2)を共有しています。
- 赤外線LEDで送るときの到達距離がとても短い:トランジスタを通して大きな電流でLEDを駆動し、機器の方に向けてください。
赤外線受信モジュールは、ワイヤレス化へのいちばん簡単で安上がりな方法です。家に眠っている古いリモコンも、新しいプロジェクトで第二の人生を送れます。BlueGraysアプリには、リモコンのコードの読み取り、LEDの切り替え、リモコンでのメロディー再生、商用電源のランプの操作、ESP32のユニバーサルリモコンのプロジェクトが、回路図とコード付きでそろっています。
よくある質問
赤外線受信モジュールはどれくらいの距離から信号を受け取れますか?
VS1838Bのような受信モジュールは、性能のよいリモコンで見通しがよければ、8〜10メートル離れた信号まで受け取れます。リモコンの電池が弱るほど、角度が大きくなるほど、周囲が明るくなるほど、到達距離は短くなります。
どのリモコンでもArduinoで使えますか?
38 kHzを使う赤外線リモコンならほぼすべて使え、IRremoteは一般的なプロトコルのほとんどを復号できます。36、40、56 kHzを使うリモコンでは到達距離が短くなることがあります。電波で動くリモコン(433 MHzなど)は、赤外線受信モジュールでは読み取れません。
赤外線受信モジュールは日光の下でも動きますか?
受信モジュール内部のフィルタは一定の光をかなり遮りますが、直射日光は受信モジュールを飽和させ、到達距離を大きく縮めることがあります。屋外では、受信モジュールを日陰か小さな保護用の筒の中に置いてください。
赤外線リモコンは壁越しに使えますか?
使えません。赤外線は壁を通り抜けられないため、リモコンと受信モジュールの間に見通しがあるか、光が反射する面が必要です。別の部屋の機器を操作するには、RFモジュールかWi-Fiを使ってください。
IRremoteはどのバージョンを使えばよいですか?
現在の4.xを使ってください。IrReceiver.begin()、IrReceiver.decode()、decodedIRData.commandを使います。ネット上の古い例に見られるIRrecv irrecv(pin)やdecode(&results)の命令はバージョン2.xのもので、新しいバージョンとは互換性がありません。
スマートフォンをリモコンとして使えますか?
Androidのスマートフォンの中には赤外線送信機を内蔵しているものがあり、適切なアプリを使えばリモコンになります。スマートフォンに赤外線がない場合は、ESP32でWebページを作り、スマートフォンからの命令を赤外線LEDで機器に送れます。
この記事を読んだ後に作れるプロジェクト
全プロジェクトを見る
IRリモコンのコードを読み取り
テレビのリモコンは、ボタンごとに目に見えない光で秘密のコードを送っています。赤外線受信機がその光を受け取り、Arduinoが押したボタンのコードをコンピューターの画面に表示します。コードが分かれば、引き出しに眠っている古いリモコンで自作のプロジェクトを操作できます。

IR受信機とリモコンでLEDを点灯・消灯
椅子に座ったまま3つの照明を操作するように、リモコンの1、2、3のボタンで青、赤、緑のLEDを点灯させ、4、5、6のボタンで同じ順に消灯させます。電源ボタンで3つを一斉に点灯させ、消音ボタンですべて消灯させます。リモコンの信号を受け取るのは赤外線受信機です。家の機器をリモコンで操作するプロジェクトへの第一歩です。

IR受信機・リモコン・ブザーでメロディーを再生
テレビのリモコンのボタンでメロディーを奏でるオルゴールを作ります。赤外線受信機がリモコンの信号を受け取り、1つ目のボタンで軽快なゲーム音楽、2つ目でおなじみの童謡、3つ目で新年の歌をブザーから流します。リモコンが目に見えない光で通信する仕組みと、音符を音に変える方法を学びます。

リモコンで220V電球を点灯・消灯
ソファに座ったまま、テレビのリモコンで家庭の電球を点灯・消灯します。Arduinoがリモコンから届く目に見えない光の信号を読み取り、電源ボタンを押すとリレーを動かして電球を点灯させ、消音ボタンを押すと消灯させます。家庭用電源を扱うため、配線は大人と一緒に、必ずプラグを抜いた状態で行ってください。

レーザー防犯システム
映画のレーザーを使った強盗シーンのように、光センサーにレーザー光を当て、人が間に入って光を遮ると、赤いLEDが点灯してブザーが鳴り始めます。警報は自動では止まらず、ボタンやリモコンの電源ボタンで停止します。異常がないときは緑のLEDが点灯します。ドアや引き出しに、目に見えない見張り役を置くユニークな方法です。

ESP32とIR受信機によるリモコン操作(LCDディスプレイ付き)
このプロジェクトでは、TSOP4838 IR受信モジュールを使い、テレビやエアコンなどの赤外線リモコンが送る信号をESP32で受信します。IRremote v4ライブラリでデコードした0以外の生コードを、I2C LCDディスプレイに表示します。このサンプルはリモコンのコードを調べるためのもので、リモコンによるLEDの点灯・消灯や明るさの調整は含みません。古いリモコンをスマートホームの操作に活用するための出発点になります。

ESP32汎用IRリモコン(IR受信機 + リモコン + LED3個 + ブザー + OLED)
ESP32で市販のIRリモコンの信号を読み取り、自作の機器を操作できます!このプロジェクトでは赤外線受信機(NECプロトコル、38 kHz)で20ボタンのIRリモコンの信号を受信します。各ボタンには異なる動作を割り当てています。1、2、3ボタンで3個のLEDをそれぞれオン・オフし、PWRボタンですべて消灯します。4~9の数字ボタンではOLEDに特別な表示を出します。SSD1306 OLEDには最後に押したボタンを大きく表示し、実行した動作の説明とLEDの状態もリアルタイムで表示します。未知のボタンを押すとOLEDにHEXコードを表示します。

レーザー警報システム
映画のような、目に見えない光のフェンスを作ります。向かい側の光センサーにレーザーを当て、人が通って光を遮るとすぐにLEDが点灯し、ブザーが鳴ります。光が再び届くと、LEDが消灯し、ブザーも止まります。ドアや廊下に使える、シンプルながら印象的な警報装置です。
ほかの記事
BlueGraysアプリ
この回路をスマホでステップごとに作る
回路図、コード、部品リストを1つの画面で確認できます。Arduino、ESP32、Picoのプロジェクトを200件以上用意しています。

