【Arduino】IR(赤外線)通信モジュールを使う

it

IR(赤外線)通信モジュールを使います。
Arduino環境でプログラム制御をするほか、IRリモコンを使ってLEDの点灯制御や通信できる距離を調査しました。

モジュール名(型名)

簡単紹介

赤外線通信をします。

Arduino環境でRaspberry Pi Picoを使って送信と受信をIRモジュールの制御をしますが、電子工作のセットで付属しているリモコンも使ってみます。

◆IRリモコンA

◆IRリモコンB

ボタンに対応する送信コードはこちらに掲載しています。
プロトコルによりコードが異なりますが、当ページではこの掲載コードで作業します。

◆関連記事

ピン配置

◆IR Transmitter

◆IR Receiver

外観

◆IR Transmitter

◆IR Receiver

使ってみた

◆開発環境

Arduino開発環境とRaspberry Pi Picoを使いました。
モジュールライブラリには「IRremote by shirriff, z3t0, ArminJo」を使いました。
赤外線通信にはいくつかのプロトコルがあり、それらに対応しているようです。

今回プロトコルについては触れずに、単純なコード変換のサンプルを修正して試しています。

◆IR通信

IR送信モジュール、IRリモコンを使ってIR受信モジュールと通信します。
IRリモコンは電子工作の入門セットや、IR通信モジュールでセット販売されている物を使いました。

IRは目視で発光を認識することはできませんが、スマホのカメラ越しに確認することができます。
画像下側のように少し紫になって発光している状態が確認できます。

リモコンのボタンによりLEDを発光させるスケッチを動かしました。
下図のように離れた位置でもマイコンに指示することができます。

このスケッチを使って正確に信号を受信できる距離を調べました。
リモコンA,Bについては3~4mあたりで受信ミス(予定のLEDが点灯しない)が発生するようになりました。
IR送信モジュールは1.5mあたりで受信ミスが発生し始めました。
それ以上の距離になるとIR受信モジュール側は受信はしているようですが、期待値を読み取れませんでした。

リモコンA約3~4m
リモコンB約3~4m
IR送信モジュール約1.5m

スマホのカメラで発光を確認できるリモコンに対し、IR送信モジュールはスマホでも発光がわかりませんでした。
光量が距離に影響していると考えると、リモコンの発光は想像しているより強いのかと思えてきます。

準備

開発環境

Arduino環境でRaspberryPi Picoを使用します。
Arduino環境の準備はこちらの記事で紹介しています。

ボードライブラリ

今回RP2040搭載基板を使用しました。

Arduino IDEのボードマネージャからRP2040用のライブラリのインストールとボードの選択をします。
ボードライブラリには「Raspberry Pi Pico/RP2040 by Earle F. Philhower, III」を使用します。
Generic RP2040またはRaspberry Pi Picoを使用します。

追加のボードマネージャのURLhttps://github.com/earlephilhower/arduino-pico/releases/download/global/package_rp2040_index.json
検索RP2040
ボードライブラリRaspberry Pi RP2040 Boards(x.x.x)※
Raspberry Pi PicoRaspberry Pi RP2040 Boards(x.x.x) > Raspberry Pi Pico
※動作確認はバージョン 4.1.1です

モジュールライブラリ

ライブラリ名検索動作確認Ver
IRremote by shirriff, z3t0, ArminJoirremote4.4.1

ピンヘッダ交換

モジュール購入時にはアングルタイプのピンヘッダが取り付けられています。
ブレッドボードで立てずに使いたいのでピンヘッダの付け替えをしました。

画像左のペアが付け替え前、右のペアが付け替え後です。

スケッチサンプル

IR受信側

説明

赤外線リモコンから送信したボタン情報をCOM出力します。
同じボタンを長押しすると、元のボタン情報と「Repeat」文字列を加えて出力します。

このサンプルスケッチは
Exsamples > IRremote > TinyReceiver を参考に修正しています。

配線

スケッチ

#define IR_RECEIVE_PIN    (D0)
#include "TinyIRReceiver.hpp"


void setup()
{
  Serial.begin(115200);
  delay(1000);
  
  if (!initPCIInterruptForTinyReceiver())
  {}
}

void loop()
{
  if (TinyReceiverDecode())
  {
    Serial.print(F("Command=0x"));
    Serial.print(TinyIRReceiverData.Command, HEX);
    if (TinyIRReceiverData.Flags == IRDATA_FLAGS_IS_REPEAT)
    {
      Serial.print(F(" Repeat"));
    }
    if (TinyIRReceiverData.Flags == IRDATA_FLAGS_PARITY_FAILED)
    {
      Serial.print(F(" Parity failed"));
    }
    Serial.println();
  }
}


結果

IRリモコンを受信モジュールに向けてボタンを押すと、シリアルに読み取った結果が表示されました。リモコンのボタンと読み取った情報の対比表です。
コード部は16進数表記です。

IR受信側(3色LED)

説明

IR受信側スケッチを修正して3色LEDの点灯動作を加えました。
リモコンの押したボタンにより点灯するLEDの色を変えます。

ボタン送受信コードLED発色
45(h)
46(h)
47(h)

配線

スケッチ

#define IR_RECEIVE_PIN    (D0)
#include "TinyIRReceiver.hpp"


void setup()
{
  Serial.begin(115200);
  delay(1000);
  
  if (!initPCIInterruptForTinyReceiver())
  {}
}

void loop()
{
  if (TinyReceiverDecode())
  {
    Serial.print(F("Command=0x"));
    Serial.print(TinyIRReceiverData.Command, HEX);
    if (TinyIRReceiverData.Flags == IRDATA_FLAGS_IS_REPEAT)
    {
      Serial.print(F(" Repeat"));
    }
    if (TinyIRReceiverData.Flags == IRDATA_FLAGS_PARITY_FAILED)
    {
      Serial.print(F(" Parity failed"));
    }
    Serial.println();
  }
}

結果

IRリモコンの1を押したときの様子です。
REDは赤に点灯しました。

IR送信側

説明

IR送信モジュールを使います。
100msごとに送信コードを変更して送信します。
送信コードはIRリモコンの1,2,3と同じコードを送信します。

IR受信側は「IR受信側(3色LED)」のスケッチと配線を使います。

このサンプルスケッチは
Exsamples > IRremote > SimpleSenderを参考に修正しています。

配線

受信側

送信側

スケッチ

#define IR_SEND_PIN   (D1)
#include <IRremote.hpp>

void setup()
{
  pinMode(LED_BUILTIN, OUTPUT);

  Serial.begin(115200);
  delay(1000);

  IrSender.begin();
  disableLEDFeedback();
}

void loop()
{
  uint8_t sRepeats = 0;
  uint16_t delay_ms = 100;
  IrSender.sendNEC(0x00, 0x45, sRepeats);
  delay(delay_ms);
  IrSender.sendNEC(0x00, 0x46, sRepeats);
  delay(delay_ms);
  IrSender.sendNEC(0x00, 0x47, sRepeats);
  delay(delay_ms);
}

結果

IR送信側から順にコードを送ることで受信側のLEDの色が変化しました。

送信コード間にウエイトを設定しています。
ウエイトが小さいと思った結果は得られず、大きいと実行速度が遅くなり通信時間がかかります。
値を変更した参考結果を記載します。

  uint16_t delay_ms = 100;
delay_msの値結果
~10始めは受信側応答したが、しばらくすると受信側が応答しなくなった。
20~30受信側応答するが、LEDの色変化が速すぎて白発光に見える
40~各色の発光がはっきり認識できる

コメント

タイトルとURLをコピーしました