赤外線リモコンでコントロール

赤外線リモコンのフォーマット

  • NECフォーマット
  • 家電製品協会(AEHA)フォーマット
  • SONYフォーマット

この中で手持ちの赤外線リモコンがNECフォーマットのリモコンだったので, このソフトウェアはNECフォーマットの赤外線リモコンを対象にします。

概略フォーマット
まず、赤外線のリモコン信号はリーダ・コードから始まります。
その後に16ビットのカスタム・コード、8ビットのデータ・コード及びその 0/1を反転したコードが8ビット続き、 最後にストップ・ビットがきます。
リーダ・コード
リーダ・コードは 9msの期間 on状態が続き、その後に 4.5msの期間 off状態となります。
この部分はその後のデータ部分とは波形 (時間) が大きく異なるので、 容易にリーダ・コードであることを識別できます。
(リピートの場合 off期間が 2.25msでその後のカスタム・コードやデータ・コードが省略され、 直ぐにストップ・ビットとなります。)
送信データ
カスタム・コードやデータ・コードの部分が 0/1のデータを含む部分です。
各部分はその下位ビットから順に送信されます (送信順は後述の[データ転送順序]を参照)。

また、0/1の区別は赤外線の有無ではなく、 ビットの長さ (つまりは、赤外線が出されていない期間の長さ) で区別するようになっています。
従って、カスタム・コード部分の長さはそのデータにより変化します。
ただし、データ・コードについてはその反転データも送信するので、 この部分でのトータルの 1の個数は 8つとなり長さは固定になります。

FAQ 1007798 : 赤外線リモコンの信号はどうなっているのですか?

詳細はリンク先へどうぞ。

赤外線リモコン信号をサンプリング

入力ピンのHi/Loの変化を経過時間とともに取り込む方法ではなく,
このソフトウェアでは0.56ms毎に入力ピンのHi/Loをサンプリングしてます

東芝のテレビリモコンで電源ボタンの信号を受信したデータを無くしたので,
説明用にOctaveで作った画像をupしときます。

赤外線信号(NECフォーマット赤外線信号)

NECフォーマット赤外線リモコン信号
NECフォーマット赤外線リモコン信号

24サンプルまでのリーダーコードでNECフォーマットを確認してから,
25サンプル以降は見たままHi(1)の後のLo(0)の数を数えてデコードします。
この画像のデーターは生成につかったmファイルに書かれた通り,以下のリモコンコードです。

赤外線リモコン信号フォーマット

NECフォーマット

カスタムコード

0xBF40(東芝)

データーコード

0x12(電源)

リピート信号(NECフォーマット)

NECフォーマットの赤外線リモコン
NECフォーマットの赤外線リモコン信号(リピート)

20サンプルまでのリーダーコードでNECフォーマットのリピート信号を確認します。

赤外線リモコン信号の受信の流れ

  • 赤外線受信モジュールの出力ピンがHからLに変化したとき(赤外線リモコン受信モジュールは負論理なので送信側信号とは論理が反転します)
    になるとAVRのLレベル割り込み機能によって割り込みベクタに処理が移ると同時にフラグを立てる。
  • Lレベル割り込みベクタで0.56ms毎のタイマー起動(パルス幅のほぼ中央をサンプリングするため, 初回は倍速で割り込むようにする)
  • タイマー割り込みベクタで赤外線リモコン受信モジュールから読み込む
    オーバーフローまたはストップビット検出でタイマー停止とフラグのクリア
  • 読み込み終了フラグが立っていたら, サンプリングした値を随時デコードする

赤外線リモコン受信開始はLレベル割り込み機能で行なう

13.2 Register Description – ATmegaデーターシート
を参考にして, 赤外線リモコン受信開始はAVRのINT1, Lレベル割り込み機能を使って実装します。
ここで EICRAレジスタにISC11 = 0, ISC10 = 0, EIMSKレジスタにINT1 = 1
と書き込んでINT1, Lレベル割り込み機能を有効にします。
INT1割り込みベクタ
内ではAVRのTIMER0割り込み機能を有効にします。

リモコン受信モジュールからの入力をサンプリングする

AVRのTIMER0割り込み機能を割り込み周期0.56msに設定して
リーダーコード異常検出, ストップビット検出, タイマアウト検出まで
TIMER0割り込みベクタ
で繰り返しサンプリングします。

赤外線リモコン信号受信終了後のデコード

フレームデコード処理の中で

  • フレーム先頭から24Tのリーダー部分でNECフォーマットのリモコンであることを確認
  • 25T以降のデーターは
    Hiの後に2回Loが続くなら1
    Hiの後に1回Loなら0
    とデコードします。
  • 必要なデーターが得られたらデコード終了

(T = サンプリング周期 = 0.56ms)

charの配列でなくビットの配列

NECフォーマット赤外線リモコン信号1フレームの0.56ms毎のH/L(1/0)2値の情報は

\[\frac{108ms}{0.56ms} = 193bit = 24byte\]

ですが, これをそのままchar型配列に入れると193byteを確保しなければならないので,
2kbyteしかない貴重なSRAM領域を節約するためにchar変数に8ビットを入れるビットの配列を用意しました。
ここがビットの配列ですが, 使わなくても赤外線リモコン信号受信はできます。

コメントを残す

メールアドレスが公開されることはありません。

This site uses Akismet to reduce spam. Learn how your comment data is processed.