赤外線を使う


R6.7.14 スタックチャンで赤外線

 M5Capsuleには赤外線を出すポートがあるので、FunctionCalling機能を使って天井のシーリングライトをコントロールできないかやってみた。データはR2年の時のものを使用。

FunctionCall.cppでIRremoteESP8266.hとIRsend.hをinclude。String get_lightON(){ の中で、
IRsend irsend(4);
irsend.begin();

として、rawData[84]を
irsend.sendRaw(rawData, 84, 38);

によって15回繰り返してみた。

 するとこのように動作した。ところが、動作は不安定(^^;)。動作する時もあれば動作しないときもある。

データが悪いかな?不安定。データは赤外線受光器を使って、シーリングライト付属のコントローラからの赤外線を受け取って得たRawデータ。ただし、やるたびに細かいところが違う。

 結局、試行錯誤の結果では、赤外線コントロールという機能限定で行えば、M5CapsuleでもM5StackでもCore2でも上手く動作する。しかし、スタックチャンのようにAvatar表示しながらでは不安定になるということのようだ。できないわけではないので、組み込んでおいてもいいかもしれない(^^;)

 というわけなので、一応スタックチャンには組み込んでいますが、別のM5Capsuleに専用のコントローラを作っています。

 尚、この取り組み中に新たな方法を取得したので記録しておきます。

 IRsend.hを読んでみると、パナソニック・プロトコルに該当しそうなものを発見。そこで、それを利用して下のようにやってみた。快適に動作する(^^)/ Core2からの赤外線を受けてみるとちゃんとPANASONICとして受けてくれました。RAWデータではなく、このプロトコルを利用するといいでしょう。


R2.1.12 一応 完成

 天井のシーリングライトと、テレビの赤外線コントローラを一つのスケッチでまとめました。

 天井灯のコントロールスケッチが完成していたので、バイナリ―出力をしました。しかし、そのスケッチに次のTVのコントロールデータを上書きしてしまったので、天井灯のデータを失ってしまいました(^^;)。再度データ取得のチャレンジをしましたが、なかなかコントロールできません。仕方なしに、マイクロビットで得たデータで組み合わせた結果、うまくコントロールできたので、組み合わせてみました。

 ボタンAで赤外線出力、ボタンBで次の項目、ボタンCで前の項目。TreeViewのスケッチを応用できればいいのだけれど、私にはまだ無理でした(^^;) で、我流の単純方法で実現。


R2.1.10 ようやくできたかな

 赤外線リモコンが使えるようになりました。これまで悩んだのは、結局は私の理解不足でした(^^;)

 手持ちの赤外線リモコンから信号を得て、分析することは簡単にできたのですが、そのデータを使って送信して家電製品をコントロールすることができませんでした。それが、ようやく解決したのでした。できてしまえば、当たり前のことなのですが、そこに至るまでが長かった。ネットでは、うまくいったことが書かれていますが、シロウトはちょっとしたミスで前に進めない、そのちょっとした注意点はなかなか見つかりません。自分で分かっていないから、解決策や情報を見つけようがないのです。まあ、長く悩んだことが収穫だったと捉えましょうか。

 M5StackでArduinoIDE使用を前提に話を進めます。

 赤外線IRのライブラリはIRremoteESP8266が一番良かったです。IRのLEDに信号を出すGPIOピンを自分で決められるからです。他にもいろいろの方々が取り組んでいて、自作ライブラリがあったりします。

 私の身の回りにある赤外線リモコンはシャープAQUOSを除くと、他にメジャーなものはなかったため、赤外線LEDから信号を送る場合は、コードがライブラリにはなく、解析で得たRAWデータを使うしかありませんでした。AQUOSにしても、いくつかのページでは異なっていて理解が進みませんでした。

 IRremoteESP8266のスケッチ例にあるIRrecvDumpV2を使って、リモコンから赤外線データを受け取ります。その際、37行目あたりにある kRecvPin には、赤外線受光センサーの端子を自分のM5Stackにつないだピンと同じ番号にします。私は、36にしました。上の写真では白いコード。リモコンから得たAQOUSテレビのデータは下記の通り。AQUOSなのにPANASONIC???

 次に、この信号を、送るプログラムで送信します。数値は、整形する必要はありませんでした。そう厳密でなくてもいいようです。もちろん、できるだけきれいにした方がエラーはないと思います。時間ができたら、1Tを425μsとして、ヘッダー部3400μs(8T)、1700μs(4T)、データ部は425μsと425μsで「0」を425μsと1275μsで「1」を送信するようにしようかと思います。

 実際の送信での一番のポイントは、上図に示す「 rawData[99] 」というところです。
 送信するためのスケッチは、やはりIRremoteESP8266のスケッチ例にあるIRsendDemoです。この時も、信号を出すピンを kIrLed で指定します。私の場合は、にしました。上のIRセットをつないだときに黄色のコードがつながったピンです。(基板裏で白とクロスしています)

 スケッチの loop の中には、「irsend.sendNEC(0x00FFE01FUL);」「irsend.sendSony(0xa90, 12, 2);」「irsend.sendSamsungAC(samsungState);」などがありますが、そういうメーカーのデータがライブラリにあればいいのですが、AQUOSはなかったので、得たデータを「生のまま」すなわちRAWで送信しました。「irsend.sendRaw(rawData, 67, 38);」

 ここで重要なことが、データ個数を指定すること。スケッチ(rawData, 67, 38)となっていますが、この67こそがデータ数。これを得られたデータ数と合わせねばなりません! AQUOS TVの場合は99個でしたから、(rawData, 99, 38)。38は一応固定です。赤外線 LED の発光時の点滅周波数で、一般には38kHzを使用するようですので。

 という手順で、TVをコントロールすることができました。めでたしめでたし。そして、参考にさせていただいたみなさんありがとうございました!

 なお、赤外線を受光してArduinoIDEのシリアルモニタに表示されたデータは、その部分をマウスを使って反転させてから、上の「送信」と書かれた部分の左の窓にマウスカーソルを持って行ってから、右ボタン=>メニューからコピーをすることができます。それを送信プログラムにペーストして使うのが早いです。整形する場合は、エクセルにでもペーストするかです。