通信フォーマット
赤外線通信を行うために参考となる情報を検索した結果、赤外線通信には通信フォーマットというものがあることを知りました。
特に参考になったのは、こちらのページでした。
NECフォーマットなど様々な通信フォーマットがありますが、下のような共通点があるようです。
- 初めに通信を開始することを示すリーダー部、どのリモコンに操作を行っているのかを示すカスタマーコード部(あるいはアドレス部)、送信したい情報を表すデータ部の3つのデータを1セットにして送信している。
- 変調単位Tというものがある。これは350usec~600usecの時間を1つの単位としていて、カスタマーコード部やデータ部ではTを区切りとして通信している。
例えばNECフォーマットなら、「1Tの間On(赤外線点滅を受信し)、つづいて1Tの間Off(赤外線点滅を受信しない)」は0を通信したことになり、「1Tの間On、3Tの間Off」は1を通信したことになる。 - リーダー部はデータ部などとは少し異なるフォーマットになっていて、長めの時間On/Offするようになっている。ただし、このときもTを時間の基準として通信している。
例えば、NECフォーマットなら、「16Tの間On、つづいて8Tの間Off」することでリーダー部を送信している。
さてここで問題です。どの通信フォーマットを選択するのが良いでしょうか?
私はどの通信フォーマットも選択しませんでした。というのも既存の通信フォーマットはやや冗長だと思ったからです。例えばNECフォーマットではカスタマーコードや反転データを送信するなど、本来送信したいデータ以外の情報が多くあります。これらは製品の誤動作を避けたり、複数の家電で混信したりすることを避けるためには必要だと思います。しかし、趣味で赤外線リモコン戦車を作りたいだけの私にとって、これは少々過剰であり、冗長だと思ったのです。
また、一般的な家電リモコンと同じ通信フォーマットにしてしまうと、偶然データが一致してしまい戦車の操作中に家電を動かしてしまう危険もあります。
したがって、下手に家電用のフォーマットを使うよりも、独自フォーマットで通信したほうが良いと考えました。
独自通信フォーマットの仕様
NECフォーマットを参考にしつつ、独自フォーマットを作りました。NECフォーマットの簡略版という感じになっています。
なお、以下の説明で、「ON」は38kHzで赤外線LEDを点滅する状態です。「OFF」は赤外線LEDを消灯している状態です。
- T(変調単位) = 400usec
- リーダー部、アドレス部、データ部、チェックサム部、終了部の5パートを1セットとして通信を行う。(「通信フォーマット:全体」を参照。)
- リーダー部は、8T(3200usec)の間ON→4Tの間OFFにする。
- アドレス部、データ部、チェックサム部では、送信データに応じて変化する。このとき、「1Tの間ON→1Tの間OFF」でbit値0を、「1Tの間ON→3Tの間OFFでOFF」でbit値1を表す。(「通信フォーマット:ビットデータ」を参照。)
- アドレス部は4bit、データ部は8bit、チェックサム部は4bitのデータを送信する。下位bitから先に送信する。(上図のケースでは、アドレス部は8(=1000b)を、データ部は4を、チェックサム部は12を送信している。)
- アドレス部は「どの受信機に対して」の送信であるかを示すための値であり、0~15の値である。
- データ部は送信したいデータの値であり、0~255の値である。1セットの送信では1byteのデータを送信することができる。
- チェックサム部はチェックサムによって受信データが正しいことをチェックするための0~15の値である。この値は、$$アドレス部の4bit値+データ部の上位4bit値+データ部の下位4bit値$$の値とする。3つの合計が15を超える場合は、0~15の値になるように下位4bitをチェックサム値とする。
例えば、アドレスが1、データが20(0x14)ならチェックサムは\(1+1+4=6\) になる。アドレスが1、データが31(0x1F)ならチェックサムは1になる。(\(1+1+15=17\)の下位4bitで1) - 終了部は1Tの間ONにする。
- リピートは無し
NECフォーマットに比べると、1セットで送信できるデータ量は変化ありません(1byte送信できる。)今回作ったリモコン戦車を操作する場合は1byteの情報で足りていますが、もしそれ以上のデータを送信したいなら、アドレスを変えて送信することで最大16byteまでは送信可能です。(ただし、16セットの送信になるので、送信次回はかかりますが。)
アドレス部の送信は、今回のリモコン戦車を作るうえでは過剰なのですが、別の装置(2byte以上のデータ送信が必要になるかも知れない)を作る時に再利用することを考えて、送信することにしました。
送信時間を比べると、リーダー部の送信にかかるターン(T)数は半分です。アドレス部などのビットで送信する情報も16ビットしかなくこれも半分にしています。また1T当たりの時間も562usecから400usecに減らしていますので、1セットを通信するためのかかる時間はNECフォーマットの30~40%ぐらいになっています。
コメント