Release 2017.10.8 / Update 2017.10.21

IR Remoteで赤外線通信

以前、赤外線を使ってカメラのリモコンシャッター操作を試してみましたが、今度はArduinoIDEに用意されている「IR Remote」というライブラリで赤外線データを扱ってみます。

スポンサーリンク

自力で赤外線バイナリを発信した時とは違い、このライブラリを使うと、簡単に一般的な家電リモコンのデータを取得したり、任意の赤外線データを送れるようになります。

準備

使用パーツ

  • Arduino
  • 赤外線受信モジュール
  • 赤外線LED&抵抗 — 抵抗値は任意
  • 家庭内にある家電リモコン
  • タクトスイッチ × 2
  • (確認用LED&抵抗 — 抵抗値は任意)

一般的に赤外線LEDは定格電圧が低いので、3V駆動のArduinoか、3V供給ピンがあるようなタイプを使うといいかと思います。ただ、他のサイト同様、5V配線でも動きはするので、壊れても痛くない方は定格無視でも結果は見れます。また、後述のArduino間通信をしたければ2セット分用意。

ここでの家電リモコンはSonyのブルーレイプレイヤーリモコンを使っています。

今回使った受信モジュールはGP1UXC41QSOSRB38C9AAですが、他の受信モジュールでもピン配置以外は似たようなものかと思います。

また、データシートを見たら、47Ω位の抵抗と47μFのコンデンサを奨励しているので、安全・確実に進めたい人はちゃんと使うパーツのデータシートを確認してください。

回路図

LEDの抵抗値はテキトーです。あしからず

受信モジュールはVCC、GND、信号の3つですが、モノによってピン配置が違うので注意してください。IR RemoteのサンプルスケッチではD11ピンを赤外線信号受信用、D3ピンを赤外線送信用(PWM)にしているので、それに倣っています。

また、確認用LED(D13ピン)はArduino基板上にもあるので、それで事足りるなら割愛してください。

IR Remoteを使う

まず、IR Remoteの使い方を書いていきます。

受信データをモニタリング

IR Remoteを使って家電リモコンのデータを見るのは、フォーマットに沿っていけば難しくはありません。というか、サンプルスケッチを開けば、それさえも必要なく、データをシリアルモニタで確認できます。

「ファイル」メニュー「スケッチ例」から「IRremote」の「IRrecvDump」を開く。

シリアルモニタを開いて(9600kbps)、家電リモコンのボタンを押せば、そのボタンのデータが取得、表示されます。

最初の行が実際のデータです(HEX表記)。次行のDecodedにはリモコンのメーカー名が出ます。IR Remoteはデータの内容から、ある程度メーカー名を識別してくれます。

カメラシャッター送信で触れたように、赤外線送信のフォーマットは、ある程度揃っているものの、詳細がメーカー別で違います。フォーマットの違いは、こちらに詳しく書かれています。

最後の数値羅列は、データの長さ、つまりON/OFF切り替わりの時間尺です。実際にシグナルが反転した時間(マイクロ秒)になっています。

IR Remoteの関数

サンプルスケッチ「IRrecvDump」を例に、ざっくり説明していきます。詳細はGitHubに書かれています。

IRrecv ~(pin number);

受信で使用するオブジェクトを作成。名称と使用するピンを一緒に指定。サンプルスケッチでは「irrecv」がオブジェクト名、カッコ内が受信に使用するピンになっています。

~.enableIRIn();

作成したオブジェクトで、割り込みによる赤外線受信をスタート。

decode_results ~~;

受信情報の格納先を作成。

受信したデータは、この作成した「results」内に格納されます。中には複数の情報が入っていて、指定して任意の情報を取得できます。

説明
decode_type メーカー名
value 受信したデータ
bits 受信したデータのビット数
rawbuf[] それぞれの赤外線ON/OFFの切替にかかった時間(μ秒)の配列
rawlen 実際に赤外線のON/OFFがあった回数

例えば、

long recv_data = results.value;

とすれば、recv_dataへ受信したデータを格納することになります。

シリアルモニタへの返りを表示する「dump」関数内では、指定に「->」というアロー演算子を使っていますが、ドット演算子「.」でも同様に呼び出せるようです(ここら辺の相違は勉強不足なので説明は割愛で…)。

ちなみにdefine定義されたメーカー名文字列は、ライブラリフォルダ内のKEYWORDファイル内で確認できます。

~.decode(&~~);

受信したかどうかを確認します。サンプルスケッチ内ではif文で使われていますが、未受信 = 0、受信 = 1 という返り値になっています。シリアル通信でいうserial.availableと同じ、と考えていいと思います。

~.resume();

.decode()の返り値をリセットします。これがないと、上記の.decode()は1を返し続けてしまいます。試しにこの行をコメントアウトして、テストしてみると分かりやすいと思います。

.decode()と.resume()はセットで使うもの、と覚えておくといいかもしれません。

以上を踏まえて、簡単なサンプルスケッチを白紙から書いてみます。

自分が使ったのがSony製なので、そこは任意に使っているリモコンメーカーへ変更してください。

状況によっては、1回押しただけなのに、複数回表示されてしまうかもしれません。これは、リモコンが同じデータを複数回送っているから、あるいは“リピートコード”も拾ってしまうからで、.resume()前にdelay関数を置いたり、間を作るかして、重複を回避してください。

赤外線データ送信

IR Remoteで赤外線データを送信するための準備は、オブジェクトをひとつ作るだけです。

IRsend irsend;

ただし、送信するために使う関数はメーカー別なので、個別に使用する必要があります。

irsend.sendNEC(data, bits)
irsend.sendSony(data, bits)
irsend.sendRC5(data, bits)
irsend.sendRC6(data, bits)

irsend.sendJVC(data, bits, repeat)
irsend.sendPanasonic(pre data, data)

irsend.sendRaw(data buf, length, hertz)

引数のdataは実データ、そのままbitsはビット数。

.sendRawはメーカーフォーマットに当てはまらない場合に使います。また、パナソニックとビクターはちょっと違う形式です。それぞれ、スケッチ例が用意されているので、気になる方はそちらを探ってください。

任意のデータを読み取り・送信できるサンプルスケッチを書いて見ます。.sendの行は、各自のメーカーに合わせて変更してください。

赤外線データを受信すれば、LEDが点滅し、そのデータとビット数をcash_にキープ。スイッチを押すとその信号を発信します。一応、シリアルモニタにも状況が出る様にしました。

このサンプルで一番大事なところは.sendした後、再度.enableIRIn();を呼んでいるところです。IR Remote、関数によってはピンの状態を変更してしまうようです。send/recieve命令を一つのスケッチに共存させたい場合、これを入れないとうまく機能しないので気をつけてください。

で、取得したパターンを家電に送ると…ちゃんと動作するでしょうか?前回、言及したとおり、赤外線LEDはかなり光の幅が狭いので、受信部へ近づけ、相当真っ直ぐ入るようにしないと上手く反応してくれないと思います。自分はここでずいぶん長いことつまづきました。

IR Remoteで無線通信

実は、今回書きたかったのはこの部分です。つまり、

「IR RemoteでArduinoを簡単・安価に無線化できる」

っていう話。

TWE-LITEは動作がしっかりしていて確実ですが、送受信で2台用意すると4000円近くかかります。対してこの赤外線通信なら、数百円あれば無線化することが出来るわけです。飛距離や角度などの制限はあるものの、「そこまでしっかりしなくていいので、とりあえず手軽に無線化したい」なら、かなり有用な方法と言えます。

ということで、Arduino同士に赤外線通信をさせます。

回路図

上述の回路図にスイッチを1つ追加しているだけです。可能なら、これを2セット用意します。

スケッチ “IR Controller”

各々のスイッチを押している間に家電リモコンの赤外線を受信すれば、その通信データを記憶します。普通にスイッチを押せば、記憶した赤外線データを送信します。記憶した赤外線データを受信すると、指定した命令を実行します。

.sendSonyは同様に環境に合わせ書き換えてください。

スイッチの反応は「シリアルモニタへの返し」と「LEDの点滅違い」ですが、“Switch 1~2 reaction”内を書き換えれば、受信した時の反応をカスタマイズできます。また、Arduinoをリセットすると取得データは消えてしまいますが、cash_の配列変数を具体的なHEX数値に書き換えておけば、常用の仕組みとしても扱えます。

簡単に無線コントローラが、あるいは、単純に家電リモコンでArduinoを操作できるようになるわけで、工夫次第で面白いモノが作れるかようになるのではないか、と。余裕があったら、赤外線ラジコンでも作ってみたいですね。

参考リンク

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA