2018年5月9日水曜日

Arduinoで赤外線リモコンの値を読み取り、送信する方法


背景

Arduinoとは電子工作に利用しやすい、プログラムを書き込める装置です。
Arduinoを使って赤外線リモコンが送信する値を読み取り、読み取ったデータを送信してみました。
思っていた以上に手間だったので、備忘録を兼ねて方法を共有します。

全体像

  1. 利用するライブラリを紹介
  2. 使ったものを紹介
  3. ライブラリを準備
  4. 読み取り回路を作成
  5. リモコンの送信値を読み取り
  6. 送信回路を作成
  7. 読み取った値を送信
  8. まとめ

利用するライブラリを紹介

この記事ではIRremoteというライブラリを利用します。
このライブラリはデータの受信データの送信に関するサンプルプログラムがあるので、それを利用します。

注意すべき点として、データの送信はSupported Boardsに載っているArduino(厳密にはHardware SpecificationのSend Pinとして太字で書かれているGPIOピンが利用可能なArduino)を使う必要があります。

Hardware Specificationの細字のGPIOピンも将来的には使えるようになるのかもしれませんが、自分が試した範囲ではそれらのピンを利用できませんでした。
(出来た方が居れば、方法を教えてもらえると嬉しいです。)
そのため、太字のGPIOピンを使えるArduinoを用意するのが良さそうです。

使ったものを紹介

Arduino Uno

Unoは利用するライブラリのSupported Boardsに載っているため、赤外線LEDを利用して値を送信できます。
データ送信用Arduinoとデータ受信用Arduinoを作れれば、Arduinoから送信される信号がリモコンと同じことを確認できます。
リモコン対応機器で確認する場合は、Arduino1台でも構いません。

Arduino Uno Rev3

Arduino IDEをインストールしたPC

Arduino IDEとはArduino向けのプログラムを作成・コンパイル・書き込みが行えるソフトウェアです。
下記のリンクから、利用しているPCのOSに対応したArduino IDEをダウンロード・インストールしてください。

Download the Arduino IDE

赤外線受信モジュール

Arduinoでリモコンの値を読み取るのに利用します。

赤外線リモコン受信モジュール SPS-444

上記の受信モジュール以外にも、下記のモジュールでも多分動くと思います。

赤外線リモコン受信モジュールOSRB38C9AA

赤外線LED + 抵抗

Arduinoから赤外線での情報を送信するのに利用します。
3mm砲弾型の赤外線LEDと100Ωの抵抗を使いました。
LEDを光らせるときは1kΩの抵抗を使うことが個人的に多いのですが、赤外線LEDは可視光の赤外線に比べて必要とする電流量(可視光数銃mA、赤外線50-100mA)が多いため、小さめの100Ωを使いました。

3mm赤外線LED 940nm OSI5FU3A11C
カーボン抵抗(炭素皮膜抵抗) 1/2W 100Ω

ブレッドボード + ジャンパワイヤ

Arduinoと部品の接続に利用します。

ブレッドボード
ジャンパワイヤ

赤外線リモコン

Arduinoで値を読み取ります。

オプトサプライ赤外線リモコン

MOSFET

ArduinoのGPIOからの電流では、赤外線LEDによっては十分に光らない場合があります。
そういう場合は、MOSFETやトランジスタを利用すると、LEDを十分な電流で光らせられます。
この記事では下記のMOSFETを利用しました。

MOSFET 2N7000

ライブラリを準備

Arduino IDEのライブラリマネージャでライブラリをインストールます。

インターネットに接続したPCでArduino IDEを起動し、スケッチ -> ライブラリをインクルード -> ライブラリを管理 を選択して、ライブラリマネージャを開きます。


ライブラリマネージャ上部の欄にIRremoteと入力して検索します。


IRremoteをクリックして、表示されるインストールボタンをクリックします。


ライブラリをインストールできました。


読み取り回路を作成

Arduinoでリモコンから送信される情報を読み取る回路を作成します。

この記事では、センサの出力ピンをGPIO11に接続します。


配線するとこうなりました。


リモコンの送信値を読み取り

IRremoteのサンプルプログラムを利用して、リモコンの送信値を読み取ります。

プログラムの書き込み

ファイル -> スケッチ例 -> IRremote -> IRrecvDumpV2 を選択して、ベースとするサンプルプログラムを開きます。


GPIO11以外のピンを信号受信に利用する回路を作成した場合は、プログラムの10行目位にあるrecvPinを、赤外線読み取り装置の信号ピンを接続したGPIOピンの番号にします。
記事を書いている時点では、サンプルプログラムの信号受信に利用するGPIOは11だったので、回路作成時にGPIO11を利用した場合は、編集せずそのままで良いです。


recvPinがGPIOピンの番号と合っていることを確認したら、プログラムを書き込みます。
Arduino Unoを使っているので、ボード情報を"Arduino / Genuino Uno"に、シリアルポートをArduino Unoのシリアルポートにします。


ボードとシリアルポートの設定ができたら、書き込みボタンをクリックするとプログラムを書き込めます。


Done Uploadingと表示されれば、書き込み成功です。

リモコンから送信された値を確認

Arduino IDE右上にあるシリアルモニタアイコンをクリックして、シリアルモニタを開きます。


先ほど書き込んだプログラムは9600bpsの通信速度でやりとりする設定になっているので、画面右下の通信速度を9600bpsにします。



受信装置にリモコンを向けてボタンを押すと、情報が表示されると思います。


ノイズが入ることがあるので、何回か試して、再現性のある情報を見てください。


空白行のあとに表示されている2行が重要です。
この情報を送信に利用するので、どこかに保存しておいてください。
Encoding  : NEC
Code      : 8F71FE0 (32 bits)

送信回路を作成

Arduinoで赤外線の信号を送信する回路を作成します。

ライブラリのHardware Specificationによると、Arduino UnoはGPIO3で信号を送信できるようなので、赤外線LEDをGPIO3に接続します。

GPIOからの電流(数10mA)で十分な場合

Arduinoの赤外線出力用GPIO、LED、抵抗、GNDを直列に繋ぎます。


配線すると、こうなりました。


MOSFETを使って多くの電流を確保したい場合

Arduinoの赤外線信号出力用GPIOをMOSFETに接続し、MOSFETを通してLEDの点灯を制御します。
電流が多く流れるため、LEDの光り方が強くなります。
また、複数本を角度を変えて同時に光らせることで、赤外線の照射範囲を広げることもできます。



配線するとこうなりました。


この回路では多くの電流が流れるので、抵抗が無いとLEDが破損する場合があります。
抵抗をLEDに接続することを強くお勧めします。

読み取った値を送信

サンプルプログラムを利用して、赤外線で信号を送信します。

プログラムを書き込み

ファイル -> スケッチ例 -> IRremote -> IRsendDemo を選択して、ベースとするサンプルプログラムを開きます。

先ほど読み取ったリモコンの情報を見ると、NEC形式で「8F71FE0」という32ビットの値を送信していることが分かります。
Encoding  : NEC
Code      : 8F71FE0 (32 bits)

loopを書き換えて、NEC形式で「8F71FE0」という32ビットの値を5秒に1回送信するプログラムにします。
void loop() {
  irsend.sendNEC(8F71FE0, 32);
  delay(5000);
}


送信値を引数として管理したい場合は、このように書くことも出来ます。
void loop() {
  unsigned int data = 0x8F71FE0;
  irsend.sendNEC(data, 32);
  delay(5000);
}

読み取った信号の情報をもとにプログラムを書き換えたら、書き込みボタンを押して、送信回路を取り付けたArduinoにプログラムを書き込みます。

Done Uploadingと表示されれば、書き込み成功です。

送信値を確認

Arduino1台で試している場合は、Arduinoに接続した赤外線LEDをリモコンの情報に応じて動作する機器に向けて、動作を確認してください。

Arduino2台で試している場合は、受信回路に対して送信回路の赤外線LEDを向けると、信号送信が成功していれば、リモコンと同じ値を確認できます。


まとめ

Arduinoで赤外線リモコンの信号情報を読み取り、同じ信号を出せました。

参考になれば嬉しいです。

参考

Arduino-IRremote
第23回 Arduinoでパーツやセンサーを使ってみよう~赤外線リモコン(前編)

0 件のコメント :

コメントを投稿