IR(赤外線リモコン)
一般的なリモコンで使われる赤外線についてまとめます。
赤外線(Infrared)から、「IR」や「CIR(Consumer IR)」とも呼ばれるものです。
電磁波の可視光の赤より外にある(赤より波長が長い、下にある)ということから、Infra(下に)Red(赤)という表現になります。
実際に使用される赤外線LEDは、950nm付近の波長が多く、次に850nm付近が使われるようです。
受光部は38kHzでバンドパスフィルターが入っていることがほとんどです。
つまり、38kHzの周波数をキャリアとして赤外線LEDを光らせればリモコンが作れるということですね。
便利なことにESP32にはRMTという赤外線信号を扱うためのペリフェラルが内蔵されています
赤外線をリモコンとして使用するには一定の周波数で変調をかけないと、例えば太陽光などに反応してしまうため、使い物になりません。
そのため一定の周波数で点滅させて、受信側はその周波数以外はフィルターで通さないことにしているのです。
しかしながら、どのようなルールで点灯してデータを送るかはメーカーそれぞれ別々で決めていたため、共通ルールがありません。
そのため、通信の方法とするフォーマット(プロトコル)は複数存在します。
番外編:IrDAを赤外線リモコンとして使用する
Linuxでは昔からあるソフトウェアで「LIRC」というものがあります。
これは赤外線リモコンの信号を扱うためのソフトウェアで、赤外線送信が可能なハードウェアを備えたLinuxマシンからIR信号を出力することが可能です。
20年ほど前にZaurus SL-C860のIrDAポートを使ってリモコンを試したことがあります。
IrDAポートは赤外線出力が最大1m程度とそこまで強くない上に波長も違うので近距離でしか動作せず、リモコンとしては全く使えないものでした(笑)
マイコンで赤外線リモコンを実現する
Arduinoライブラリもいくつか存在します。
- https://github.com/Arduino-IRremote/Arduino-IRremote
- https://github.com/crankyoldgit/irremoteesp8266
特定のプロトコルに沿って、アドレス・データを指定して送出可能な関数もありますが、MSB/LSBがライブラリ、バージョンによって違うので注意してください。
実際のリモコンではLSBから送出されますが、どのライブラリでも信号そのままのRAWの配列で記録しておけば、移植性が高くそのまま送れる上に、各種プロトコルに沿った関数への変換も可能です。
もちろん、プロトコルが判明してしまえば、そのパラメータのみで信号は復元可能です。
後述するIrScrutinizerではそれぞれの変換操作も可能です。
IrScrutinizer で赤外線リモコンを調査する
赤外線リモコンのIR信号を調査するためのソフトウェア「IrScrutinizer」があります。
こちらを使用して赤外線リモコンを調査してみましょう。
IrScrutinizer で使用可能な赤外線送受信ハードウェア
普通のコンピューターには赤外線を送受信する機構が無いため、ソフトウェアだけでは赤外線リモコンの調査ができません。
よって、IrScrutinizerを利用するためには赤外線信号を送受信することが可能なハードウェアを接続する必要があります。
- Global Caché IRラーナー付きのモデルに対応。日本では入手難?
- CommandFusion - USB IR Learner 日本では入手難?
- IrWidget PICにファームウェアを書き込む必要あり
- USB IR Toy 昔は日本でも容易に購入できたが…
- Girs Serverを備えたデバイス 例:Arduino用AGirs
- PCのオーディオポート(可聴域のフィルタがあるため専用回路が必要で信頼性も低い)
- LIRCデバイスを備えたLinuxマシン(LIRC対応のIrDAポート等を備えたPCは現代において存在せず相当限られます)
一番簡単な実現方法としては、適当なArduinoと周辺パーツを用意してAGirsのファームウェアを書き込むことです。
Arduino Nano で作る IrScrutinizer で使用可能な Girs Server ハードウェア
一番安価に済む方法で、公式サイトでも紹介されているものです。
こちらのガイドに従って組み立ててみましょう!
まず最初に部品集めからです。
| 部品名 | 概要 | 個数 | 入手先 |
|---|---|---|---|
| Arduino Nano | 公式サイトでは安価な中華クローンを推奨している | 1個 | 互換(Seeeduino Nano)Mouser / DigiKey / マルツ |
| SFH 4546 | 940nm赤外線LED・指向角40° | 1個 | Mouser / DigiKey / マルツ |
| SFH 4544 | 940nm赤外線LED・指向角20° | 1個 | Mouser / DigiKey / マルツ |
| TSMP98000 | TSMP58000が生産終了のため代替品 | 1個 | Mouser / DigiKey / マルツ |
| TSOP38438 | これは一般的な部品なので何でもいいと思われる | 1個 | Mouser / DigiKey / マルツ |
| WP710A10ID5V | 赤色LED・抵抗内蔵5V直結可能 | 1個 | Mouser / DigiKey / マルツ |
| WP710A10YD5V | 黄色LED・抵抗内蔵5V直結可能 | 1個 | Mouser / DigiKey / マルツ |
| WP710A10SGD5V | 緑色LED・抵抗内蔵5V直結可能 | 1個 | Mouser / DigiKey / マルツ |
| 68Ω 抵抗器 | 1/4Wスルーホール型抵抗 | 1個 | Mouser / DigiKey / マルツ |
Arduino NanoはAmazonやAliExpressに互換品が安く転がっています。同じく互換品のSeeeduino Nanoであれば部品屋で買えます。
ファームウェアのAGirsではATmega328Pに対応していますが、現行のArduino Nano R4や、Arduino Nano Everyには対応していないようです。
そのため、ATmega328Pを搭載している純正Arduino Nanoまたは互換品を選ぶことが重要です。
赤外線周りの主要部品は日本では Mouser / DigiKey でしか手に入らないようなので、適当に注文しておくといいと思います。
送料無料になるまで買いたくない、送料が高い、という人はマルツオンラインで注文しましょう。
DigiKey代理店のマルツオンラインは部品単価が少し割高だが送料が安めになります。少量発注ならアリかと。
TSMP98000は受信信号をそのまま出力するもので、外見では同じに見えますがとても特殊な部品です。
秋月電子や千石電商では、TSOP38438と同じ38kHzのBPF付きの受光モジュールしか取り扱いがありません。
TSOP38438の代替品を購入する場合には、ピン配置に注意してください。ピン配置違いで多くの部品が出回っています。
(1=OUT, 2=GND, 3=VS の受光モジュールを使用します)
部品が揃ったら組み立てを始めます。
TSMP98000をD8、D9、D10のパッド(ピン)に、TSOP38438をD5、D6、D7のパッド(ピン)に、レンズを外側に取り付けします。
WP710A10ID5V(赤色LED)をピンA0とA1に。WP710A10YD5V(黄色LED)はピンA2とA3に。WP710A10SGD5V(緑色LED)はピンA4とA5に。
カソード(短い方の足)はそれぞれA0、A2、A4に接続します。
赤外線LEDは2種類を直列で使用します。広範囲に使えるように指向角違いのものを使用しているだけのようで同じ種類でも良さそうです。
どちらかの赤外線LEDのカソード(フチが平らな方の足)をD3のパッド(ピン)近くのGNDに接続します。
直列にするため、GNDに接続した赤外線LEDのアノード側から、もう一つの赤外線LEDのカソードに接続します。
最後に残ったアノードに抵抗を接続し、その抵抗の先をD3パッド(ピン)に接続します。
(※この赤外線LEDは通常のLEDと違い、足が長い方はカソードのようです)
製作例です。
電流計算はしていませんが、赤外線LEDを光らせるのにGPIO直結はどうなのか・・・(笑)
MOSFETを間に入れてあげると丁寧。中華クローンの安価なArduino Nanoなら壊れても安いしまあいいでしょう。
Arduino Nanoにファームウェアを書き込みます。以下、Windows11で試した例です。
コンピューターとUSB接続をして、デバイスマネージャーでCOMポートが増えることを確認しておきます。(COMポート番号もメモしておきます)
2026年現在、最新のリリースが1.0.5になります。
- https://github.com/bengtmartensson/AGirs/releases/latest
- https://github.com/bengtmartensson/AGirs/releases/tag/Version-1.0.5
こちらから「GirsLite-1.0.5-nano-flasher.bat」をダウンロードしておきます。
ファームウェアが内包されているスクリプトなので、このbatファイルだけでOKです。
Arduino IDE がインストールされている必要があります。
しかし、このbatファイルはArduino IDE 1系を前提としているため、現行のArduino IDE 2系で使うにはパスを修正する必要があります。
ダウンロードした「GirsLite-1.0.5-nano-flasher.bat」を任意のテキストエディタで開き、
748行目にある
set ARDUINO_ROOT=C:\Program Files\Arduino
set TOOLS_ROOT=%ARDUINO_ROOT%\hardware\tools\avr
を
set ARDUINO_ROOT=%USERPROFILE%\AppData\Local\Arduino15
set TOOLS_ROOT=%ARDUINO_ROOT%\packages\arduino\tools\avrdude\8.0.0-arduino1
に変更します。
これはボード定義が Arduino AVR Boards 1.8.7 の場合です。
インストールしているバージョンによっては「avrdude\8.0.0-arduino1」フォルダ名が異なる場合があります。
実際には、 C:\Users\ユーザー名\AppData\Local\Arduino15\packages\arduino\tools\avrdude 内のフォルダ名を確認してみてください。
「GirsLite-1.0.5-nano-flasher.bat」をダブルクリックで開くだけで書き込みが可能です。
COM5以外のポートを使用している場合は、接続されているCOMポートを入力してください。(以下、COM3の例)
ファームウェアの書き込みに失敗する場合は、ボーレートの変更が必要になります。
12行目にある
set BAUD=115200
REM set BAUD=57600
を
REM set BAUD=115200
set BAUD=57600
に変更(行頭のREMスペースを移動)してから再度ファイルを開いてみてください。
ファームウェアの書き込みが終了すれば、Girs Serverの完成です!
IrScrutinizer の使い方
最新のリリースは以下の通りです。
- https://github.com/bengtmartensson/IrScrutinizer/releases/latest
- https://github.com/bengtmartensson/IrScrutinizer/releases/tag/Version-2.4.2
2026年4月現在、2.4.2が最新です。
「IrScrutinizer-2.4.2.exe」をダウンロードしてインストールします。
ハードウェアの接続には「Hardware」タブを開きます。
今回用意したのは Girs Server なので「Girs Client」タブを開き、Serial Portで対象のCOMポートを選択します。
右上の「Open」ボタンをクリックすると接続されます。
接続時にリセットがかかると、3つのLEDが全て消灯後、一瞬だけ3つとも全点灯します。
赤色LEDだけが点灯状態になればコマンド待ち状態となり正常です。
Version欄にも書き込んだファームウェアのバージョン「GirsLite 1.0.5」が表示されると思います。
赤外線信号の解析には「Scrutinize signal」タブを開きます。
「Capture」ボタンを押すと、赤色LEDが消灯、黄色LEDが点灯して、赤外線信号待ちになります。
この間にリモコンを赤外線受光部に向けてボタンを押すと、信号がキャプチャされて表示されます。(10秒でタイムアウトします)
例:DAM-RM100XのDAMボタンを押した時
上部に表示される16進数の羅列が赤外線信号から得られた生データ(標準でPronto Hex形式・Options->Output Text Formatで変更可能)になります。
そして、そこから精査して得られたデコード結果が、その下部に表示される「Decode」欄の「NEC1: {D=209,S=45,F=29}」という結果になります。
リモコンのボタンは一瞬ではなく、少し長めに押すと解析結果は安定します。
「Capt. (cont.)」ボタンは連続でキャプチャするときに使用します。最後の結果のみ表示されます。
「Scrutinize」ボタンは上部のテキストボックス内の生データのテキストから解析を行う場合に押します。
上部のテキストボックスは自由に編集でき、「Paste & Scr.」ボタンを押すとクリップボードの内容が貼り付けられます。
その内容でデコード結果が欲しい場合に使用するボタンとなっています。
「Transmit」ボタンは、現在の内容の信号を送出するときに使用するボタンです。実際に反応するかテストできます。
「Export」ボタンは、現在の内容をファイルに保存できます。(標準でGirr形式・Options->Export formatsで変更可能)
ディレクトリが無い場合は、作成するか聞かれます。
リモコンは実際には複数のボタンを備えており、リモコン1個に対して複数の種類の信号があります。
「Scrutinize remote」タブを開くと、複数行に分かれた複数のボタンを表示できる画面になります。
「Parametric Remote」では、プロトコルデコード結果での一覧表となり、「Raw Remote」ではRAWのまま一覧にできます。
「Capture」を押すと受信待ちとなり、赤外線信号を受信する度にリストに追加されていきます。
リストはクリックで入力でき、右クリックをすることで編集メニューが表示されます。
「Name」にはリモコンのボタン名を入力していきましょう。
日本語を使用するとエクスポート時に失敗するので、英数字のみ使用したほうが良いです。
終了するときは再度「Capture」ボタンを押すと停止します。
「Export」でこのリスト中の信号を一括でファイルに出力できます。(標準でGirr形式・Options->Export formatsで変更可能)
エクスポートしてArduinoでリモコンを作る
Options->Export formatsの設定を標準ファイル形式の「Girr」から「Arduino-IRremote」にすることで、Arduino-IRremote前提のコードが出力されます。
バージョン4系に対応しているようで、そのままArduino IDEで書き込んで使用できるようです。
先程の解析結果をエクスポートすると以下のようなコードが得られます。
switch (commandno) {
case 1L: // DAM
IrSender.sendNEC(209U | (45U << 8), 29U, no_sends - 1);
break;
DAMボタンのデコード結果が「NEC1: {D=209,S=45,F=29}」でしたので、それがそのまま引数に10進数で表記されているような形です。
DとSのパラメータは結合しているようです。16進数のほうがわかりやすいですね。
S=45を16進数にすると、0x2D。コード中では8bitシフトしています。
そして、D=209を16進数にすると、0xD1。Sパラメータとビットシフトして結合すると、0x2DD1。
実際のボタン定義のコマンドとなるF=29は0x1D。
IrSender.sendNEC(0x2DD1, 0x1D, no_sends - 1); // DAM
にしても良さそうです。
「C」形式でエクスポートをすると、ライブラリ前提でないため、RAW形式の配列が得られます。
組み込み環境で利用したい場合は、環境に合わせて、Arduino向けコードか、C向けコードを利用すると良いと思われます。
とにかく保存形式に関しては、IrScrutinizerの標準形式となる「Girr」で保存しておけば、アプリで再度開いて変換することが可能です。
基本的には「Girr」で保存して、必要に応じて変換して利用するのが良いのではないでしょうか。
