- 先頭に三菱電機とパナソニック製エアコンのリモコン信号を解析する部分を追記
- ダイキン工業製エアコンのリモコン信号を解析する部分はページを分けました。
リモコン信号の信号解析アプリケーション
以前に用意したアプリケーションのおまけに解析器を付けておきました。
メニューのInfra-redページでリモコン信号をコピペすると確認できます。
注: ↑は成り行きで追加していたらいつの間にかフロントヘビーに育ってしまったので今度分割します。
React Native for Windowsを使ってデスクトップアプリにしました。
このページへどうぞ。
三菱電機とパナソニック製エアコンのリモコン信号を解析する
三菱電機とパナソニック製エアコンのリモコン信号の資料 on GitHub
三菱電機とパナソニック製エアコンのリモコン信号の資料が GitHub にあるのを見つけたので, それを解析するソフトウェアを実装した。
三菱電機製エアコンの信号解析
資料によると第1フレームと第2フレームは共通の信号なので片方を解析すればよいようだ。
フレームは18バイト。
- 温度 8バイト目
- 運転 6バイト目
- 電源 6バイト目
- CRC 18バイト目 (前の17バイトすべて足した値の mod 256)
ということのようですね。
Qiitaで拾ってきた三菱電機製エアコン冷房27度 オンのコードらしい。
pigpioのirrp.py形式
|
|
最後を見てみると
- MitsubishiElectric HVAC
- Temperature 27
- Mode Cool
- Switch ON
となっているので解析できてる様な気がするね。
運転: 暖房22度のコード
|
|
停止: 暖房22度のコード
|
|
運転: 冷房26度のコード
|
|
パナソニック製エアコンの信号解析
資料によると第1フレームは共通の信号で, 第2フレームに個別の信号の2フレーム構成で出来ているようだ。
第1フレームは8バイトの共通の信号。
この2つは同じ信号だよ。実際のソースコードを見てみると分かるはず。
b1 | b2 | b3 | b4 | b5 | b6 | b7 | b8 | bit order |
---|---|---|---|---|---|---|---|---|
02 | 20 | e0 | 04 | 00 | 00 | 00 | 06 | LSB first |
40 | 04 | 07 | 20 | 00 | 00 | 00 | 60 | MSB first |
第2フレームはLSB firstビットオーダーの信号で19バイト。
- 温度 7バイト目 (bit 1,2,3,4) + 16
- 風向 9バイト目 (bit 0,1,2,3)
- 風量 9バイト目 (bit 4,5,6,7)
- 運転 6バイト目 (bit 4,5,6,7)
- 電源 6バイト目 (bit 0)
- CRC 19バイト目 (前の18バイトすべて足した値の mod 256)
ということ。
実際のリモコンで確かめる
運転: 暖房23度, 風向: 自動, 風量: 自動
|
|
運転: 冷房21度, 風向: 自動, 風量: 自動
|
|
停止: 冷房16度, 風向: 水平, 風量: 最大
停止信号を送るとディスプレイが消えたのでこの写真は運転状態の写真です。
|
|
以上で資料が正しいことを確認できた。
ダイキン工業製エアコンの信号解析
ページを分けました。
ダイキンエアコンのリモコン信号を解析する
解析対象のリモコン信号を入手
信号解析アプリケーションで解析するリモコン信号は以下の方法で手に入れてください。
- 下のコードをコピペする。
- 参考文献にあるダウンロードからCSVファイルをダウンロードしてコードをコピペする。
- 赤外線リモコン信号を記録して送信する学習リモコンをラズパイゼロでつくる。
このページを参考にハードウェアを用意して, 手持ちのリモコンからコードを取り出す。 - pigpioのExamplesにある IR Record and Playback (irrp.py)で 作った赤外線信号ファイルからjsonを取り出す。
パーサーがこれだから
赤外線リモコン信号の構造
アプリケーションノートより NEC, SIRC(SONY) フォーマット赤外線リモコン信号の構造を引用します。
NECフォーマット赤外線リモコン信号
Texas Instruments - Application Report SLAA644B
Infrared Remote Control Implementation With MSP430FR4xx1
より引用しました。
こんなインターネット上の文書より, SLAA644B1 アプリケーションノートを信用して欲しい。
1 Introduction
中央の矢印で表現されている赤外線通信信号より左側が送信機, 右側が受信機。
5.1章で書かれている内容が NECフォーマット
この構造は家製協(AEHA)フォーマットも大筋で同じ
5.1 Pulse Distance Protocol
Pulse distance protocol is widely used by many appliances companies. It uses ASK modulation and pulse distance encoding with a carrier frequency of 38 kHz.
5.1.1 Frame Format
There are two kinds of frames in protocol: data frame and repeat frame.
A data frame consists of a leading code and data payload. The leading code is a burst with a length of 9 ms, followed by a pause of 4.5 ms. The data payload consists of 8 bits address to identify the device and 8 bits command for control words. Both are sent twice for reliability. The second transmission of address and command are complementary, therefore the total length of the data frame is constant (67.5 ms). The payload is finalized by a 560-µs carrier modulated tail pulse, to finish the last bit data gap.
Logic 1 is defined as a 560-µs carrier modulated period followed by a 1690-µs space period. Logic 0 is defined as a 560-µs carrier modulated period followed by a 560-µs space period (see Figure 12).
A complete data frame format is shown in Figure 13.
Repeat frame is defined to handle auto-repeat function and does not carry any address or command information. It includes train pulses and a tail pulse following (its format is shown in Figure 14). The repeat frame is repeated every 110 ms while the same key is still pressed.
The full sequence format of pulse distance protocol is shown in Figure 15.
SIRC(SONY)フォーマット赤外線リモコン信号
SLAA644B アプリケーションノートにはSIRCフォーマットが書かれていないので
Texas Instruments - Application Note AN091
RemoTI TM IR Signal Generation Application Note2
より引用しました。
3.4 SIRC Format
3.4.1 Modulation
The SIRC format uses a combination of the pulse distance and pulse width modulation technique. SIRC modulation is based on varying both the active period and duty cycle to distinguish between a logical “1” and a logical “0”. Note that the non-active period for both logical “1” and logical “0” is constant. Figure 7 below illustrates the principle of a combined pulse distance and pulse width modulation.
SIRC format timing information:
- Carrier: 40 kHz with 1/3 or 1/4 duty cycle
- Active period:
- Logical “0”: 600 µS
- Logical “1”: 1.2 ms
- Duty Cycle
- Logical “0”: Active Period Logical “0” + 600 µS: 1.8 ms
- Logical “1”: Active Period Logical “1” + 600 µS: 1.2 ms
3.4.2 Protocol
The SIRC protocol uses a 7-bit command and a 5-bit address length for each transfer. Other versions with different command and address length also exist. The command and address bits are preceded by a preamble with active period of 2.4 ms and duty cycle of 3 ms. The command and data bits are transferred with LSB first. See Figure 8 below for an illustration of the protocol.
3.4.3 Repeat Sequence
The protocol described in Figure 8 is also used as the repeat pattern. This means initial frame and repeat frames are identical. The frame is repeated every 45 ms as long as the key remains pressed. See Figure 9 for an illustration of the repeat sequence.
ざっと見ていると情報通信でおなじみの階層構造をなしているわけで。
NECフォーマットを例にして説明すると
送信機(リモコン)では情報(メッセージ)を
Pulse Distance Protocol (または Pulse Position Modulation) によってエンコードして
- NECフォーマットを表すヘッダ(Leading Code)
9ms ON / 4.5ms OFF - ペイロード(エンコードした情報)
- トレイラー(ストップビット)
を一つのフレームに組み立てて物理層に送る。
物理層(伝送路3)では(NECフォーマットの場合)このように見える。
ついでに
物理層(伝送路3)では(SIRCフォーマットの場合)このように見える。
こういうものを情報通信用語で「カプセル化」といいますね。
赤外線リモコン信号を解析する
送信機でカプセル化された通信であるから, 受信側プログラムはその反対「非カプセル化」を行なえば元の情報が得られる。
これは PureScript4 で書いたソースコードで
このプログラムの動作は上で図示されている構造を解体。つまり「非カプセル化」するということ。
このプログラムはこの3段階で解体するように作りました。
- (物理層からやってきた)入力である複数のフレームを個々のフレームに切り離す。
- 個々のフレームからペイロードを取り出す。
- ペイロードをデコードする。
ここで
リモコンから送信された物理層のASK5変調信号(アプリケーションノート参照)は受信側の赤外線受信モジュールによって包絡線6が取り出されているので, このプログラムはそれを入力とします。
この図をよく見て欲しい。
余談だけれど, 取り扱っているデータを
- 「ビット」と言うのはふつう第1層(物理層)
- 「フレーム」と言うのはふつう第2層(物理層の上層)
のお話ね。
以下簡単に説明します。
データ型宣言
- Count型
- 38kHzの時間での何カウントになるか
|
|
比較するためにクラス Eq, クラス Ord
表示するためにクラス Show
四則演算するためにクラス Semiring, クラス Ring, クラス CommutativeRing, クラス EuclideanRing
のインスタンスにしている。
- Baseband型
- パーサーからデコーダーに渡される中間表現であってON時間, OFF時間の配列。
|
|
- Bit型
- 1ビットを表現する。
- 1 or 0
- Hi or Lo
- true or false
- 付勢 or 消勢
- Assert or Negate
これは2値を表せたら表現は何でもよいんですけどね。
赤外線リモコン信号回路には負論理信号が混ざるので, 今回はAssert/Negateでいきます。
|
|
- InfraredLeader
- リーダー信号
AEHA | NEC | SIRC(SONY) | 不明のどれか
|
|
InfraredLeader のコンストラクタ
ON時間 / OFF時間からリーダー信号を得る
それぞれの判定に使う時間は参考リンクにある通りで,
許容誤差の上限下限を 0.2ms にしておいた。
|
|
- InfraredCode
- 赤外線リモコン信号。
正しい入力なら, 最後はこれに変換される。
|
|
入力文字列のパーサー
参考リンクのADRSIR文書情報で定義された入力をデコーダーに渡す中間表現に変換する。
|
|
デコーダー
中間表現から赤外線リモコン信号に変換する。
書いてある通りに Phase1, Phase2, Phase3 の3段階で砕く。
«<7 は関数合成演算子でHaskellの . ドット
traverse8 は Haskellの mapM
<=<9 はモナドの合成演算子でHaskellと同じ
|
|
デコード第1段階
リモコンから複数フレームが送られる事があるので, 1段目は入力を各フレームに変換する。
OFF時間 8ms継続でフレームを切り離す。
8msは参考リンクにある通りAEHA規格が根拠であるが, SIRC(SONY)規格でも有効。
|
|
デコード第2段階
入力フレームをリーダ部とビット配列にする
|
|
デコード第3段階
AEHA / NEC / SIRC / 不明 それぞれ対応する関数で変換する
|
|
デコード用モナド
|
|
- 3段階のデコード関数はEitherモナド
- 破壊的更新(変数再代入)を伴う操作を行なうためのStateモナド
この2つのモナドを合成している。
|
|
ここに書かれているとおりStateモナドのフィールドがビットの配列となっているので,
- 取得 (State.get)
- 更新 (State.put)
などのアクセッサーを通じてフィールドにアクセスすることになる。
この部分は他言語でいう Getter / Setter のこと。
Haskell / PureScript のようないわゆる純粋関数型言語では変数の取り扱いに特別の配慮が必要なんでこんなことになる。
純粋にこだわらない言語ではこんなめんどくさい事をしなくても普通に変数を使えばよいですね。
1ビットを取り出す
|
|
ここでの動作は State.getでビット配列を取得して 取得したビット配列が
- 空ならエラーメッセージを返却
- 有れば1ビットを取り出して, 残りを次のStateとして更新, 取り出した1ビットを返却
nビットを取り出す
|
|
残りのビットをすべて取り出す
|
|
デコード (AEHA)
先頭から以下の順番で取り出す
- カスタムコード(16ビットlsb first)
- パリティ(4ビット lsb first)
- data0(4ビット lsb first)
- dataN(8ビット lsb first)
- ストップビット
|
|
デコード(NEC)
先頭から以下の順番で取り出す
- カスタムコード(16ビットlsb first)
- data(8ビット lsb first)
- dataの反転(8ビット lsb first)
|
|
デコード(SIRC)
先頭から以下の順番で取り出す
- コマンド(7ビットlsb first)
- アドレス(5/8/13ビット lsb first)
- ストップビット
|
|
赤外線リモコン信号の解析はこれでいいと思う。
さいごに
- 入力文字列
- カウントの配列
- フレームの配列
- ビット列
- 赤外線リモコン信号
入力文字列が各段階で変換される様子を見ているのが上のページ。
フロントエンドはPureScriptで書いていますが, このプログラムの動作はまさにコレ
プログラミングはデータの変換をするものだ
—プログラミングElixir 第1.1章
参考文献
赤外線リモコン誕生記 - 特許を取れなかった技術,取らなかった技術
赤外線信号
- 赤外線リモコンの通信フォーマット
- SB-Projects – IR Index
- FAQ 1007798 : 赤外線リモコンの信号はどうなっているのですか?
- FAQ 1006539 : リモコン・コードの受信/解析はどのように行うのか?
- AN1064 – IR Remote Control Transmitter
- Application Report SLAA644B
Infrared Remote Control Implementation With MSP430FR4xx - Application Note AN091
RemoTI TM IR Signal Generation Application Note - STM32Cubeによる赤外線リモコンプロトコル用のトランスミッタとレシーバの実装
ADRSIR
メーカーによるソフトウェアダウンロードページから
http://bit-trade-one.co.jp/support/download/
I2C仕様文書, リモコンコードCSVファイルをダウンロードする。
リモコンデーターの構造
1 赤外線データのON-OFF-ON-OFF…の時間を38kHzの時間での何カウントになるかを求めます
3.2msの場合は、3.2ms / 0.026ms(38kHz) = 123 (0x7B)2 各カウント値を2バイトデータとして先頭からカウント値のLoバイト、Hiバイトの順番にデータを送信します
データ
送信データ長は、ON-OFFで1データとなります。よって、この場合のデータ長は8となります。
0x7B, 0x00, 0x3D, 0x00, 0x0F, 0x00, 0x0F, 0x00, 0x0F, 0x00, 0x2E, 0x00, 0x0F, 0x00, 0x0F, 0x00, 0x0F, 0x00, 0x0F, 0x00, 0x0F, 0x00, 0x2E, 0x00, 0x0F, 0x00, 0x2E, 0x00, 0x0F, 0x00, 0x0F, 0x00ADRSIR I2C仕様文書