黒豆 (Broadlink RM Mini 3) の IR 信号解析してみたよ♪

##<b>■はじめに</b>
昨年末に Google Home 、今月にはやっと Amazon Echo の一般販売も始まり、おうちハックを楽しんでいる人達の間では、格安で赤外線信号を学習してスマートホーム化できる IR リモコンデバイス Broadlink RM mini3 が人気です（通称 黒豆：きっと黒くて小さいからでしょうか海外での通称も Black Bean です :D）。
![blackbeen.jpg](https://qiita-image-store.s3.amazonaws.com/0/241735/e12ef55d-3596-85ec-9927-bd11599fc964.jpeg)
ただ・・こちらの黒豆、IR コマンドの送信フォーマットが非公開ということでなかなか小回りが利きません。ということで色々ネットの情報から送信コードの仕様を調査してみたので公開します。

##<b>■送信コードが分かると何が嬉しいの・・・？</b>
送信コード仕様が分かると・・・

・他の IR デバイス向けに公開されている多くの機器の IR コードを変換して使ったり
・本来の仕様の通りの綺麗な波形に整形＆送信して対象機器側の認識率をUPさせたり
・隠しコードの調査をしたり
　（例えばTVだと実は On/Off 個別にコードあるのでそれを探したり）

などなど、単に黒豆で信号学習するだけでなく、赤外線信号で色々遊べるようになります ：D

※それでも意味が分からない？と言う方のためにこのページの後半に実践編を載せました。
　この記事で掲載している解析データをどうやって活用するか具体例でご紹介しています。

##<b>■参考情報</b>
結果を書く前に、参考にさせて頂いた情報サイトのリンクを先にご紹介します。

●IR コードについての基礎知識
http://shrkn65.nobody.jp/remocon/index.htm
https://watenoblog.blogspot.jp/2014/01/irkitjson.html
http://www.asahi-net.or.jp/~gt3n-tnk/IR_TX1.html
http://elm-chan.org/docs/ir_format.html

●家製協フォーマットの詳細
http://shrkn65.nobody.jp/remocon/panasonic_bsd.htm

●エアコンのIR信号
https://raspibb2.blogspot.jp/2016/06/raspberry-pilirc.html

●いろんな IR コマンドのデータベース
http://www.256byte.com/remocon/iremo_db.php
http://bit-trade-one.co.jp/blog/20171225-2/
http://www.remotecentral.com/cgi-bin/codes/

●Philips Prontoコードを黒豆コードに変換するサンプル
今回の解析はこちらの情報をベースに独自の解析を加えたものです。
※中間コードのLIRC形式はオン/オフを　Micro Sec で示したものの様です。
https://gist.github.com/appden/42d5272bf128125b019c45bc2ed3311f#file-pronto2broadlink-py-L10

●その他参考情報
http://www.mechanist.x0.com/wiki.cgi?page=%C0%D6%B3%B0%C0%FE%A5%EA%A5%E2%A5%B3%A5%F3%A5%C7%A1%BC%A5%BF%A4%CE%CA%D1%B4%B9

##■<b>送信コードの解析結果 </b>
以下が家製協フォーマットを例にした場合の黒豆のIRコードの仕様ですが、上記リンクや
http://shrkn65.nobody.jp/remocon/panasonic_bsd.htm
の内容と何度も見比べながら読むと理解しやすいと思います

以下のリーダー～トレーラー２までの数値は大体近い値ならIR信号としては有効です。実際に黒豆で学習した IR 信号も以下と全く同じではなく近い数値になっていることが多いです。
以下は赤外線リモコン規格上の理想的な数値・波形に近いので、実際にリモコンから学習したコマンドも、この数値に書き換えて送信すると機器側の認識精度が上がる場合があります。

```
0x2600,      ; ヘッダ (0x26 = IR, 0x00 = no repeats)
0x????,      ; パケット長(リーダー～トレーラー２)(little endian)
             ; ここから家製協フォーマット
0x6f,0x37,   ; リーダー（固定値）ON(8T)→OFF(4T)。
             ;  [425µs*8(T)＝3400µs*269/8192=111.xx(0x6f), 
             ;   425µs*4(T)＝1700µs*269/8192=55.xx (0x37)]
0x0d,0x0d,   ; データ部「0」のとき。ON(1T)→OFF(1T)
0x0d,0x29,   ; データ部「1」のとき。ON(1T)→OFF(3T)
             ; (送信データのビット数分続く)
0x0d,        ; トレーラー１（固定値）ON(1T)→OFF(8ms以上)
0x00,0x0d05  ; トレーラー２（固定値）2バイトは 0x00 に続けて (big endian)
             ; ここまで家製協フォーマット
0x????",     ; remainder = (ヘッダ～トレーラー２までのサイズ + 4) % 16 
             ; # rm.send_data() adds 4-byte header (02 00 00 00)
             ; remainder が 0 ならこのデータは必要なし
             ; 0 以外なら 16 - remainder（常に 0x0000 でもOK?）
```
✳ T と言うのは赤外線信号ON/OFFの最小時間単位で、家製協フォーマットの場合 1T で 425µs になり、例えば ON(8T) なら赤外線 ON の状態が 3400µs 継続するという意味になります。

<b>※注意</b>
小１時間解析した程度の内容なので間違いなどあったらごめんなさい。
おかしなところなどあれば是非ご指摘ください。自分でも見つけ次第修正します。

##■<b>実践編</b>
と・・上記の情報だけだと、ほぼ既存の情報の寄せ集めですし（笑）、そもそもどうやって使うのか良く分からない方もおられると思いますので、少しだけ実践編です。

実際にうちで試した時の参考サイトをまずは貼っておきます。
http://itline.jp/~svx/diary/?date=20110612
https://qiita.com/yamori813/items/9a6587bc22e8f61ce182

パナソニックのリモコン付きシーリングライトの例です。

製品についているリモコンだと ON/OFF 切り替えボタンの一つだけでのトグル切り替えのみなので、今照明がついているのか？消えているのか？が分からないと、このトグルボタンの　IR 信号を学習しただけでは家の照明を Google Home などから音声で自由に切り替えるのは困難です。（単にON/OFFが交互に入れ替わるだけなので）

![remocon.png](https://qiita-image-store.s3.amazonaws.com/0/241735/faa1cb7c-9f09-1ef6-0544-cde2368b039e.png)


そこで・・・以下のサイトに行くと、この照明のコマンドが紹介されています。
ここでのポイントは実際この商品は内部的には ON/OFF それぞれ個別の IR 信号が定義されている点です。
※製品付属リモコンにはボタンの無い ON/OFF それぞれに専用の信号があるということです。

http://www.256byte.com/remocon/iremo_db.php?mode=view&id=280

```
344A902CBC = ON
344A90EC7C = OFF
```

さて・・ここで最初に書いた黒豆の信号解析データの登場です。

解析データ中の「データ部」という箇所に注目してください。

```
0x0d,0x0d,   ; データ部「0」のとき。ON(1T)→OFF(1T)
0x0d,0x29,   ; データ部「1」のとき。ON(1T)→OFF(3T)
             ; (送信データのビット数分続く)
```

と書かれている部分です。

この箇所は実際にリモコンの赤外線信号として対象機器に送られる信号そのものです。

上記のシーリングライトのデータベースのデータで言うと

```
344A902CBC = ON
344A90EC7C = OFF
```

の部分に該当しますが、見た目が違うのは、黒豆の解析結果のデータ部は2進数(で示したIRコマンドの1ビット毎の赤外線on/offの各パルス幅を16進数で示したもの)、上記のシーリングライトの信号は純粋にメーカーが定義したIRコマンドを示す16進数という違いだけで中身は同じものです。

ですので、もし黒豆で独自の信号、今回のケースだとシーリングライトのON/OFF信号を送信したい場合、（製品付属のリモコンにはこのコマンドを送信するボタンは有りませんので学習しようがありませんので）黒豆の送信信号列を手作りすることで、黒豆でシーリングライトのON/OFFが個別に制御可能になる。
と言うわけです。

なんでわざわざ赤外線コマンドの解析なんてする必要があるのか？お分かりいただけたでしょうか？ ：D

では実際にやってみましょう。

まずデータベースから持ってきた16進のコマンドを2進数に直します。Windows についてる電卓などで簡単に変換できます。

```
16進数 / 34 4A 90 2C BC = ON
2進数 / 00110100 01001010 10010000 00101100 10111100
```

次に2進数に変換したものを黒豆用の IR コマンド形式に変換します。
今変換した2進数の順に
0 なら 0d,0d, を
1 なら 0d,29, を
並べていくだけなので簡単です。
（慣れてきたら変換用のスクリプトなどを作りましょう！手でやると大変です）

```
0d,0d,       ; データ部「0」のとき。ON(1T)→OFF(1T)
0d,29,       ; データ部「1」のとき。ON(1T)→OFF(3T)
```

簡単なのは、製品についているリモコンの実際の赤外線信号（なんでも良いので）を一旦黒豆で学習して、そのコマンド列の中身を一部修正する方法です。（同じ製品のコマンドは大体のデータは共通で一部が違うのみです）

※機器によってはチェックサムなどのデータも含まれるので注意が必要です。

最後に自家製の IR コマンドを黒豆から送信して動作を確認してみてください。



今回の実践編では例としてライトのコマンドを手作りする方法をご紹介しましたが、他にも例えばテレビの信号を学習したものを少しづつ値を変えて未知のコマンドを探したりするのも上記と似た方法で可能です。（総当たりなので手でやると大変なので自動化したほうがよいですが）


※総当りの未知のコマンド調査は付属リモコンには無い思いがけない機能（業者向けのメンテモードなど便利な機能）が見つかることがあって楽しいのですが、工場出荷時に戻すなど機器の設定が全部消えてしまうようなクリティカルなコマンドが存在する場合もあるのでお試しの際は気をつけて☆

※今回は家製協フォーマットの機器を例に説明してみました。その他のフォーマットの場合リーダーからトレーラーまでの形式が違ってきます。（詳細は以下のリンクを参照してください）
http://shrkn65.nobody.jp/remocon/nec.html

※（最近教えて頂いたので追記）上記の手順で 344A902CBC=ON / 344A90EC7C=OFF を変換すると正しく動作するのですが、1点注意が必要です。赤外線信号のデータ部は仕様上 LSB first 形式ということで、2進数のビットの並びは上記で変わらないのですが、16進が 2c5209343d=ON と表記される場合があります（LSB firstの説明は省きます）。ネット上などで16進表記の機器コマンドを見つけ自分で変換するときはどちらの表記になっているか注意したほうがよさそうです。

##■<b>最後に</b>
スマートホームは日本ではまだまだこれからですが、今後の発展が楽しみですね～ ：D
今はまだハック前提な感じですが、将来一般にも広まるのを期待しています☆

この記事が皆さんのおうちハックの一助になれば何よりです♪

##<b>※投稿記事一覧</b>
他にも 自分で「おうちハック」した内容を以下に投稿しているので、よろしければ合わせてご覧ください☆

・GoogleHome/AmazonEcho とラズパイでやった事・やりたい事一覧[[LINK]](https://qiita.com/kt-sz/items/86536aff99d80c1cd464)
・Google Home でちょっと未来風のスマート TV を作ってみたよ☆[[LINK]](https://qiita.com/kt-sz/items/0362d5fe3e9a3e478245)
・黒豆 (Broadlink RM Mini 3) の IR 信号解析してみたよ♪ [[LINK]](https://qiita.com/kt-sz/items/1c36a7b22a58359a8e6f)
・スマートロック SESAME の WEB API が便利だった！[[LINK]](https://qiita.com/kt-sz/items/e8ccec02605584e62b53)
・Amazon Echo の沢山ある面白スキルを気軽に遊ぶ方法[[LINK]](https://qiita.com/kt-sz/items/0d01e763d540ddea5816)
・LINEを「ラズパイのターミナル化＆スマートホームのフロントエンド化(ChatOps風)」してみた♪[[LINK]](https://qiita.com/kt-sz/items/9adcb02a3b3a6cf3dd7b)
・LINE と Firebase とラズパイを繋いでみたよ☆[[LINK]](https://qiita.com/kt-sz/items/c008084300a978516153)
・GoogleHome と Chromecast でキーワード＆画像＆Wikipedia検索～TV表示[[LINK]](https://qiita.com/kt-sz/items/9edea18c4f0f5e8cf631)
・スマホ ハック＆スマートホーム連携 [[LINK]](https://qiita.com/kt-sz/items/9e23bd5969f0024b17f8)
・ラズパイとサーモセンサーで自宅のガスコンロ監視（火の用心） [[LINK]](https://qiita.com/kt-sz/items/471f469cc89d2bac0c76)
・トニー・スタークの家にありそうなスマート・テーブル（笑） [[LINK]](https://qiita.com/kt-sz/items/13cb71214604081dbf7c)