最終更新日:2020年4月11日
TVBOXの話題では赤外線リモコンの話題を取り上げていました。SONYの学習リモコンにTVBOXのリモコンも割り当てて快適生活化していたつもりです。
Arduinoの基本項目にも赤外線リモコンが用意されているのですが、こちらは飛ばしていました。一応手元には送信側LEDも受信側フォトダイオードもあるのですが。
Arduinoフォーラムを眺めていて、Arduinoでエアコンのリモコン操作が難しいという事実を知り、興味を持ちました。赤外線リモコンは家電協会の規格書を入手すれば何とでもなるという解釈をしており、ただ、その規格書が入手しづらいという考えを持っていました。Forumを見ている限りリバースエンジニアリングに頼る部分が多いことも判りました。
自分はリバースエンジニアリングは余りしたくないのですが、エアコン制御は知っておいて損はないと思い、記録に残すことにした次第です。既に多くの先人がエアコンに関するリバースエンジニアリング情報を提供しています。参考になります。
自分はNationalのエアコンしか所有していないため、この点に特化して記録に残してゆきます。赤外線リモコンの基本情報はwikipediaに任せますが、基本は抑えておきたいです。
- 基本フォーマットは3系統。ただし、海外のフォーマットが出てきており把握しきれない。※Arduinoのライブラリでは10分類していました。
名称 キャリア周波数 0/1判断 NECフォーマット 38kHz 消灯時間の長さで0/1を判定 家製協フォーマット 38kHz 点灯/消灯時間の比 1:1=0、1:3=1 SONYフォーマット 40kHz 点灯時間の長さで0/1を判定 - Nationalのエアコンは家製協フォーマットの模様なので、以後、このフォーマットに特化します。
- 赤外線リモコンの出力をフォトダイオードで検出すると、オシロスコープによる可視化が可能です。※可視LEDの点灯確認というのもあるのですが送信された程度しか把握できないでしょう。
- 実際に波形を取得してみました。
エアコンのボタンを押したところ,260msecの期間ON/OFF信号を検出しました。信号が負論理なのはVCCPullUpした信号から読み取っているからです。- ArduinoにしろRaspberryPiにしろ赤外線リモコンの受信ライブラリではON/OFF変化をインターバルタイムとして確保し、0/1解析、コード解析を行っているようです。
実際の運転ONを押したときの受信結果はこんな感じでした。
1連のコマンド長が295msecで最初のパルスが3420usecです。- Arduinoのデバッグコードは以下の通りでした。
11:30:52.391 -> DFDF2020
11:30:52.391 -> DFDF2020 (33 bits)
11:30:52.391 -> Raw (101): 3400 -3600 800 -2650 850 -2700 800 -950 800 -2700 800 -2700 800 -2700 800 -2700 800 -2700 800 -2700 850 -2650 850 -900 800 -2700 850 -2650 850 -2650 850 -2650 850 -2650 850 -900 850 -900 850 -2700 800 -950 800 -900 850 -950 800 -900 850 -950 800 -950 800 -950 800 -2700 800 -900 850 -950 800 -950 800 -950 800 -950 3450 -3550 800 -2700 800 -2700 800 -950 800 -2700 800 -2700 800 -2700 850 -2650 850 -2650 850 -2650 850 -2650 800 -950 800 -2700 850 -2650 850 -2650 850 -2650 800 -2700
足すと150msecになることから、Arduinoのライブラリ側の問題なのか?繰り返しなのか?確認が必要です。- Raw(101)とあります。101は変化点の取得数なのですが、これはライブラリに書かれているバッファサイズであることが判りました。
- IRremoteInt.h
#define RAWBUF 101 // Maximum length of raw duration buffer- ところがRAWBUFの値を変更しても解決しないというForum書込がありました。ただ、これはUNOのRAMサイズの問題の可能性が高いです。
- と云う事で #define RAWBUF 201 にして実行してみました。
16:03:40.695 -> DFDF2020
16:03:40.695 -> DFDF2020 (33 bits)
16:03:40.695 -> Raw (136): 3500 -3550 800 -2650 850 -2700 800 -950 800 -2700 800 -2700 800 -2700 800 -2700 800 -2700 800 -2700 800 -2700 800 -950 850 -2650 850 -2650 850 -2650 800 -2700 850 -2650 800 -950 850 -900 850 -2650 850 -900 850 -900 850 -900 850 -900 800 -950 800 -950 800 -950 800 -2700 850 -900 900 -850 850 -900 900 -900 800 -900 3450 -3550 850 -2700 800 -2700 800 -950 800 -2700 800 -2700 800 -2700 850 -2650 800 -2700 800 -2700 800 -2700 850 -900 800 -2700 800 -2700 850 -2650 850 -2650 850 -2650 800 -950 800 -950 800 -2700 900 -850 900 -900 800 -950 850 -900 850 -850 900 -850 900 -850 900 -2650 850 -900 800 -950 800 -950 800 -950 800 -950 3450 -3550 800
足し込んでも190msecです。このライブラリにはまだ制限があるようです。- ターゲットにしていたリモコンが A75C2069 でちょっと古すぎるという問題があるのかと思い、一台交換したモノがあったので、そちらのリモコンの調査に変更します。型番はA75C4439です。
- A75C4439の運転ボタンを押したときのキャプチャを添えます。
これで判ったこととして2つのフレームに分かれているという事です。
16:48:45.562 -> 7361FF95
16:48:45.562 -> Unknown encoding: 7361FF95 (32 bits)
16:48:45.562 -> Raw (132): 3550 -1750 400 -550 300 -1350 400 -500 400 -450 400 -500 400 -450 400 -500 350 -500 400 -450 400 -500 400 -450 400 -550 300 -500 400 -1350 400 -450 400 -500 400 -450 400 -450 450 -450 400 -500 400 -450 400 -1350 400 -1350 400 -1350 400 -450 400 -500 350 -1350 400 -500 400 -450 400 -500 400 -450 40500 350 -500 400 -500 350 -500 400 -450 400 -450 400 -500 400 -450 400 -500 400 -500 350 -500 350 -500 400 -500 350 -450 450 -450 400 -450 400 -500 400 -450 450 -450 400 -450 400 -450 400 -500 400 -500 350 -500 350 -500 400 -450 400 -1450 400 -1350 400 -500 400 -450 400 -500 350 -500 400 -450 400
この結果は前半のフレームかと思います。残念ながら後半のフレームは今のままでは取得出来ないです。- 改めて先人の書込を検索したところ、PanasonicのエアコンはAEHAフォーマットで2フレーム構成で8バイト+19バイトなのだそうです。
https://qiita.com/dokkozo/items/25c6e17fcc2e655d5d42- 前半のフレーム(8B)は常に固定のようです。
送信側のコードを実際に書いてみていろいろ判りました。Arduino-IRremote-masterのライブラリは送信時に38kHzのキャリアが維持できないように思います。digitalWrite()でusecオーダの処理を維持するのは酷です。実際にAD2で見ても本来なら26usecを維持しなくてはいけないのに100usec程度に膨れあがり全く成立していないようです。受信側ではfc=38KHzのLPFを掛けるため問題なのだと思われます。
自分で書くなら38kHzのタイマ割込を用意し、割込発生毎にポートアクセスで指定pinをON,マイクロ秒遅延でOFFにするか?3倍のタイマ割込108kHzの割込にして3で割って余り0の時にON,1の時にOFF、2の時に無視にするという方法でキャリアは正確に作ることが出来そうです。
実際の信号はTと云う単位でON/OFF信号を作成する必要があります。フォーマットはメーカ毎に異なりますが、送信側はソースコード内で固定して然りだと思うので
免責事項
本ソフトウエアは、あなたに対して何も保証しません。本ソフトウエアの関係者(他の利用者も含む)は、あなたに対して一切責任を負いません。
あなたが、本ソフトウエアを利用(コンパイル後の再利用など全てを含む)する場合は、自己責任で行う必要があります。本ソフトウエアの著作権はToolsBoxに帰属します。
本ソフトウエアをご利用の結果生じた損害について、ToolsBoxは一切責任を負いません。
ToolsBoxはコンテンツとして提供する全ての文章、画像等について、内容の合法性・正確性・安全性等、において最善の注意をし、作成していますが、保証するものではありません。
ToolsBoxはリンクをしている外部サイトについては、何ら保証しません。
ToolsBoxは事前の予告無く、本ソフトウエアの開発・提供を中止する可能性があります。
商標・登録商標
Microsoft、Windows、WindowsNTは米国Microsoft Corporationの米国およびその他の国における登録商標です。
Windows Vista、Windows XPは、米国Microsoft Corporation.の商品名称です。
LabVIEW、National Instruments、NI、ni.comはNational Instrumentsの登録商標です。
I2Cは、NXP Semiconductors社の登録商標です。
その他の企業名ならびに製品名は、それぞれの会社の商標もしくは登録商標です。
すべての商標および登録商標は、それぞれの所有者に帰属します。