テレビやDVDプレーヤーなど、皆さんの周りにもいくつかリモコンを使った電化製品があるはずです。
ボタンを押すことで「チャンネルを変える」「ボリュームを調整する」「電源をON/OFFする」など、リモコンは家電本体と通信して指令を送っているはずですが、その様子を目で確認することはできません。これは信号の送受信に赤外線を使用しているためです。
今回はArduinoに赤外線リモコン受信モジュールを取り付けてこの信号を読み取り、家電に付属するリモコンでArduinoを操作してみます。
このテクニックを使えばプッシュボタンを一個ずつArduinoボードに配線する必要がなくなります。
目次
1. 赤外線リモコン受信モジュール「OSRB38C9AA」の仕組み
赤外線リモコンは、人間の目では見ることができない「赤外線」と呼ばれる光を使って機器と通信しています。
また、この赤外線リモコンから発せられる光は、ボタンを押すと単に一回光るだけではなく、伝えたいコマンドに応じて高速でON/OFFを繰り返します。
赤外線を受信した機器は、この赤外線がON/OFFするパターンを解析してコマンドを識別し、それに応じた動作を行います。
こうしたコマンドは、赤外線リモコンにあるボタンの数だけ用意されているので、機器は混乱することなく指示された動作を行うことができるのです。
赤外線を直接見ることができない人間には、赤外線リモコンからどのようなコマンドが発せられているのか把握することはできません。ところが面白いことに、リモコンが光を発する部分にスマートフォンのカメラを押しつけながら赤外線リモコンのボタンを押すと、点滅する光を見られる場合があります。
このように、人間の目に見えない光でも電子部品には検知することができるのです。これは「光学フィルタ」の働きによります。
実は「赤外線に反応する/しない」はハードウェア、ソフトウェアのどちらも大きな違いはありません。カメラの内部では、検出したい領域の光だけを通過させる光学フィルタを、光に反応する素子の前に置き、不必要な光を見え難くしているのです。
スマートフォンのカメラは、あえて赤外線をカットすることで可視光線を優先的に受光できるようにしています。反対に可視光線をカットするように作られた電子部品が「赤外線リモコン受信モジュール」です。
今回紹介する「OSRB38C9AA」も、その赤外線リモコン受信モジュールの一つです。赤外線リモコン受信モジュールは光に反応する素子(PINフォトダイオード)・光学フィルタ・レンズ・オペアンプなどがパッケージ化された電子部品であり、手軽に赤外線の信号を読み取ることができます。
赤外線リモコンには「チャンネル切換」「再生・停止」「音量調整」などの機能に対応したボタンがありますが、実際には赤外線リモコンの内部で動作するプログラムが、押されたボタンに対応したコマンド(赤外線の発光パターン)を作り出しています。
この発光パターンを知ってさえいれば、手近なリモコンでArduinoを操作することができるようになるはずです。ところがこの発光パターンは、一般的にメーカーが公開する情報ではありません。
そこで、最初に赤外線リモコン受信モジュールを使って、この発光パターンを読み取っておきます。一度、発光パターンを確認できれば、あとはその発光パターンに対応した処理を行うだけです。
本記事では、手元にあるリモコンの特定のボタンに合わせてArduinoに接続したLEDをON/OFFします。スケッチでは先にリモコンが発する信号のパターンを解析し、次のステップで、その信号を受け取った際の処理であるLEDのON/OFFを行います。
2. 準備
以下のものを用意してください。
Arduino Uno
Arduino IDE
ブレッドボード
赤外線リモコン受信モジュール
LED
1本(色は何でも可)
抵抗
330Ω 8本(LEDの破損防止用)
赤外線リモコン受信モジュールには「OSRB38C9AA」を使用します。PINフォトダイオードとアンプが内蔵され、赤外線に反応するタイプの赤外線リモコン受信モジュールであれば、どの様な製品も使用できるはずです。ただしピンの並びは異なりますので注意してください。
上記に加えてブレッドボード用のジャンパーワイヤ、USBケーブルが必要です。
3. スケッチ
以下がスケッチ全体です。
スケッチには大きく分けて2つのパートがあります。
最初は赤外線リモコンから受信した特定の発光パターンを読み取るパート、次が特定の発光パターンを検出したらLEDをON/OFFするパートです。
スケッチのあとに解説が続きます。
#include <IRremote.h> int receiverPin = 8; int LEDPin = 6; bool lightOn = false; IRrecv receiver(receiverPin); decode_results results; void setup() { Serial.begin(9600); receiver.enableIRIn(); } void loop() { if(receiver.decode(&results)) { Serial.println(results.value, HEX); receiver.resume(); } if (receiver.decode(&results)) { if (results.value == 0x00000000) { if (lightOn == true) { digitalWrite(LEDPin, LOW); lightOn = false; } else { digitalWrite(LEDPin, HIGH); lightOn = true; } } receiver.resume(); } }
最初はライブラリを使用できるようにするインクルード文です。
#include <IRremote.h>
今回の電子工作では、赤外線通信をサポートするIRremoteライブラリを使用します。もしArduino IDEにライブラリを追加していない場合は先に以下の操作を行ってください。
[スケッチ]メニューから[ライブラリをインクルード] ≫ [ライブラリを管理…]を選択します。
[検索をフィルタ]に「IRremote」と入力してください。
「IRremote」が見つかるはずです。最新のバージョンを選択して[インストール]をクリックします。
これでArduino IDEにIRremoteライブラリが読み込まれました。
ただし、これだけではスケッチ内で使用することができないので、先頭でIRremote.hをインクルードします。
続いて変数の定義です。
int receiverPin = 8; int LEDPin = 6; bool lightOn = false; IRrecv receiver(receiverPin); decode_results results;
最初の2行はArduinoボードのピン番号を定義しています。変数receiverPinは赤外線リモコン受信モジュールの信号ピンがつながるArduinoボードのピン番号、変数LEDPinはLEDを接続するピン番号です。
変数lightOnはLEDの点灯状態を記憶します。trueは点灯、falseは消灯を意味し、初期状態は消灯です。
4行目は赤外線リモコン受信モジュールを操作するためのオブジェクトを作成しています。引数は赤外線リモコン受信モジュールがつながるArduinoボードのピン番号です。以降、赤外線リモコン受信モジュールの操作は変数receiverを通して行います。
最後の変数resultsは、赤外線リモコン受信モジュールが受信した信号を格納します。
setup()関数です。
void setup() { Serial.begin(9600); receiver.enableIRIn(); }
最初にシリアルモニターの初期化を行います。これは赤外線リモコンが送信する発光パターンを解析するために必要です。
2行目は赤外線リモコン受信モジュールを初期化し、使用できるようにします。
以下はloop()関数内の一つ目のif文を抜粋したものです。
if(receiver.decode(&results)) { Serial.println(results.value, HEX); receiver.resume(); }
このパート(if文)は、赤外線リモコンが送信する赤外線信号を受信した際に実行されます。
読み取った信号は16進数(HEX)に変換されシリアルモニターに送られます。シリアルモニターに表示される16進表記の数値は「リモコンの特定のボタンと対応する数値」として次のパートで使用します。
以下はloop()関数内の二つ目のif文を抜粋したものです。
if (receiver.decode(&results)) { if (results.value == 0x00000000) { if (lightOn == true) { digitalWrite(LEDPin, LOW); lightOn = false; } else { digitalWrite(LEDPin, HIGH); lightOn = true; } } receiver.resume(); }
このパート(if文)も赤外線リモコンが送信する赤外線信号を受信した際に実行されます。
ソースコード中に0x00000000とある点に注意してください。この状態のままではif文が実行されません。0x00000000の部分は前述のパートで読み取った「リモコンの特定のボタンと対応する数値」に置き換えてください。
「リモコンの特定のボタンと対応する数値」で適切に置き換えたあとは、赤外線リモコンのボタンを押すごとにLEDがON/OFFします。
4. 配線
以下の手順で配線します。ブレッドボードを使用すると良いでしょう。
最初にArduinoボードとLEDを接続します。
- Arduinoボードの6番ピンとLEDのアノード(長い方の端子)を接続。
- LEDのカソード(短い方の端子)と抵抗(330Ω)の一端を接続。
- 抵抗(330Ω)のもう一端とArduinoボードのGNDを接続。
次にArduinoボードと赤外線リモコン受信モジュールを接続します。
- Arduinoボードの8番ピンと赤外線リモコン受信モジュールの信号端子を接続。
- 赤外線リモコン受信モジュールの電源端子とArduinoボードの5Vを接続。
- 赤外線リモコン受信モジュールのグランド端子とArduinoボードのGNDを接続。
配線が完了したら、ArduinoボードとArduino IDEが実行しているパソコンをUSBケーブルで接続して、シリアルモニターを開きます。
テレビなどの手近な赤外線リモコンの発光部を赤外線リモコン受信モジュールに向け、適当なボタンを押します。
シリアルモニター上に16進数が表示されましたか? 表示されている値をスケッチ内の0x00000000の部分にコピー&ペーストしてください。
再度、スケッチをArduinoボードに転送すると、以降は先ほどのリモコンのボタンで、Arduinoボードに接続したLEDのON/OFFをコントロールできるでしょう。
5. まとめ
今回はArduinoに赤外線リモコン受信モジュールを取り付けて、家電に付属する赤外線リモコンでArduinoを操作しました。
「赤外線リモコンの信号を解析してArduinoに覚えさせる」と言うと少し難しく聞こえますが、実際は今までの電子工作と大きな違いはないでしょう。
よく目にする赤外線リモコン受信モジュールは、3本の端子をArduinoボードに接続するだけです。スケッチの量は増えますが、プッシュボタンを一個ずつArduinoボードに配線するよりはるかに簡単なはずです。
ぜひ、このテクニックをマスターして電子工作に応用してみてください。