M5Stack

M5Stack Atomで赤外線リモコンを作る(2)受信編

赤外線リモコン信号をM5Stack Atomシリーズで受信する方法について解説します。

受信に必要な部品

AtomシリーズにはAtom MatrixとAtom Liteがあります。どちらも赤外線信号を送信するためのLEDを内蔵していますが、受信するためのセンサーは内蔵していません。そのため、センサーを外付けする必要があります。

赤外線リモコン信号を受信できるセンサーはとても安価で入手も容易です。例えば、秋月電子通商さんはこんなセンサーを販売しています。2個パックで100円という安さです。

しかし電子工作初心者にとっては裸の電子部品を扱うのは勇気がいります。

初心者でも安心して使える部品として、M5Stack社が販売しているM5Stack用赤外線送受信ユニットがあります。

このユニットには、赤外線受信用のセンサーと送信用のLEDが搭載されています。このユニットとM5Stackは4線式のGROVEケーブルで接続するように設計されています。GROVEケーブルには突起があり、正しい方向にしか刺さらないので配線を間違える心配はありません。製品名に「M5Stack用」と記載されていますが、AtomシリーズにもGROVEソケットが搭載されているので、Atomシリーズでも使えます。下の写真はこのユニットをAtom Matrixに接続した様子です。

Atom側のGROVEソケットは少し小さめなので、強めに力を入れてGROVEケーブルを挿す必要があります。抜くときはなるべくケーブル部分ではなく白いプラグ部分を持って引っ張るようにするとケーブルを壊さずに済みます。

赤外線受信プログラム

赤外線受信用のライブラリがいくつか存在しますが、機能が豊富でバージョンアップも頻繁に行われているIRremoteESP8266を私は使っています。ライブラリ名がESP8266となっていますが、Atomに搭載されているマイクロプロセッサのESP32にも対応しています。

Arduino IDEにIRremoteESP8266ライブラリをインストールすると、サンプルプログラムも一緒にインストールされます。その中にIRrecvDumpV2というプログラムがあります。

IRrecvDumpV2は、赤外線信号を受信して中身を解析し、結果をシリアルモニタに出力してくれるプログラムです。

IRrecvDumpV2を使ってAtomで赤外線を受信するには、プログラムの変更が少し必要です。IRrecvDumpV2の冒頭部は次のようなプログラムです。

27行目でArduino.hをincludeしていますが、これの代わりにM5Atom.hをincludeするように変更します。

38行目で、赤外線センサーが接続されているGPIOのピン番号が14に設定されています。これをM5Stack赤外線送受信ユニットの赤外線センサーのピン番号に変更する必要があります。

Atom MatrixにM5Stack赤外線送受信ユニットを接続して使う場合、赤外線センサーが何番ピンに接続されるのか調べてみましょう。

M5Stack赤外線送受信ユニットの裏側を見るとこのようなラベルが貼られています。

INと書いてあるのが赤外線センサーなので、GROVEケーブルの白い線が赤外線センサーにつながっていることがわかります。Atom Matrixの裏側を見るとこのようなラベルが貼られています。

白い線はG32につながっていることがわかります。これで赤外線センサーが32番ピンにつながっていることがわかりました。そこでプログラムの38行目の14を32に変更します。

Atom Liteのラベルはこうなっているので、同じ32番ピンだということがわかります。

27行目と38行目を変更したプログラムはこうなります。

Setup() にもAtom用の変更を加えます。元々のプログラムはこうなっています。

112行目の次にAtomの初期化処理である

M5.begin(true, false, false);

を追加します。M5.begin()には引数が3つあり、その意味は次の通りです。

  • 第1引数:シリアル通信を有効にするかどうか
  • 第2引数:I2C通信を有効にするかどうか
  • 第3引数:LEDを有効化するかどうか

M5.begin()を加えたプログラムはこうなります。

ネット上にあるM5StickCやAtomのプログラム例で、M5.begin(・・・)の次にSerial.begin(111520)を記述しているのをよく見かけます。しかし、これは不要です。理由は、M5.begin(・・・)の中でSerial.begin(111520)がすでに実行されているからです。M5.begin(・・・)のソースコードの該当部分はこうなっています。

IRrecvDumpV2の実行結果

IRrecvDumpV2を起動すると、シリアルコンソールにこのような出力が行われます。

「Pin 32で赤外線信号の受信を待っている」という意味のメッセージが表示され、待ち状態になっています。

この状態で、赤外線センサーに向けてリモコンの信号を送ると、受信結果がシリアルコンソールに表示されます。

Protocolは、リモコンの信号がどのプロトコルに準拠しているかを表しています。上図の例ではNECプロトコルであることがわかります。

rawData[ ]は受信した赤外線のOn/Off時間の生データです。addresscommanddataは、生データをProtocolに従って解析した結果です。

IRremoteESP8266には、赤外線信号を送信する関数が複数用意されています。プロトコルがあらかじめわかっている場合は、プロトコルに対応した関数を使うのが簡単です。例えば、NECプロトコルの場合は、sendNEC(・・・)を使います。

プロトコルがわかっていない場合は、rawData[ ]を引数として渡すsendRaw(・・・)を使います。

学習リモコンを作る場合、覚えさせるリモコンがどのプロトコルを使っているかあらかじめわかっていないので、生データであるrawData[ ]を送るsendRaw(・・・)を使うのがお手軽です。しかし、この方法では生データを覚えておく必要がありメモリーをたくさん消費するという欠点があります。例えばエアコンのリモコンは非常に長い信号を送るのでメモリーがたくさん必要になります。