Lesson13 赤外線受信モジュール
このレッスンでは、IRリモートコントローラからの信号を赤外線受信モジュールで受信してArduinoを制御する方法を学びます。
必要な部品
必要な部品は以下になります。
- Elegoo UNO R3 x 1
- IR Receiver Module x 1
- IR Remote x 1
- F-M Jumper Wire x 3
赤外線受信モジュール(Infra-Red Receiver Module)
赤外線受信モジュールは、赤外線信号を受信可能なフォトセルを備えたマイクロチップです。家電製品のリモコンにもこの赤外線送受信の仕組みは利用されており、普段から日常生活でも登場している装置になります。
赤外線とは、目に見えない光です。赤い光が目に見える中で最も波長の長い光なのですが、その赤よりも波長が長い光を赤外線と呼びます。逆に目に見えない波長の短い光は、紫外線です。余談ですが、夕日が赤いのは、太陽光が大気圏内(空気中)を通過する距離が長いため波長の短い光は、はじかれて残った波長の長い光が見えるため赤く見えるわけです。
リモコン(赤外線発信装置)には、赤外線LEDを備えており、この赤外線LEDをオン、オフして信号を送ります(モールス信号)。つまり点滅信号を送っている訳です。これを赤外線を検出できるでセンサーで受け取り、点滅の長さ、間隔で復調してデジタル信号に変換しています。
赤外線通信の仕組み
赤外線の波長は780nm~1mmです。その中でも赤外線リモコンは、900nm帯の波長を利用しています。よく利用される通信フォーマットには、NEC/家製協/SONYフォーマットの3種類があり、これらで日本国内の殆どの家電をカバーしています。
その中でも最初に規格化されたNECフォーマットについて記載して通信の仕組みを理解したいと思います。
赤外線波長 | 950nm | |
周波数 | 38KHz (1/3duty) | 26μs (≒26.32μs) |
変調単位(T) | 0.56ms | |
固定長フレーム | 32ビット | カスタマーコード+データ |
カスタマーコード | 16ビット | メーカー識別コード |
データ | 8ビット | 8ビットのデータ+ビットの反転データ |
赤外線通信の開始時にリーダーコードを送信し、フレームデータの開始を示します。リーダコードは、16T(9.0ms)の点灯と8T(5.4ms)の消灯で構成されています。
カスタマーコードやデータは、以下の信号でビットデータを形成します。8ビットで表現できるのは、0から255までのデジタル信号になります。データは8ビット+8ビットの反転です。これで8ビットデータのエラーチェックをしています。
ビットの0と1の表現は、LOWの長さで指定します。ビット0は、1TがHIGHの後に1TがLOWになります。ビット1は、1TがHIGHの後に3TがLOWになります。
しかし、この0.56msの倍数で表現すれば良いという訳ではありません。実は、38KHzのパルス信号にする必要があります。LOWは消灯しておけば良いだけなのですが、HIGHはパルスでの点灯が必要になります。つまり、1T(560μs)中に38KHz(1秒間に38,000回転という意味)、1回転=26μs周期で1/3点灯、2/3消灯を繰り返すことになります。
リーダーコードやカスタマーコードについては、ただ、通信規格として規定されているというものですが、データビットの0と1は、データ値そのものを示していますので、赤外線通信を使用する場合は、理解しておく必要があります。
回路をつくってみる
それでは実際に回路をつないでみます。
赤外線受信モジュールには、上からGにGND、Rに5V、YにD11を接続します。
プログラムを動かしてみる
チュートリアルに付属のコードを利用して実際に動かしてみます。今回もIR-Remoteというライブラリを利用するのでZipライブラリをインポートして、スケッチにインクルードします。
#include <IRremote.h>
//www.elegoo.com
//2016.12.9
int receiver = 11; // Signal Pin of IR receiver to Arduino Digital Pin 11
/*-----( Declare objects )-----*/
IRrecv irrecv(receiver); // create instance of 'irrecv'
decode_results results; // create instance of 'decode_results'
/*-----( Function )-----*/
void translateIR() // takes action based on IR code received
// describing Remote IR codes
{
switch(results.value)
{
case 0xFFA25D: Serial.println("POWER"); break;
case 0xFFE21D: Serial.println("FUNC/STOP"); break;
case 0xFF629D: Serial.println("VOL+"); break;
case 0xFF22DD: Serial.println("FAST BACK"); break;
case 0xFF02FD: Serial.println("PAUSE"); break;
case 0xFFC23D: Serial.println("FAST FORWARD"); break;
case 0xFFE01F: Serial.println("DOWN"); break;
case 0xFFA857: Serial.println("VOL-"); break;
case 0xFF906F: Serial.println("UP"); break;
case 0xFF9867: Serial.println("EQ"); break;
case 0xFFB04F: Serial.println("ST/REPT"); break;
case 0xFF6897: Serial.println("0"); break;
case 0xFF30CF: Serial.println("1"); break;
case 0xFF18E7: Serial.println("2"); break;
case 0xFF7A85: Serial.println("3"); break;
case 0xFF10EF: Serial.println("4"); break;
case 0xFF38C7: Serial.println("5"); break;
case 0xFF5AA5: Serial.println("6"); break;
case 0xFF42BD: Serial.println("7"); break;
case 0xFF4AB5: Serial.println("8"); break;
case 0xFF52AD: Serial.println("9"); break;
case 0xFFFFFFFF: Serial.println(" REPEAT");break;
default:
Serial.println(" other button ");
}// End Case
delay(500); // Do not get immediate repeat
} //END translateIR
void setup() /*----( SETUP: RUNS ONCE )----*/
{
Serial.begin(9600);
Serial.println("IR Receiver Button Decode");
irrecv.enableIRIn(); // Start the receiver
}/*--(end setup )---*/
void loop() /*----( LOOP: RUNS CONSTANTLY )----*/
{
if (irrecv.decode(&results)) // have we received an IR signal?
{
translateIR();
irrecv.resume(); // receive the next value
}
}/* --(end main loop )-- */
実際に動かしてみたいと思います。シリアルモニタとリモコンの操作を同時に確認したいので、パソコン画面とリモコン操作を同期してビデオに残しました。こちらで動かした結果をご確認ください。(わざわざ動画にする必要ある?という突っ込みはやめてください。動画作成スキルをレベルアップしたいので動画作成チャンスがあればつくります!)
以上
コメント