なにせ赤外線リモコンを扱うのは初めてですから、どのようなデータが送られているのかなど、知る由もありません。まず、データの解析から始めなければなりませんでした。すぐにCDプレイヤーをばらし、受光モジュールにロジアナを繋ぎ、赤外線受光部からの波形を目視で解析する作業を始めました(*2)。
解析が済んだら、リモコン端子を即9801のプリンタポートに接続し、制御するべくソフトウェアを書き始めました。最初に書いたのは数十行の短いテストプログラムでしたが、コマンドを送信してCDプレイヤーが再生を始めた時の感動は今でも忘れられません。今の私の赤外線リモコンに対するノウハウはこの時に生まれたといっても過言ではないでしょう。
しばらく使用していましたが、リモコンのためにプリンタポートを塞ぐのはプリンタとの共有が出来ないので、マシンを分解して基板に直接半田付けしてしまいました。
次の日、調子に乗ってホットキーによるCDプレイヤー管理ソフトまで書いてしまいましたが、このプロジェクトはこれ以上発展のしようがなく、構想からわずか二日というハイペースでこのプロジェクトは終了したのでした(*3)。
現在、可愛がっていたPC-9801Fは現役を引退して、部室の椅子と化しているので上記の常駐ソフトが動く環境は無くなってしまいましたが、現在進行中の新たなプロジェクトへの重要な第一歩になったことは言うまでもありません。
----注釈----
その当時、パソコンの手頃なインターフェースと言えばシリアルポート(RS-232C) 程度しか無く(*1)、それを使って赤外線リモコンをコントロールするためには RS/CS信号を使用して信号線から直接データを読み書きする事が一般的であろう、と考えていました。
ところが、どう考えたらこうなるのか、データ線を使い同期転送で信号を扱う方法を考え出しました。確か、半分冗談で私が言い出したような気がしますが、論議を進めるうちにこれが冗談にはならなくなってきたのです。
すぐに簡単なテストプログラムを書き、それによって我々の理論が実用に耐えうる物である事が証明されました。その日からハードウェアの開発が始まり、日々の改良が続き現在に至ります。
昨冬にはコミックマーケット(*2)にて販売もしました。お陰様で完売いたしまして、嬉しい限りです。
----注釈----
・キャリア
赤外線にデータを載せるには外部ノイズなどを考慮した上で当然ながらキャリアに送信データを乗せる必要があります。一般に、送信キャリアには 38KHzの方形波が使用されます。
・変調方式
PPM(パルス位置変調)が使われます。パルスが出てから次のパルスまでの間隔で変調する方式です。G-HAL 氏が書いている原稿に詳しく載ってますので、ここでは詳細は省略します。
・データ構造
老舗メーカーが勝手気ままに設計したわけで、各社バラバラです。最近は家電製品協会(以下、家製協)がデータ構造のコンフリクトを無くすために統一規格を設定しているらしいです。
しかし現在、私が調べている限りではまだこの家製協フォーマットは見た事がありません。そのうち一般家電にお目見えする日もくるのでしょうか。
・リーダ
データの先頭に位置する、調歩同期通信で云うところのスタートビットに相当する物です。存在していないメーカーもたまにありますが、大概のメーカーでは存在しているようです。
・トレーラ
データの最終部に位置する、調歩同期通信で云うところのストップビットに相当する物です。リーダと同じく、存在しないメーカーもあります。
・リピータ
キーを押しっぱなしにした状態で、同じデータを送信しつづけるものとリピータと呼ばれる特殊な繰り返し状態を表す信号を送出するものとが存在します。
SONY等は同一データ送信型で、NEC 等はリピータ送信型に分類されます。
・受光モジュールの特性
キャリアである 38KHzのフィルタを内蔵しており、モジュールから出力されるデータは 38KHzのキャリア成分を除去した物が出力されます。さらに、AGC を内蔵しており、外界の赤外線ノイズよりもリモコンからの信号をより優先的に復元する性質を持ちます(*1)。
・電源
電源電圧は +5Vが必要で、シリアルポートの信号線には+10V程度出力されているわけですから、何等かのレギュレータが必要です。しかも、受光モジュールは外来ノイズに弱いので、電源も出来るだけ安定した物を供給するのが理想です。しかし、ツェナーダイオードや一般のレギュレータでは内部消費電力を無視出来ません。シリアルの信号線から電源を供給するには、内部損失の少ないレギュレータを構成する必要があります。
今回は CMOS のレギュレータを使用してレギュレータ内部での消費電力を極力減らすように考慮しました(*2)。
シリアルの信号線は+12V〜-12Vまで振れますから、そのまま接続すると逆電流が流れ、レギュレータを破壊してしまいます。そこで入力側に整流用のダイオードを入れます(*3)。
・シリアルドライバの特性
受光モジュールの信号線は 0V〜+5Vまでしか振ってくれません。しかし一般的なシリアルの受信ドライバチップはこの電圧で正常に 1 と 0 を判別してくれます。今回はこのようなチップの特性を利用して直接接続しています。
・信号線の特性
受光モジュールの信号線の出力インピーダンスが高く、シリアルポートに直接接続した場合、ハイレベルに振りきれません。そこでプルアップ抵抗を入れます。付けてみたら1K〜2KΩ程度が適当なようです。
プルアップ抵抗を入れる事により、0V〜+4.5V 程度に振れるようになります。これだけ振れていれば実用上は全く問題無しです。
・入力性能
赤外線受光モジュールに関しては「さすが民生品…」と唸らずにはいられませんでした。なにせ家電に使用されている物と同じですから、5m程度離れていても余裕で受光出来るのです(*4)。凄いですね。
----注釈----
・LEDの特性
連続許容電流は 100mAですが、duty1%では1000mAもの電流を流す事ができます。
赤外線リモコンのデータは必ずキャリアに乗るため、duty50% 以下になるのは明らかですので、少々無茶をしても大丈夫です。
・LEDの保護
今回は 200mA〜300mA 程度流せるように設計しましたが、プログラムのミスにより電流が流れつづける状態になってはLEDの破壊は明白です。そこでハードウェアでワンショット回路を入れてLEDを保護することにします。
出来るだけ簡単にハードウェアを構成するために、コンデンサと抵抗のみで構成しました。見ての通り恐ろしく簡単です。
・電源
ノートパソコンを使用して外で使う事がまず前提としてあるので、外付電源は無いに越した事はありません。しかしシリアルポートから数百ミリアンペアもの電源を取ろうというのはある意味無謀です。がしかし、今回は電源レスでこだわり通しました。
前ページで述べましたが、シリアルの信号線は-12V〜+12V振れますので、入力側に整流用のダイオードをとりあえず入れておきます(*1)。
・シリアルドライバの特性
電流を取るには内部抵抗がとてつもなく大きいので、電源面には非常に苦労しました。ですが、チャージ用のコンデンサを入れる事によりパルス電流を駆動するには十分といえるほど驚くほどの電流が取れるようになりました。こだわりの成果です。
シリアルドライバは端子をショートさせても壊れないほど頑丈に出来ているので、このくらいで壊れる事はありません。
・LED駆動段
当初、ダーリントン駆動を前提に開発していたのですが、実際に実装してみると周波数特性が悪いのか、いまいち某社リモコンの認識率が良くありませんでした。
いろいろ試行錯誤してみた結果、一石で構成した方が一番良いという事になり、単純に 2SC1815のシングルで構成する事にしました(*2)。
・出力性能
開発当初はLEDを一つだけ使用して構成していたのですが、指向性が強い事と、出力をもう少し稼ぎたいため二つ使用する事にしました。
前述の通り、電流が取れませんので並列にする事は出来ません。しかし電圧を取ることは可能です。直列に接続する事で単純計算で出力が二倍になります(*3)。
これらの試行錯誤の結果、民生用の家電リモコンと同じかそれ以上の出力レベルを得る事に成功しました。信号線からの電源でここまで強力な赤外線を出せるとは思ってもいなかったので、正直言って最初は少々驚きましたが、苦労した甲斐があったというものです。
----注釈----
さらに驚くべき事に、苦労してD-SUB25pinシェルに収めてしまいました(*1)。うーん、ここまでやっちゃうと我ながら感動もひとしおです。我が子のようにかわいいです。物作りの楽しさってこれなんですよね。
回路図を眺めてみると、よくもまぁ、ここまで部品を減らせたもんだとつくづく感心します。開発に関ってくれた水無さんもとい皆さんに感謝。
ちなみに、受動素子の定数はほとんど経験&実測から決定したもので、理論に頼った部分はほとんどありません。理論的に計算したのはLED保護用の時定数ぐらいですかね。ははは。
----注釈----
・調歩同期{送信:内部クロックを使用、受信:内部クロックを使用}
通常はこの調歩同期モードで使用します。送受信時、8251に供給されるクロックを8251内部で16分周することにより、信号のクロックが作成されます。内部クロックはボーレートジェネレータから供給されますから、プログラマブルなボーレートを作成することが可能になるわけです。
信号は、スタートビット、データビット、パリティービット(任意)、ストップビットから成り、任意のタイミングで非同期で転送する事が可能です。
↓start bit ↓stop bit ��┐ ┌─┐ ┌───┐ ┌─┐ ┌───�� データライン └───┘ └─┘ └─┘ └─┘ 0 1 0 1 1 0 1 0・BCI同期{送信:内部クロックを使用、受信:外部クロックを使用}
┐┌┐┌┐┌┐┌┐┌┐┌┐┌┐┌┐┌┐ クロックライン└┘└┘└┘└┘└┘└┘└┘└┘└┘└ ┌─┐ ┌───┐ ┌─┐ データライン��──┘ └─┘ └─┘ └──���� 0 1 0 1 1 0 1 0・ST2同期{送信:外部クロックを使用、受信:外部クロックを使用}
・同期刻時機構{送信:内部クロックを使用、受信:受信データからクロックを作成}
これは同期転送の1種です。通常の同期転送と異なっているのは、受信にクロックラインを必要としない点です。これは、送られてくるデータからクロックを生成するという特殊な事をしているためで、このモードで転送をする際にはある程度の同期転送に関する知識が必要とされるでしょう。わりと遊べそうなネタではあります。
----注釈----
・同期転送ではない!?
でも今回のデータ通信は厳密に云うと同期転送ではありません。本来の同期転送というのは、受信時には相手側の同期信号を使い、それに同期して信号線を読む、という方法です。赤外線モジュールから同期信号が供給されるわけがありません。さてどうしましょう。
答えは簡単、自分の同期信号で相手のデータを読んでやれば良いのです。実はこの方法は PC-9801のハードウェアに大きく依存する部分であり、調歩同期転送モードの時には送信受信共に内部クロックが使用されるという特徴を最大限に生かした方法なのです。
・同期キャラクタ
同期転送には同期キャラクタ(*2)が付き物です。同期転送では、同期をロックした状態でないと正常にデータを取得出来ませんから、ひと工夫が必要です。
これは簡単に、同期キャラクタに FF を設定してやる事で解決します。こうすれば有信号時にデータ先頭から同期がロックし、その後連続してデータを取得する事が出来るようになるのです。なぜ 00 を使わないか?それは送光部との兼合いです。詳しくは次で述べます。
----注釈----
・同期キャラクタ
受光編で同期キャラクタを FF にすると書きましたが、これは送光部において重大な意味を持ちます。シリアルチップはデータが出力されない状態では常に同期キャラクタを送信しつづけます。常に発光ダイオードが光り続けてはまずいのです。
そこで、データ無しの状態を同期キャラクタに設定する必要があります。データ無しの状態、それがすなわち FF だというわけ(*1)。
・データ出力
受信データはキャリアが存在しない状態で格納されていますので、送信する時にはキャリアを生成してやる必要があります。これは受信データを1ビット毎に間引き、ビットを反転させて(*2)送信する事により解決します。
----注釈----
PC-9801 シリーズはシリアルのボーレートジェネレータの都合上、5MHz系と8MHz系に分かれますが、76800bpsというのは同期転送での値(*1)なので、5MHz系と8MHz系で共通のクロックを得る事ができます。
結果として、同期転送なのにクロックは内部同期信号を使う、というトリッキーな方法でシリアルチップを駆動しています。さらに、同期キャラクタを FF にするなどという普通は考えないであろう方法で、シリアルチップを初期化するのです。即ち、シリアルチップを 16bitのFIFOバッファとして使用しているのと同じことになります(*2)。
これらは明らかに8251の予期された使い方ではありませんが、正常に動作してくれます。我々の理論はあくまでも9801の8251でなければ成り立たないのです!(*3)
9801の同期モード切り換えはディップスイッチでやらなければいけませんが、駆動方式としては調歩同期なのでディップスイッチを切り換える必要がありません。考えれば考えるほど、偶然の集合でこの理論は成り立っているのです(*4)。
現時点で開発予定のソフトウェアは、カラオケ選曲システム、タイマー内蔵学習リモコン(*5)、MDタイトル入力システム(*6)、等など。既にベースは完成しているのですが、アプリケーションの域にまで達していないのが実状です。
これらのソフトウェアの出来によりハードウェアの真価が発揮される訳ですが、私個人としては、このハードウェアを製作出来ただけでも満足しています。言い換えれば、技術者としての満足、ですかね。こんなトリッキーな物がよく出来たとつくづく感心しますよ。
----注釈----
例えば現在の赤外線リモコンでは、ある機器の電源を入れたい場合に、その機器の電源が入っているかどうかを確認する手段がありません。既に電源が入っていた場合は、電源を切ってしまう可能性だってあるわけです。これでは不便ですね。
というわけで、私は「赤外線双方向リモコン」の規格化を提唱します。リモコンからデータを送り、それに対して本体側からアクノリッジを返す。これだけでも赤外線リモコンの可能性は無限に広がってゆくのです。
「窓で動くアプリを作れば規格化されるだろう。でも窓で動かなければ絶対に売れないし、規格化もされない。」と誰かが言ってましたが、こういう御時勢が非常に悲しい今日この頃の私です。
赤外線通信。それはあまり高速な通信には向かないものの非常に魅力的な通信方法の一つです。間に物が入ると通信出来ないとか、指向性が強いとか、そういう欠点も多々ありますが、その欠点を補って余りある程の長所は、やはり特筆すべきお手軽さでしょう。巷では電磁波の有害性について騒がれていますが、これに対しても赤外線は基本的に無害です。
IrDAの方も高速通信のための規格が続々と設定されているようですし、今後の赤外線通信のあり方をのんびりと眺めていこうと思います。
なお、今回紹介したハードウェアの管理ソフト(ドライバ、ツール等)に関する解説は別紙にて行いますので、そちらの方も併せてご覧ください。