ゆるく楽しむプログラミング

M5Atomでリモコン操作

M5Atomに内蔵の赤外線LEDを使って、赤外線リモコン機器を操作してみます。

とりあえず、実験対象にしたのは ダイソー リモコンライト[イルミネーション]


リモコンのファオーマットとアドレスとコマンドを調べるために 赤外線リモコン受信モジュールを使用します。
幸い(?) フォーマットはNECフォーマットでした。

赤外線リモコン受信スケッチでアドレスとボタン毎のコマンドコードを調べます。
アドレスは 0x807F 、 ボタンとコマンドコードの対応は▼の通り。



38KHz搬送波の生成

M5Atomの赤外線LEDは、単純に赤外線を発光するLEDであって、赤外線リモコンの送信モジュールではありません。
赤外線リモコン送信機として使用するには、赤外線LEDを38KHzで点滅させる必要があります。
点滅周期がおおよそ26μ秒になるのでArduinoIDEのdelayMicroseconds()で何とかなりそうです。
▼のテストルーチンで、所要時間が1秒になるようにdelayMicroseconds()のパラメタを調整します。
私の手持ちのM5Atom liteでは 13μ秒/12μ秒で良い感じになりましたが、個体差があるかもしれません。
※点滅周期がおおよそ26μ秒なので、大体合ってそう。
void SendIRCommand(uint8_t data[]) {
  int i ;
  // SEND HEADER
  unsigned long us = micros();
  for (i=0;i<38000;i++) {
      digitalWrite(DATAPIN,HIGH) ;
      delayMicroseconds(13);
      digitalWrite(DATAPIN,LOW) ;
      delayMicroseconds(12);
  }
  us = micros() - us ;
  Serial.print("US=") ;
  Serial.println(us) ;
}


オシロスコープで波形を確認、大体良さそう。
※内蔵の赤外線LEDでは計測しようがないので、外部に普通のLEDを付けて波形を計測しています。


赤外線リモコン受信ユニットにロジックアナライザーをつないで、信号が受信できていることを確認。
これも問題なく受信できています。


NECフォーマットでコマンド送信

NECフォーマットは▼の通り



1秒で38000回ループするので、562μ秒では21.356回ループします。
これを元に計算すると、それぞれ16T=341回、8T=170回、1T=21回、3T=64回ループすれば良い事になります。

最終的に辻褄が合えば問題ないのですが、送信スケッチとロジックアナライザ、受信スケッチで値が不一致なのも気持ち悪いので、ビットの並びは合わせておきます。
送信時にはLSBファーストで送信すると、全部辻褄がって、送信した値と、ロジックアナライザの解析値、受信した値が同じになります。
今回は、送信ルーチンは自前で構築しておりLSMファーストでもMSBファーストでも好きにできますが、IRsendライブラリを使用するとMSBファーストで送信されるようで、送信値とロジックアナライザの解析値、受信した値が食い違って混乱します。
IRsendライブラリを使用する場合はビット並びを入れ替えた方が分かり易いかも。

IRコマンド送信スケッチで送信した場合と、リモコンで送信した場合の動きをロジックアナライザーで比較し差異がない事を確認


リモコンライトも操作できています


M5Atomの赤外線LEDは(ダイソーのリモコンと比べると)作用射角が狭く、到達距離も短いようです。
リモコン代わりに使うのはちょっとキビシイかも。

スケッチ

ReciveIR : ArduinoUNOで赤外線リモコン受信ユニットを使用するスケッチ
SendIR-DISO-LAMP : 今回作成した、赤外線リモコン送信スケッチ
SendIR-With-IRsendLibrary : 参考までにIRsendライブラリを使用する場合のサンプル(ビットの並びを変換)
以上の スケッチを公開しています

YuruPuro/IRSend


解説動画