前回は、SDカードの使い方を学びました。今回は、赤外線リモコン受信モジュールと赤外線LEDを利用し、赤外線リモコンを作成します。テレビやエアコンなどのリモコンの多くは、赤外線を使っています。このリモコン信号を解析し、Arduinoでリモコン信号を発信して家電を操作しましょう!
今回の電子工作レシピ
完成までの時間目安:90分
必要なパーツ
- Arduino本体(Arduino Mini Pro)http://www.switch-science.com/catalog/789/
- ブレッドボード https://www.sengoku.co.jp/mod/sgk_cart/detail.php?code=EEHD-4D6P
- 赤外線リモコン受信モジュール SPS-440-1(38kHz)http://akizukidenshi.com/catalog/g/gI-00614/
- 5mm赤外線LED OSI5LA5113A http://akizukidenshi.com/catalog/g/gI-12612/
- CDSセンサ(光センサ) http://akizukidenshi.com/catalog/g/gI-00110/
- タクトスイッチ http://akizukidenshi.com/catalog/g/gP-03647/
- 抵抗器(220Ω)
赤外線って何?
「赤外線通信」「赤外線カメラ」「遠赤外線ヒーター」などなど、「赤外線」というキーワードをよく目にすることがあると思いますが、この「赤外線」とは一体どのようなものでしょうか?wikipediaで調べてみます。
赤外線 – wikipedia
赤外線(せきがいせん)は、可視光線の赤色より波長が長く(周波数が低い)、電波より波長の短い電磁波のことである。ヒトの目では見ることができない光である。分光学などの分野で IR (infrared) と略称される。
電磁波を波長で分類すると下記の図のようになります。
赤外線通信の基本的なしくみ
では、この赤外線をどのように利用してリモコンなどの通信を行っているのでしょうか。
基本的には、赤外線LEDの点灯・消灯を切り替えて命令を送っています。
また、それらの切り替えのパターンは、家電などで利用されている赤外線リモコンの場合、一般的に定められた共通のフォーマットを利用している場合がほとんどです。代表的なフォーマットは下記の3種類で、国内のほとんどの家電の赤外線リモコンがこのフォーマットを採用しています。
代表的なフォーマット
- NECフォーマット
- 家製協フォーマット
- SONYフォーマット
例えば、NECフォーマットでは、リモコンから命令を送る合図としてリーダー信号を発信します。その次に、データ信号を送り、最後にストップ信号を送るようなフォーマットになっています。基本的なフォーマットはこの3つのフォーマットを採用しています。リモコンのボタンを押し続けた場合や、信号を繰り返す場合の処理が違うなど、細かい取り決めが、各家電メーカーによってあります。実際に制作をする場合は、「学習リモコン」のように、既存のリモコン信号を直接読みとって解析をする必要です。
※詳しいフォーマットの解析に興味のある方は「赤外線リモコンコード」「赤外線 解析」などで検索すると色々なコードが見つかります。
リモコン信号の周波数について
赤外線は太陽や、照明などいたるところから発光されています。それらの光とリモコンの信号を見分ける工夫として、大抵の赤外線リモコンでは発光する周波数を38KHzと設定し、他の光と区別をしています。今回、利用する赤外線受信モジュールもこの38KHz対応のものを利用します。
Arduinoで赤外線を送受信してみる
では、Arduinoで赤外線を受信してみましょう。今回はテレビの受信部などにも使われる、赤外線リモコン受信モジュールSPS-440-1を使います。受信する周波数は38kHzで、必要な回路が内蔵されているためArduinoにそのまま接続できます。また、送信部には赤外線LEDを使います。
下記の図のように赤外線受信モジュールをArduinoに接続します。
次にプログラムです。今回赤外線の解析はGithubで公開されているIRライブラリを利用します。ソース一式は、右下のダウンロードボタンから取得できます。Githubを利用している場合は、通常の手順でソースを取得してください。ダウンロードしたソースは、メニューの「スケッチ」-「ライブラリを使用」-「Add Library」をクリックして、ダウンロードしたzipファイルを追加してください。再度「スケッチ」→「ライブラリを使用」を開いて、そこに「IRremote」が追加されていれば無事にライブラリの導入が完了です。うまくいかない方は、Arduinoのlibrariesディレクトリにzipを解凍したフォルダを移動してArduinoを再起動してください。
shirriff/Arduino-IRremote
https://github.com/shirriff/Arduino-IRremote
ライブラリを利用できるようになったのでプログラムを作成します。IRremoteライブラリには、サンプルプログラムが入っているので、それを利用して受信を試してみます。このプログラムでは、11番ピンに入力された赤外線信号を解析してフォーマットとデータ内容を表示するプログラムです。
プログラム:赤外線信号の解析
/* * IRremote: IRrecvDump - dump details of IR codes with IRrecv * An IR detector/demodulator must be connected to the input RECV_PIN. * Version 0.1 July, 2009 * Copyright 2009 Ken Shirriff * http://arcfn.com * JVC and Panasonic protocol added by Kristian Lauszus (Thanks to zenwheel and other people at the original blog post) * LG added by Darryl Smith (based on the JVC protocol) */ #include <IRremote.h> int RECV_PIN = 11; IRrecv irrecv(RECV_PIN); decode_results results; void setup() { Serial.begin(9600); irrecv.enableIRIn(); // Start the receiver } // Dumps out the decode_results structure. // Call this after IRrecv::decode() // void * to work around compiler issue //void dump(void *v) { // decode_results *results = (decode_results *)v void dump(decode_results *results) { int count = results->rawlen; if (results->decode_type == UNKNOWN) { Serial.print("Unknown encoding: "); } else if (results->decode_type == NEC) { Serial.print("Decoded NEC: "); } else if (results->decode_type == SONY) { Serial.print("Decoded SONY: "); } else if (results->decode_type == RC5) { Serial.print("Decoded RC5: "); } else if (results->decode_type == RC6) { Serial.print("Decoded RC6: "); } else if (results->decode_type == PANASONIC) { Serial.print("Decoded PANASONIC - Address: "); Serial.print(results->panasonicAddress,HEX); Serial.print(" Value: "); } else if (results->decode_type == LG) { Serial.print("Decoded LG: "); } else if (results->decode_type == JVC) { Serial.print("Decoded JVC: "); } else if (results->decode_type == AIWA_RC_T501) { Serial.print("Decoded AIWA RC T501: "); } else if (results->decode_type == WHYNTER) { Serial.print("Decoded Whynter: "); } Serial.print(results->value, HEX); Serial.print(" ("); Serial.print(results->bits, DEC); Serial.println(" bits)"); Serial.print("Raw ("); Serial.print(count, DEC); Serial.print("): "); for (int i = 0; i < count; i++) { if ((i % 2) == 1) { Serial.print(results->rawbuf[i]*USECPERTICK, DEC); } else { Serial.print(-(int)results->rawbuf[i]*USECPERTICK, DEC); } Serial.print(" "); } Serial.println(""); } void loop() { if (irrecv.decode(&results)) { Serial.println(results.value, HEX); dump(&results); irrecv.resume(); // Receive the next value } }
プログラムをArduinoにアップロードした後、テレビなどのリモコンを赤外線受信モジュールに向かってボタンを押すと、シリアルモニタ上に信号データが表示されました。
では、次にリモコン信号の送信プログラムを試してみましょう。送信プログラムを利用するためには、ライブラリ側のソースに一手間加える必要があります。Arduinoの「libraries」-「IRremote」ディレクトリの中にあるIRremote.hを開いて、ソースの上部に青枠で囲った「#define 〜〜〜」を加えて上書き保存してください。これで、各種フォーマットに従った信号を送信できます。
IRremote.hの編集が完了しましたら、プログラムをArduinoに書き込みます。サンプルの例では、タクトスイッチを押した時にSonyフォーマットのテレビ電源ONの信号を3回発信するプログラムとなります。
プログラム 赤外線送信回路
#include <IRremote.h> IRsend irsend; int sensorPin = A0; void setup() { Serial.begin(9600); } void loop() { int sensorValue = analogRead(sensorPin); //Serial.println(sensorValue); if(sensorValue == 0){ for (int i = 0; i < 3; i++) { irsend.sendSony(0xa90, 12); // Sonyフォーマットでテレビ電源ONの信号 delay(40); } } }
実際にテレビに向けて信号を発信してみました(※ここではプログラムを少し変えて5秒おきに電源ON/OFFを繰り返す信号を送信しています)。
ArduinoからテレビのON/OFFができるようになりました!
まとめ
今回、赤外線受信モジュールと赤外線LEDを利用して、赤外線リモコン信号の送受信を試しました。次回は、赤外線信号と、温度センサや光センサなどのセンサを組み合わせて、家電を操作するスマートコントローラーを作成してみます。