MAXQ®ベースの「学習」リモコンの作成方法
要約
コンシューマ向けエンターテイメント機器の赤外線(IR)リモコンは、世界中の家庭につきものと思えるほど氾濫しています。しかし、マイクロコントローラMAXQ2000と数個の安価な部品を使用することによって、他のリモコンのコードを「学習」して要求に応じてそれらのコードを再生するリモコンを作成することが可能です。
概要
単純な赤外線(IR)リモコンは、多くの家庭で重要な地位を確保しています。その理由は簡単です。現代の家庭に普及している様々なエンターテイメント機器を、リモコンで自由に操作することができるからです。世界各地の番組を呼び出し、複数のソースから音楽を聴き、オーディオおよびビデオメディアを再生し、さらに(そうしたければ)後で見るために番組を保存しておく、これらすべてを居心地の良いお気に入りの部屋から行うことが可能です。
しかし、IRリモコンの偏在化は1つの問題に発展してきました。ほとんどの家庭では、これらの小さなデバイスが3個、4個、あるいはそれ以上テーブルの上に散らかっています。テレビ用に1つ、ディジタルビデオレコーダ用に1つ、ビデオデッキ用にもう1つ、オーディオ用にさらにもう1つ、しかもこのリストには、ケーブルテレビのSTBや衛星放送レシーバ、分配スイッチ、DVDレコーダ、あるいは我々の注意を引くその他いくつもの機器が含まれていません。
このリモコンの混乱状況に対する解決策になるのが、別のリモコンのコードを記憶する学習リモコンです。学習リモコンを「学習」モードにしておき、第2のリモコンが、たとえば音量アップなどのコマンドを送信する方法を学習リモコンに「教える」のです。その後は、該当するボタンが押されるたびに、教わったコマンドを学習リモコンが送信します。
このアプリケーションノートでは、マキシムのRISCマイクロコントローラMAXQシリーズの1つであるマクロコントローラMAXQ2000を核としてそのような学習リモコンを作成する方法を示します。しかし設計の詳細に入る前に、若干の背景知識に触れておく必要があります。
画像の拡大(PDF, 388kB)
光による制御
最初のテレビ用リモコンは、Zenith®のSpace Commanderです。これは、機械的な仕組みを使用して、作動時に特定周波数の超音波を発生するものでした。音叉を思い出してください。音叉をたたくと、一定の、予測可能な周波数で振動します。理論上は、音叉が放出する音波を受信して、何かの動作の命令として解釈することが可能です。この初期のリモコンは完全に機械式であったため、バッテリは不要でした。しかし、利用可能なコマンドは、テレビのオン/オフ、チャネルアップ、チャネルダウンの3つだけでした。
半導体デバイスの価格が低下し、より一般的になるにつれて、リモコンの仕組みとして超音波よりもIR光が選ばれるようになりました。最も単純なIRリモコンシステムは、変調された赤外線ビームを送信するハンドヘルドユニットと、変調された赤外線を受信して変調内容を(通常は何かの動作を実行するコマンドとして)解釈するベースユニットで構成されます。しかし、技術上の実現可能性、物理的な現実、および市場ニーズの3つの条件が重なるため、この動作の詳細は決して単純ではありません。
周囲がIR放射で満たされているという厳しい現実の中で、何か簡単な変調方式で放射エネルギーの雑音越しに識別が可能になることを期待するのは非現実的です。熱を発するものは、すべてIR放射も発します。たとえば白熱電球からは、可視光よりも多くの赤外線が放射されています。人体でさえ赤外線を放出しています。このため、ほとんどのIRリモコンの送信機は、データに応用する前に低周波数のキャリア(通常は28kHz~60kHzの範囲)で光線に変調をかけます。
一定の周波数で光線を変調することによって、一般的な家庭環境における他のすべての干渉IR放射の中からの検出が容易になります。単純なバンドパスフィルタを使用して、IR信号の分離と解釈を行うことができます。この目的のために、IRフォトダイオードとバンドパスフィルタの両方を内蔵した安価なICが数多く存在しています。
そのような変調された光線を生成するのは簡単です。赤外線を放射するLEDデバイスは一般的で安価なものであり、適切な発振器でIR LEDを駆動するだけで変調された光線を生成することができます。図1は、変調と、IR変調されたデータの受信とを行うことのできる回路です。
図1. 電気信号が、変調されたIRビームに変換され、再び電気信号に戻されます。送信機の到達範囲を拡大するために、PNPドライバが使用されています。各部品の値は、選択したIR LEDに合わせて調節します。
変調されたLED光源およびソースと同じ周波数で動作するレシーバICがあれば、リモコンシステムの出発点が揃ったことになります。LED回路が動作しており、レシーバの受信範囲内にあるとき、レシーバの出力がアクティブになります。必要な動作がそれだけ(外部回路の単純なオン/オフ制御)であれば、これで作業完了です。
しかし、オン/オフ制御だけでは十分ではありません。たとえ単純なリモコンでも、音量アップとダウン、チャネル選択、入力ソース選択、そして恐らく個別の数字など、様々な種類のコマンドを送信することができるはずです。そのため、何かそれ以外のもの、変調された光線にさらに「変調」をかける方法が必要になります。話が興味深くなるのはここからです。
IRリモコンが広く採用され始めたのに伴って、各メーカはそれぞれ独自の方法で光線の変調を行うようになりました。そのすべてがディジタル制御(すなわち、変調された光線の特徴によってディジタルの「1」または「0」ビットを表現する方式)を使用していましたが、細かい点は大幅に異なっていました。単純な非ゼロ復帰(NRZ)変調を使用したものもありました。また、パルス幅変調(PWM)の形式を使用して、長いパルスで1つの状態を表し、短いパルスでもう1つの状態を表すものもありました。さらに、オンからオフへの遷移で1つの状態を表し、オフからオンへの遷移でもう1つの状態を表すという、2相変調の形式を使用したものもありました。この混乱した状況は現在に至るまで続いており、任意のメーカ製の機器を操作することができる汎用リモコンの作成が非常に大変な作業になっています。
設計上の変数
汎用学習リモコンの設計に当たっては、キャリア周波数、ビットフォーマット、およびフレームフォーマットという、3つの変数について考慮する必要があります。
キャリア周波数
キャリア周波数とは、光線の変調を行う周波数のことです。実際のビットレートとは無関係です。それぞれのシステムごとに一定の周波数であり、およそ28kHz~60kHzの範囲ですが、ほとんどのものは36kHz~38kHzで動作します。
ビットフォーマット
ビットフォーマットとは、システムが「1」と「0」のビットを区別する方法のことであり、メーカごとに大きく異なる可能性があります。一部のシステムでは、「発光オン」期間の長さが決定要素になっています。Sony®が製造しているシステムには、1100µsの「発光オン」パルスを使って「1」ビットを示し、550µsの「発光オン」パルスで「0」ビットを表すものがあります。パルス間のスペースは常に550µsです。
別のビットフォーマットでは、「発光オン」のパルスを一定に保ち、その固定幅パルス間のスペースを変化させます。松下(Panasonic®)製のシステムの中には、800µsのパルスを定常的に放射しながら、2400µsのパルス間スペースという形で「1」ビットを、800µsのパルス間スペースで「0」ビットを表すものがあります。
最も広く使用されているコード体系の1つが、PhilipsのRC-5コードです。このコードでは、889µsにわたって連続する変調された光線と、889µsのスペースによって各ビットセルが構成されます。「発光オン」期間の後に「発光オフ」期間が続く場合、そのビットセルは「1」を表していると考えます。「発光オフ」期間の後に「発光オン」期間が続く場合は「0」を表すと考えます。RC-5システムでは、各フレームの先頭に2個の「1」ビットを強制的に入れることによってビットの同期を保証しています。図2に各種のビットフォーマットを示します。
図2. IRリモコンシステムでは複数のビットフォーマットが使用可能ですが、いずれもキャリアによって光線に変調をかけた上で、いくつかの方法の1つを使用してキャリアを変調するという処理を含んでいます。
フレームフォーマット
ビットフォーマットが決まったら、設計者はフレームフォーマットを決定しなければなりません。多くの場合、これは同期パルス(通常は一般のデータパルスより少し長いパルス)と、その後に続く特定フォーマットのデータビット群で構成されます。データは通常、希望の機能を伝える「データ」部分と、制御対象の機器に対応する「カスタム」部分の、2つの部分で構成されます。そして、あるデバイス用の特定のデータ項目が、別のデバイスでは何か違うものに該当する場合があります。
一部のコードでは、各フレームについて情報を2回送信します。1回は通常のモードで送信し、もう1回はビットの向きを反転させます。こうすることで、初歩的なレベルのエラーチェックが実現されます。2つのコピーが一致しない場合、そのコマンドは無効と見なされます。
1つのフレームが送信された後、通常は何度も送信が繰り返されます。一般的なフレーム繰り返し速度は、およそ毎秒10~20フレームの範囲です。少数ですが、コードを1回だけ送信して、その後に「キー押下」のコードを繰り返し送信するプロトコルも存在します。この記事で説明するシステムでは、繰り返されるフレームのそれぞれにデータコードとカスタムコードが格納されていることを前提にしているため、それらのプロトコルは対象外になります。
最後に、RC-5プロトコルを含むいくつかのプロトコルでは、キー押下ごとにビットの反転を行います。これによって、受信中にギャップが発生したとき、それが信号の喪失によるものか(たとえば誰かがリモコンとベースユニットの間を通った場合など)、それとも実際に第2のキーが押されたことを示すものかを、容易に判別することができます。この機能は、今回のプロジェクトでは実装していません。
汎用性の追求
以上の議論を踏まえると、汎用学習リモコンが仕事を達成するためには、これらのビットフォーマットのそれぞれについて知っている必要があるように思えます。結果として生成されるデータセットのサイズが問題になる場合は、確かにその通りです(一般的なIRリモコンのメッセージは、数十ビットの長さしかありません)。しかし、メモリが比較的安価であることを考えると、単に入力ビットストリームをサンプリングして、そのサンプルを記録するという方法を使うことができます。
したがってこのプロジェクトの場合、実はビットフォーマットやフレームフォーマットは重要ではありません。それは、このシステムが単に受信した内容を記録して再生するためです。対象のシステムについて不可知の立場を維持することで、真の汎用性が保証されます。
受信と記録
レシーバ回路は単純そのものです。VDDにプルアップされたフォトトランジスタが入力回路を形成しており、マイクロコントローラMAXQ2000の入力端子にじかに接続することが可能です。特別なレシーバICは不要であり、むしろ望ましくありません。通信距離は重視しておらず、それよりもキャリア周波数に関係なく実際の変調エンベロープを記録することを目的としています。
フォトトランジスタを飽和モードで動作させることで、小さな問題が生じます。フォトトランジスタは、特に高速なデバイスというわけではありません。完全なオン状態から完全なオフ状態への回復時間は、ほとんどのシステムのビット時間より長くなっています。そのため、光信号の量が多すぎるとフォトトランジスタが飽和します。キャリア周波数を完全に見失い、変調波形の輪郭のみに追従することになります。しかし、信号量が少なすぎると、認識可能な波形がまったく存在しなくなります。図3に、これらの条件を示します。
図3. IR信号の受信時には、適正な信号強度であることが必要です。信号強度が高すぎると、フォトトランジスタが飽和してしまい、信号の低周波数部分だけが検出されます。信号強度が低すぎると、キャリア周波数が検出スレッショルドに達しなくなります。
したがって、マスタリモコンと学習リモコンの間を正確に適切な距離にすることが極めて重要です。しかしその距離はどのくらいでしょう?それを決定するために、学習リモコンのソフトウェアは若干の事前サンプリングを行って、距離が適切かどうかを判断します。記録を開始する前に、学習リモコン(すなわちマイクロコントローラMAXQ2000)は入力チャネル上の遷移を示す信号をサンプリングします。信号が存在しない場合、信号レベルが低すぎるものと判断して該当するLEDを点灯します。一方、マイクロコントローラ搭載リモコンが入力チャネル上の遷移を検出しているにも関わらず、100µs以下のパルス(キャリア周波数は10kHzより高いと想定することが可能)が見つからない場合は、信号レベルが高すぎるものと判断して別のLEDを点灯します。最後に、「オフ」期間で区切られた一連の高速パルスをマイクロコントローラが検出した場合は、信号レベルが理想的である、すなわち「スイートスポット」を捉えていると判断します。その場合、学習リモコンのコードは記録状態に移行します。
記録状態では、いくつかのことが行われる必要があります。マイクロコントローラ搭載リモコンは、キャリアの受信周波数を判定しなければなりません。マイクロコントローラは16MHzで動作しており、キャリアの周波数は(最高でも) 60kHzであるため、キャリア周波数を精密に測定することが可能です。4個のサンプル(立下りエッジから立下りエッジまで)を積算します。そして結果を8で割ることによって、ハイ期間とロー期間の時間を決定します。
次に、レシーバは10msより大きな送信ギャップの探索を開始します。どのプロトコルも同一コードの繰り返し送信の間にギャップを挿入するようになっており、またどのプロトコルも単一のコード内に約1msを超えるギャップが存在することを許していません。ギャップを発見することで、レシーバにはそこがコードシーケンスの始点であることが分かります。これで記録を開始することができます。
コードの記録に当たって、マイクロコントローラ搭載リモコンはキャリアがオンになっている時間を積算します。キャリアの消失を検出すると、今度はキャリアがオフのままになっている時間を積算します。その結果、必要なときに信号の再生に使用することができるオン/オフ時間のベクトルが得られます。
このプロジェクトはデモ用であり、完成された製品ではないため、これらのオン/オフ時間のベクトルを揮発性のRAMに格納します。実際の製品では、ソフトウェアサブルーチンによってこれらのベクトルを不揮発性メモリ(EEPROMなど)にコピーすることになるでしょう。
再生
ボタンのプログラミングが終わった後、CPUはスリープモードに入ります。このモードでは、レジスタとRAMの内容は維持されますが、CPUクロックは停止します。割込み(またはリセット)だけがCPUのウェイクアップを行うことができます。
ボタンが押下されるとCPUがウェイクアップされ、入力ポートをスキャンしてどのボタンが押されたのか判断します。次に、そのボタンに該当するコードを再生する方法についての指示が格納されているRAM内のベクトルにアクセスします。
RAMベクトルは、オン/オフサイクルの回数が含まれたヘッダ、キャリアの周波数を示す値、および各オン/オフサイクルのオン時間とオフ時間を表す値ペアのシーケンスで構成されます。ヘッダ内の最初の値(オン/オフサイクルの数)を、ループカウンタレジスタ(LC1)に格納します。この値をカウンタレジスタに保存することによって、すべてのサイクルの値について容易にループを行うことができます。
ヘッダ内の第2の値(キャリア期間)は、スケーリングした上で保存しておきます。IRオン時間には、この値を別のループカウンタレジスタ(LC0)にロードします。MAXQ2000はシングルサイクルコアであるため、プログラムループによるタイミングを完全に信頼することができます。したがって、ハイ期間に相当する4命令サイクルのループを実行した後、ロー期間に相当する4命令サイクルのループを実行することによって、キャリアを生成することができます。このようにして、オン期間のループとオフ期間のループを交互に実行する形で、実行が継続されます。
もしタイマがなければ実行経路はこの位置にとどまって、一定時間IR LEDを点灯し、一定時間オフにすることによってキャリアを生成し続けることになります。個々の半ビット時間について、MAXQ2000のタイマチャネルの1つに書き込む値がベクトルに格納されています。タイマの分解能が約2µsになるように、タイマは32分周モードで動作させます。
半ビット時間の先頭ごとに、その時間の長さがタイマにロードされます。そして、プログラムコードがIR LEDの点滅を行うか(オン期間の場合)または単にIR LEDをオフのままにしておくか(オフ期間の場合)のいずれかを行っている間、ビット時間が経過したかどうかを判定するため、タイマが頻繁にチェックされます。
半ビット時間が経過した後、ループカウンタレジスタ(LC1)がデクリメントされ、0になったかテストされます。0でない場合は、まだ送信すべきビットが存在するため、ループの先頭に分岐します。それ以外の場合はボタンをチェックして、まだ押されているかどうかを調べます。ボタンがまだアクティブである場合は、サイクル全体(ベクトルからの初期値の読取りとカウンタの再初期化)が再び開始されます。それ以外の場合は、次のボタンが押されるまでCPUがスリープモードに戻ります。
基本的なリモコン動作の拡張
これで実際に動作する学習リモコンができたわけですが、このリモコンにはボタンが2個しかありません。この設計に対する最も自明な拡張として、さらにボタンを増やすことが考えられます。それらのボタンの増設は、少数のハードウェア追加を伴う単純明快なプロセスです。CPUがアイドル状態のとき、すべての行ドライバが「1」状態を出力するようにセットします。すべての列をソフト(すなわち高抵抗)プルダウンすることによって、アイドル状態の間はそれらの入力がローに保たれます。ユーザがいずれかのボタンを押下すると、該当する列がハイに駆動されて、CPUがウェイクアップされます(図4)。その後CPUが1度に1つの行ずつ各行をハイにセットすることによって、ボタンが位置する行と列を判定することができます。
図4. キーを追加してプロジェクトを補強するには、任意のキーの作動によってプロセッサの割込みが発生する必要があります。スリープモード時には、ソフトプルダウン抵抗によってすべての列ラインがローに保たれ、すべての行ラインがハイに駆動されます。いずれかのキーが押下されると列ラインがハイに駆動され、プロセッサがウェイクアップされて行スキャンのプロセスが開始されます。
第2の拡張案としては、MAXQ2000の時刻クロックペリフェラルを使用してCPUをウェイクアップして、プログラムされた一連のIRコマンドを特定の時刻に実行することが考えられます。時刻クロックは、バッテリの電力で長時間動作するよう設計された低消費電力のペリフェラルです。MAXQ2000がスリープモードの間、高周波数のクロックは停止しますが、時刻クロックは動作を継続しています。このクロックは、時刻または経過時間に基づいて割込みを生成してCPUをウェイクアップすることができます。たとえば、時刻クロックでCPUをウェイクアップして、リモコンからケーブルテレビや衛星放送のSTBにコマンドを送信した後、さらにVCRやPVRにコマンドを送信して番組の録画を開始することが可能です。番組が終わる時刻に再びCPUをウェイクアップして、録画を終了することもできます。
第3に考えられるのは、MAXQ2000をPCに接続することです。それによって、PCをプログラミングステーションとして使用することが可能で、プログラミング情報をWebからダウンロードして汎用リモコンに自動的にロードするというような発展性も生まれます。
このように、少数の外付け部品と簡単なソフトウェアによって、高度なマイクロコントローラであるMAXQ2000が汎用学習リモコンの核になります。
同様の記事が、「Circuit Cellar」誌の2007年12月号に掲載されています。
著者について
この記事に関して
製品
{{modalTitle}}
{{modalDescription}}
{{dropdownTitle}}
- {{defaultSelectedText}} {{#each projectNames}}
- {{name}} {{/each}} {{#if newProjectText}}
-
{{newProjectText}}
{{/if}}
{{newProjectTitle}}
{{projectNameErrorText}}