今回は、Arduinoで赤外線受信モジュールとコントローラを使用して、3つのLEDのON/OFF制御をする方法を紹介します。LCDの使用方法については、以前の記事(ArduinoでSTEM教育-基礎編:LCD)を参照してください。
目次
使用する部品一覧
使用する部品は図のとおりです。これらの部品は、すべて「ELEGOO Arduino用のMega2560スタータキット」に含まれています。
- Arduino MEGA2560 R3 …1個
- 830穴 ブレッドボード …1個
- LCD1602モジュール …1個
- ポテンショメータ(10kΩ) …1個
- 赤外線受信モジュール …1個
- 赤外線コントローラ …1個
- LED …3個
- 抵抗(220Ω) …3個
- ジャンパワイヤ(オス-メス) …3個
- ジャンパワイヤ(オス-オス) …19個
赤外線受信モジュールの特徴や取り扱い方法
赤外線による制御は、テレビやエアコンのリモコンなどで使用されています。赤外線は、可視光領域よりも波長が長い光のことを指し、裸眼で見ることができません。今回使用するモジュールは、AX-1838HSという素子を使用しており、940nm/38kHzの赤外線を受信できます。赤外線の波長と周波数は、コントローラ側と受信機側で揃えておく必要があります。
回路図
赤外線受信モジュールの電源(R)端子は5Vに接続、グランド(G)はGNDに接続、通信(Y)端子はD5端子に接続します。各LEDと電流制限抵抗(220Ω)は直列に接続します。LEDのアノード(LED端子の長い方)は、赤LEDはD2、緑LEDはD3,青LEDはD4に接続します。電流制限抵抗の片方は、GNDに接続します。
配線図
ブレッドボードを使用した配線は図のとおりになります。
組立完成写真
実際に組み立てた写真です。同じようにできましたか?

プログラム
最初に、赤外線受信モジュール用のライブラリ(IRremote.h)を#includeで読み込みます。そして、IRrecvクラスを使用するために、irrecv(RECEIVER_PIN)でインスタンスを生成します。また、受信信号をデコードした結果を格納するために、decode_resultsのインスタンスも生成します。setup()内では、赤外線受信を開始するために、irrecv.enableIRIn()を記述します。
赤外線コントローラの何のボタンが押されたか分かりやすいように、decodeIR()関数を作成します。この関数では、0~3が押された場合、その番号が返り値となるようにします。赤外線を受信した場合、if文内のコードが実行されます。if文内では、押されたボタンの値をvalueに代入し、それをLCDに表示させます。
次に、value(赤外線リモコンで押したボタン)に応じて、LEDのON/OFFの場合分けをするため、switch文とcase文を使用します。break記述を省略した場合、以降のコードも実行されてしまうので、注意してください。メインループの最後は、赤外線受信機をリセットして、次の受信に備えるために、irrecv.resume()を記述します。
//www.stemship.com
//2019.10.22
#include <LiquidCrystal.h>
#include <IRremote.h>
#define RECEIVER_PIN 5 //Digital Pin
#define RED_PIN 2 //Digital Pin
#define GREEN_PIN 3 //Digital Pin
#define BLUE_PIN 4 //Digital Pin
// BS E D4 D5 D6 D7
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);
IRrecv irrecv(RECEIVER_PIN); // 'IRrecv'のインスタンス生成
decode_results results; // 'decode_results'のインスタンス生成
void setup() {
//LEDピン設定
pinMode(RED_PIN, OUTPUT);
pinMode(GREEN_PIN, OUTPUT);
pinMode(BLUE_PIN, OUTPUT);
digitalWrite(RED_PIN, LOW);
digitalWrite(GREEN_PIN, LOW);
digitalWrite(BLUE_PIN, LOW);
//IR設定
irrecv.enableIRIn(); // IRの受信を開始する
//LCD設定
lcd.begin(16, 2); // LCDを2行16列で使用する
lcd.print("IR Receiver"); //LCDの1行目に表示する内容
}
int decodeIR(){
switch(results.value){
case 0xFF6897: return 0;
case 0xFF30CF: return 1;
case 0xFF18E7: return 2;
case 0xFF7A85: return 3;
}
}
void loop() {
int value;
if (irrecv.decode(&results)) //赤外線を受信した場合
{
lcd.setCursor(0, 1);
value = decodeIR();
//LCD表示
lcd.print("Pressed Button=");
lcd.setCursor(15, 1);
lcd.print(value);
//LEDのON/OFF設定
switch(value){
case 0: digitalWrite(RED_PIN, HIGH);
digitalWrite(GREEN_PIN, LOW);
digitalWrite(BLUE_PIN, LOW);
break;
case 1: digitalWrite(RED_PIN, LOW);
digitalWrite(GREEN_PIN, HIGH);
digitalWrite(BLUE_PIN, LOW);
break;
case 2: digitalWrite(RED_PIN, LOW);
digitalWrite(GREEN_PIN, LOW);
digitalWrite(BLUE_PIN, HIGH);
break;
case 3: digitalWrite(RED_PIN, LOW);
digitalWrite(GREEN_PIN, LOW);
digitalWrite(BLUE_PIN, LOW);
break;
}
irrecv.resume(); //IR受信機をリセット
delay(500);
}
}
動かしてみよう
プログラムを書き込んで、実際に動かしてみてください。
今回学んだポイント
- 赤外線センサは、ある特定の波長・周波数の赤外線(今回使用した製品は、940nm/38kHz)を利用して、送信機と受信機間で信号の受け渡しをする。
- switchとcaseを使用することで、可読性の良いコードを書くことができる。
- case文内は複数行書くことができるが、最後はbreakで抜ける必要がある。
改造してみよう
もう少し理解を深めるために、自分で改造してみてください。
- 0,1,2,3以外のボタンを押した場合のLED制御を書いてみよう。
- LEDの輝度をコントローラで制御できるようにしてみよう。



コメントを残す