
Arduinoと赤外線受信モジュールを使って、リモコン信号を読み取る電子工作で遊んでみました。
仕組みはとてもシンプルですが、
赤外線が扱えるようになると電子工作の幅が一気に広がります。
今回は初心者の方向けに、配線とコードをできるだけ丁寧に解説していきます。
Arduinoで赤外線受信機
作ったものは簡単で、Arduinoに赤外線モジュールを接続し受信信号をシリアルモニタでモニタリングするだけとなります。使用部材はこちらです。
1.Arduino(互換機) UNO R3

Arduinoは互換機を使ったのですが、なんの問題もありませんでした。
2.赤外線受信モジュール(CHQ1838)

CHQ1838という赤外線モジュールを使いました。こちら、センサーの足とモジュールから出ているピンがそのまままっすぐ出ていないようで、上図のようになっておりました。+(5V入力)ピン間違うところでした^^;
それぞれ、アマゾン、楽天で購入可能です。
使用部材はこれだけとなります。
配線
Arduinoと赤外線受信モジュールは以下のように接続しました。

・赤外線受信モジュールの+(5V)⇒Arduinoの5V
・赤外線受信モジュールの-(GND)⇒ArduinoのGND
・赤外線受信モジュールのS⇒Arduinoの12ピン
今回は赤外線受信モジュールのSをArduinoの12ピンに接続しましたが、デジタルIOピンならどこでもよいです。ArduinoへはPCからUSB給電となります。
ハードは以上となります。
ソフトウェア作成
それでは、Arduino IDEでソフトを作っていきます。
まず、赤外線を制御するモジュールをたくさん用意してくれている「IRremoteライブラリ」を入れましょう。スケッチ⇒ライブラリをインクルード⇒ライブラリを管理を選択します。

ライブラリマネージャが開きますので、「IRremote」で検索します。

「IRremote」ライブラリが表示されますので、インストールボタン押下でインストールします。この記事を書いている時点の最新バージョンは3.6.1でした。
「INSTALLED」と表示されてばインストール完了です。

ソースコードは以下になります。これだけの記述で動いてしまうので、「IRremote」ライブラリ様様です^^
#include <IRremote.h>
#define IR_RECEIVE_PIN 12 //受信ピン指定
IRrecv rcvdata(IR_RECEIVE_PIN); // 受信オブジェクトを作成
decode_results dec_results; // 受信データの格納先
void setup() {
// put your setup code here, to run once:
Serial.begin(9600); //シリアル通信のビットレート
rcvdata.enableIRIn(); // 赤外線受信開始
}
void loop() {
// put your main code here, to run repeatedly:
if (rcvdata.decode(&dec_results)) { // 受信確認
Serial.println(dec_results.value, HEX); //受信データ確認
Serial.println(dec_results.decode_type);//メーカコード確認
rcvdata.resume(); //リセット
}
delay(100); //100ms待つ
}では、簡単ですがソースコードの説明をします。
まず、#include <IRremote.h>でさきほどインストールした「IRremote」ライブラリを読み込み、IRrecv rcvdata(IR_RECEIVE_PIN);にて受信オブジェクトを作成します。これは、
「rcvdata」という名前で赤外線の受信データを処理するオブジェクトを作成しますね。受信するピンは12ピンでお願いします。
という意味になります。オブジェクト生成時「IRrecv」宣言だけですんでしまうというのは少し違和感があるのですが、そういう仕様のようですね。
次にdecode_results dec_results;にてdecode_results 型の変数を宣言します。decode_results はIRremote.hに定義されている構造体でdecode_type(メーカーコード)やvalue(受信データ)などのメンバーを持っています。今回はdecode_typeとvalueだけ見てみました。
次に初期化部分です。Serial.begin(9600);でシリアル通信のビットレートを9600bpsに設定し、rcvdata.enableIRIn(); で赤外線受信処理を開始します。
次にLoop処理。if (rcvdata.decode(&dec_results)) で受信データの有無判定をしています。
rcvdata.decodeの中で受信データがあれば受信データをdecode_resultsの構造体の各メンバーにセットし(データはvalueに、メーカーコードはdecode_typeにセットなど)、戻り値として1を返し、受信データがない場合は0を返すのでデータがある場合だけ処理する形になっています。
受信時は受信割込み処理を使うことも多いのですが、今回はメインループの中で常に受信データの有無を判定するポーリング判定です。
Serial.println(dec_results.value, HEX); で受信したデータを16進数で表示し、Serial.println(dec_results.decode_type);で受信したメーカーコードを表示しています。
そして次にrcvdata.resume(); で受信データをクリアしてリセットし、次の受信にそなえます。この処理を実施しないと受信後にdecode_resultsへセットされた受信データがクリアされず、次の受信を受け取ることができなくなります。(ですので、rcvdata.resume(); を実施しないと初回の受信で、そのデータを受信し続けるという形になってしまい、その後の受信データを受け付けなくなります)
そして最後にdelay(100);で100ms待ちます。この処理はなくても動くのですが、ループを早く回しすぎると一回の受信で複数回受信処理を実施してしまったりするのでこうしてます。
今回は赤外線データをモニタリングするだけなのでこれでよいのですが、もし赤外線データを受信したあとに何かを制御する処理があれば安易にメインループにdelayを入れるべきではありません。
ソースの説明は以上となります。
実行結果
実際にArduinoにプログラムを書き込み実行した結果は以下になりました。(今回は東芝のDVDレコーダーリモコンを使いました)


ボタンを適当に押したのですが、ボタンに割り当てられている値は違うので(当然ですが)、ボタンによって受信データが変わります。また、東芝のメーカーコード上記を見るかぎり「8」のようでした。ネットなどでメーカーコード確認すると「8」は違う会社だったりするのですが。。。まあ、あまり気にしないようにします笑
以上、今回はArduinoで赤外線受信モジュールを使用して受信データをモニタリングする方法を紹介させていただきました。
まとめ
今回は簡単な電子工作を紹介させていただきました。
組み込みプログラムが大好きで電子工作もけっこうやりますので、また何か作りましたら紹介させていただきます。
✅ ITキャリアを育てるコミュニティ「ITキャリアラボ」
「独学だと続かない…」
「相談できる人がいない…」
「同じ目標の仲間がほしい…」
そんな方向けに、
無料のLINEコミュニティ『ITキャリアラボ』を運営しています。
エンジニア歴20年・講師の僕が、
・資格学習のコツ
・勉強法アドバイス
・キャリア相談
・IT業界のリアル情報
などを発信&質問対応しています。
📌 参加無料・匿名OK・LINEだけで完結
📌 まずは「話を聞くだけ」でも大歓迎
独学で悩む時間を減らしたい人は、気軽に頼ってください。
👇お気軽にどうぞ
ITキャリアラボ
-

【無料】ITの悩みを気軽に相談できるコミュニティ・ITキャリアラボ
IT業界を目指すあなたへ|「ITキャリアラボ」無料コミュニティのご案内 「IT業界に転職したいけど、何から始めればいいかわからない…」「資格の勉強が続かない…」「相談できる人がいない…」 そんな不安、 ...
続きを見る