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

22 May 2016 — Written by Aki
#ソフトウェア#赤外線リモコンコントロールアンプ#電子ボリューム

一般的な日本の赤外線リモコンのフォーマットは以下の3つのようです。

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

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

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

[概略フォーマット]
まず、赤外線のリモコン信号はリーダ・コードから始まります。
その後に16ビットのカスタム・コード、8ビットのデータ・コード及びその 0/1を反転したコードが8ビット続き、 最後にストップ・ビットがきます。

[リーダ・コード]
リーダ・コードは 9msの期間 on状態が続き、その後に 4.5msの期間 off状態となります。
この部分はその後のデータ部分とは波形 (時間) が大きく異なるので、 容易にリーダ・コードであることを識別できます。
(リピートの場合 off期間が 2.25msでその後のカスタム・コードやデータ・コードが省略され、 直ぐにストップ・ビットとなります。)

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

FAQ 1007798 : 赤外線リモコンの信号はどうなっているのですか?
ルネサス エレクトロニクス株式会社
https\://ja-support.renesas.com/knowledgeBase/17796063

赤外線リモコン信号を見てみる

入力ピンのHi/Loの変化を経過時間とともに取り込む方法ではなく, このソフトウェアでは0.56ms毎に入力ピンのHi/Loをサンプリングしています。
ソフトウェアは24サンプルまでのリーダーコードでNECフォーマットを確認してから, 25サンプル以降は Hi(1)の後のLo(0)の数を数えてデコード します。

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

東芝製テレビのリモコンで電源ボタンの信号を受信した本物のデータを無くしたので, かわりに説明用にOctaveで作った画像をおいておきます。

この画像のデーターは生成につかったmファイルに書かれた通りに以下のリモコンコードです。

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

  • カスタムコード
    0xBF40(株式会社 東芝)

  • データーコード
    0x12(電源)

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

赤外線リモコン信号を受信する

赤外線受信モジュールの出力ピンがHからLに変化したら受信開始

  1. 赤外線受信モジュールの出力ピンがHからLに変化したときに
    (赤外線リモコン受信モジュールは負論理なので送信側信号とは論理が反転します) になるとAVRのLレベル割り込み機能によって割り込みベクタに処理が移ると同時にフラグを立てる。

  2. Lレベル割り込みベクタで0.56ms毎のタイマー起動(パルス幅のほぼ中央をサンプリングするため, 初回は倍速で割り込むようにする)

  3. タイマー割り込みベクタで赤外線リモコン受信モジュールから読み込む
    オーバーフローまたはストップビット検出でタイマー停止とフラグのクリア

  4. 読み込み終了フラグが立っていたら, サンプリングした値を随時デコードする

赤外線受信の終了

各々の流れ

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

charの配列でなくビットの配列を使う

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

108ms0.56ms=193bit=24byte\frac{108ms}{0.56ms} = 193bit = 24byte

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

© 2020 Built with GatsbyStarter created by panr

このサイトに書かれた内容によって生じた損害等の一切の責任を負いかねますので, 予めご了承ください。