注意:すべてのOSOYOO ARDUINO用製品はサードパーティー製品であり、ARDUINOと完全に互換性があります

認可されたオンライン小売業者:

AMAZON
amzuk

内容

  1. 紹介
  2. 準備
  3. IRについて

紹介

IR(赤外線)通信は、一般的で安価で使いやすい無線通信技術です。IR光は可視光に非常に似ていますが、わずかに波長が長くなっています。これは、人間の目には見えないため、ワイヤレス通信に最適です。たとえば、テレビのリモコンのボタンを押すと、IR LEDが38,000回/秒でオン/オフを繰り返して、情報(音量やチャンネルコントロールなど)をTVのIRフォトセンサーに送信します。

このチュートリアルでは、まず一般的なIR通信プロトコルの内部動作を説明します。その後、Arduinを使用してIRデータを送受信するための3つの例を説明します。最初の例では、1838B IRフォトセンサを使用して一般的なリモコンからの受信IRデータを読み取ります。次の例では、IRリモコンのテスト方法と、対応するボタン名をシリアルモニターに表示する方法を示します。3番目の例では、IRレシーバからデータを送信して、LEDのオン/オフなど、一般的な家電の制御を行う方法を示します。

準備

ハードウェア

ソフトウェア

IRについて

IRとは何か?

赤外光は、実は特定の色を持つ通常の光です。波長が約950nmと可視光線より低いため、私たち人間にはこの色が見えません。リモコンに赤外線が選ばれる理由のひとつは、「使いたいけど、見たくない」ということです。また、IR LEDは簡単に作れるため、安価に入手でき、趣味でIR制御を行うには最適なのです。

赤外線の光源は、まだまだたくさんあります。太陽は最も明るい光源ですが、その他にも電球、ろうそく、セントラルヒーティングシステム、そして私たちの体も赤外線を放射しています。

赤外線通信の一般的な変調方式は、38kHz変調と呼ばれるものです。38kHzの信号のような規則性を持つ自然源はほとんどないため、その周波数でデータを送信するIRトランスミッターは、周囲のIRの中で目立つことになります。38kHz変調のIRデータが最も一般的ですが、他の周波数を使用することもできます。

リモコンのキーを押すと、送信側のIR LEDが一瞬だけ速く点滅し、エンコードされたデータが家電製品に送信されます。

oscilloscopeをテレビのリモコンのIR LEDに接続すると、上のような信号が見えるはずです。この変調された信号が、まさに受信システムが見ているものです。ただし、受信装置のポイントは、信号を復調して、マイコンが読み取れる2値波形を出力することです。上の波でVS1838BのOUTピンを読むと、2番目のようなものが表示されます。

変調の様子

熱を放射するものはすべて、赤外線を放射します。そのため、IRメッセージがエラーなく受信機に伝わるように、いくつかの予防策を講じる必要があります。キャリア周波数で信号を変調することで、信号をノイズの上に際立たせることができます。変調により、IR光源を特定の周波数で点滅させることができます。IRレシーバーはその周波数に同調するので、他のものを無視することができます。

下の写真では、変調された信号が、左側の送信機のIR LEDを駆動しているのがわかります。検出された信号は、反対側のレシーバーから出力されています。

(Thanks to SBProjects.com for the gif and excellent IR resource!)

VS1838B IRレシーバーの技術的詳細

VS1838B IRレシーバーのピン配列です:

IR コントロールについて

赤外線リモコンは、機器をワイヤレスで制御する最も安価な方法です。私たちは、小型で非常にシンプル、かつ低コストなリモコンを設計しました。多くの異なるIRリモコンがあります。これらのすべては、エンコード方法と物理ボタンの数が異なり、ボタンが押されたときに受け取るコードが異なる場合があります。

ir-remoteライブラリ:

注:これを動作させるためには、次のライブラリがインストールされている必要があります!

ここをクリック -IR REMOTE CONTROL: ARgithub.com/shirriff/IRremoteDUINO LIBRARY

注意!です!Arduinの後期バージョンにIRRobotRemoteというライブラリがある場合、競合する可能性があるので、そのライブラリを削除する必要があります。Arduin(root)/libraries/RobotIRremoteを必ず削除してください。ここで、Arduin(root)とは、Arduinoのインストールディレクトリを指します。RobotIRremoteというライブラリは、IRremoteと定義が似ていてエラーになります。

例IR REMOTEからデータを読み込む

この例では、VS1838B IRレシーバーとArduino用ボードを使用して、あらゆるIRリモートからIRリモートコードを読み取る方法を説明します。個々のボタン操作からコードを受信できるようになれば、リモコンとArduinは汎用的な近距離通信インターフェースになります!

まず、IR libraryがインストールされていることを確認します。Arduinライブラリのインストール方法はhereをご覧ください。

接続方法

以下のように回路を組みます:

コード プログラム

上記の操作が完了したら、USBケーブルでボードとコンピュータを接続します。Arduino IDEを開き、プロジェクトに対応するボードタイプとポートタイプを選択します。次に、
以下のスケッチをボードにロードしてください。

#include <IRremote.h>  // use the IRRemote.h
const int irReceiverPin = 2;  //the SIG of receiver module attach to pin2
IRrecv irrecv(irReceiverPin); //Creates a variable of type IRrecv
decode_results results;    // define resultsas 

void setup()
{
  Serial.begin(9600);    //initialize serial,baudrate is 9600
  irrecv.enableIRIn();   // enable ir receiver module
}

void loop() 
{
  if (irrecv.decode(&results)) //if the ir receiver module receiver data
  {  
    Serial.print("irCode: ");    //print "irCode: "        
    Serial.print(results.value, HEX); //print the value in hexdecimal 
    Serial.print(",  bits: ");  //print" , bits: "         
    Serial.println(results.bits); //print the bits
    irrecv.resume();    // Receive the next value 
  }  
  delay(600); //delay 600ms
}

特定のボタンが押されたとき、入力された値を使って、コード内で別のことをすることができます。たとえば、モーターやLEDをオンにしたりオフにしたりできます。

各ボタンを押した結果は、value()メソッドを呼び出すことで確認することができます:

results.value

シリアルモニターウィンドウに値を出力することができます:

Serial.println(results.value, HEX); //prints the hex value a a button press

動作確認結果

このスケッチは、使用しているリモコンの種類を自動的に解読し、リモコンのどのボタンが押されたかを特定します。Arduino IDEでシリアルモニターを9600bpsで開き、リモコンのさまざまなボタンを押す。

シリアルモニターに、私のリモコンのボタンがランダムに押された様子が表示されています。ボタンによって異なるコードが表示される:

上のスケッチを使い、21個のボタンを左から右へ、上から下へと数えると、受信したコードは以下のようになります: (注:「FFFFFFFFFF」を受信した場合、ボタンを押したままだと「リピート」を意味します)

1 FFA25D
2 FF629D
3 FFE21D
4 FF22DD
5 FF02FD
6 FFC23D
7 FFE01F
8 FFA857
9 FF906F
10 FF6897
11 FF9867
12 FFB04F
13 FF30CF
14 FF18E7
15 FF7A85
16 FF10EF
17 FF38C7
18 FF5AA5
19 FF42BD
20 FF4AB5
21 FF52AD

IR Remote Test

特定のボタンが押されると、受信した値を使って、モーターやLEDのオン・オフなど、コード内で別のことを行うことができます。

この例では、IRレシーバーをテストするために、前回のスケッチを修正し、特定のボタンが押されたときに、IRコントロールの対応するボタンの名前を表示するために入力される値を使用します。ハードウェアの接続は、上記の例と同じです。コードをアップロードする前に、IRremoteライブラリがインストールされていることを確認してください!

コードプログラム

上記の操作が完了したら、USBケーブルでボードとコンピュータを接続します。Arduino IDEを開き、プロジェクトに対応するボードタイプとポートタイプを選択します。次に、以下のスケッチ をボードにロードしてください。

#include "IRremote.h"
/*-----( Declare Constants )-----*/
int receiver = 2; // pin 1 of IR receiver to Arduin digital pin 2
/*-----( Declare objects )-----*/
IRrecv irrecv(receiver);           // create instance of 'irrecv'
decode_results results;            // create instance of 'decode_results'
/*-----( Declare Variables )-----*/

void setup()   /*----( SETUP: RUNS ONCE )----*/
{
  Serial.begin(9600);
  Serial.println("IR Receiver Raw Data + Button Decode Test");
  irrecv.enableIRIn(); // Start the receiver
}/*--(end setup )---*/

void loop()   /*----( LOOP: RUNS CONSTANTLY )----*/
{
  if (irrecv.decode(&results)) // have we received an IR signal?
  {
//    Serial.println(results.value, HEX);  UN Comment to see raw values
    translateIR(); 
    irrecv.resume(); // receive the next value
  }  
}/* --(end main loop )-- */

/*-----( Declare User-written Functions )-----*/
void translateIR() // takes action based on IR code received
{
  switch(results.value)
  {
  case 0xFFA25D:  
    Serial.println(" CH-            "); 
    break;
  case 0xFF629D:  
    Serial.println(" CH             "); 
    break;
  case 0xFFE21D:  
    Serial.println(" CH+            "); 
    break;
  case 0xFF22DD:  
    Serial.println(" PREV           "); 
    break;
  case 0xFF02FD:  
    Serial.println(" NEXT           "); 
    break;
  case 0xFFC23D:  
    Serial.println(" PLAY/PAUSE     "); 
    break;
  case 0xFFE01F:  
    Serial.println(" VOL-           "); 
    break;
  case 0xFFA857:  
    Serial.println(" VOL+           "); 
    break;
  case 0xFF906F:  
    Serial.println(" EQ             "); 
    break;
  case 0xFF6897:  
    Serial.println(" 0              "); 
    break;
  case 0xFF9867:  
    Serial.println(" 100+           "); 
    break;
  case 0xFFB04F:  
    Serial.println(" 200+           "); 
    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;
  default: 
    Serial.println(" other button   ");
  }
  delay(500);
} //END translateIR

実行結果

アップロードが終了してから数秒後、リモコンのいろいろなボタンを押してみてください。

Arduino IDEのシリアルポートを9600bpsで開くと、以下のソフトウェアが押されたボタンを表示するはずです:

注:シリアルモニターに「他のボタン」と表示されるのは、入力された値がIRリモートコードに対応していないことを意味し、ボタンを押し続けたり、他の妨害があった場合に表示されることがあります。

IR Control LED

プログラミングにより、リモコンを介して特定のキー(例えば電源キー)を制御します。キーを押すと、リモコンから赤外線が照射され、赤外線受信機で受信され、Osoyoo基本ボードのLEDが点灯します。Osoyoo基本ボードの3番ピンにLEDを接続し、Powerキーが押されているかどうかを遠隔で確認できるようにします。

接続方法

以下のように回路を組みます:

コード プログラム

上記の操作が完了したら、USBケーブルでボードとコンピュータを接続します。緑色の電源LED(PWRと表示)が点灯しているはずです。
以下のスケッチをボードに読み込ませてください。

#include <IRremote.h>
const int irReceiverPin =2; //the SIG of receiver module attach to pin2 
const int ledPin = 3;//pin 3 connect to an led
IRrecv irrecv(irReceiverPin); //Creates a variable of type IRrecv
decode_results results;
void setup()
{
  pinMode(ledPin,OUTPUT);//set ledpin as OUTPUT
  Serial.begin(9600);//initialize serial 
  irrecv.enableIRIn(); //enable ir receiver module 
}
void loop() 
{
  if (irrecv.decode(&results)) //if the ir receiver module receiver data
  { 
    Serial.print("irCode: "); //print"irCode: " 
    Serial.print(results.value, HEX); //print the value in hexdecimal 
    Serial.print(", bits: "); //print" , bits: " 
    Serial.println(results.bits); //print the bits
    irrecv.resume(); // Receive the next value 
  } 
  delay(600); //delay 600ms
  if(results.value == 0xFFA25D)//if receiver module receive 0xFFA25D
  {
    digitalWrite(ledPin,HIGH);//turn on the led
  }
  else
  {
    digitalWrite(ledPin,LOW);//turn off the led
  }
}

実行結果

アップロードが終わって数秒後、リモコンの「CH-」ボタンを押すと、付属のLEDとOsoyoo基本ボードの3番ピンに接続されたLEDの両方が点灯する。その後、他のキーを押すと、LEDは消灯します。