前回の記事で、簡易赤外線リモコンをArduino UNOで作成するための設計を行いました。
プログラムの作成が完了したので、実装編を記載します。
設計当初は難しいかなと思ってましたが、赤外線のプロトコル周りは「IRremote」というライブラリを使用したため、400行程度のプログラムで実現できました。
筆者が作成した簡易学習リモコンの試作機です。

目次
詳細設計
本プログラムでは、Arduino UNOの電源を落としても学習したデータや、リモコン送信状態を記憶しておくために変数の永続化が必要になります。
Arduinoで変数を永続化するには、フラッシュメモリを利用します。
Arduinoのフラッシュメモリは、1KBの容量があります。学習するリモコンデータは1つ4Byteなので、2つのボタンに学習する場合でも、1つあたり、100個以上のデータを記憶できるので、十分です。
学習データ管理方式
学習データはボタン1、2それぞれで配列を用意し、学習データを格納します。
Arduinoの電源投入時に、フラッシュメモリから学習データを配列に読み込みます。
リモコン送信時は、配列からデータを読み込んで送信します。
学習データ追加の際には、配列にデータを追加し、フラッシュメモリに記憶します。
配列とフラッシュメモリの学習データの内容は、常に同じ状態にします。
状態管理方式
学習データに加えて、2種類の状態管理データが必要になります。
送信状態
ボタンを押すたびに登録されているリモコンデータを順に送信するため、学習データ配列のインデックス値(次にどのデータを送信するか)を送信状態として記憶します。
送信状態は、いつArduinoの電源を落とされても良いように、フラッシュメモリに記憶します。
学習状態
学習データ配列は、固定サイズの配列とするため、別途何個のリモコンデータが登録されているか記憶する必要があり、これを学習状態とします。
学習状態も、送信状態と同様、フラッシュメモリに記憶します。
管理方式イメージ
管理方式を図に表すと以下のようになります。

フラッシュメモリの構成
フラッシュメモリには、下記順でデータを記憶します。
- ボタン1の学習データ
- ボタン2の学習データ
- ボタン1の送信状態
- ボタン2の送信状態
- ボタン1の学習状態
- ボタン2の学習状態
イメージは以下のようになります。

実装
ライブラリ導入
Arduinoで「IRremote」が利用できるように、インストールしておきます。
Arduino IDEのメニューで[スケッチ]-[ライブラリをインクルード]-[ライブラリを管理]をクリックします。

検索ボックスに「irremote」と入力して出てきた「IRremote」を[インストール]ボタンをクリックすれば完了です。

本プログラムでは、記事執筆時の最新版3.9.0を利用しています。
赤外線リモコンライブラリ「IRremote」の利用方法
初期化処理
Arduinoのsetup()関数内に下記を記述し、初期化します。
RECEIVE_PIN、SEND_PINには、それぞれ受信用、送信用のArduinoのピン番号を指定します。
IrReceiver.begin(RECEIVE_PIN);
IrSender.begin(SEND_PIN);
受信
Arduinoのloop()関数に下記を記述します。受信したらif文の条件がtrueになり、受信データが取得できます。
if(IrReceiver.decode()){
uint32_t addr = IrReceiver.decodedIRData.decodedRawData;
}
送信
リモコンデータのフォーマットは、いくつかありますが、今回のプログラムでは、NEC方式のリモコンデータを送信できるように実装しました。
Arduinoのloop()関数に下記を記述します。
IrSender.sendNECRaw(value, 0);
第1引数にリモコンデータを代入し、第2引数にリピート回数を指定します。0の場合は1回送信になります。
プログラム書き込み
以下プログラムをArduino IDEのエディタにコピペし、「IRLearning.ino」という名前で保存します。
事前にArduinoをパソコンにUSB接続し、ブートローダやCOM等の初期設定をしておき、「マイコンボードに書き込む」アイコンをクリックして、エラーが出なければ完了です。
今回のプログラムでは、1つのボタンあたり最大32個のリモコンデータを登録できるようにしました。定数MAX_BTNの値変更で120個まで増やすことができます。
初期設定
プログラムを書き込んだら、フラッシュメモリの初期化操作が必要になります。
初期化の方法は、USBで電源を供給し、ボタン1、ボタン2のそれぞれを10秒以上長押しし、LEDが3回点滅すれば完了です。
使用方法
学習
学習したいボタンを3秒以上(10秒以内)長押しして離します。
LEDが点滅状態になるので、元になるリモコンのボタンを押して、リモコンデータを送信します。
学習完了後、LEDが3回点滅して消灯します。
NECフォーマット以外のリモコンデータは認識されないため、LED点滅および学習待ち状態が続きます。
学習をキャンセルしたい場合は、Arduinoの電源を落とす必要があります。
最大学習データ数を超えて学習しようとすると、LEDが2回点滅して消灯状態になり、これ以上は学習できません。
送信
送信したいボタンを短く押して離します。
LEDが1回点滅し、リモコンデータが送信されます。
ボタンを押すたびに登録されているリモコンデータが順に送信されます。
未学習状態で送信操作を行うと、LEDが2回点滅し、リモコンデータは送信されません。
学習リセット
学習リセットしたいボタンを10秒以上長押しします。
リセット完了後、LEDが3回点滅して消灯します。
作成した簡易学習リモコンの活用例です。
コメント