ESP32で赤外線受信モジュールを使用して、ブルーレイレコーダーのリモコンから発信する情報を受信してモニタしてみたいと思います。
ESP32と赤外線受信モジュールを接続
ESP32と赤外線受信モジュールを接続していきます。
準備するもの
今回使用するものは、以下になります。
- ESP32
- ブレッドボード
- 赤外線受信モジュール
- LED
- 抵抗(220Ω)
- ジャンパーワイヤー
赤外線受信モジュール
赤外線受信モジュールは、Amazonで購入しました。すでに受信機が基板に実装されているため、ジャンパーワイヤーで接続するだけで簡単です。
主な仕様は、以下になります。
- 電源電圧範囲:2.7V~5.5V
- 周波数:37.9kHz
- 受光角:90°
とりあえず3.3Vでも動作しそうなので、3.3Vにつないで試してみます。
接続
以下のように接続していきます。
ARDUINOMODULES.INFO
KY-022 Infrared Receiver Module
プログラム作成
プログラムの概要は、リモコンなどの赤外線情報を受信してシリアルモニタに表示する処理になります。
ライブラリの追加
赤外線受信処理を行うためにライブラリをインストールします。
Arduino IDEを起動して、メニューの「ツール」→「ライブラリを管理」を選択します。
表示した「ライブラリマネージャ」のテキストボックスに「IRremote」を入力します。
検索して表示された「IRremote」をインストールします。
プログラム
とりあえず、「IRremote」のライブラリをインストールすることで、サンプルソースも追加されますので、ちょっとだけ改造して実行してみます。
#include "IRremote.h"
int IR_RECEIVE_PIN = 12;
int FEEDBACK_LED_PIN = 14;
void setup() {
Serial.begin(115200);
pinMode(FEEDBACK_LED_PIN, OUTPUT);
IrReceiver.begin(IR_RECEIVE_PIN, ENABLE_LED_FEEDBACK, FEEDBACK_LED_PIN);
}
void loop() {
if (IrReceiver.decode()) {
IrReceiver.printIRResultShort(&Serial);
IrReceiver.printIRResultRawFormatted(&Serial, true);
IrReceiver.resume();
}
delay(100);
}
プログラムについて簡単に説明していきます。
3行目で赤外線受信入力ピン、4行目で赤外線有効受信のフィードバックを表示するLEDのピンを定義しています。
9行目の IrReceiver.begin() で、赤外線受信を開始させています。引数の定義は以下になります。
- 第1引数:uint8_t aReceivePin・・・赤外線受信入力ピン
- 第2引数:bool aEnableLEDFeedback = false(省略可)・・・有効受信のフィードバック
- 第3引数:uint8_t aFeedbackLEDPin = USE_DEFAULT_FEEDBACK_LED_PIN(省略可)・・・有効受信のフィードバックを表示するLED出力ピン(デフォルト0です)
今回は、赤外線受信のフィードバックを有効にして、LEDで表示してみます。
12~19行目で、赤外線を受信した場合にシリアルモニタに表示する処理を行っています。
まず、13行目の「IrReceiver.decode()」で、直近に受信した赤外線情報をデコードして、正常なデータである場合は、trueを返却しています。
13行目で受信処理が正常だった場合に、14行目と15行目で受信した情報を表示しています。
14行目の IrReceiver.printIRResultShort() で、以下の情報を表示しています。
- デコードタイプ
- デコードアドレス
- デコードコマンド
- デコードデータ
- データ用に受信したビット数
- LSB first(リトルエンディアン) または MSB first(ビッグエンディアン)
引数にシリアル通信のクラスを設定しているため、この関数の中でシリアルモニタに表示する処理を行ってくれています。
ちなみに、以下の構造体に赤外線の情報がデコードされて、その情報をシリアルで送信してくれているようです。
struct IRData {
decode_type_t protocol;
uint16_t address;
uint16_t command;
uint16_t extra;
uint8_t numberOfBits;
uint8_t flags;
uint32_t decodedRawData;
irparams_struct *rawDataPtr;
};
15行目の IrReceiver.printIRResultRawFormatted() で、受信したデータを整形して表示しています。
16行目で、IrReceiver.resume() を行って赤外線受信処理を再開しています。
動作確認
実際に動作を確認してみます。
適当なリモコンを用意します。
赤外線受信モジュールに向けて、なんでも良いのでリモコンのボタンを押してみると、シリアルモニタに文字列が表示されました。
ボタンによって割り当てられている文字列が違うことがわかります。これで電化製品本体側を制御しているので、文字列を記録してESP32から赤外線を送信すれば リモコンと同じように制御ができそうです。
赤外線受信のフィードバックを設定しているので、赤外線受信時にLEDが点灯します。結構楽しいです。
赤外線受信モジュールも問題なく3.3Vで動作したので良かったです。
まとめ
ESP32で赤外線受信をためしてみました。
ライブラリのサンプルソースをちょっといじっただけで、赤外線の受信処理を簡単に行うことができます。
実際に赤外線情報を受信してみると、リモコンのボタン1つ押しただけでも、そこそこデータが送信されていることがわかりました。また、ボタンごとに電文が異なっているので、この電文を使ってESP32から実際に機器を制御してみたいと思いました。
ESP32だとBluetoothもWiFiもあるのにという感じですが、赤外線の受信処理はとてもお手軽に実装出来て、さらに受信反応も良かったのでアリではないかと思います。
心残りは、家にあるリモコンを何個か試してみましたが、全てデコードタイプが「NEC」だったので、他社の赤外線受信のテストも機会があればやってみたいと思います。
今回は赤外線受信だけでしたが、次は赤外線送信も追加して何かできたらよいと思います。
【参考図書】