月刊I/O 2022年5月号『Raspberry Piで作る電子工作』に記事を掲載して頂きました!

【Arduino入門編㉗】赤外線(IR)モジュールを使いリモコンの信号を読み取り送受信する方法!

Arduinoで無線通信を使いデータのやり取りが出来ると電子工作の幅が広がります。
無線を使ったやり取りにはWi-FiやBluetoothを使った方法などいろいろとあるようです。

例えば、双方向でのデータのやり取りのほかに複数モジュール間でのやり取りも出来るnRF24L01無線モジュールは電子工作用途で便利に使える無線モジュールでした。
Arduino間でのデータのやり取りによりこのようなロボットカーを無線で動かすことが出来ます。

【電子工作】3Dプリントパーツ・Arduinoで動かすスマートカー(ロボットカー)製作ノート!

この無線モジュールはSPIでのデータのやり取りとなるため、使うGPIOピンが多くArduinoで使えるSPIピンはボードによって決まっているため製作物に組み込む際は既に組んでいるピンを再配置するなど少し手間もかかります。

そしてBluetoothモジュールを使えば、基本的に1対1のみのやり取りとなりますがTX/RXの通常のシリアルでのやり取りとなるため組み込みには便利に使えました。

Arduinoを使いBluetooth通信をやってみる!HC-05/HC-06 Bluetoothモジュールの使い方!

電子工作でこれまで製作したものの無線化をいろいろと模索しているのですが、今回はArduinoで赤外線(IR)モジュールを使いリモコンの赤外線信号(IRデータ)を読み取り、それを使ってArduinoの制御等で使ってみたいと思います。

赤外線(IR)信号を使ったやり取りは、身の回りにあるテレビやエアコンなど様々な電化製品のリモコンで使われているので、Arduinoでその信号を読み取ることが出来ると面白いことができそうですよね!

リモコンの信号を読み取りArduinoに繋いだ赤外線モジュールから送信すれば、リモコンを使わずArduinoから家電をON/OFFさせたりなんてことも出来そうです!

例えばこんな感じ!
部屋にあったLEDテープライト用のリモコン信号を読み取り、Arduinoから点灯を制御するなんてことも出来ますね!

また、赤外線受光モジュール(送信用赤外線LEDも)はデジタルピン1本のみで使えるため、既に製作したものに組み込むことも簡単に出来ます。
赤外線でのやり取りなので受光部の位置により受信感度が悪くなることもありますが、リモコンを使って簡単に動きをテスト出来たりと・・・電子工作用途で何かと使える場面は多そうです。

今回は、赤外線(IR)モジュールを使ってリモコンの信号を読み取る方法やその信号を送信する基本的な方法を見ていきたいと思います。

赤外線(IR)モジュールを使いリモコンの信号を読み取り送受信する方法!

赤外線を使ったやり取りは家庭内にある多くのリモコンで使われているため、もう説明するまでもないですね。
赤外線(IR)通信は、安価で使いやすい無線通信なのでこの通信方式を使ったリモコンは身の回りに多くあります。

赤外線は人が認識できる波長よりも長い光なので直接見ることが出来ませんが、簡単に言うと赤外線を発するLEDを使い非常に速く点滅させてデータとして送信しているものとなります。
Arduinoで言うと、デジタルピンを使ったHIGH/LOWで赤や青のLEDを点滅させているのと原理は同じです。
ただ赤外線を発するLEDを使っているので人にはその点滅を認識することが出来ないということですね。

こちらはIRデータを読み取ることが出来るトランジスタテスター(多機能テスター)ですが、リモコンから出たIRデータを読み取らせて数値を表示させることが出来ます。

リモコンのスイッチを押した瞬間に、目には見えませんが赤外線LEDが高速でHIGHとLOW(点灯・消灯)を繰り返し、それをデータとして送信しているということですね。
ON/OFFの波形を見てみると何となくですがイメージも掴みやすいと思います。

少し難しそうですがやっている事はLEDのON/OFFでデータを作っているということです。
ArduinoはIRデータを扱うためのライブラリが用意されているので、この雰囲気だけ掴めれば比較的簡単に扱うことが出来ます。

赤外線受光モジュール(センサー)

赤外線を使ったリモコンでのやり取りは、赤外線を発して送信する赤外線(IR)LEDとそのデータを受信する赤外線受光モジュール(センサー)が使われます。

Arduinoスターターキットにも1セット(赤外線LED/赤外線受光モジュール/リモコン)付属していました。
Arduino学習用として使えるようになると便利に活用できる機会も多いと思います。

赤外線LEDは通常のLEDと使い方は同じです。
見た目も同じですね。

赤外線LEDに関しては後述します。
まず赤外線受光モジュールから見ていきます。

こちらが赤外線受光モジュール(VS1838B)です。
ピンの配列は、VCC(5V)/GND/Signalとなっています。
SignalピンをArduinoのデジタルピンに繋ぎIR信号を渡します。

またこのようなピンヘッダーが付いたモジュール形状になったものもあります。
赤外線は直接見ることが出来ないため、こちらのモジュール形状になったものではボードにLEDが搭載されています。

リモコンからのIRデータを受信時にLEDが点滅し視覚的に分かりやすくなっています。

上記単品パーツのものに確認用LEDが付いているだけですが、ピンヘッダーになっているのでブレッドボードやジャンパーワイヤーに接続してテストする際は使いやすくなっています。

MEMO
モジュールタイプのものはピンの並びが変わっているので注意して下さい!

今回はArduinoスターターキットに付属していたこれらのリモコンや赤外線受光モジュールを使って解説していきたいと思います。

赤外線受光モジュールとの接続

赤外線受光モジュールとの接続は簡単です。
Arduinoのデジタルピンと接続するだけです。(電源もArduino から取っています)
今回デジタルピンD11に接続しました。

赤外線受光モジュール(VS1838B)Arduino
SignalD11
VCC5V
GNDGND

IRremoteライブラリのインストール

IRデータのやり取りを行うための専用ライブラリをインストールしておきます。
[IRremoteライブラリ]を使用します。

Arduino IDEのメニューから[スケッチ]→[ライブラリをインクルード]→[ライブラリを管理]へと進みIRremoteで検索します。

2022年2月現在、IRremoteライブラリの最新版は3.6.0となっていました。
初めて使った時は2.6あたりだったので大分バージョンが上がっているようです。

新しいバージョン3.Xでは2.Xのものとライブラリの仕様が少し変わったようですね。
今回はバージョン2.8.0を使って説明していきたいと思います。
ライブラリのインストールは通常と同じ作業となります。

参考 IRremote Arduino LibraryGitHub

受信したIRデータを確認する

【IRremoteライブラリ】のインストールが完了したらテストスケッチを使い、まず赤外線受光モジュールで受信したIRデータを確認してみたいと思います。

[ファイル]→[スケッチ例]→[IRremote]→[IRreceiveDumpV2]を選択します。

ライブラリのバージョンが2.8.1以降では、このサンプルスケッチは[IRreceiveDump]に統一?されたようです。
バージョン3.Xではライブラリの仕様が少し変更になっていますが、初めて使う場合2.Xの方が分かりやすいため(ずっとこのバージョンを使っていたからかな?)、こちらではバージョン2.8.0で進めていきます。

一応[IRreceiveDumpV2]のスケッチをそのまま載せておきます。

このスケッチをArduino(こちらではArduino Unoを使います)に書き込み、シリアルモニタを立ち上げます。
通信速度(ボーレート)の設定は115200bpsです。

手持ちのリモコンを赤外線受光モジュールに向けてボタンを押すと、受信したデータが表示されます。

取得できる主なデータ
  • メーカー名(メーカープロトコル)
  • 受信したIRコード(Data)
  • 受信したデータのbit数
  • rawData(生のタイミングデータ)

などが表示されます。
必要なデータ(赤で囲った部分)をメモしておきます。

MEMO
IRコード(Data)が分かれば赤外線受光モジュールで信号を識別することが出来ます。
また後述する赤外線LEDを使って送信で使う場合、メーカー名やbit数、rawデータが必要となります。

今回Arduinoスターターキットに付属していたこちらのリモコンを使ってテストしてみました。
このリモコンを使い以前製作した4足歩行ロボットを動かしてみようと思います。
[2]で前進、[8]で後退、[4]で左回り、[6]で右回り、[5]で座る動作を付けるため各ボタンのIRコード(Data)を確認しておきます。

上記スケッチでそれぞれボタンが押された時のIRデータを確認します。
例えば[5]を押した時、このリモコンではこのようなデータを受信しました。
受信で使う場合必要なのは、IRコード(Data)のみです。
同様に他のボタンも確認しておきます。

受信したIRデータをシリアルモニタで確認する

リモコンの押されたボタンを判別するテストスケッチを作りました。
シリアルモニタを使い確認してみます。
先程事前に調べた各ボタンのIRコードと一致するデータを受信すると「5キーON」のように表示させるものとなります。

MEMO
IRコード(Data)の値はご自身のリモコンで取得した値に書き換えて下さい!
一致するIRコードが送られてくると「◯キーON」と表示され、それ以外のキーが押されると「未割り当てのキー」と表示するスケッチとなります。

上手くリモコンから送られていくるIRコードを識別出来ていますね。
デジタルピン1本のみで使えるので、簡単に製作物に組み込むことも出来ます。

Arduinoで動かす4足歩行ロボット製作ノート!Arduino学習に便利なロボくんなので使って下さい!【STLデータ公開】

また、テスト環境などでも便利に使えそうです。
例えば、複数のスイッチを使ったテストではブレッドボードにタクトスイッチを取り付けジャンパーワイヤでArduinoと接続しプルアップさせ・・・複数のON/OFF判定が必要な場合、結構面倒な配線となります。

赤外線受光モジュールを使い、上記のようにボタンのIRデータにより分岐させれば回路も簡単にでき、判定するスイッチも必要に応じてリモコンのボタンを増やしていくだけなので簡単に出来ますね!

スケッチ解説

ライブラリのインクルード

IRremoteライブラリのインクルードです。

IRrecv 名称(pin番号)

受信で使用するオブジェクトの作成。
名称と使用するピンを指定します。

decode_results ○○

受信データの格納先を作成。
受信したデータは作成した「results」内に格納されます。

複数情報が入っていますが指定して任意の情報を取得できます。

関数内容
decode_typeメーカー名を取得
value受信データを取得
bits受信したデータのビット数を取得

○○.enableIRIn();

赤外線受信を開始させます。

○○.decode(&~~);

赤外線受信モジュールからデータを受信したかの確認。
シリアル通信する際に使われるserial.availableと同じようなもの?です。

○○.value

受信情報格納先から受信データを取得。

○○.bits

受信情報格納先から受信したデータのビット数を取得。

~.resume();

.decode()の値をリセットし、次の受信データを受け取れるようにする。

リモコンデータ(IRデータ)を送信する

リモコンから送信されたIRデータを確認し動かすことが出来ました。
次にIRデータを送信で使ってみたいと思います。

赤外線(IR)の送信には、赤外線(IR)LEDを使います。
使い方は通常のLEDと同じです。

こちらの赤外線LEDは、順方向電圧(VF)が1.25~1.8V、順方向電流(IF)が20mAとなっています。
ほぼ赤色LEDと同じくらいですね。

R=(5.0-1.5)/0.02=175Ω

今回電流制限抵抗は180Ωのものを使いました。

赤外線LEDの接続

赤外線LEDの接続は非常に簡単です。
通常のLEDと同じです。
電流制限抵抗を挟みデジタルピンD3に繋ぎます。(IRremoteライブラリの送信デフォルトピンはD3となっています)

送信にはメーカー名とData(IRコード)、受信ビット数が必要となります。
先程ライブラリのサンプルスケッチ[IRreceiveDumpV2]で事前に調べておいたものです。

今回使っているリモコンはNECのプロトコル信号を持ったリモコンでした。
これをIRremoteライブラリのsend関数に反映させます。

○○.sendNEC(Data, ビット数);

上記スケッチではリモコンの”2″と”8”キーのIRデータを1秒間隔で送信します。
Arduinoが2台あれば受信側で確認する事が出来ます。

先程使った受信側Arduinoのシリアルモニタに1秒間隔で「2キーON」「8キーON」と表示されれば上手く送信データが送られているということになります。

こんな感じですね。

また手持ちのリモコンで取得したIRデータを上記スケッチに書き換え、Arduinoに接続した赤外線LEDから対応機器が動作すれば成功です。

例えば、こちらは部屋に設置したLEDテープライト用のリモコンです。(こちらもNECプロトコル信号のものでした)

このリモコンのIRデータを読み取り送信データとして使うことにより、リモコンを使わずArduinoのシリアルモニタから制御出来るようにしてみました。
なかなか面白いですね!

ライブラリで使える他のメーカープロトコル

メーカープロトコルによる送信関数は多数用意されています。
手元にあったいくつかのリモコンで試してみました。

上記テストで使用したリモコンはNECのプロトコル信号を持ったリモコンでした。
他のメーカープロトコル信号で使えるsend関数も多数用意されていますが、メーカーにより使い方が少し異なるようですね!

メーカープロトコル send関数使用例
  • ○○.sendNEC(Data, ビット数);
  • ○○.sendSony(Data, ビット数);
  • ○○.Panasonic(Address, Data);

などが使えます。
サポートされている他のメーカー製のリモコンのIRsendクラスに関してはこちらのページを確認して下さい

参考 IRsend Class ReferenceIRremote

例えばPanasonic製のテレビリモコンの電源ボタンではこのような信号が出ていました。

Panasonicのメーカープロトコルのsend関数はこのように使います。

~~.Panasonic(Address, Data);

上記スケッチのsend関数部分をirsend.Panasonic(0x555A,  0x5AF14868);に置き換えることにより上手く使うことが出来ました。(以下のsendRaw関数を使っても送信することが出来ます)

他のメーカープロトコルに関しては、上記サイトを参考にして下さい!

プロトコルが不明(UNKNOWN)の場合の送信設定

上記のようにメーカーのプロトコル信号の場合、send関数を使いsendNECやsendPanasonicのように指定してIRコードを送信することが出来ます。

しかしプロトコルが[UNKNOWN]と表示され不明な場合や、分かっていても上手く送信できない場合はsendRaw関数を使うと上手くいく場合があります。

例えばこちらはカメラシャッター用のリモコンとなります。

中華の格安リモコンですが、プロトコルが不明(UNKNOWN)と表示されました。

このような場合、sendRaw関数を使って送信タイミングの生データを使えば上手くいきます。
上記[IRreceiveDumpV2]で信号を調べるとRawデータ(生の信号データ)が配列で表示されます。
このリモコンの場合、15配列の数となっていました。

このデータをそのままコピーし、sendRaw(○○, 15, 38)でIRデータを送信することが出来ます。(第2引数は配列の数、第3引数は38固定で大丈夫です)

先程のメーカープロトコルを使ったスケッチをsendRaw関数を使ったものに修正するとこのようになります。

手元にあったリモコンをいろいろと試してみましたが、メーカープロトコルによる送信やsendRaw関数を使いタイミングデータを送信する方法で大抵のものは上手くいきました。

しかしエアコンのリモコンだけは送信しているデータが多いようで今回の方法ではうまくいきませんでした。
そのことはライブラリのGithubページにも書かれていました。
方法はいろいろと書かれているので興味ある方はライブラリの仕様をさらに深く探ってみるのがいいかと思います。

今回使ったアイテム

赤外線受光モジュール&赤外線LED

赤外線(IR)のデータの受信に使う赤外線受光モジュールと送信に使う赤外線LEDです。

リモコンセット

赤外線受光モジュールと赤外線LED、今回テストで使ったリモコンがセットになったものも販売されているようです。
Arduinoスターターキットにも1セット付属していました。

Arduino UNO

Arduinoはオープンソースのハードウェアなので正規品以外にも互換品が多数販売されています。
互換品でも正規品と比べて特に問題なく使用でき安価なためArduino学習用としていいと思います。

Elegoo製のArduinoボードは、互換ボードの中でも非常にクオリティーが高いのでおすすめです!

【ELEGOO Arduino Uno】Arduino完全互換ボードの中ではダントツのクオリティーですね!

Arduino スターターキット

これからArduino学習を進めていくにあたりArduino UNO(互換品)やブレッドボード、ジャンパーピンなどがセットになったスターターキットが販売されています。

私はGeekcreit製のスターターキットを使っていますが、ELEGOO製のものは国内Amazonなどでも購入可能で人気があるようです。(セット内容はほぼ同じです!)

そしてELEGOOのサイトからスターターキット用サンプルスケッチのダウンロードも可能です。(Geekcreitのキットでも使えます)

参考 チュートリアルダウンロードELEGOO

電子工作を始めるにはまずブレッドボードやジャンパーピン、メインとなるArduino UNOやサーボ、LEDなどの基本的なパーツがないと実際に動かすことが出来ませんが、個々にパーツを購入して回路を組んでとなるとかなりの手間がかかります。

スターターキットがあればArduinoの初歩的なことはかなりの数こなすことが出来るのでオススメです!
そこからスキルアップに伴い個別でセンサーやモジュールなど必要なものを増やしていくのがいいと思います。

今回使ったリモコンや赤外線受光モジュール、赤外線LEDも1セット付属していました。

最後に!

Arduinoを使った電子工作を始めた頃にArduinoスターターキットを購入し付属していたものなので、当時いろいろと試した記憶があります。

最近では以前より少しですがArduinoの事が分かるようになってきて、自作した製作物の無線化に使ってみました。
使用するGPIOピンはデジタルピン1本のみなので比較的簡単に組み込むことができテスト動作させることが出来るのがいいですね!

またテスト環境での動作テストでON/OFF判定させることはよくありますが、複数のスイッチをArduinoに接続しようと考えると接続自体は簡単ですがブレッドボードの配線やプルアップ設定など結構面倒となってきます。
IRコードを取得しスケッチ内で動作を分岐させるといった使い方で便利に使えそうですね。
動作させるボタンを増やしていくのも簡単です。

Arduinoのスターターキットに入っているパーツ構成ってよく考えられていますね。
ある程度Arduinoを触っていると追加でいろいろとセンサーやモジュールなどのパーツを増やしていくわけですが、これからArduinoを始めてみようと考えられている方には基本的な事が試せる良いキットだとあらためて思ったりしました。

コメントを残す