防災グッズを揃えて災害に備えよう!
\ 防災グッズを揃えるきっかけに /
この記事内には、プロモーションが含まれます。
こんにちは、せでぃあ(@cediablog)です。
今回のArduinoプログラミングLESSON21では、「リモコンの仕組みが分かる、リモコンを使った無線制御」を紹介します。
リモコンと言えば、現代社会に欠かせないアイテムですよね。
私が子供のころのテレビは、チャンネル切り替えのダイヤルが付いたガチャガチャ式でした。
そのような時代では、テレビの電源ON-OFFや、チャンネル切り替え、音量変更はテレビ本体に付属したボタンやツマミを操作しなければならず、移動する手間がかかっていました。
そこで登場したのが、離れた位置にいても機器が操作できるリモコン(Remote controller)です。
身の回りのリモコンを使う機器
今回は、液晶ディスプレイLCD1602に「リモコンからの入力信号データを表示させる」プログラムの作り方を紹介します。
ELEGOOスーパースターターキットに含まれるパーツを使って、リモコンの仕組みがわかる電子工作を作っていきます。
今回液晶ディスプレイLCD1602の制御はI2Cを使ったシリアル通信を使います。
I2C通信を使ったLECディスプレイ表示方法については、こちらの記事にて詳しく解説しています。
上記記事の動作確認した配線状態のうち、LCDディスプレイ配線はそのまま使うことができます。
本記事は、プログラミングと電子パーツの知識が習得できるプログラミング初心者も安心して取り組めるテーマとなっています。
小学生、中学生も安心してプログラミングができるように、文字列を使わなビジュアルプログラミング方法を動画付きで紹介しています。
ビジュアルプログラミングを使えば小学生から抵抗なくプログラミングができますよ!
本記事では、スクラッチベースのビジュアルプログラミングツールmBlockとArduinoIDEプログラムどちらのプログラミング方法も紹介しています。
本記事ではmBlockのアップロードモード「オン」でのプログラム例を紹介しています。
無料のブロックプログラミングツールmBlockのインストール方法については、こちらの記事を参照してください。
せでぃあはこんな人物です
✅プライム企業に勤める電気・機械設計エンジニア
✅親子の絆を深めるため、夏休みに子供と一緒に電子工作を製作
✅Arduinoプログラミングを用いて作ったプログラミング電子工作「信GO機」が市の発明くふう展で「優秀賞」を受賞
✅本ブログにてArduinoスクラッチプログラミングLESSON記事投稿中
✅YouTubeチャンネル「せでぃあブログちゃんねる」運営中
赤外線リモコンの仕組みについて解析します。
リモコン操作は、信号を発信する「赤外線リモコン」と信号を受け取る「赤外線受信機」をペアで使用します。
リモコン動作の流れ
例えば今回使用するリモコンの「0ボタン」を押すと、「16738455」というデータが受信データとして認識されます。
0ボタンを押すと必ず同じデータ「16738455」を認識できるので、マイコン側は「16738455」を受信した=「0ボタンが押された」と解釈できます。
リモコン操作とは、これを利用して押されたボタンに応じた動作をリモートで行っています。
テレビのチャンネル切り替え、音量変更なども同じ原理で行われているのです。
別のメーカーのリモコンを使っても操作ができないのは、リモコンから発信される信号がメーカー毎で異なるからです。
テレビの前にぬいぐるみなどを置いてしまって、リモコンのチャンネル切り替えができなくなったりした経験があると思いますが、それは赤外線受信部の前を遮ってしまっていることが原因だったりするわけです。
リモコン制御の仕組みがなんとなくご理解いただけたと思います。
リモコンは目に見えない赤外線(IR)を使っており、今回使用するリモコンの信号波長は940nmです。
人が色を判別できる波長の領域は、おおよそ380nm~780nmと言われています。
可視光領域から外れた光を、波長が短い側を紫外線、長い側を赤外線と呼んでいます。
なぜ紫外線、赤外線と呼ばれるかは上記の色調分布をみていただければ一目瞭然だと思います。
リモコンは目に見えない赤外線LEDを素早く点滅させることで、受信機に信号を送っています。
ご家庭のリモコンにも信号発信用の赤外線LEDがついていますので、ぜひ一度確認してみてください。
今回紹介する「リモコンからの受信データをLCDディスプレイに表示させる動作」について説明します。
動作の説明
今回はリモコン0~9以外のボタンを押しても、LCD表示内容は変わりません。
まずは動画を見て、今回のLESSONで実行させたい動作内容を確認してください。
また、mBlockを使ったブロックプログラミングや動作確認方法についても解説しています。
赤外線リモコンの仕組みが理解できるテーマになっています。
赤外線リモコンからの入力データをLCDディスプレイに表示させるために必要な作業を解説します。
今回は文字列を使ったプログラム形式と、文字列を使わないブロックプログラミング形式の両方について説明します。
あなたの作りたいプロブラム形式に対応した手順に応じて、対応してください。
プログラム形式に応じた開発環境
プログラミング初心者の方は、ビジュアルプログラミングがおすすめです!
プログラミングするために、パソコンが必要です。
電子部品等の必要な機器については、このあと説明します。
パソコンに統合開発ソフトウェア「ArduinoIDE」のインストールを行います。
Arduinoのセットアップ方法については、以下の記事にて詳しく説明しています。
Arduino IDEでの言語プログラミングも勉強したい方は、プログラミングの流れを理解しておいてください。
以下の記事にて、プログラミングから動作確認までの流れを詳しく説明しています。
mBlockでプログラミングする場合は、ArduinoIDEのインストールは不要です。
パソコンにスクラッチベースのビジュアルプログラミングツール「mBlock」のインストールを行います。
以下の記事にて詳しく説明しています。
ArduinoIDEでプログラミングする場合は、mBlockのインストールは不要です。
電子部品とジャンパーワイヤの差し込みだけで配線が可能です。
専用開発ソフトウェア「Arduino IDE」を使います。
私が作成したプログラムをコピペして使ってください。
Arduino IDEプログラミングの基本操作については、こちらの記事にて詳しく説明しています。
mBlockでプログラミングする場合は、ArduinoIDEプログラミングは不要です。
スクラッチベースのビジュアルプログラミングツールmBlockを使ってプログラムを作成します
プログラム内容については、後述するプログラミング例を参考にしてください。
ArduinoIDEでプログラミングする場合は、mBlockプログラミングは不要です。
プログラムが完成したら動作確認を行います。
今回は、LCDディスプレイをI2C通信で制御する方法を紹介した記事の一部配線変更にて対応可能な内容です。
I2C通信を使ったLCDディスプレイ表示が初めての方は、こちらの記事から読んでいただくことをおすすめします。
今回はELEGOO社のスーパースターターキットに含まれる部品で作ることができますが、Arduino裏面のショート対策としてクリアケースも併せて準備することをおすすめします。
【おすすめ】コスパ最強のArduinoキットの中間グレードです!
プログラムを作成するために必要です。
プログラム制御の演算はArduino側で行うため、パソコンのSPECは一般的なモデルで十分対応可能です。
パソコンのOSはWindows、Macどちらでも対応可能です。
基本的なエディション「Arduino Uno」の互換機である、ELEGOO社のUNO R3を使用しています。
Arduino本体裏面のショート対策に、別売りのクリアケースの購入をおすすめしています。
各ソケットの役割など、Arduino本体の機能について以下の記事にて詳しく説明しています。
パソコンとArduinoを接続してプログラムデータのやり取りをするために必要です。
たくさんの穴が開いていて、部品の端子を穴に差し込むだけで電気的に接続が可能な板です。
説明図は30列のショート版ですが、スーパースターターキットに含まれる63列タイプでも機能は同じです。
ブレッドボードだけの購入も可能です。
赤外線リモコンの赤外線信号を受信するための機器です。
赤外線リモコンです。
赤外線レシーバーとセットで使います。
液晶ディスプレイ「LCD(Liquid Crystal Display)」モジュールになります。
数字や文字などを表示させることが可能です。
I2Cを使ってLCDを制御するために必要なモジュールです。
電源線2本と通信線2本の合計4本の配線だけで、LCDを制御することが可能になります。
I2Cモジュールはキットに含まれないため、別途購入が必要です。
オス-メスジャンパー線を7本使用します。
I2Cシリアルインターフェースボード及び赤外線受信機とArduino本体を接続させるために使用します。
ジャンパー線を2本使用します。
Arduino本体とブレッドボードの接続や、ブレッドボードの共通電源ライン(GNDまたは5V)からブレッドボード内の配線系統穴に差し込んで接続するのに使います。
スターターキットに含まれる機器に関しては、以下の記事にて詳しく紹介しています。
ここからは、各機器間の配線方法について解説します。
上図が配線説明図となりますので、これと同じ配線をすれば完成します。
機器が故障するおそれがあるので、接続するプラスマイナス極性には十分注意して配線してください。
赤外線受信機のつなぎ先
機器故障させないためにも、USBケーブルを抜いた「通電OFF」状態にて配線を行ってください
本記事では、以下に示す「Arduino IDEプログラミング」と「mBlockプログラミング」の2通りのプログラミング方法について解説しています。
いずれか1つのプログラミング方法を用いることで、本LESSONの動作を行うことが可能です。
ArduinoIDE:文字列による命令語形式
mBlock:スクラッチベースのビジュアル形式
文字列を使わないmBlockの方が、直感的で分かりやすく小学生におすすめのプログラミング方法になります。
mBlockを使ってプログラミングをする方は、mBlockの説明まで読み飛ばしてください。
プログラミング初心者の方は、ビジュアルプログラミングがおすすめです!
ArduinoIDEを使用した文字列プログラミングを行うためには、LiquidCrystal_I2Cライブラリのダウンロードとインストール作業が必要となります。
LiquidCrystal_I2Cライブラリのダウンロードとインストール方法を解説します。
mBlockでプログラミングをする場合は、本ライブラリインストール作業は不要です。
「Download ZIP」をクリックして、ZIPファイルをダウンロードします。
ArduinoIDEを開き、「スケッチ」⇒「ライブラリをインクルード」⇒「.ZIP形式のライブラリをインストール…」の順に選択して、STEP3でダウンロードしたZIPファイルを選択。
インストールが行われ、ライブラリインストール作業が完了となります。
リモコンボタンに対する受信データは、受信させたデータをモニタリングしなければ分かりません。
今回使用するリモコンの0~9ボタンに対する、受信データの割り当ては以下の通りです。
赤外線(IR)リモコン受信機を使ってデータを受信するためには、専用のライブラリをインストールする必要があります。
mBlockでプログラミングをする場合は、本ライブラリインストール作業は不要です。
Arduino IDEを開き、スケッチ⇒ライブラリをインクルード⇒ライブラリを管理をクリックする。
検索窓に「IRremote」と入力して、IRremoteライブラリを検索します。
ライブラリが検索できたら、プルダウンからバージョン「2.8.0」を選択します。
ver2.8.1以降を使うと、赤外線リモコンからの受信データがすべて「0」と認識されてしまうため、必ず「2.8.0」を選択してください。
インストールボタンをクリックして、IRremoteライブラリをインストールします。
ライブラリのインストールが完了した旨の表示がされたら、IRremoteライブラリのインストールは完了です。
Arduino IDEとは統合開発ソフトウェアで、C言語のような文字列を用いたプログラミング方法です。
プログラミングするにあたり、ある程度の命令語を知っておく必要があります。
Arduino IDEのインストール方法については、以下の記事で詳しく説明しています。
日本語版のArduino公式リファレンスが記載されているので、関数を調べるときに重宝します!(私も所有しています)
Arduino IDEを使って、文字列プログラミングを行います。
Arduino IDEを使ったプログラミング~動作確認方法については、以下の記事で詳細説明しています。
/* 作品名:LESSON21 */
/* 作成者:せでぃあ https://cediablog.com */
/* IR(赤外線)リモコン制御 */
// ライブラリのインクルード
#include <LiquidCrystal_I2C.h>
#include <IRremote.h>
// LiquidCrystal_I2C型変数の宣言
LiquidCrystal_I2C lcd(0x27, 16, 2); // 0x27のアドレス,16列2行のLCDを使用
// 変数の宣言
int RECEIVE_SOCKET = 2; //IR受信信号入力ソケット番号
// IR受信モジュールの初期設定
IRrecv irrecv(RECEIVE_SOCKET); // 受信オブジェクトの作成
decode_results results; // 受信データの格納先
void setup() {
//プログラム起動時1回だけ処理される回路
//IR受信モジュール
irrecv.enableIRIn(); //IR受信モジュールを有効化
//LCDディスプレイ表示
lcd.init(); // LCDの初期化
lcd.backlight(); // LCDバックライトの点灯
lcd.setCursor(0, 0); //上段1列目にカーソルを移動
lcd.print("BTN:"); //LCDディスプレイに「BTN:」と表示させる
lcd.setCursor(0, 1); //下段1列目にカーソルを移動
lcd.print("DATA:"); //LCDディスプレイに「DATA:」と表示させる
}
void loop() {
//プログラム起動後ループ処理される回路
if (irrecv.decode(&results)) { //IR受信モジュールからデータを受信したとき
//リモコン「0」ボタン信号を受信したとき
if (results.value == 16738455) {
lcd.setCursor(4, 0); //上段5列目にカーソルを移動
lcd.print("0"); //LCDディスプレイに「0」と表示させる
lcd.setCursor(5, 1); //下段6列目にカーソルを移動
lcd.print(results.value); //LCDディスプレイに受信値を表示させる
}
//リモコン「1」ボタン信号を受信したとき
else if (results.value == 16724175) {
lcd.setCursor(4, 0); //上段5列目にカーソルを移動
lcd.print("1"); //LCDディスプレイに「1」と表示させる
lcd.setCursor(5, 1); //下段6列目にカーソルを移動
lcd.print(results.value); //LCDディスプレイに受信値を表示させる
}
//リモコン「2」ボタン信号を受信したとき
else if (results.value == 16718055) {
lcd.setCursor(4, 0); //上段5列目にカーソルを移動
lcd.print("2"); //LCDディスプレイに「2」と表示させる
lcd.setCursor(5, 1); //下段6列目にカーソルを移動
lcd.print(results.value); //LCDディスプレイに受信値を表示させる
}
//リモコン「3」ボタン信号を受信したとき
else if (results.value == 16743045) {
lcd.setCursor(4, 0); //上段5列目にカーソルを移動
lcd.print("3"); //LCDディスプレイに「3」と表示させる
lcd.setCursor(5, 1); //下段6列目にカーソルを移動
lcd.print(results.value); //LCDディスプレイに受信値を表示させる
}
//リモコン「4」ボタン信号を受信したとき
else if (results.value == 16716015) {
lcd.setCursor(4, 0); //上段5列目にカーソルを移動
lcd.print("4"); //LCDディスプレイに「4」と表示させる
lcd.setCursor(5, 1); //下段6列目にカーソルを移動
lcd.print(results.value); //LCDディスプレイに受信値を表示させる
}
//リモコン「5」ボタン信号を受信したとき
else if (results.value == 16726215) {
lcd.setCursor(4, 0); //上段5列目にカーソルを移動
lcd.print("5"); //LCDディスプレイに「5」と表示させる
lcd.setCursor(5, 1); //下段6列目にカーソルを移動
lcd.print(results.value); //LCDディスプレイに受信値を表示させる
}
//リモコン「6」ボタン信号を受信したとき
else if (results.value == 16734885) {
lcd.setCursor(4, 0); //上段5列目にカーソルを移動
lcd.print("6"); //LCDディスプレイに「6」と表示させる
lcd.setCursor(5, 1); //下段6列目にカーソルを移動
lcd.print(results.value); //LCDディスプレイに受信値を表示させる
}
//リモコン「7」ボタン信号を受信したとき
else if (results.value == 16728765) {
lcd.setCursor(4, 0); //上段5列目にカーソルを移動
lcd.print("7"); //LCDディスプレイに「7」と表示させる
lcd.setCursor(5, 1); //下段6列目にカーソルを移動
lcd.print(results.value); //LCDディスプレイに受信値を表示させる
}
//リモコン「8」ボタン信号を受信したとき
else if (results.value == 16730805) {
lcd.setCursor(4, 0); //上段5列目にカーソルを移動
lcd.print("8"); //LCDディスプレイに「8」と表示させる
lcd.setCursor(5, 1); //下段6列目にカーソルを移動
lcd.print(results.value); //LCDディスプレイに受信値を表示させる
}
//リモコン「9」ボタン信号を受信したとき
else if (results.value == 16732845) {
lcd.setCursor(4, 0); //上段5列目にカーソルを移動
lcd.print("9"); //LCDディスプレイに「9」と表示させる
lcd.setCursor(5, 1); //下段6列目にカーソルを移動
lcd.print(results.value); //LCDディスプレイに受信値を表示させる
}
irrecv.resume(); //IR受信情報をリセット
}
delay(100); //0.1秒ウェイト
}
上記がLCDディスプレイへの赤外線リモコンからの受信データ表示プログラムになります。
Arduino IDEのプログラム画面にコピーアンドペーストすることで、動作確認まで進めることができます。
各プログラム列の右側にプログラム内容をコメント記入してありますので参考にしてください。
0~9の10通りのボタン信号に対応した条件がプログラムのボリュームを大きくしていますが、コピペを使うとプログラム作成時間が短縮できますよ。
今回のプログラムで使用した命令文について、解説します。
変数のデータ型を指定するものです。
今回はピンソケット番号を代入するので整数を扱う「int型」を指定します。
データ型 | 説明 | 扱える範囲 |
---|---|---|
int | 2バイトの整数を代入可能。 | -32768~32767 |
long | 4バイトの整数を代入可能 | -2,147,483,648~2,147,483,647 |
float | 4バイトの小数を代入可能。 | 3.4028235×1038~-3.4028235×1038 |
char | 1バイトの値を代入可能。文字列の代入に利用されます。 | -128~127 |
boolean | 0または1のみ代入可能。フラグのON-OFFなどに利用されます。 | 0,1 |
条件式が成立しているか否かで、どちらの命令文を実行するか振り分けます。
if( 条件 ){
条件成立時に実行する文 ;
} else {
条件不成立時に実行する文 ;
}
()内で指定した時間(単位はmsec)だけ、プログラム実行を待たせます。
今回はLCD1602の制御をするために、「LiquidCrystal_I2Cライブラリ」を使用します。
このライブラリを使うだけで、簡単にLCD表示を制御できます。
プログラム冒頭の宣言部にてLiquidCrystalライブラリを読み出します。
#include <LiquidCrystal_I2C.h>
プログラム冒頭の宣言部にてLiquidCrystal_I2C型の変数を定義します。
LiquidCrystal_I2C lcd(I2Cアドレス, 桁数, 行数)
変数「lcd」は例であり、任意の変数文字列を指定してください。
LCDの表示内容をクリアし、カーソルを左上に移動させます。
lcd型変数.init
LCDの表示内容をクリアします。
lcd型変数.clear()
カーソル位置を指定します。テキスト表示開始位置を指定することができます。
lcd型変数.setCursor(桁、行)
桁は左端が「0」、行は上段が「0=1行目」になります。
LCDに文字列を表示させます。
lcd型変数.print(“表示させたい文字列”)
LCDバックライトを点灯させます。
lcd型変数.backlignt()
赤外線リモコンからの受信データを受信するために、「IRremoteライブラリ」を使用します。
このライブラリを使うことで、赤外線受信機を使って赤外線リモコンからのデータを受信することができます。
ライブラリのバージョンは2.8.0をインストールしてください。
プログラム冒頭の宣言部にてIRremoteライブラリを読み出します。
#include <IRremote.h>
赤外線データを受信するためのオブジェクトを作成します。
赤外線受信機の信号線と接続するArduinoの入力ピン番号を指定します。
IRrecv 受信オブジェクト名(入力ピン番号)
赤外線受信データの格納先変数を作成します。
decode_results 変数名
setup関数にて、赤外線受信モジュールを有効化します。
受信オブジェクト名.enableIRIn()
赤外線データを受信すると「HIGH」になるフラグです。
データを受信したときに演算させたいときに、if文の条件として使います。
受信オブジェクト名.decode(&results)
赤外線受信機にて受信したデータは、受信データ格納変数.valueを使って参照できます。
受信データ格納変数名.value
赤外線受信データをリセットし、次の赤外線データを受信できるようにします。
受信オブジェクト名.resume()
プログラミング初心者の方に、おすすめなArduinoの参考書を紹介しています!
ここからは、mBlockを使ったプログラムの作り方を解説します。
これらの基本操作方法については、こちらの記事を参照してください。
プログラミング、動作確認方法については、本記事の説明動画でも紹介しています
動画を参考にプログラミングしてみてください。
mBlockではArduino用の専用ブロックが標準でいくつか準備されています。
しかしながら、赤外線データを受信するためのブロックは標準では準備されていないため、拡張ブロックを追加する必要があります。
今回は赤外線データ送信ブロック以外の4種類のIRremoteブロックを使います。
mBlockを開いて、拡張ボタンをクリックします。
検索窓に「irremote」と入力して、拡張ブロックを検索します。
INPUT_PULLUPと書かれた拡張ブロックを追加します。
IRremoteブロックが追加され、プログラムに使用可能となります。
LCDを制御(LCD画面クリア、カーソル位置を指定、LCDへの文字列表示など)するために必要な、専用ブロックを追加する必要があります。
mBlockを開いて、拡張ボタンをクリックします。
検索窓に「i2c」と入力します。
I2Cを使ったLCD制御用の拡張ブロックを追加します。
I2Cを使ったLCD制御ブロックが追加されます。
今回は「アップロードモード オン」でのプログラム作成例を紹介しています。
プログラム開始条件が「Arduino Unoが起動したとき」になっている点に注意してください。
以下のプログラムが動作プログラムになります。
mBlockのArduino専用ブロックについては、こちらの記事にて詳しく説明しています。
上記項目について確認していきましょう。
プログラムの演算が開始されたら、LCDディスプレイ上段に「BTN:」、下段に「DATA:」が表示されていることを確認してください。
LCDディスプレイのバックライトが点灯状態であることを併せて確認してください。
赤外線リモコンのLEDを受信機の受光部の方向に向けて、リモコンのボタンを押してください。
0から9までの数字ボタンを押して、LCDディスプレイに表示される内容を確認してください。
赤外線受信機はリモコンからのデータを受け取ると赤色LEDが点滅します。
小学生のお子様には断然、ビジュアルプログラミングがおすすめです!
mBlockはブロックのドラッグアンドドロップで簡単にプログラミングができます!
小学生のプログラミング学習におすすめな、mBlockが使えるプログラミングロボットを紹介しています。
最後まで読んでいただき、ありがとうございました。
子供の成長を育む!小学生のお子様にぴったりなプログラミング教室が見つかるように厳選しました!
Arduinoスクラッチプログラミングのおすすめ参考書について詳しく説明しています。
Arduinoプログラミング(スクラッチも)を使った電子工作を紹介しています。
この記事が気に入ったら
フォローしてね!
コメント
コメント一覧 (2件)
[LiquidCrystal_I2Cライブラリのインストール]のgibHuBの解説がよくわからない?iRmototo.hの読み込みは、5個くらいの候補が出ますが、正式名を教えてください。BTN: DATA:までは進みます。それ以後が反応なしです。受信機のledは光ります。iRmoto.hが読み込み不可の気がします。
GitHubのやさしい使い方をしりたいです。
のびおすぶろうさん、貴重なご意見ありがとうございます。
今後の記事作成時に参考にさせていただきます。
BTN: DATA:の表示が出来ているとの事で無事LiquidCrystal_I2Cライブラリインストールは成功しており安心しました。
ライブラリマネージャで検索したiRmototo.hの正式名は下記になります。
IRremote by shirriff,z3t0,ArminJo
記事でも注意書きがありますが、バージョンは必ず2.8.0をインストールしてください。
バージョン2.8.1以降をインストールしてしまうと赤外線データの受信が正しくできません。
バージョン2.8.0をインストールしてもうまくいかない場合は、メールにてサポートさせていただきますのでご連絡いただけますと幸いです。
今後ともよろしくお願いいたします。