今回は、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の輝度をコントローラで制御できるようにしてみよう。
コメントを残す