プロジェクト29 IRリモコン制御

1. 説明

IRリモコンはIR信号を使ってLEDを制御します。これにより、LEDの制御が大幅に簡素化されます。

2. 動作原理

本プロジェクトでは、約38Kのキャリア周波数を変調に使用することが多いです。

IRリモコンシステムは変調、送信、受信を含みます。変調を通じてデータを送信することで、伝送効率が向上し、消費電力が削減されます。

一般的に、キャリア変調の周波数は30kHz~60kHzの範囲内(通常は38kHz)です。矩形波のデューティ比は1/3で、下図のように送信側の455kHz水晶発振器によって決定されます。

この端の水晶発振器には整数分周が必須で、周波数係数は通常12と評価されます。したがって、455kHz÷12 ≈ 37.9kHz ≈ 38kHzとなります。

38kHzキャリア(完全)送信図:

キャリア周波数: 38kHz

波長: 940nm

受信角度: 90°

制御距離: 6m

リモコンボタンの回路図:

3. 配線図

4. テストコード

/*
  keyestudio ESP32 Inventor Learning Kit  
  Project 29.1 IR Remote Control
  http://www.keyestudio.com
*/
#include <Arduino.h>
#include <IRremoteESP8266.h>
#include <IRrecv.h>
#include <IRutils.h>

const uint16_t recvPin = 19;  // 赤外線受信ピン
IRrecv irrecv(recvPin);  // 受信クラスのオブジェクトを作成
decode_results results;   // デコード結果クラスのオブジェクトを作成
long ir_rec;

void setup()
{
  Serial.begin(9600); // シリアルポートを初期化し、ボーレートを9600に設定
  irrecv.enableIRIn(); // 受信開始
}

void loop() 
{
  if (irrecv.decode(&results)) 
  {
    ir_rec = results.value; // 信号を変数ir_recに代入
    if(ir_rec != 0)
    {		// ボタンが押された時にコードの繰り返し実行を防止
        Serial.print(ir_rec, HEX); // 変数ir_recを16進数で表示
        Serial.println();// 改行
    }
    irrecv.resume(); // IRリモコンの受信を再開し、次の値を受信
  }
} 

5. テスト結果

配線を接続しコードをアップロードした後、シリアルモニターを開きボーレートを9600に設定します。

リモコンのボタンを押すと、16進数の値が表示されます。

6. 知識の拡張

次に、IRリモコンを使ってLEDを制御します。OKボタンを押すとLEDが点灯し、再度押すと消灯します。

配線図:

コード:

/*
  keyestudio ESP32 Inventor Learning Kit 
  Project 29.2 IR Remote Control
  http://www.keyestudio.com
*/
#include <Arduino.h>
#include <IRremoteESP8266.h>
#include <IRrecv.h>
#include <IRutils.h>

int led = 25;
int led_val = 0;
const uint16_t recvPin = 19;  // 赤外線受信ピン
IRrecv irrecv(recvPin);       // 受信クラスのオブジェクトを作成
decode_results results;       // デコード結果クラスのオブジェクトを作成
long ir_rec;

void setup() 
{
  Serial.begin(9600);   // シリアルポートを初期化し、ボーレートを9600に設定
  irrecv.enableIRIn();  // 受信開始
  pinMode(led, OUTPUT);
}

void loop() 
{
  if (irrecv.decode(&results)) 
  {
    ir_rec = results.value;      // 信号を変数ir_recに代入
    if (ir_rec != 0) 
    {           // ボタンが押された時にコードの繰り返し実行を防止
      if (ir_rec == 0xFF02FD) // 受信したIR信号がOKボタンのものか判定
      {  
        led_val = !led_val;      // 変数を反転。初期値が0なら反転後は1になる
        digitalWrite(led, led_val);
      }
    }
    irrecv.resume();  // IRリモコンの受信を再開し、次の値を受信
  }
}

テスト結果:

OKボタンを押すとLEDが点灯し、再度押すと消灯します。