手習ひデジタル信号処理(105) Scilab、comm_tbx、赤外線リモコンの波形

Joseph Halfmoon

ここ数回、NRZとかNRZIとか「バイナリシーケンス」の操作を行ってきました。通常はこのバイナリシーケンスを変調・復調して搬送波に載せたり取り出したりするのがメンドクセーわけです。しかしそこを簡単に済ませている奴を思い出しました。赤外線リモコンのあれね。今回はScilab上で赤外線リモコンのバイナリシーケンスを作製してみます。

※「手習ひデジタル信号処理」投稿順 Indexはこちら

※Windows11上で、Scilab6.1.1およびScilab上のツールボックス Scilab Communication Toolbox 0.3.1(以下comm_tbx)を使用させていただいとります。

赤外線リモコン

今回対象にするのは赤外線リモコンといってもテレビなどの制御に使われているやつです。単方向の通信でテレビのON・OFFやチャンネルの切り替えなどができる皆さまお馴染み?のアレです。歴史をさかのぼれば、

ジーナス(ゼニス)スペース・コマンド

というお名前で60年以上も前に米国ゼニス社(当時の米国のテレビ業界を牛耳っていた?)のテレビに使われたものがその源流の筈。アメリカのご家庭のリビングは広いので、そこのカウチに座ってテレビジョンを見ているときに立ち上がってチャンネルを変えるのがメンドイ、というお客様のご要望にお応えするための発明だった筈。

それがまあ、いろいろあったのでしょう。現在でも赤外線リモコンの通信規格としては、NEC半導体(現在はルネサス)が策定したものが「メジャー」としてて生き残っているようです。今となっては数少なくなってきた日本発祥の電子系の規格か。トホホ。

なおエアコンの赤外線リモコンは別っす。双方向の通信必要で各社難しい仕様であるみたい。

赤外線リモコンの通信フォーマットについては先達の方々がいろいろ書かれています。今回は『elm-chan.org』様の以下のページを参考にさせていたきました。

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

バイナリ数列を赤外線LEDの駆動波形に変換する実験用関数

正しいのか正しくないのかよく分からない関数が以下に。後で実地に確かめてみないとならないか。。。

// generate Ir-remote-control pulses, NEC format (by J.Halfmoon Nov. 3, 2023)
// Fs: 456kHz Fixed, Fsc: Sub-carrier 38kHz, 1/3 duty Fixed
// T: 562us ~ 256 pulses Sub-carrier
// 0: on=1T off=1T, 1: on=1T off=3T
// b: binary sequence (must be 32 bit for NEC format.)
function rcpul=genRCpulse(b)
  scON=cat(1, ones(4, 1), zeros(8, 1));
  sc1=[]
  for n = 1: 256 do
    sc1 = cat(1, sc1, scON);
  end
  sc0=zeros(12*256, 1);
  rcpul=[]
  //generate Leader
  for n=1:16
    rcpul=cat(1, rcpul, sc1);
  end
  for n=1:8
    rcpul=cat(1, rcpul, sc0);
  end
  nSym=length(b);
  for n=1:nSym
    if b(n) == 1 then
      rcpul=cat(1, rcpul, sc1);
      rcpul=cat(1, rcpul, sc0);
      rcpul=cat(1, rcpul, sc0);
      rcpul=cat(1, rcpul, sc0);
    else
      rcpul=cat(1, rcpul, sc1);
      rcpul=cat(1, rcpul, sc0);
    end
  end
endfunction

1フレームは32ビットの固定長で3つのフィールドからなるようですが、上記の関数はデータ長のチェックなどもせず、与えられただけのビット列をIR波形に変換しちまいます。固定のサンプリング周波数456kHzにて赤外LEDを駆動できるとそれらしい波形になる筈(確かめてないケド。)

波形生成とその結果

1フレームは、Leader部と32ビットのデータ本体からなり、32ビットのデータには、16ビットのカスタマデータ部と8ビットの(ペイロード)データ、そして8ビットのデータのビット反転が載っているみたいです。実験なので例によってprbs()関数で乱数データ作って載せてます。

customerCode=prbs(16);
data=prbs(8);
dataB = bitxor(data, 1);
x32=cat(1, customerCode, data, dataB);
rcNEC=genRCpulse(x32);
plot_binary(rcNEC);
title('Ir Remote Control Pulses, NEC format');

波形のプロット結果が以下にirPulses0

456kHzでサンプリングしているのでデータ的はかなり長いです。上で縦棒一本に見えているところも当然サブキャリアの波形がビッチり詰まってます。拡大していくとサブキャリアの波形が見えますが、そのレベルであると今度は載っているビットはまったく見えず。一応、それらしくはあるけれど、大丈夫か?実機でこの波形が受け入れられるのだかどうだか見てみたいが。

手習ひデジタル信号処理(104) Scilab、comm_tbx、NRZIからバイナリ復元 へ戻る

手習ひデジタル信号処理(106) Scilab、cmp_bits()の代替自前関数 へ進む