学習型赤外線リモコン・ライブラリ

赤外線リモコンの仕様は比較的単純なものが多く仕様が公開されてるものもあることから、多くの方々が学習リモコンの実装に挑戦され公開されてはいる。が、仕様を限定すると対応できない機器がかなり多くなり、汎用性を考慮すると多大なメモリが必要となるなど課題も多い。

数年前、Kickstarterにてデビューしたdigisparkという極めて小さなCPUボードに興味を持ったことがきっかけでArduinoという開発環境を知る。勉強がてら赤外線リモコンでも作ってみようとは思ったもののTVリモコン等の比較的標準ぽいものはともかくエアコンなどの家電製品では仕様もパラバラでデータ・ビット数もかなり多いものがあるためデータメモリ512バイトしかないCPUでは汎用的な学習リモコンなどほぼ無理とあきらめていたが、オシロスコープで各種リモコンが出力する波形を、ずーーーーと見つめていたらなんとなく解決策が見えてきた。

赤外線リモコンの基本仕様は、ELM-ChaNさんの赤外線リモコンの通信フォーマットが詳しいので参考にしてもらいたいが、私が考えた仕様ではフィリップスのRC-5、6等のマンチェスター符号方式には対応できないものの、それ以外のパルス幅でデータビットを表す国内外の多くの機器に対応可能な方法である。(と思う...)

まず、確実にデータ解析できるようにパルスONとOFFを別けて処理することが重要である。パルス幅はリーダー部(ON/OFF)2種類、データ部(ON/OFF/LONG(1))3種類の合計5種類のみ記録。データ部はパルスONかOFFどちらかのパルス幅は常に一定、他方はデータビットにより2倍以上に変化するものとし、短いほうのパルス幅の1.5倍より大きいかどうかでリアルタイムにデータ解析&記録。その他、同一リピート・フレームや複数フレームにも対応することでコードサイズは大きくなったが作業領域を除く赤外線データ保存領域が最低20バイト~最大でも64バイトもあれば足りるというかなり省メモリなものとなり、ATtiny85でも汎用的な学習リモコンを実現することが可能となった。

ブレッドボードでのいい加減な実験風景(笑)

あと、赤外線の波形を眺めていて気になったことが...

立ち上がりが136us遅れている
立下りが244us遅れているのでパルス幅としては108us長く見えてしまう

赤外線受信センサーは秋月で購入したSHARPのGP1UXC41QSを使用してるが、赤外線パルスの受信タイミングが遅れることは予想できたもののONとOFFに時間差があり、センサー出力のON信号幅が赤外線パルス幅よりもかなり長く見えてしまうという問題を発見。赤外線センサーの受光量に影響されるようで、弱いときでも50us、強いときだと200us程度の誤差が発生する。他社センサーではどうなのかも調べてはいないし、これが学習結果にどう影響するかも定かではないが考慮するにこしたことはなさそうである。

追記(2017-04-06)
Digisparkからも赤外線受信シールドキットが販売されてるが送信用LEDの駆動がCPUのIO直接(Max20mA)からしかできなくて実用性に乏しいためLED駆動用にトランジスタを追加したDigispark用の赤外線送受信シールドを作ってみた。

赤外線送受信シールド
Digisparkに取り付けてみたところ

参考
赤外線リモコンの通信フォーマット

【ライブラリの使い方】

【赤外線リモコン・ライブラリ】

2017-04-03 スキャン開始時のノイズ対策が効かなくなっていたので修正。
2017-03-20 スペル・ミスと大きなバグを見つけたので修正。