人生を自由に楽しむため、会社員をやめてフリーランスになった『ユウイチ』です。
今回は趣味の電子工作についてなのですが、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で赤外線受信モジュールを使用して受信データをモニタリングする方法を紹介させていただきました。
まとめ
今回は簡単な電子工作を紹介させていただきました。
組み込みプログラムが大好きで電子工作もけっこうやりますので、また何か作りましたら紹介させていただきます。