TeamKNOx WEB-Site

赤外線リモコン(GBC専用)
GB-REMCON
学習リモコンの使い方
レポート
動作原理
<戻る
<<戻る
  • 学習リモコン GBC ONLY !!

    GB-REM.ZIP (37KB)
    REPROT WARE !!!

    GBC が持つ赤外線機能を利用した学習リモコンです。


  • 学習リモコンの使い方

    GB-REM PLAY 起動画面になります。実際にリモコン信号を再生する場合は指カーソルを画面上のそれぞれのボタンに持っていきGBCのAボタンをクリックします。受け手側の角度にも寄りますが、信号の到達距離は2〜3m程度になります。日本の家屋ならほぼ問題にならない距離です。Bボタンをクリックすることでエンコードしたデータを再生することが出来ます。

    GB-REM REC 信号の学習を行います。覚えさせたいボタンに指カーソルを移動してAボタンをクリックします。GBC上部に付いている赤外線の窓に向かって信号を送ります。

    GB-REM DUMP 学習した信号の内容を表示します。生データを表示します。「Send to PC」ボタンをAボタンでクリックすることにより 9600bps パリティ無し ストップビット1のフォーマットでPCへIrの生データをカンマ区切りの形式で転送することが可能です。Bボタンでは GB-fREMe のCのソースリストを同様にPCへ出力します。

    GB-REM 生データをエンコード(1種の圧縮)した状態のデータを表示します。これもDUMPと同様にAボタンでデータ、Bボタンで GB-fREMe のソースリストを出力します。こちらはエンコードした形での出力になります。

  • レポート

    Extract DATA データの吸出しはGBCのIrポートとIrDA(Irタワー)の窓を対向させて行います。
    GB-REM DUMP

    ビルド20000318から学習したデータを赤外線ポートから出力できる様になりました。この機能のおかげでレポートの作成が数段楽になります。対応ポートはIrDAポートかLEGOのマインドストームスのIrタワーです。シリアルCOMにIrタワーをWindowsのターミナルソフトを立ち上げます。IrタワーではPCのキーを何か押した後にIr窓(IrDAあるいはIrタワー)に向かって「DUMP」中の「Send to PC」ボタンに指カーソルを合わせてAボタンを押します。IrDA にするかIrタワーを使うかはビルド時にソースリスト中で設定します。

    DUMPの内容を下記のEXCELシートにコピーしてメールしてください。 EXCELなどのスプレッドシートプログラム(表計算プログラム)はTABで区切りのが一般的ですが、TAB区切りですと通信ソフトでうまく受信できないと言う問題が出ました。そこでカンマでの区切りをK.I.氏が提案され実装されることになりました。(素晴らしい…提案と実装が同時に行われる。)「データ -> 区切り位置」でカンマを設定します。これにより2回目以降からEXCELを終了するまでこの設定で使えるようになります。
    レポート例(生データ)
  • 動作原理

  • GBC の Irポート
     GBCのIrポートは極めて原始的でIrの受光素子が入力ポートに、発光素子が出力ポートにそれぞれ接続されています。つまり、Irの信号の受信は入力ポートの状態(ステータス)を見ることになります。一方、出力はそれぞれのパルスの0/1に応じて出力ポートを0/1にするかどうかで決まります。ここまでが予備知識となります。では実際に信号を受信するにはどうすれば良いかを考えてみます。この入力ポートを一定間隔で監視することになります。(これをサンプリングと言う)。また、出力の場合はこの一定間隔(先ほどのサンプリングですね。)で記録した信号の有無を再現することになります。

  • サンプリングレートの決め方
     サンプリングとは基本的に信号の有無を調べることになります。つまり、サンプリングレートを細かくすればするほど精度の高いデータが取れるわけですが、その分多くの記憶容量(RAM)が必要になってきます。よっていくらでも高く出来るわけではありません。どこかで精度と記憶容量のバランスを取らなければいけなくなってきます。これを「トレードオフ」とか「落し所(オトシドコロ)」とか言います。(「アチラを立てればコチラが立たず」のバランスを取るわけですね。)また、ある信号をサンプリングするときは変化する信号の2倍以上の周波数(速さ)でサンプリングしなければいけない事が分かっています。(これを「サンプリング定理」と言う。)一般的なリモコンの場合はPulsePositionModulation(以下、PPM)と言う方法で定義されています。このときの0/1はそれぞれ、0.56ms/1.125ms,0.56ms/2.25msになっています。まず、サンプリング定理で照らし合わせると0.56msが最小単位ですから0.28ms以上の速度でサンプリングしなければいけないことになります。ただ、あくまでもこれは必要最小限の速度です。一般にはもう少し早くサンプリングしなければなりません。また、ここでもう一つ考慮しなければいけない問題が出てきます。CPUの処理速度です。これ以上は言わなくても分かるかと思いますが、CPUの処理速度以上のサンプリング速度は絶対に不可能です。以上の点を考慮して(落し所として…)0.1msにします。(この辺の具体的な決め方が技術者としてのセンスであると考えます。)

  • 実際のサンプリング
     サンプリングレートまで決まりましたので後は実際にデータを取ることを考えてみましょう。一つのリモコンの動作の大きさはパルスの長さの合計で決まってきます。今回の例で考えると75ms程度までの大きさになります。まず、単純に考えると75ms/0.1ms=750となります。0/1をそれぞれ1バイトに格納すると1動作あたり750バイト必要になります。GBのRAM容量が8KB(8192バイト)であることを考えるとこれでは10個程度のキーしか格納できなくなります。これはあまりうまいやり方とは言えません。

  • データの格納方法
     基本的に受信データは0/1で構成されているのでそこに着目します。例えば図中のリーダーコード部をサンプリングすることを想定します。今回の例ではリーダーコード部は13.5ms(9ms+4.5ms)になります。0.1msでベタにサンプリングした場合は13.5ms/0.1ms=135(バイト)になります。記憶イメージとしては111111…11(90バイト)00000…00(45バイト)と言った感じでしょうか?さて、これを見て気付くかもしれませんね。必ず1から始まるのであれば()の中の文字に着目すれば良いことに…つまり90バイト、45バイトがそれぞれのデータになります。これで135バイトが2バイトになりました。劇的にデータが減ったことになります。もっと一般的な言葉に置きかえると「変化が発生したときにその状態が何サンプリング続いたかを記録すれば良い。」と言う言い方が出来ると思います。つまり、H−90,L−90同様にカスタムコードを見るとH−5,L−5,H−5,L−15…と言えます。つまり変化分の数とその状態がいつまで続くかの表記になると考えることが出来ます。変化分を数えると67バイトになります。

    #1バイトは255になります。つまり、0.1msのサンプリングレートで考えると25.5msまで表すことが出来ます。一つの変化量はこの値を超えないのでここからも0.1msが妥当な値であることがわかります。

  • データのエンコード
     さらにもう一段、解析を進めてみます。今回の例のカスタムコードは機器毎に設定されますので機器が決まれば固定になります。そうなるとリモコンの動作で変化するのはデータコードのみになります。(最後のデータコードは動作をあらわすデータバイトの「1の補数」の関係なので計算で求めることが出来る。)つまり、データコードを除いた部分の信号は全て機器が同じであれば共通になるはずです。リモコンの信号は基本的にはシリアルの信号です。今回の例では4バイトまでにすることができるはずです。そして実際に変化するのはその内の1バイトだけと言うことです。リーダーコード部やリモコンの識別バイト(ヘッダ部)を入れても10バイトも有れば再現できることになります。PPMのビット列を読むことからエンコードは始まります。PPMではLの部分の長さでビットが0/1か判断します。カスタムコードを例に取り、以上の約束事を当てはめてみると01100111となります。さらにもう一つ、ここではH−5,L−5が0、H−5,L−15が1と固定していますが、実際の信号のサンプリングなので±1程度の誤差はつきものです。この辺を考慮してみます。

  • すぐに出来たみたいだけど…
     この様にまとめて書くとすぐに出来たように感じられますが、実際にはかなりの紆余曲折がありました。特に最後のエンコードの部分はなかなか実装するチャンスに恵まれませんでしたが、とりあえず色々考えている内に何とかできました。当初は織田が考え、TeamKNOxのトップコーダーであるN.U.氏が最適化を行いました。最初のルーチンと最適化されたルーチンを示しますので参考にしてください。


頁の先頭
織田裕一へメール


Copyright (C) 1998 - 2004 TeamKNOx