(57)【要約】【課題】  光通信を高速で、かつ、安定的に実現させる。【解決手段】  ８個×８個のLED７１よりなるLEDアレイ６２のLED７１の各発光パターンの変化によりデータを送信する際、受信側でLEDアレイ６２の個々のLED７１の発光パターンが認識し難くなり、通信状態が悪化した場合、点線で囲むように、近傍の複数のLED７１を同期して発光させることにより、並列的に送信できるデータは減少するが、同期して発光する部分の面積が大きくなることにより、発光パターンが認識しやすくなり、安定した通信を実現させることができる。本発明は、光通信装置に適用することができる。【選択図】      図９
2006191313.tif 000002
【特許請求の範囲】
【請求項１】
2次元平面上に近接して配置した複数の発光装置をそれぞれ点滅させることにより、並列にデータを送信するデータ通信装置であって、
上記データを送信する際の並列度を決定する並列度決定手段と、
上記並列度に応じた個数を単位として、近接する上記発光装置をグループ化するとともに、同一グループ内の各発光装置を同期して点滅させる制御を行う発光制御手段と
を備えることを特徴とするデータ通信装置。
【請求項２】
上記並列度が高いほど、１グループあたりの上記発光装置の個数が少ない
ことを特徴とする請求項１に記載のデータ通信装置。
【請求項３】
上記並列度決定手段は、送信開始時に上記並列度を決定する
ことを特徴とする請求項１に記載のデータ通信装置。
【請求項４】
上記並列度決定手段は、送信中に上記並列度を決定する
ことを特徴とする請求項１に記載のデータ通信装置。
【請求項５】
上記発光装置は可視光を発光する
ことを特徴とする請求項１に記載のデータ通信装置。
【請求項６】
上記データはパケット化されたデータであり、
上記発光制御手段は、１つのパケットが上記1つのグループから時間的に連続して送信されるよう各発光装置の点滅を制御する
ことを特徴とする請求項１に記載のデータ通信装置。
【請求項７】
送信先からのデータを受信する受信手段をさらに備え、
上記受信手段は、2次元平面上に近接して配置した複数の発光装置の点滅により並列に送信されたデータを受信する
ことを特徴とする請求項６に記載のデータ通信装置。
【請求項８】
上記受信手段は、上記送信先での受信状態を示すフィードバック情報を受信するとともに、上記並列度決定手段は、上記フィードバック情報に基づいて上記並列度を決定する
ことを特徴とする請求項６に記載のデータ通信装置。
【請求項９】
上記受信手段は、上記フィードバック情報を任意の時間間隔で受信するとともに、上記並列度決定手段は、上記受信手段がフィードバック情報を受信するごとに上記並列度を決定する
ことを特徴とする請求項７に記載のデータ通信装置。
【請求項１０】
上記フィードバック情報は、送信されたパケット毎の受信状態を示す情報を含む
ことを特徴とする請求項８に記載のデータ通信装置。
【請求項１１】
上記発光手段は、上記送信されたパケット毎の受信状態を示す情報に基づいて、受信が失敗したパケットに対応するグループにおいてはダミーパケットを送信するよう制御する
ことを特徴とする請求項９に記載のデータ通信装置。
【請求項１２】
上記並列度決定手段は、並列に送信したパケットのうち受信が成功したパケットの割合に基づいて、上記並列度を決定する
ことを特徴とする請求項９に記載のデータ通信装置。
【請求項１３】
上記請求項１に記載のデータ通信装置を複数備え、各データ通信装置間で相互にデータ通信を行うことを特徴とするデータ通信システム。
【請求項１４】
2次元平面上に近接して配置した複数の発光装置をそれぞれ点滅させることにより、並列にデータを送信するデータ通信装置のデータ通信方法であって、
上記データを送信する際の並列度を決定する並列度決定ステップと、
上記並列度に応じた個数を単位として、近接する上記発光装置をグループ化するとともに、同一グループ内の各発光装置を同期して点滅させる制御を行う発光制御ステップと
を含むことを特徴とするデータ通信方法。
【請求項１５】
上記並列度が高いほど、１グループあたりの上記発光装置の個数が少ない
ことを特徴とする請求項１４に記載のデータ通信方法。
【請求項１６】
上記並列度決定ステップの処理は、送信開始時に上記並列度を決定する
ことを特徴とする請求項１４に記載のデータ通信方法。
【請求項１７】
上記並列度決定ステップの処理は、送信中に上記並列度を決定する
ことを特徴とする請求項１４に記載のデータ通信方法。
【請求項１８】
上記発光装置は可視光を発光する
ことを特徴とする請求項１４に記載のデータ通信方法。
【請求項１９】
上記データはパケット化されたデータであり、
上記発光制御ステップの処理は、１つのパケットが上記1つのグループから時間的に連続して送信されるよう各発光装置の点滅を制御する
ことを特徴とする請求項１４に記載のデータ通信方法。
【請求項２０】
送信先からのデータを受信する受信ステップの処理をさらに含み、
上記受信ステップの処理は、2次元平面上に近接して配置した複数の発光装置の点滅により並列に送信されたデータを受信する
ことを特徴とする請求項１９に記載のデータ通信方法。
【請求項２１】
上記受信ステップの処理は、上記送信先での受信状態を示すフィードバック情報を受信するとともに、上記並列度決定ステップの処理は、上記フィードバック情報に基づいて上記並列度を決定する
ことを特徴とする請求項１９に記載のデータ通信方法。
【請求項２２】
上記受信ステップの処理は、上記フィードバック情報を任意の時間間隔で受信するとともに、上記並列度決定ステップの処理は、上記受信ステップの処理がフィードバック情報を受信するごとに上記並列度を決定する
ことを特徴とする請求項２０に記載のデータ通信方法。
【請求項２３】
上記フィードバック情報は、送信されたパケット毎の受信状態を示す情報を含む
ことを特徴とする請求項２１に記載のデータ通信方法。
【請求項２４】
上記発光ステップの処理は、上記送信されたパケット毎の受信状態を示す情報に基づいて、受信が失敗したパケットに対応するグループにおいてはダミーパケットを送信するよう制御する
ことを特徴とする請求項２２に記載のデータ通信方法。
【請求項２５】
上記並列度決定ステップの処理は、並列に送信したパケットのうち受信が成功したパケットの割合に基づいて、上記並列度を決定する
ことを特徴とする請求項２２に記載のデータ通信方法。
【請求項２６】
上記請求項１４に記載のデータ通信方法を複数に含み、各データ通信方法間で相互にデータ通信を行うことを特徴とするデータ通信システムのデータ通信方法。
【請求項２７】
2次元平面上に近接して配置した複数の発光装置をそれぞれ点滅させることにより、並列にデータを送信するデータ通信装置を制御するコンピュータに実行させるプログラムであって、
上記データを送信する際の並列度を決定する並列度決定ステップと、
上記並列度に応じた個数を単位として、近接する上記発光装置をグループ化するとともに、同一グループ内の各発光装置を同期して点滅させる制御を行う発光制御ステップと
を含む処理をコンピュータに実行させることを特徴とするプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、データ通信装置および方法、並びにプログラムに関し、特に、光空間通信を高効率で、かつ、安定的に実現できるようにしたデータ通信装置および方法、並びにプログラムに関する。
【背景技術】
【０００２】
次世代の照明用光源として、LED（Light Emitting Diode）が期待されている。LEDは、室内外の照明のほかに、ディスプレイデバイスとして期待されている。さらに、液晶ディスプレイのバックモニタとして活用されつつある。LEDは従来の照明用光源とは異なり、高速な応答特性を持ち、その特性を活かせば、照明光に変調をかけて、情報を発信することができる。
【０００３】
一方、イメージセンサの分野では、CMOS（Complementary Metal-Oxide Semiconductor）イメージセンサが撮像素子として多く用いられるようになり、高速撮像が可能なデバイスも登場している。こうしたデバイスを利用することで、照明光に高速に変調してのせた情報を読み取ることが可能となってきた。またイメージセンサは２次元アレイセンサであることから、２次元の可視光通信が可能となる（例えば、特許文献１参照）。
【０００４】
【特許文献１】特開２００１−２９２１０７号公報
【発明の開示】
【発明が解決しようとする課題】
【０００５】
上述の手法においては、情報光を並列に発信する２次元アレイ発光部と、情報光を並列に受信する２次元アレイ受光部で構成される受信装置から構成される並列光通信システムについて開示されている。しかしながら、通信路特性が悪化した場合に、安定した通信が困難になってしまうという課題があった。
【０００６】
本発明はこのような状況に鑑みてなされたものであり、特に、光空間通信を高効率で、かつ、安定的に実現できるようにするものである。
【課題を解決するための手段】
【０００７】
本発明のデータ通信装置は、データを送信する際の並列度を決定する並列度決定手段と、並列度に応じた個数を単位として、近接する発光装置をグループ化するとともに、同一グループ内の各発光装置を同期して点滅させる制御を行う発光制御手段とを備えることを特徴とする。
【０００８】
上記並列度が高いほど、１グループあたりの発光装置の個数を少なくすることができる。
【０００９】
上記並列度決定手段には、送信開始時に並列度を決定させるようにすることができる。
【００１０】
上記並列度決定手段には、送信中に並列度を決定させるようにすることができる。
【００１１】
上記発光装置には可視光を発光するようにさせることができる。
【００１２】
上記データはパケット化されたデータとすることができ、発光制御手段には、１つのパケットが1つのグループから時間的に連続して送信されるよう各発光装置の点滅を制御させるようにすることができる。
【００１３】
上記送信先からのデータを受信する受信手段をさらに設けるようにさせることができ、受信手段には、2次元平面上に近接して配置した複数の発光装置の点滅により並列に送信されたデータを受信させるようにすることができる。
【００１４】
上記受信手段には、送信先での受信状態を示すフィードバック情報を受信するとともに、並列度決定手段は、フィードバック情報に基づいて並列度を決定させるようにすることができる。
【００１５】
上記受信手段には、フィードバック情報を任意の時間間隔で受信させるようにするとともに、並列度決定手段には、受信手段がフィードバック情報を受信するごとに並列度を決定させるようにすることができる。
【００１６】
上記フィードバック情報には、送信されたパケット毎の受信状態を示す情報を含ませるようにすることができる。
【００１７】
上記発光手段には、送信されたパケット毎の受信状態を示す情報に基づいて、受信が失敗したパケットに対応するグループにおいてはダミーパケットを送信するよう制御させるようにすることができる。
【００１８】
上記並列度決定手段には、並列に送信したパケットのうち受信が成功したパケットの割合に基づいて、並列度を決定させるようにすることができる。
【００１９】
本発明のデータ通信システムは、請求項１に記載のデータ通信装置を複数備え、各データ通信装置間で相互にデータ通信を行うことを特徴とする。
【００２０】
本発明のデータ通信方法は、データを送信する際の並列度を決定する並列度決定ステップと、並列度に応じた個数を単位として、近接する発光装置をグループ化するとともに、同一グループ内の各発光装置を同期して点滅させる制御を行う発光制御ステップとを含むことを特徴とする。
【００２１】
上記並列度が高いほど、１グループあたりの発光装置の個数を少なくすることができる。
【００２２】
上記並列度決定ステップの処理には、送信開始時に並列度を決定させるようにすることができる。
【００２３】
上記並列度決定ステップの処理には、送信中に並列度を決定させるようにすることができる。
【００２４】
上記発光装置は可視光を発光するようにすることができる。
【００２５】
上記データはパケット化されたデータとするようにすることができ、発光制御ステップの処理には、１つのパケットが1つのグループから時間的に連続して送信されるよう各発光装置の点滅を制御させるようにすることができる。
【００２６】
上記送信先からのデータを受信する受信ステップの処理をさらに含ませるようにすることができ、受信ステップの処理には、2次元平面上に近接して配置した複数の発光装置の点滅により並列に送信されたデータを受信させるようにすることができる。
【００２７】
上記受信ステップの処理には、送信先での受信状態を示すフィードバック情報を受信させるようにすることができるとともに、並列度決定ステップの処理には、フィードバック情報に基づいて並列度を決定させるようにすることができる。
【００２８】
上記受信ステップの処理には、フィードバック情報を任意の時間間隔で受信させるようにすることができるとともに、並列度決定ステップの処理には、受信ステップの処理がフィードバック情報を受信するごとに並列度を決定させるようにすることができる。
【００２９】
上記フィードバック情報には、送信されたパケット毎の受信状態を示す情報を含ませるようにすることができる。
【００３０】
上記発光ステップの処理には、送信されたパケット毎の受信状態を示す情報に基づいて、受信が失敗したパケットに対応するグループにおいてはダミーパケットを送信するよう制御させるようにすることができる。
【００３１】
上記並列度決定ステップの処理には、並列に送信したパケットのうち受信が成功したパケットの割合に基づいて、並列度を決定させるようにすることができる。
【００３２】
本発明のデータ通信システムのデータ通信方法は、請求項１４に記載のデータ通信方法を複数に含み、各データ通信方法間で相互にデータ通信を行うことを特徴とする。
【００３３】
本発明のプログラムは、データを送信する際の並列度を決定する並列度決定ステップと、並列度に応じた個数を単位として、近接する発光装置をグループ化するとともに、同一グループ内の各発光装置を同期して点滅させる制御を行う発光制御ステップとを含む処理をコンピュータに実行させることを特徴とする。
【００３４】
本発明のデータ通信装置および方法、並びにプログラムにおいては、データを送信する際の並列度が決定され、並列度に応じた個数を単位として、近接する発光装置がグループ化されるとともに、同一グループ内の各発光装置が同期して点滅させられるように制御される。
【００３５】
本発明のデータ通信装置は、独立した装置であっても良いし、データ通信を行うブロックであっても良い。
【発明の効果】
【００３６】
本発明によれば、光空間通信を高効率で、かつ、安定的に実現することが可能となる。
【発明を実施するための最良の形態】
【００３７】
以下に本発明の実施の形態を説明するが、本明細書に記載の発明と、発明の実施の形態との対応関係を例示すると、次のようになる。この記載は、本明細書に記載されている発明をサポートする実施の形態が本明細書に記載されていることを確認するためのものである。従って、発明の実施の形態中には記載されているが、発明に対応するものとして、ここには記載されていない実施の形態があったとしても、そのことは、その実施の形態が、その発明に対応するものではないことを意味するものではない。逆に、実施の形態が発明に対応するものとしてここに記載されていたとしても、そのことは、その実施の形態が、その発明以外の発明には対応しないものであることを意味するものでもない。
【００３８】
さらに、この記載は、本明細書に記載されている発明の全てを意味するものではない。換言すれば、この記載は、本明細書に記載されている発明であって、この出願では請求されていない発明の存在、すなわち、将来、分割出願されたり、補正により出現、追加される発明の存在を否定するものではない。
【００３９】
即ち、本発明のデータ通信装置は、データを送信する際の並列度を決定する並列度決定手段（例えば、図３の並列度制御部５８）と、並列度に応じた個数を単位として、近接する発光装置をグループ化するとともに、同一グループ内の各発光装置を同期して点滅させる制御を行う発光制御手段（例えば、図３の通信コントローラ５２）とを備えることを特徴とする。
【００４０】
本発明のデータ通信方法は、データを送信する際の並列度を決定する並列度決定ステップ（例えば、図３３のフローチャートにおけるステップＳ２６６の処理）と、並列度に応じた個数を単位として、近接する発光装置をグループ化するとともに、同一グループ内の各発光装置を同期して点滅させる制御を行う発光制御ステップ（例えば、図２５のフローチャートにおけるステップＳ１０３の処理）とを含むことを特徴とする。
【００４１】
尚、プログラムについては、データ通信方法と同様であるので、その説明は省略する。
【００４２】
図１は、本発明を適用した情報通信システムの一実施の形態の構成を示す図である。
【００４３】
通信装置１−１，１−２は、後述するLEDアレイ６２（図３）と２次元受光部８２とを用いて、相互に空間内でLEDアレイ６２（図３）のLED７１（図３）の発光パターンを２次元受光部８２により受光してデータを授受する。尚、以降において、通信装置１−１，１−２について特に区別する必要が無い場合、単に、通信装置１と称するものとし、その他の構成についても同様に称するものとする。また、図１において、通信装置１が２個であり、相互にデータを授受する例について説明するが、それ以上の台数の通信装置１が相互に通信する構成であっても良いことは言うまでもない。
【００４４】
次に、図２を参照して、通信装置１の構成について説明する。尚、通信装置１−１，１−２については、それぞれ同様の構成である。
【００４５】
通信装置１は、例えば、いわゆるパーソナルコンピュータである。CPU（Central Processing Unit）２１は、ROM（Read Only Memory）２２、または記憶部２８に記憶されているプログラムに従って各種の処理を実行する。RAM（Random Access Memory）２３には、CPU２１が実行するプログラムやデータなどが適宜記憶される。これらのCPU２１、ROM２２、およびRAM２３は、バス２４により相互に接続されている。
【００４６】
CPU２１には、バス２４を介して入出力インタフェース２５が接続されている。入出力インタフェース２５には、キーボード、マウス、マイクロホンなどよりなる入力部２６、ディスプレイ、スピーカなどよりなる出力部２７が接続されている。CPU２１は、入力部２６から入力される指令に対応して各種の処理を実行する。そして、CPU２１は、処理の結果得られた画像や音声等を出力部２７に出力する。
【００４７】
入出力インタフェース２５に接続されている記憶部２８は、例えばハードディスクなどで構成され、CPU２１が実行するプログラムや各種のデータを記憶する。通信部２９は、その他の通信装置１と通信する。
【００４８】
また、記憶部２８は、各種のプログラムを記憶しており、CPU２１は、これらのプログラムを読み出して対応する処理を実行する。
【００４９】
入出力インタフェース２５に接続されているドライブ３０は、磁気ディスク４１、光ディスク４２、光磁気ディスク４３、或いは半導体メモリ４４などが装着されたとき、それらを駆動し、そこに記録されているプログラムやデータなどを取得する。取得されたプログラムやデータは、必要に応じて記憶部２８に転送され、記憶される。
【００５０】
次に、図３を参照して、図２の通信装置１により実現される機能について説明する。尚、図３においては、図中の上部の通信装置１−１については、送信側の構成を詳細に示しており、図中の下部の通信装置１−２については、受信側の構成を詳細に示しているが、いずれも同様の構成であり、それぞれが通信装置１−１，１−２間でデータの送受信を実行している。また、図中の符号については、「−１」、「−２」が付されていないものもあるが、図中に付されていないものであっても、通信装置１−１を構成するものには「−１」が付されており、通信装置１−２を構成するものには「−２」が付されているものとする。
【００５１】
ホストコントローラ５１−１，５１−２は、それぞれ通信装置１−１，１−２のメインコントローラであり、ここでは、送信データをそれぞれ通信コントローラ５２−１，５２−２に送り、受信データを通信コントローラ５２−１，５２−２からそれぞれ受け取る。
【００５２】
通信コントローラ５２−１，５２−２は、それぞれホストコントローラ５１−１，５１−２より供給される送信データを送信装置５３−１，５３−２に供給し、それぞれ通信装置１−２，１−１に対して送信させる。より詳細には、通信コントローラ５２−１，５２−２は、それぞれホストコントローラ５１−１，５１−２より供給された送信データを並列の光信号で送信するために、64bitごとに分割し、送信装置５３−１，５３−２に供給し、それぞれ通信装置１−２，１−１に送信させる。また、通信コントローラ５２−１，５２−２は、送信する各種のパケットをマンチェスタ符号化し、マンチェスタ符号化された信号に基づいて、送信装置５３のLEDアレイ６２の個々のLED７１毎の発光パターンを決定し、LED発光パターンテーブル５９に記憶させる。
【００５３】
通信コントローラ５２−１，５２−２のデータ通信コントローラ５６−１，５６−２は、受信装置５４−１，５４−２よりそれぞれ通信装置１−２，１−１より送信されてきたデータを受信すると、パケット単位で受信パケット格納メモリ５６ａ−１，５６ａ−２に記憶させると共に、パケットのうち受信データを構成する部分を受信データ格納メモリ５６ｂに記憶させる。
【００５４】
通信状態認識部５７−１，５７−２は、後述するように送信装置５３のLEDアレイ６２を構成するLED７１の１個分の光を受光する、受信装置５４−１，５４−２の２次元受光部８２の画素により通信路が形成されるが、この通信路単位でデータが受信できたか否かに基づいて、通信経路毎に受信できた場合ACKを、受信できなかった場合NACKをそれぞれの送信装置５３−１，５３−２を制御して、制御情報（制御パケット）として送信させる。このとき、通信状態認識部５７−１，５７−２は、通信経路毎にACKまたはNACKの情報をACKレジスタ５７ａ−１，５７ａ−２に記憶させる。また、通信状態認識部５７−１，５７−２は、送信装置５３を制御して近傍にある複数のLEDを同期させて並列に発光させるときの並列度のテストパケットを並列度制御部５８の並列度レジスタ５８ａの情報に基づいて送信させる。通信状態認識部５７は、送信先の通信装置１における受信装置５４の２次元受信部８２により受信できなかった通信路に対応するLED７１について、ダミーパケットを送信するように、対応する通信路のLEDアレイ６２上のLED７１についてダミーパケットを送信させる。
【００５５】
上述したように、送信装置５３により送信されるパケットは、制御パケット、データパケット、テストパケット、およびダミーパケットがある。通信状態認識部５７−１，５７−２は、どの通信路に、制御パケット、データパケット、テストパケット、およびダミーパケットが送信されているかの情報を通信路テーブル５７ｂ−１，５７ｂ−２として記憶する。
【００５６】
並列度制御部５８は、近接する複数のLED７１を１個のLEDであるかのように同期して発光させることにより並列的にLED７１を発光させるための並列度を、ACKレジスタ５７ａに基づいて計算し、並列度レジスタ５８ａに記憶させる。
【００５７】
送信装置５３−１，５３−２の発光制御部６１は、LED発光パターンテーブル５９に記憶されている、LEDアレイ６２上の個々のLED７１のパターンに基づいて、LEDアレイ６２上の個々のLED７１を発光させる。
【００５８】
受信装置５４−１，５４−２は、２次元受信部８２−１，８２−２がレンズ８１−１，８１−２を介して、送信装置５３−２，５３−１より送信されてくる２次元の並列の光信号を各画素単位で受光する。２次元受信部８２−１，８２−２は、光電変換素子を用いた、例えば、フォトダイオードアレイなどにより構成される。また、２次元受信部８２は、撮像素子であればよいので（高速撮像素子であることが望ましい）、通常映像を取得することを目的としたCCD（Charge Coupled Device：電荷結合素子）イメージセンサやCMOS（Complementary Metal-Oxide Semiconductor）イメージセンサなどにより構成するようにしても良い。CMOSイメージセンサは、比較的消費電力が低いので、高速に光を受光して、その光の変化を捉える用途には、より適していると考えられる。以降においては、２次元受信部８２は、高速撮像素子（イメージセンサ）により構成されているものとして説明する。
【００５９】
ADC（A/D（Analog/Digital）コンバータ）８３−１，８３−２は、２次元受光部８２−１，８２−２を構成するイメージセンサの各画素から読み出した輝度データをアナログ量からデジタル量に変換し、デコード部８４−１，８４−２に供給する。尚、２次元受光部８２がCMOSイメージセンサである場合、ADCが内蔵されている構成であっても良い。
【００６０】
デコード部８４−１，８４−２は、2次元受光部８２により受光された送信装置５３−１，５３−２からの並列光信号を復号する。デコード部８４は図４で示されるように、フレームメモリ９１、比較部９２、デコード処理部９３、デコードメモリ９４、および、エラー検出部９５より構成される。
【００６１】
フレームメモリ９１（９１−１，９１−２）は、フレーム間差分演算を行うために使用するADC８３より供給された各画素の輝度値の情報を記憶する。フレームメモリ９１は、少なくとも１フレーム分のメモリを用意して、前フレームの映像（２次元受光部８２の各画素により受光された輝度値の情報）を蓄え、適宜比較部９２に供給する。
【００６２】
比較部９２は、フレームメモリ９１に蓄えられているADC８３より供給された現在のフレームの画像データと前フレームの画像データとの差分を求める。
【００６３】
比較部９２は、図５で示されるように構成されており、光の変化を検出するためのＭフレーム間差分を求め、さらに、求められたＭフレーム間差分結果をコンパレータ１１２，１１４で閾値と比較した結果を出力する。
【００６４】
すなわち、比較部９２の正フレーム間差分計算部１１１、および、負フレーム間差分計算部１１３は、光の変化を検出するために、今撮像されているフレームを基準として、２Mフレーム前までの、２Ｍフレーム間の差分値を求め、それぞれコンパレータ１１２，１１４に出力する。コンパレータ１１２，１１４は、入力された差分値を、それぞれ所定の閾値Ref(+)，Ref(-)と比較し、比較結果に対応して１、または、０の値を出力部に供給する。より具体的には、正フレーム間差分計算部１１１は、差分値が閾値Ref(+)より大きいとき１を、それ以外のとき０を出力し、負フレーム間差分計算部１１３は、差分値が閾値Ref(-)より小さいとき１を、それ以外のとき０を出力する。尚、Ｍは、正の整数を示す。また、説明の便宜上、以下の説明においては、Ref(+)＝−Ref(-)であるものとするが、これに限るものではない。
【００６５】
より詳細には、正フレーム間差分計算部１１１は正の２Ｍフレーム間差分を以下の式（１）で示されるように計算して、コンパレータ１１２の端子１１２ａに出力する。
【００６６】
【数１】
2006191313.tif 000003
・・・（１）
【００６７】
尚、式（１）におけるｆ(n)は、第ｎフレームにおける所定の画素位置の画素値を示しており、式（１）の第１項は、第ｎフレームから第（ｎ−M−１）フレームの画素値のサメーションを示しており、第２項は、第（ｎ−Ｍ）フレームから第（ｎ−２M−１）フレームの画素値のサメーションを示している。すなわち、正フレーム間差分計算部１１１は、式（１）を演算することにより、時系列的に、今のフレームに近い新しい画素値の和から、今のフレームに遠い古い画素値の和を引いた値を正フレーム間差分YP（M,n）として求める。
【００６８】
また、同様にして、負フレーム間差分計算部１１３は正の２Ｍフレーム間差分を以下の式（２）で示されるように計算して、コンパレータ１１４の端子１１４ａに出力する。
【００６９】
【数２】
2006191313.tif 000004
・・・（２）
【００７０】
尚、式（２）の第１項は、第（ｎ−Ｍ）フレームから第（ｎ−２M−１）フレームの画素値のサメーションを、第２項は、第ｎフレームから第（ｎ−M−１）フレームの画素値のサメーションをそれぞれ示している。すなわち、負フレーム間差分計算部１１３は、式（２）を演算することにより、時系列的に、今のフレームに遠い古い画素値の和から今のフレームに近い新しい画素値の和を引いた値を負フレーム間差分YM（M,n）として求める。
【００７１】
さらに、コンパレータ１１２は、端子１１２ａに入力されてくる正フレーム間差分値YP(M,n)と、端子１１２ｂに入力されるリファレンス値Ref(+)（リファレンス値Ref(+)は、任意に設定される値である）とを比較し、正フレーム間差分値YP(M,n)がリファレンス値Ref(+)よりも大きい場合、第ｎフレームにおける比較結果としてCP(n)＝１を後段に出力し、逆に、正フレーム間差分値YP(M,n)がリファレンス値Ref(+)よりも小さい場合、第ｎフレームにおける比較結果としてCP(n)＝０を後段に出力する。
【００７２】
同様に、コンパレータ１１４は、端子１１４ａに入力されてくる負フレーム間差分値YM(M,n)と、端子１１４ｂに入力されるリファレンス値Ref(-)（リファレンス値Ref(-)は、任意に設定される値）とを比較し、負フレーム間差分値YM(M,n)がリファレンス値Ref(-)よりも小さい場合、第ｎフレームにおける比較結果としてCM(n)＝１を後段に出力し、逆に、負フレーム間差分値YM(M,n)がリファレンス値Ref(-)よりも大きい場合、第ｎフレームにおける比較結果としてCM(n)＝０を後段に出力する。
【００７３】
すなわち、LED７１で点滅する光を検出する上で、最も単純な方法は、受光量をある決められた閾値と比較することで２値化して、受光量を１，０のデジタル信号にする方法である。この方法は、最もシンプルで実装も容易であるが、周囲の明るさが変化すると、固定された閾値と比較して２値化する方法では、安定したデータ伝送は望めない。
【００７４】
そこで、上述したように、光の変化を検出するのに、受光量をあるレートでサンプリングして、時間方向に連続するサンプリング区間の受光量の比較を行うことで光の変化を検出する。
【００７５】
より具体的には、時間が経つにしたがって増加するフレームのサンプリング番号をn、各サンプリング区間での受光量をf(n)とし、Mを１とすると、光の変化量は、上述の式（１）よりY（1,n）=f(n)-f(n-1)で表され、Y（1,1）>0のときに光が「暗」から「明」に変化したこと（LED７１がOFFの消灯状態からONの発光状態になったこと）が検出され、Y<0のときに光が「明」から「暗」になったこと（LED７１がONの発光状態からOFFの消灯状態になったこと）を検出したことになる。
【００７６】
上記Y（1,n）=f(n)-f(n-1)を１フレーム間差分と定義して、さらに拡張してＭフレーム間差分を定義する。ここでＭは１以上の整数である。すなわち、Ｍ＝１の場合は、上述の式（１）は、Y(1,n)＝f(n)-f(n-1)で定義され、Ｍ＝２の場合には、Y(2,n)＝f(n)+f(n-1)-f(n-2)-f(n-3)、Ｍ＝３の場合には、Y(3,n)＝f(n)+f(n-1)+f(n-2)-f(n-3)-f(n-4)-f(n-5)となる。
【００７７】
従って、Ｍが大きいほど、光の変化の検出感度は高くなるが、その一方、Ｍが大きくなると受光側のサンプリング周波数を固定とすると、光の点滅周波数を落とさなければならず、データの転送効率が悪くなるデメリットもある。
【００７８】
安定して光の変化を検出するためには、受光部のフレームレートはLED７１の点滅周波数のＮ倍以上の関係になければならない。ここでＮは、光の変化の検出方法によって決まる値である。１フレーム間差分では、Ｎ＞２であり、２フレーム間差分ではＮ＞３である。すなわち、Ｍフレーム間差分（ここでＭは１以上の整数）の場合、Ｎ＞Ｍ＋１となる。ここでＮは小さい値の方が、同じフレームレートでもデータ転送レートが大きく出来ることから有利であるので、Ｎ＝Ｍ＋１とすると最適となる。
【００７９】
尚、以降においては、Ｍ＝１すなわち１フレーム間差分を用いて説明する。しかしながら、本発明は、光の変化検出にフレーム間差分以外の方式を用いても、同様に効果が得られるので、特にこの光の変化検出方法に限られるものではない。
【００８０】
結果として、Mフレーム間差分を用いることで、光の立ち上がり変化と立下り変化を検出することが可能となる。すなわち、光の立ち上がり変化の検出を行うには、新しいフレームの輝度から古いフレームの輝度を引く、上述した式（１）で示される正のＭフレーム間差分を用いることができる。
【００８１】
また、光の立ち下がり変化の検出を行うには、古いフレームの輝度から新しいフレームの輝度を引く、上述した式（２）で示される負のＭフレーム間差分を用いることができる。
【００８２】
以上の式（１），式（２）で定義されるYP(M,ｎ)，YM(M,ｎ)を用いて、光の立ち上がり変化と立ち下がり変化を求めるために、ある閾値を用いて二値化した値が、上述したCP(n)，CM(n)として定義される。すなわち、上述したREF(+),REF(-)は、それぞれ光の立ち上がりと立ち下がりの変化の大きさに対する閾値であり、光の変化が閾値を越えたときに、CP(n)，CM(n)は１となる。
【００８３】
デコード処理部９３は、比較部９２より供給される比較結果（CP(n)，CM(n)）に基づいて、データの復元を行い、データと受信座標を出力する。デコード用メモリ９４は、2次元受光部８２の各画素（受光素子）で受光して復元したデータや復元途中のステータスデータを蓄えるのに利用する。
【００８４】
より詳細には、デコード用メモリ９４は、図６で示されるように、2次元受光部８２より供給される信号のデコード過程で各画素の座標位置（図６においては、２次元受光部８２の画素配列がX方向にM画素、Y方向にN画素であるものとする）デコード状況を示すステータス情報（以降においては、フラグとも称する）とデコードして得られたデータ部分（以降においては、データとも称する）を格納するためのフレームメモリである。フラグは、図１０で示されるように、デコードカウンタ(3bit)、デコードステータス(7bit)、CRC結果フラグ(1bit)、およびエンドフラグ(1bit)から構成される。また、データはヘッダ(15bit)、受信データ(64bit)、およびエラー検出符号(16bit)を格納するエリアで、デコードできたビットから順に格納される。
【００８５】
エラー検出部９５（図４）は、CRC（Cyclic Redundancy Check）を用いて復元したデータ（図６のヘッダ、データ、およびエラー検出符号）のエラー検出を行う。CRCを用いた手法としては、例えば、CRCとして代表的なITU-T(国際電信電話諮問委員会)の勧告によるもので、生成多項式(Generator Polynomial) G(x)=x16+x12+x5+1を用いるようにしてもよい。エラー検出部９５（図４）は、エラー検出をおこなうため、シンドローム多項式(Syndrome polynomial)を計算し、シンドローム多項式が０になればエラーなし、０以外であればエラーが発生したことを検出する（詳細は、「誤り訂正符合とその応用」（江藤良純、金子敏信監修）（オーム社）参照）。エラー検出部９５は、後段の通信コントローラ５２に受信したパケットデータと受信した２次元受光部８２上の画素の座標を出力する。
【００８６】
ここで、以降の説明を容易にするために、通信装置１−１より通信装置１−２にデータを送信する動作を簡単に説明する。
【００８７】
通信コントローラ５２−２は、デコード部８４−２（デコード部の中のエラー検出部９５−２）より、各画素（受光素子）で受信したパケットデータを受け取り、並列で受信したパケットをデータ順に並べ替える。また、各通信路の通信ができたか否かを調べ、通信できた空間アドレスにはACKを、通信できなかった空間アドレスにはNACKを送信側に返すための制御パケットを生成し、送信装置５３−２に供給する。送信装置５３−２は、供給された制御パケットを通信装置１−１に対して送信する。
【００８８】
通信コントローラ５２−２は、ホストコントローラ５１−２より供給される送信データを取得し、送信データを並列の光信号で送信するために、64bitごとに分割する。送信装置５３−１内の発光制御部６１−１は、通信コントローラ５２−１より供給される、LEDアレイ６２−１の各LED７１の発光パターンを取得し、取得した発光パターンに応じてLEDアレイ６２−１の各LED７１の点滅を制御する。
【００８９】
LEDアレイ６２−１上の各LED７１が発光することにより送信する送信データの順序は、受信後のデータの再構成を簡単にするために、LEDアレイ６２の空間アドレスの順番に送り、順序が入れ替わることがないようにしている。したがって、例えば、後述する図８で示されるようにLEDアレイ６２のLED７１の配列が、８個×８個である場合、空間アドレス(0,0), (1,0), (2,0) … (7,0), (0,1), (1,1), (2,1) … (7,1), … (7,7)の順にデータがパケットに詰められて、送信される。
【００９０】
各パケットの構成は、スタートコード、ヘッダ、データ、エラー検出符号の4つの部分から構成され、正しいヘッダの値をセットしたパケットを生成する。また、CRCの生成多項式を用いてエラー検出符号が生成され、パケットの最後に付加される。
【００９１】
通信コントローラ５２−１は、その一方で、受信装置５４−１により受信されたパケットを取得する。通信コントローラ５２−１は、通信装置１−２の送信装置５３−２より送信されてくる、上述した制御パケット(ACK/NACK情報を含むパケット)を受け取り、この情報（どの通信路が通信可能で、どの通信路が通信失敗だったか）に基づいて、利用する通信路を決定する。すなわち、ACKの返ってきた通信路を利用して、データパケットと制御パケットの送信を行う。NACKの帰ってきた通信路にはダミーパケットを送信する。
【００９２】
また通信コントローラ５２−１，５２−２は、通信路の状況に応じて、並列度を決定する。
【００９３】
従って、通信コントローラ５１−１は、通信が可能な通信路の情報に基づいて、決定された並列度で、送信データを送信装置５３−１に送信させる。結果として、送信装置５３−１のLEDアレイ６２のLED７１が所定の発光パターンで発光することによりデータが通信装置１−２に供給される。
【００９４】
通信装置１−２の受信装置５４−２の２次元受光部８２は、通信装置１−１の送信装置５３−１より供給されるデータを、発光パターンとして受信する。
【００９５】
通信コントローラ５２−１，５２−２は、送信する各種のパケットをマンチェスタ符号化し、マンチェスタ符号化された信号に基づいて、送信装置５３のLEDアレイ６２の個々のLED７１毎の発光パターンを決定し、LED発光パターンテーブル５９に記憶させる。
【００９６】
ここで、マンチェスタ符号化について説明する。LEDなど高速に点滅可能な光源から発する点滅パターンに送信データをのせて、データ通信を行うことは、テレビジョン受像機などのリモートコンロトーらやIrDA（Infrared Data Association：赤外線通信）などで行われている。点滅パターンを信号化する上で、ONを1、OFFを0とするのが最も高効率ではあるが、安定したデータ転送を行うためのエラー検出が困難である。
【００９７】
マンチェスタ符号化は、データ0を10、データ1を01として表現する。ここで1を光源ON、0を光源OFFと考える。するとデータ送信区間は必ず点滅することになり、長く光源OFFになったり、光源ONになったりしないので、環境光との判別も比較的容易となり、安定した通信が可能となる。
【００９８】
例えば、「１００１００１０」という８ビットの送信データをマンチェスタ符号化する場合、すなわち、送信データとして７３を送信したい場合、送信データは、２進数の１／０がそれぞれＯＮ／ＯＦＦを表しているとき、LED７１は、「OFF-ON→ON-OFF→ON-OFF→OFF-ON→ON-OFF→ON-OFF→OFF-ON→ON-OFF」となるように点滅制御部２５３により制御されることになる。
【００９９】
このようにマンチェスタ符号化することにより、１、または、０をとる信号は３個以上連続することが無く、各送信区間は必ず点滅することになり、長くLED７１がOFFの状態となったままになったり、LED７１がONの状態となったままになるようなことが防止され、環境光との判別も比較的容易となるので、安定した通信が可能となる。
【０１００】
また、マンチェスタ符号化された信号の先頭位置には、固定されたスタートコードが付されており、このスタートコードが検出された直後の位置からデコードを開始することで、マンチェスタ符号化された信号をデコードすることができる。
【０１０１】
すなわち、図７で示されるように、一番上のラインに、４bitのスタートコード(St0,St1,St2,St3)と８bitのヘッダの(H0-H7)がマンチェスタ符号化されているものとする。尚、スタートコードとヘッダの構成については詳細を後述するが、実際のスタートコードは4bitであるが、ヘッダのbit数は異なる。しかしながら、ここでは、マンチェスタ符号化の説明のためヘッダのビット数は、図７で示されるビット数であるものとする。
【０１０２】
図７の上段の菱形内に示されるように、スタートコードはSt0=01(OFF→ON),St1=11(ON→ON),St2=00(OFF→OFF),St3=01(OFF→ON)から構成されるものとする。また、ヘッダは、H0=10(ON→OFF)、H1=01(OFF→ON)、H2=10（ON→OFF）、H3=10（ON→OFF）、H4=10(ON→OFF)、H5=01(OFF→ON)、H6=10（ON→OFF）、H7=10（ON→OFF）から構成されている。ここで、図７において、横軸は時間軸を表す。また、縦線の１区間がイメージセンサの２フレームに相当する。したがって、H0=10（ON→OFF）は受信される信号の４フレーム目の時間に相当する。さらに、光の立ち上がり変化を示すCP(n)と光の立下り変化を示すCM(n)を、3段目と4段目に示す。
【０１０３】
このときスタートコードのパターンは固定なので（スタートコードが固定されている理由については後述する）、CP(n)=1になってから（区間St０内におけるCP(n)＝１）、６フレーム後にCM(n)=1となり（区間St２内におけるCM(n)＝１）、さらに４フレーム後にCP(n)=1（区間St３内におけるCP(n)＝１）、そしてその２フレーム後にCM(n)=1（区間St３内におけるCM(n)＝１）となる。結果として、4フレーム分の信号がヘッダであることが認識できる。ここで、説明の便宜上、この最初のCP(n)=1となるフレームを「スタートコード基準点」、スタートコードの最後のCM(n)=1となるフレームを「ヘッダ基準点」と称するものとする。
【０１０４】
ヘッダ、データ、誤り検出符号のデコード（復元）は、ヘッダ基準点から４フレーム毎に、CP(n),CM(n)の状態を確認することで、行うことができる。すなわち、データ基準点から４フレーム毎のフレームにおいて、CP(n)=1ならば、そのビットは１であり、CM(n)=1ならば、そのビットは０となる。もし、CP(n)=CM(n)=0の場合には、マンチェスタ符号を受信することができなかったので、エラーとして処理する。
【０１０５】
この結果、区間H0において、送信されてくるデータは、「10」であるので、デコード結果は０となり、区間H1において、送信されてくるデータは、「01」であるので、デコード結果は０となり、区間H2乃至H4，H6，H7において、送信されてくるデータは、「10」であるので、デコード結果は0となり、区間H5において、送信されてくるデータは、「01」であるので、デコード結果は1となる。
【０１０６】
尚、図７において、5段目のデコードタイミングは、光信号の立ち上がりを上向の矢印で示し、立ち下がりを下向きの矢印で示しており、各矢印の間の丸中の数値が間隔となるフレーム数を示している。また、６段目には、デコードデータ示されており、7段目にはデコードカウンタ、8段目にはデコードステータスが示されている。7，８段目のデコードカウンタおよびデコードステータスについては、詳細を後述する。
【０１０７】
次に、LEDアレイ６２の空間アドレスについて説明する。
【０１０８】
例えば、LEDアレイ６２が図８で示されるようにLED７１が8個×8個で配置されていた場合、最大で６４個のLED７１により並列に６４個の発光信号を送信することができることになる。この場合、空間アドレスは、図８で示されるように、左上から（０，０）、（１，０）・・・（７，０）と設定され、さらに、下段に進み（０，１），（１，１）・・・と設定され、最終的に最下段の左端が（７，０）と設定され、右端が（７，７）に設定され、全部で６４個（＝8個×8個）の空間アドレスが設定されることになる。この場合、各空間アドレスに設定されるLED７１について、個々に1bitの通信路が１個設定されることになる。
【０１０９】
しかしながら、通信状態により１個のLED７１の発光パターンでは十分に２次元受光部８２で受光できないような状況が考えられる。このような場合、近接する複数のLED７１をグループ化して同期して発光させるようにすることで、LED７１の発光する面積を高めることで、受光し易くすることが考えられる（近接していない状態でも、近傍のLED７１であればよい）。例えば、図９で示されるように、２個×２個の合計４個のLED７１を同期して発光させることで1bitの通信路が、16個（＝４個×４個）設定されることになる。このような場合、空間アドレスは、図９の点線で囲まれている4個のLED７１の単位で設定され、上段の左から（０，０），（１，０），・・（４，０）と設定され、最下段の左端の４個のLED７１が（０，３）に、右端の４個のLED７１が（３，３）にそれぞれ設定される。結果として、１６個の通信路が確保されることになる。
【０１１０】
同様にして、４個×４個のLED７１をグループ化して同期して発光させるようにすることで、さらに、２次元受光部８２による受光能力を高めることも可能であり（通信路は4個）、最大では、６４個のLED７１をグループ化して同期させて発光させることにより1bitのみであるが送信させるようにすることも可能である。ただし、この場合、通信路は１個である。
【０１１１】
以上のようにして、近傍の所定数のLED７１をグループ化して同期して発光させることで安定した通信を実現させることが可能となる。ただし、グループ化するLED７１の数が増えると、LEDアレイ６２全体として通信路の数は低下することになる。以降においては、LEDアレイ６２全体での（通信路−１）を並列度と称するものとする。尚、「−１」されるのは、並列度を６bitの値（０乃至６３）で表現するためである。
【０１１２】
次に、送信装置５３と受信装置５４により授受されるパケットについて説明する。
【０１１３】
パケットは、データパケット、制御パケット、ダミーパケット、およびテストパケットの４種類がある。
【０１１４】
データパケットは、送信データを含むパケットである。データパケットは、図１０で示される。図中の左端部がLSBであり右端部がMSBである。パケットは、LSBからスタートコード、ヘッダ、データ、およびエラー検出符号が配置される。
【０１１５】
スタートコードはどの種類のパケットも同一のパターンであり、「01110010」である。ヘッダは、データ識別制御フラグが１bit、並列度テストフラグが１bit、ダミーフラグ１bit、並列度の値6bit、および空間アドレス6bitの合計１５bitから構成される。
【０１１６】
データパケットの場合、データ識別制御フラグ=0、並列度テストフラグ=0、ダミーフラグ=0に設定される。また並列度は、LEDアレイ６２における並列度を表す。図１０においては、６４個（8個×8個）のLED７１からなるLEDアレイ６２を想定して、最大値が６３となるように6bitに設定（並列度−１で表す）されている。空間アドレスは、このデータパケットを送信するLEDアレイ６２内のLED７１の位置である。先頭3bitがX方向の位置を示しており、後半の3bitがY方向の位置を示す。
【０１１７】
データは、並列度が最大である場合を想定し、送信データをLSBからMSBへの順にデータD0, D1, D2 … ,D63（合計64bit）が設定されている。エラー検出符号は、ヘッダ、およびデータの情報に基づいて生成されるCRCの符号が設定される。
【０１１８】
制御パケットは、各通信路毎に送信装置５３より送信されたデータが受信できたか否かを示す情報（ACK/NACK）を含むパケットである。エラーもなくパケットが受信された通信路（空間アドレス）においては、ACKが設定されることになる。何らかの原因でパケットが受信されなかった通信路（空間アドレス）については、NACKが設定されることになる。すなわち、この制御パケットが相互に授受されることにより、利用する通信路の通信状態を認識することが可能となり、通信に利用する通信路が選択される。
【０１１９】
図１１は、制御パケットの構成を示している。スタートコードは、どの種類のパケットでも同じ(01110010)である。ヘッダは、制御パケットを示すために、データ識別制御フラグ=1、並列度テストフラグ=0、ダミーフラグ=0が設定される。また並列度は、LEDアレイ６２における並列度を表す。図１１においては、６４個（8個×8個）のLED７１からなるLEDアレイ６２を想定して、最大値が６３となるように6bitに設定（並列度−１で表す）されている。
【０１２０】
また、データには、通信路の場所を表す空間アドレス(0,0)(1,0)(2,0)…(7,0)(0,1)(1,1)(2,1)…(7,7)の順にACKまたはNACKが設定される。すなわちACKの場合には０が、NACKの場合には１がそれぞれ設定される。データ部分は64ビットあるので、最大６４個のLED７１が並列に各通信路としてデータを受信できたか否か（ACK/NACK）の情報を設定することが可能な構成になっている。
【０１２１】
ダミーパケットは、前回の送信時において、受信装置５４においてデータが受信できなかった通信路に対して送信されるパケットである。受信装置５４においてデータ受信できなかった通信路は、データが受信される通信装置１から送られてきた制御パケットのACK/NACK情報に基づいて認識することが可能である。
【０１２２】
図１２にダミーパケットの例を示す。スタートコードは、どの種類のパケットでも同じ(01110010)である。ヘッダは、ダミーパケットを示すために、データ識別制御フラグ=1、並列度テストフラグ=0、およびダミーフラグ=１に設定される。また並列度は、LEDアレイ６２における並列度を表す。図１２においては、６４個（8個×8個）のLED７１からなるLEDアレイ６２を想定して、最大値が６３となるように6bitに設定（並列度−１で表す）されている。
【０１２３】
また、データの部分には、制御パケットと同様、通信路の場所を表す空間アドレス(0,0) (1,0) (2,0) … (7,0) (0,1) (1,1) (2,1) … (7,7)の順にACKまたはNACKが設定される。すなわち、ACKの場合には０が、NACKの場合には１が設定される。もちろん、データ部分に必ずACK/NACKを入れる必要はないが、制御パケットを送信する通信路が使えなくなった場合（制御パケットを送信するLED７１の点滅パターンが認識できない場合）、ダミーパケットを通じて相手側に制御パケットの情報（ACK/NACK）を伝えることができる。そこで、ダミーパケットのデータ部分にACK/NACKがセットされている。
【０１２４】
テストパケットは、並列度のテストを行うときに送信するパケットである。並列度のテストについては、詳細を後述する。図１３にテストパケットの例を示す。スタートコードは、どの種類のパケットでも同じ(01110010)である。ヘッダは、テストパケットを示すために、データ識別制御フラグ=1、並列度テストフラグ=1、およびダミーフラグ=0に設定される。また並列度は、LEDアレイ６２における並列度を表す。図１２においては、６４個（8個×8個）のLED７１からなるLEDアレイ６２を想定して、最大値が６３となるように6bitに設定（並列度−１で表す）されている。またデータの部分には、制御パケットと同様、通信路の場所を表す空間アドレス(0,0) (1,0) (2,0) … (7,0) (0,1) (1,1) (2,1) … (7,7)の順にACKまたはNACKが設定される。
【０１２５】
次に、通信コントローラ５２における各種のメモリ、テーブル、およびレジスタについて説明する。
【０１２６】
データ通信コントローラ５２の受信パケット格納メモリ５６ａは、図１４で示されるように、受信装置５４より受け取った受信パケットを格納する。最大６４パケットを一度に受信する可能性があるので、６４パケット分のメモリとなっている。
【０１２７】
受信データ格納メモリ５６ｂは、図１５で示されるように、通信コントローラ５２が、データを、デコード部８４より供給された受信パケットから抽出して、データ(1)乃至(63)として格納する。
【０１２８】
通信状態認識部５７のACKレジスタ５７ａには、受信用と送信用のものがあり、それぞれ同様の構成である。ACKレジスタ５７ａは、図１６で示されるように、デコード部８４より供給された受信パケットから、受信方向の各通信路のデータが受け取れたか否かの情報を記録する。このレジスタの内容が、送信する制御パケットのACK/NACK情報となる。すなわち、例えば、この例においては、データが受信できた通信路についてはACKであるので０に設定され、データが受信できなかった通信路についてはNACKであるので１に設定されて記録される（当然のことながら、設定される０，１の値は逆であっても良い）。本実施例では６４個（８個×８個）のLED７１からなるLEDアレイ６２であるので、６４ビットのレジスタが設定されている。
【０１２９】
通信状態認識部５７の通信路テーブル５７ｂは、送信方向の各通信路が、どの種類のパケット（制御／データ／ダミー／テスト）を送信するかを示すテーブルである。図１７で示されるように、最大で６４個のLED７１により６４個の通信路が設定されることになるため、通信路テーブルは、通信路（０）乃至通信路（６４）が設定されており、それぞれ2bitのデータより構成される。この例においては、例えば、００（＝10進表記で０）がデータパケット、０１（＝10進表記で１）が制御パケット、１０（＝10進表記で２）がダミーパケット、１１（＝10進表記で３）がテストパケットとして設定することによりそれぞれのパケットの種類を識別する。尚、識別するための2bitの信号は、上記以外でも良いことはいうまでもない。
【０１３０】
並列度制御部５８の並列度レジスタ５８ａは、受信した制御パケットから、送信方向の通信の成功状況（ACK/NACK）に応じて決定された並列度の値を記憶する。並列度レジスタ５８ａは、図１８で示されるように6bitであり、最大並列度も６４であることから、並列度レジスタ５８ａには、（並列度−１）が記憶される。すなわち、６４並列（８×８）であれば６３が、並列度なし（通信路は１本）であれば０が記憶される。
【０１３１】
LED発光パターンテーブル５９は、通信コントローラ５２により通信路毎に、送信パケットが生成された後、マンチェスタ符号化されたデータにスタートコードを付加して、生成された発光パターンを、その通信路に対応するLED７１のアドレスに記憶する。すなわち、LEDアレイ６２の並列度が６４であった場合、６４個のLED７１が用いられることになるので、図１９で示されるように、マンチェスタ符号化されたデータである１９８bitのデータがLED(0)乃至LED(64)のアドレスに、記憶されることになる。
【０１３２】
次に、図２０のフローチャートを参照して、図３の情報通信システムによる通信処理について説明する。尚、図３の情報通信システムにおける通信装置１−１，１−２は、相互に同様の処理を実行し、適宜データを送受信している。
【０１３３】
ステップＳ１において、各種のメモリ、レジスタ、およびテーブルが初期化される。より具体的には、通信コントローラ５２のデータ通信コントローラ５６は、受信パケット格納メモリ５６ａおよび受信データ格納メモリ５６ｂを、すべて０に初期化する。通信状態認識部５７は、ACKレジスタ５７ａおよび通信路テーブル５７ｂを０に初期化する。並列度制御部５８は、並列度レジスタを０に初期化する。通信コントローラ５２は、LED発光テーブル５９を０に初期化する。
【０１３４】
ステップＳ２において、並列度制御部５８は、並列度テスト処理を実行する。すなわち、送信装置５３におけるLEDアレイ６２のLED７１の並列度がテストにより決定される。並列度制御部５８は、並列度が１レベルずつ上げられていき、データが受信される通信装置１−２から各通信路においてテストパケットが受信できたか否か（LED７１の点滅パターンを２次元受光部８２により受光してパケットとして受信することができたか否か）を、制御パケットによって知らせてもらい、最適な並列度を決定する。並列度制御部５８は、決定した並列度を並列度レジスタ５８ａに記憶させる。また、通信状態認識部５７は、並列度レジスタ５８ａを参照し、通信路テーブル５７ｂを初期化する（どの通信路でデータパケットを送信して、どの通信路で制御パケットを送信するかを設定する）。尚、並列度テスト処理については、詳細を後述する。
【０１３５】
ステップＳ２において、並列度テスト処理が終了し、並列度が設定されると、送受信の準備が完了しているので、ステップＳ３において、通信コントローラ５２は、受信装置５４に問い合わせて、受信データあるか否かを判定する。より詳細には、通信コントローラ５２は、２次元受光部８２が送信装置５４のLEDアレイ６２のLED７１の点滅パターンにより光を受光して、パケットを受信したか否かを受信装置５４に問い合わせて、データ受信されたか否かを判定する。例えば、ステップＳ３において、受信データがないと判定された場合、その処理は、ステップＳ４に進む。
【０１３６】
ステップＳ４において、通信コントローラ５２は、ホストコントローラ５１より送信データが供給されたか否かを判定し、送信データがないと判定された場合、その処理は、ステップＳ７に進む。
【０１３７】
ステップＳ７において、通信コントローラ５２は、通信終了が指示されているか否かを判定し、通信終了が指示されていない場合、その処理は、ステップＳ３に戻る。すなわち、受信すべきデータも送信すべきデータもない場合、通信終了が指示されるまで、ステップＳ３，Ｓ４，Ｓ７の処理が繰り返されて、受信データ、または、送信データの待ち状態となる。
【０１３８】
ステップＳ４において、例えば、ホストコントローラ５１より送信データが供給されたと判定された場合、ステップＳ５において、通信コントローラ５２は、送信処理を実行し、その処理は、ステップＳ７に進む。すなわち、通信コントローラ５２は、通信状態認識部５７の通信路テーブル５７ｂに基づいて、送信パケット（制御パケット、データパケット、ダミーパケットのいずれか）を生成し、マンチェスタ符号化処理を施し、LED発光パターンに変換すると共に、そのLED発光パターンをLED発光パターンテーブル５９に記録する。送信装置５３の発光制御部６１は、LED発光パターンテーブル５９の情報に基づいて、LEDアレイ６２上の各LED７１の発光パターンを制御し、LEDアレイ６２の各LED７１を発光させて、データを点滅パターンにより送信する。尚、送信処理については、詳細を後述する。
【０１３９】
一方、ステップＳ３において、例えば、受信データが受信されたと判定された場合、ステップＳ６において、通信コントローラ５２は、受信処理を実行し、その処理は、ステップＳ７に進む。
【０１４０】
より詳細には、通信コントローラ５２の通信状態認識部５７は、２次元受光部８２により各通信路となるLED７１の点滅パターンとして受光した光信号を、デコード部８４によりデコードして、パケットとして受信できたか受信できたか否かをACKレジスタ５７ａに記憶させる。すなわち、通信状態認識部５７は、データが受信できた通信路に対してはACK(=0)としてACKレジスタ５７ａに記憶させ、受信できなかった通信路に対してはNACK(=1)としてACKレジスタ５７ａに記憶させる。
【０１４１】
また、受信パケットがデータパケットであれば、データ通信コントローラ５６は、受信データを受信データ格納メモリ５６ｂに記憶させると共に、1回の並列受信が完了したところで、その内容をホストコントローラ５１に供給する。
【０１４２】
受信パケットが制御パケットであれば、通信コントローラ５２は、制御パケット内に含まれるACKまたはNACKの情報（自らが送信したデータが受信されたか否かの情報）に基づいて、データを再送する必要があるか否かを判断する。また、並列度制御部５８は、並列度を再設定する。通信状態認識部５７は、有効なデータを送信する通信路を再設定する（通信路テーブル５７ｂを再設定する）。尚、受信処理については詳細を後述する。
【０１４３】
以上のような送信処理が実行されることにより、通信状態に応じて、通信路と並列度とが常に最適な状態に制御された状態で、データが通信されることになるため、高速で安定したデータの通信を実現することが可能となる。
【０１４４】
次に、図２１のフローチャートを参照して、並列度テスト処理について説明する。
【０１４５】
並列度テスト処理は、通信の開始時に相手に送信するときの送信装置の並列度を決めるためのテストである。並列度制御部５８は、低い並列度から１レベルずつ上げながら、送信したデータを受信する通信装置１から各通信路においてテストパケットが受信できたか否かを、制御パケットとして通知してもらうことにより、通信に最適な並列度を決定する。最適な並列度とは、通信速度が最高となる並列度であると考えることができる。以降の並列度テスト処理におおける並列度は、６４（＝８個×８個）、１６（＝４個×４個）、４（＝２個×２個）、および１を、それぞれレベル４乃至１として４レベルのみを考えるものとする。
【０１４６】
ステップＳ２１において、並列度制御部５８は、並列度のレベルを１に設定し、並列度テスト処理が実行中であることを示す、並列度テスト中フラグ＝１に設定する。すなわち、並列度制御部５８は、最初の並列度をレベル１にセットし、並列度レジスタ５８ａに０（＝並列度−１）を記憶させ、並列度テスト処理を開始するので、並列度テスト中フラグを１にセットする。
【０１４７】
ステップＳ２２において、並列度制御部５８は、テストパケット送受信処理を実行する。
【０１４８】
ここで、図２２を参照して、テストパケット送受信処理について説明する。
【０１４９】
ステップＳ５１において、通信状態認識部５７は、テスト用通信路テーブルセット処理を実行する。
【０１５０】
ここで、図２３のフローチャートを参照して、テスト用通信路テーブルセット処理について説明する。
【０１５１】
ステップＳ７１において、通信状態認識部５７は、通信路を識別する変数iを０に初期化する。変数iは、並列度の数だけ（通信路の数だけ）テストパケット属性をセットするためのカウンタ値である。
【０１５２】
ステップＳ７２において、通信状態認識部５７は、通信路テーブル５７ｂの通信路（ｉ）のアドレスにテストパケットの属性（２進数で「１１」＝１０進数で３）をセットする。
【０１５３】
ステップＳ７３において、通信状態認識部５７は、変数iをインクリメントする（i=i+1）。
【０１５４】
ステップＳ７４において、通信状態認識部５７は、変数ｉが並列度よりも小さいか否かを判定し、小さい場合、その処理は、ステップＳ７２に戻る。すなわち、通信状態認識部５７は、並列度について並列度制御部５８に問い合わせて、並列度レジスタ５８ａにおける並列度を参照する。変数iが並列度よりも小さい場合、まだテストパケット属性をセットする通信路（ｉ）が存在することになるので、通信状態認識部５７は、通信路（ｉ）の送信パケット種別を３にセットする処理を繰り返す（ステップＳ７２乃至Ｓ７４の処理が繰り返される）
【０１５５】
ステップＳ７４において、変数iが並列度よりも小さくない、すなわち、変数ｉが並列度と等しくなるか、または、それ以上になった場合、全ての通信路の属性がテストパケット属性にセットされたことになるので、その処理は、終了する。
【０１５６】
すなわち、以上の処理により、通信路テーブル５７ｂは、並列度に応じて設定された全ての通信路の属性がテストパケットにセットされることになる。
【０１５７】
ここで、図２２のフローチャートの説明に戻る。
【０１５８】
ステップＳ５２において、通信状態認識部５７は、通信路テーブル５７ｂの情報に基づいて、送信装置５３を制御して送信処理を実行する。すなわち、通信状態認識部５７は、通信路テーブル５７ｂの情報にしたがって、並列度の数だけテストパケットを生成して、符号化した後、スタートコードを加えて、発光パターンを生成し、その発光パターンをLED発光パターンテーブル５９に記憶させる。送信装置１の発光制御部６１は、LED発光パターンテーブル５９に記録された発光パターンに基づいて、LEDアレイ６２のLED７１を発光させてデータを光により送信する。尚、送信処理については、詳細を後述する。
【０１５９】
ステップＳ５３において、通信状態認識部５６は、一定の時間が経過したか否かを判定し、一定の時間が経過するまで、同様の処理を繰り返し、一定時間だけ処理待ちの状態となる。そして、ステップＳ５３において、一定の時間が経過したと判定された場合、ステップＳ５４において、通信コントローラ５２は、受信装置５４に問い合わせて、制御パケットが送信されてきて受信され始めたか否かを判定し、受信されていないと判定された場合、その処理は、ステップＳ５２に戻る。すなわち、制御パケットが送信されてきていないと言うことはデータが、送信したデータが受信されていない恐れがあるので、再度テストパケットを送信する。
【０１６０】
一方、ステップＳ５４において、制御パケットが受信され始めたと判定された場合、ステップＳ５５において、通信状態認識部５７は、各通信路において制御パケットが受信できたか否かをACKレジスタ５７ａに記憶させる。すなわち、通信状態認識部５７は、受信できたら通信路についてはACK(=0)としてACKレジスタ５７ａに記憶させ、受信できなかった通信路についてはNACK(=1)として（受信用）ACKレジスタ５７ａに記憶させる。また、通信状態認識部５７は、受信パケットは制御パケットであるので、制御パケット内に含まれるACKまたはNACK情報（こちらから前回送信したデータが相手側に受け取られたか否かの情報）を（送信用）ACKレジスタ５７ａにセットした後、受信処理を完了する。尚、受信処理については、詳細を後述する。
【０１６１】
以上のように、通信コントローラ５２がテストパケットを送信して、一定時間の間、相手側から制御パケットが送られてくるのを待ち、もし送られてくればその制御パケットを受信する。制御パケットが送られてこない場合、テストパケットを再送信して、また一定時間の間、相手側から制御パケットが送られてくるのを待ち、もし送られてくればその制御パケットを受信する。このようにして、相手側から制御パケットが返ってくるまで、この処理を繰り返す。もちろん、何回か処理を繰り返しても、相手からの応答が得られなかった場合には、この処理を終了し、ホストコントローラ５１にその結果を伝えて、通信を終えるようにしても良い。
【０１６２】
ここで、図２１のフローチャートの説明に戻る。
【０１６３】
ステップＳ２３において、通信状態認識部５７は、受信した制御パケットを解析して、ACKが返ってきているか否かを判定し、例えば、ACKが返ってきていないと判定した場合、その処理は、ステップＳ２２に戻る。すなわち、ステップＳ２３において、NACKが返ってきていた場合、ステップＳ２２の処理に戻ることで、再度テストパケット送受信処理が実行される。もちろん、ここで、何回か処理を繰り返しても、相手からのACKの応答が得られなかった場合、ホストコントローラ５１にその結果を伝えて、通信処理を終了するようにしても良い。また、より通信品質を知るために、テストパケット送受信処理を繰り返して、ACKが所定の回数以上受信できた場合に、ACKが返ってきたと判断するようにしても良い。
【０１６４】
ステップＳ２４において、並列度制御部５８は、並列度レジスタ５８ａに記憶されている並列度のレベルを１レベル上げて記憶させる。例えば、並列度１（並列度レジスタ＝０）であった場合、並列制御部５８は、並列度４（２×２：並列度レジスタ＝３）となる。今の場合、並列度のレベルを１から２に上げる。
【０１６５】
ステップＳ２５において、通信状態認識部５７は、再びテストパケット送受信処理を実行する。尚、テストパケット送受信処理については、図２２のフローチャートを参照して説明した処理と同様であるので、その説明は省略する。
【０１６６】
ステップＳ２６において、並列度制御部５８は、受信した制御パケットのACKまたはNACKの情報から、全通信路（並列度の数だけある）のうち、ACKの返ってきた通信路の割合を計算する。計算式は以下の式（３）で示される。
RACK(%)=ACKの返ってきた通信路の数／並列度の数×１００
・・・（３）
ここで、RACK(%)は、全通信路（並列度の数だけある）のうち、ACKの返ってきた通信路の割合（百分率）を示している。
【０１６７】
ステップＳ２７において、並列度制御部５８は、RACK(%)が、閾値RTHよりも大きいか否かを判定する。ここで、閾値RTHは、２５（％）と設定している。すなわち、今の場合、並列度のレベルは、レベル１で並列度が０、レベル２で並列度が３、レベル３で並列度が１５、レベル４で並列度は６３となり、レベル間の差は、並列度にして４倍ずつ変化している。従って、あるレベルにおいて、ACKが返ってくる割合が、２５％以下となるということは、実質的に１レベル下げた方が、各通信路を構成するLED７１の数が増えて、光による通信状態を改善できる可能性があることになる。このため、閾値RTHは、２５％として設定されている。
【０１６８】
例えば、ステップＳ２７において、割合RACKが閾値RTHよりも大きいと判定された場合、すなわち、さらに並列度を上げることができる可能性がある場合、ステップＳ２８において、並列度制御部５８は、並列度が最大値となっているか否かを判定し、例えば、最大値ではないと判定された場合、その処理は、ステップＳ２４に戻る。
【０１６９】
すなわち、再び、ステップＳ２５乃至Ｓ２７の処理により、並列度のレベルが１レベル上げられて同様の処理が繰り返される。
【０１７０】
そして、ステップＳ２８において、並列度が最大値であると判定された場合、ステップＳ３０において、通信状態認識部５７は、通信路テーブル５７ｂの初期化処理を実行する。
【０１７１】
ここで、図２４のフローチャートを参照して、通信路テーブルの初期化処理について説明する。
【０１７２】
ステップＳ８１において、通信状態認識部５７は、変数ｉを０に初期化する。ここで、
変数iは、送信パケットの種別をセットする通信路の番号（通信路テーブル５７ｂのアドレス）を示している。
【０１７３】
ステップＳ８２において、通信状態認識部５７は、通信路(i)の送信パケットの種別を１に設定する。すなわち、最初の処理において、通信状態認識部５７は、通信路テーブル５７ｂの通信路(0)の領域に、１をセットする。ここで、送信パケットの種別＝１は、制御パケットであることを示す値であるので、通信路(0)は制御パケットを送信するように設定される。
【０１７４】
ステップＳ８３において、通信状態認識部５７は、変数ｉを１インクリメントする。
【０１７５】
ステップＳ８４において、通信状態認識部５７は、通信路(i)の送信パケットの種別を０にセットする。すなわち、通信状態認識部５７は、通信路テーブル５７ｂの通信路(0)以外の領域を０にセットする。すなわち、送信パケットの種別＝０は、データパケットであることを示す値であるので、通信路(0)以外の通信路(i)はデータパケットを送信するように設定される。
【０１７６】
ステップＳ８５において、通信状態認識部５７は、変数ｉが並列度よりも小さいか否かを判定し、小さいと判定した場合、その処理は、ステップＳ８３に戻る。すなわち、並列度は、並列度レジスタ５８ａの値＋１であり、変数iが並列度よりも小さい間は、通信路テーブル５７ｂの各送信パケットの設定処理を継続することになる。結果として、通信路(0)以外の通信路(i)は、全てデータパケットに割り当てられることになる。
【０１７７】
ステップＳ８５において、変数ｉが並列度よりも小さくない場合、すなわち、全ての通信路について送信パケットの設定処理が完了した場合、通信路テーブル５７ｂの初期化処理は完了したことになるので、その処理は、終了する。すなわち、通信路テーブル５７ｂは、通信路の送信パケットの種別を記録しておくので、通信路の数だけ設定する必要があるが、その通信路の数は並列度と等しい値であるので、全ての通信路について送信パケットの種別が設定されたとみなされる。
【０１７８】
以上の処理により、通信状態認識部５７は、並列度の数（並列度レジスタ５８ａの値＋１）だけ、通信路テーブル５７ｂに送信パケットの種別をセットする。ただし、１つの通信路には制御パケットを割り当てて、残りの通信路にはデータパケットを割り当てるようにすることで、通常のデータ通信中にも並列度を変化させることが可能となる。
【０１７９】
ここで、図２１のフローチャートの説明に戻る。
【０１８０】
並列度制御部５８は、並列度テスト処理が実行されていないことを示す、並列度テスト中フラグ＝０に設定し、その処理を終了する。すなわち、並列度制御部５８は、並列度テスト処理が完了したので、並列度テスト中フラグを０にセットする。
【０１８１】
一方、ステップＳ２７において、割合RACKが閾値RTHよりも大きくないと判定された場合、ステップＳ２９において、並列度制御部５８は、並列度レジスタ５８ａに１レベル下げた並列度を記憶させる。すなわち、例えば、並列度６４（８×８：並列度レジスタ＝６３）のレベル４であった場合、１レベル下げられて、並列度は、並列度１６（４×４：並列度レジスタ＝１５）のレベル３となる。
【０１８２】
以上の処理により、並列度が１レベル上げられると、４倍の通信速度が実現されることになるので、所定のレベルで並列度に対してACKが返ってくる通信路の割合RACKが２５％よりも大きい場合、順次並列度を上げてテストを繰り返し、割合RACKが２５％よりも小さい場合、並列度のレベルが１レベル下げられた状態で設定され、割合RACKが２５％よりも小さくならなかった場合、並列度が最大値に設定される。結果として、通信状態が良く、LEDアレイ６２の各LED７１の点滅パターンを個々に２次元受光部８２が認識できるような場合、高い並列度が維持できるので、高速での通信を可能とすることができる。一方、通信状態が悪く、LEDアレイ６２の各LED７１の点滅パターンを個々に２次元受光部８２が認識できないような場合、複数の近傍にあるLED７１を同期して並列度を下げることにより、実質的な通信速度を低下させることで、２次元受光部８２の認識能力を上げて通信の安定度を向上させることが可能となるので、データ通信における高速性と安定性をバランスよく維持することが可能となる。
【０１８３】
尚、並列度テスト処理は、後述するが通信途中にも動的に行なわれるので、並列度テスト処理を、図２０におけるステップＳ２において行わないようにすることも可能である。ただし、この場合においても、通信路テーブルの初期化処理のみは実行される必要がある。
【０１８４】
また、並列度１から１レベルずつ並列度を上げていく並列度テスト処理の例について説明してきたが、最大並列度から１レベルずつ並列度を下げながらテストを繰り返して、並列度を設定するようにしても良い。
【０１８５】
次に、図２５を参照して、送信処理について説明する。
【０１８６】
ステップＳ９１において、通信状態認識部５７は、変数ｉを0に初期化する。送信パケットは、並列度の数だけ（通信に使用される通信路の数だけ）生成されることになるので、生成されるパケットの数をカウントするために、変数iを用いる。
【０１８７】
ステップＳ９２において、通信状態認識部５７は、通信路テーブル５７ｂ上の通信路(i)のパケットの属性が３、すなわち、テストパケットに設定されているか否かを判定し、例えば、パケットの属性が３に設定されていないと判定された場合、その処理は、ステップＳ９３に進む。
【０１８８】
ステップＳ９３において、通信状態認識部５７は、通信路テーブル５７ｂ上の通信路(i)のパケットの属性が１、すなわち、制御パケットに設定されているか否かを判定し、例えば、パケットの属性が１に設定されていないと判定された場合、その処理は、ステップＳ９４に進む。
【０１８９】
ステップＳ９４において、通信状態認識部５７は、通信路テーブル５７ｂ上の通信路(i)のパケットの属性が２、すなわち、ダミーパケットに設定されているか否かを判定し、例えば、パケットの属性が２に設定されていないと判定された場合、すなわち、パケットの属性が１乃至３ではないので、残されたパケットの属性であるデータパケットであると判定された場合、その処理は、ステップＳ９５に進み、データパケット生成処理を実行する。
【０１９０】
ここで、図２６のフローチャートを参照して、データパケット生成処理について説明する。
【０１９１】
ステップＳ１１１において、通信コントローラ５２は、データパケットを生成するため
、図１０で示される1bitのデータ／制御識別フラグを０に設定する。
【０１９２】
ステップＳ１１２において、通信コントローラ５２は、データパケットを生成するため、図１０で示される1bitの並列度テストフラグを０に設定する。
【０１９３】
ステップＳ１１３において、通信コントローラ５２は、データパケットを生成するため、図１０で示される1bitのダミーフラグを０に設定する。
【０１９４】
ステップＳ１１４において、通信コントローラ５２は、並列度レジスタ５８ａに記憶されている並列度を、図１０で示される6bitの並列度の値にセットする。
【０１９５】
ステップＳ１１５において、通信コントローラ５２は、図１０で示される6bitの空間アドレスに空間アドレスを設定する。例えば、通信路(i)の空間アドレスは、Ｘ＝（i÷sqrt(並列度)）の余り、Ｙ＝（i÷sqrt(並列度)）の商となる。すなわち、図８，図９の空間アドレスの説明図において、４×４の１６並列の場合においては、X方向、Ｙ方向ともに４つの通信路があるので、通信路(i)の空間アドレス（Ｘ）は、i÷４の余りとなり、通信路(i)の空間アドレス(Y)は、i÷４の商となる。
【０１９６】
以上のステップＳ１１１乃至Ｓ１１５の処理によりヘッダが生成される。
【０１９７】
ステップＳ１１６において、通信コントローラ５２は、データ再送フラグが１、すなわち、データの再送が要求されているか否かを判定し、例えば、データ再送フラグが１ではない、すなわち、データの再送が要求されていないと判定された場合、ステップＳ１１７において、図１０で示される64bitのデータに送信用の送信データを設定する。
【０１９８】
一方、ステップＳ１１６において、データ再送フラグが１である、すなわち、データの再送が要求されていると判定された場合、ステップＳ１２０において、通信コントローラ５２は、図１０で示される６４bitのデータに再送が要求されている再送データを設定する。
【０１９９】
ステップＳ１１８において、通信コントローラ５２は、ステップＳ１１１乃至Ｓ１１５の処理で生成されたヘッダと、ステップＳ１１７またはＳ１２０の処理により生成されたデータからCRC符号を算出する。
【０２００】
ステップＳ１１９において、通信コントローラ５２は、ステップＳ１１８の処理で算出されたCRC符号を、図１０で示されるエラー検出符号の部分に設定する。
【０２０１】
以上の処理により、データパケットが生成される。
【０２０２】
ここで、図２５のフローチャートの説明に戻る。
【０２０３】
ステップＳ９６において、通信コントローラ５２は、符号化処理を実行する。
【０２０４】
ここで、図２７のフローチャートを参照して、符号化処理について説明する。
【０２０５】
ステップＳ１３１において、通信コントローラ５２は、パケットのヘッダ、データ
、および、エラー検出符号の各符号を、マンチェスタ符号化する。すなわち、通信コントローラ５２は、送信データが０であれば、１０の２ビットに、送信データが１であれば、０１の２ビットに変換する。
【０２０６】
ステップＳ１３２において、通信コントローラ５２は、マンチェスタ符号化して生成した送信データにスタートコードを付加する。スタートコードは、全ての種類のパケットにおいて「０１１１００１０」である。
【０２０７】
以上の処理により、通信コントローラ５２は、パケットのヘッダ、データ、および、エラー検出符号の各符号を、マンチェスタ符号化して、さらにその先頭にスタートコードを付加する。スタートコードは、図１０乃至図１３に示したように、どの種類のパケットにおいて「０１１１００１０」である。
【０２０８】
ここで、図２５のフローチャートの説明に戻る。
【０２０９】
ステップＳ９７において、通信コントローラ５２は、LED発光パターンテーブル更新処理を実行する。
【０２１０】
ここで、図２８のフローチャートを参照して、LED発光パターンテーブルの更新処理について説明する。
【０２１１】
ステップＳ１５１乃至Ｓ１５４およびＳ１６２乃至Ｓ１６４において、通信コントローラ５２は、並列度レジスタ５８ａに問い合わせて、並列度（並列度レジスタ５８ａの値）から、通信路のサイズであるブロックサイズ（ＢＳ）（以降においては、複数のLED７１により構成される通信路のブロックを通信路ブロックと称するものとする）を算出する。ここで、１つの通信路のサイズは、BS×BS（＝LEDの個数×LEDの個数）個のLEDで構成される。
【０２１２】
すなわち、ステップＳ１５１において、通信コントローラ５２は、並列度レジスタ５８ａの情報に基づいて、今現在の並列度が６４であるか否か（並列度のレベルがレベル４であるか否か）を判定する。
【０２１３】
例えば、ステップＳ１５１において、並列度が６４であると判定された場合、ステップＳ１６２において、通信コントローラ５２は、ＢＳを１に設定する。
【０２１４】
また、ステップＳ１５１において、並列度が６４ではないと判定された場合、ステップＳ１５２において、通信コントローラ５２は、並列度が１６であるか否か（並列度のレベルがレベル３であるか否か）を判定し、例えば、並列度が１６であると判定した場合、ステップＳ１６３において、ＢＳを２に設定する。
【０２１５】
さらに、ステップＳ１５２におて、並列度が１６ではないと判定された場合、ステップＳ１５３において、通信コントローラ５２は、並列度が４であるか否か（並列度のレベルがレベル２であるか否か）を判定し、例えば、並列度が４であると判定した場合、ステップＳ１６４において、ＢＳを４に設定する。
【０２１６】
また、ステップＳ１５３において、並列度が４ではないと判定された場合、すなわち、並列度が６４でも、１６でも、４でもないので、１であると判定された場合、ステップＳ１５４において、通信コントローラ５２は、ＢＳを８に設定する。
【０２１７】
ステップＳ１５５において、通信コントローラ５２は、変数ｋを０に初期化する。変数ｋは、通信路ブロック内の通信路のＹ座標を表す変数である。
【０２１８】
ステップＳ１５６において、通信コントローラ５２は、変数ｊを０に初期化する。変数ｊは、通信路ブロック内の通信路のX座標を表す変数である。
【０２１９】
ステップＳ１５７において、通信コントローラ５２は、LED発光パターンテーブル５９のLED(R×BS+Q×BS×BS+j+8k)のアドレスに通信路(i)の発光パターンの情報を記憶させる。すなわち、通信路(i)の送信データは、(R×BS+Q×BS×BS+j+8k)番目のLED（ここで0≦i＜BS、0≦j＜BS、NB=8/BSとすると、Qはi÷NBの商、Rはi÷NBの余り）の発光パターンとなるので、LED発光パターンテーブル５９の対応するアドレスに、通信路(i)の発光パターンを記憶させる。
【０２２０】
ステップＳ１５８において、通信コントローラ５２は、変数ｊを１インクリメントする。ステップＳ１５９において、通信コントローラ５２は、変数ｊが、ブロックサイズＢＳよりも小さいか否かを判定し、小さい場合、すなわち、まだ、Ｘ方向のＢＳ分のアドレスにLED発光パターンテーブル５９に発光パターンを記憶させていない場合、その処理は、ステップＳ１５７に戻る。すなわち、Ｘ方向についてＢＳとなるアドレスになるまで、発光パターンを記憶させる処理が繰り返される。
【０２２１】
一方、ステップＳ１５９において、変数ｊがＢＳよりも小さくない、すなわち、Ｘ方向についてＢＳとなるアドレスまで、発光パターンがLED発光パターンテーブル５９に記憶されたと判定された場合、ステップＳ１６１において、通信コントローラ５２は、変数ｋを１インクリメントする。
【０２２２】
ステップＳ１６２において、通信コントローラ５２は、変数ｋがＢＳよりも小さいか否かを判定し、例えば、変数ｋが小さい場合、すなわち、まだ、Ｙ方向のＢＳ分のアドレスにLED発光パターンテーブル５９に発光パターンを記憶させていない場合、その処理は、ステップＳ１５７に戻る。すなわち、Ｙ方向についてＢＳとなるアドレスになるまで、発光パターンを記憶させる処理が繰り返される。
【０２２３】
一方、ステップＳ１６２において、変数ｋがＢＳよりも小さくない、すなわち、Ｙ方向についてＢＳとなるアドレスまで、発光パターンがLED発光パターンテーブル５９に記憶されたと判定された場合、その処理は、終了する。
【０２２４】
以上により、通信路ブロックに対して、ステップＳ１５７の処理が、全て施されるまで処理が繰り返され、最終的にLEDアレイ６２の各LED７１の発光パターンが全て、LED発光パターンテーブル５９に記憶させることになる。
【０２２５】
ここで、図２５のフローチャートの説明に戻る。
【０２２６】
ステップＳ９８において、通信状態認識部５７は、変数ｉを１インクリメントする。
【０２２７】
ステップＳ９９において、通信状態認識部５７は、変数ｉが並列度よりも小さいか否かを判定し、小さいと判定された場合、その処理は、ステップＳ９２に戻る。
【０２２８】
ステップＳ９２において、通信路テーブル５７ｂ上の通信路(i)のパケットの属性が３、すなわち、テストパケットに設定されていると判定された場合、ステップＳ１００において、通信コントローラ５２は、テストパケット生成処理を実行する。
【０２２９】
ここで、図２９のフローチャートを参照して、テストパケット生成処理について説明する。尚、図２９のフローチャートにおけるステップＳ１７４，Ｓ１７５，Ｓ１７７，Ｓ１７８の処理は、図２６のフローチャートを参照して説明したステップＳ１１４，Ｓ１１５，Ｓ１１８，Ｓ１１９の処理と同様であるので、その説明は、省略する。
【０２３０】
ステップＳ１７１において、通信コントローラ５２は、テストパケットを生成するため
、図１３で示される1bitのデータ／制御識別フラグを１に設定する。
【０２３１】
ステップＳ１７２において、通信コントローラ５２は、テストパケットを生成するため、図１３で示される1bitの並列度テストフラグを１に設定する。
【０２３２】
ステップＳ１７３において、通信コントローラ５２は、テストパケットを生成するため、図１３で示される1bitのダミーフラグを０に設定する。
【０２３３】
ステップＳ１７６において、通信コントローラ５２は、図１２で示されるデータの部分に送信用のACKレジスタ５７ａの値を設定する。すなわち、テストパケットのデータ部に、送信用のACKレジスタ５７ａの値（相手側から受信したときに記録しておいた各通信路の受信の可否）が設定される。
【０２３４】
以上の処理により、図１２で示されるように、テストパケットとして識別できるヘッダが生成されることによりテストパケットが生成される。
【０２３５】
ここで、図２５のフローチャートの説明に戻る。
【０２３６】
ステップＳ９３において、通信路テーブル５７ｂ上の通信路(i)のパケットの属性が１、すなわち、制御パケットに設定されていると判定された場合、ステップＳ１０１において、通信コントローラ５２は、制御パケット生成処理を実行する。
【０２３７】
ここで、図３０のフローチャートを参照して、制御パケット生成処理について説明する。尚、図３０のフローチャートにおけるステップＳ１９４乃至Ｓ１９８の処理は、図２９のフローチャートを参照して説明したステップＳ１７４乃至Ｓ１７８の処理と同様であるので、その説明は省略する。
【０２３８】
ステップＳ１９１において、通信コントローラ５２は、制御パケットを生成するため
、図１１で示される1bitのデータ／制御識別フラグを１に設定する。
【０２３９】
ステップＳ１９２において、通信コントローラ５２は、制御パケットを生成するため、図１１で示される1bitの並列度テストフラグを０に設定する。
【０２４０】
ステップＳ１９３において、通信コントローラ５２は、制御パケットを生成するため、図１１で示される1bitのダミーフラグを０に設定する。
【０２４１】
結果として、制御パケットを認識するためのヘッダが構成されることにより、制御パケットが生成される。
【０２４２】
ここで、図２５のフローチャートの説明に戻る。
【０２４３】
ステップＳ９４において、通信路テーブル５７ｂ上の通信路(i)のパケットの属性が２、すなわち、ダミーパケットに設定されていると判定された場合、ステップＳ１０２において、通信コントローラ５２は、ダミーパケット生成処理を実行する。
【０２４４】
ここで、図３１のフローチャートを参照して、ダミーパケット生成処理について説明する。尚、図３１のフローチャートにおけるステップＳ２１４乃至Ｓ２１８の処理は、図２９のフローチャートを参照して説明したステップＳ１７４乃至Ｓ１７８の処理と同様であるので、その説明は省略する。
【０２４５】
ステップＳ２１１において、通信コントローラ５２は、ダミーパケットを生成するため、図１２で示される1bitのデータ／制御識別フラグを１に設定する。
【０２４６】
ステップＳ２１２において、通信コントローラ５２は、制御パケットを生成するため、図１２で示される1bitの並列度テストフラグを０に設定する。
【０２４７】
ステップＳ２１３において、通信コントローラ５２は、制御パケットを生成するため、図１２で示される1bitのダミーフラグを１に設定する。
【０２４８】
結果として、ダミーパケットを認識するためのヘッダが構成されることにより、ダミーパケットが生成される。
【０２４９】
ここで、図２５のフローチャートの説明に戻る。
【０２５０】
ステップＳ９９において、変数ｉが並列度よりも小さくない、すなわち、全ての通信路(i)に対してデータパケット、ダミーパケット、制御パケット、または、テストパケットのいずれかのパケットが設定されたと判定された場合、ステップＳ１０３において、通信コントローラ５２は、LED発光パターンテーブル５９に記憶されている発光パターンの情報を送信装置５３に供給する。送信装置５３の発光制御部６１は、通信コントローラ５２により供給された発光パターンの情報に基づいて、LEDアレイ６２の各LED７１を発光させることにより、光でデータを送信する。
【０２５１】
以上の処理により、通信路テーブル５７ｂの情報に基づいて、並列度の数だけ送信パケットとしてデータパケット、ダミーパケット、制御パケット、または、テストパケットのいずれかのパケットが生成されて、マンチェスタ符号化された後、スタートコードが加えられることにより、発光パターンが生成され、その発光パターンで、送信装置５３のLEDアレイ６２の各LED７１が発光することによりデータが光で送信される。
【０２５２】
次に、図３２のフローチャートを参照して、受信処理について説明する。
【０２５３】
尚、この受信処理は、並列度テスト処理において相手側から制御パケット（ACK/NACK情報）が返ってくるのを受信する場合、もしくは、並列度が設定された後、実際の通信が始まり、相手側からデータパケット、制御パケット、またはダミーパケットが受信される場合に行なわれる処理である。この受信処理は、上述した、どちらの場合にも利用できるようになっている。
【０２５４】
ステップＳ２３１において、データ通信コントローラ５６は、受信装置５４により受信された受信パケットをすべて受信パケット格納メモリ５６ａに格納する。受信パケットは、最大の場合、並列度の数だけ受信されることになる。
【０２５５】
ステップＳ２３２において、データ通信コントローラ５６は、変数ｉを0に初期化する。尚、変数iは、受信パケット格納メモリ５６ａの受信パケットの番号、すなわちアドレスを示すものである。
【０２５６】
ステップＳ２３３において、データ通信コントローラ５６は、受信パケット格納メモリ５６ａのi番目の受信パケットを解析し、i番目の受信パケットが受信できたか否かを確認する。すなわち、受信パケットが格納されていれば０以外の値が入っているが、格納されていなければ、初期化されているので０が入っている。さらに、データ受信コントローラ５６は、受信パケットの種類がデータパケット、制御パケット、テストパケット、または、ダミーパケットであるかを解析する。より具体的には、データ通信コントローラ５６は、受信したパケットのヘッダの情報に基づいて、データパケット、制御パケット、テストパケット、または、ダミーパケットであるかを解析する。
【０２５７】
ステップＳ２３４において、通信状態認識部５７は、パケット(i)の解析結果に基づいて、受信パケットが受信パケット格納メモリ５６ａに格納されていれば、通信路(i)のパケットは受信できたことがわかり、格納されていなければ通信路(i)のパケットは受信できなかったことがわかる。通信状態認識部５７は、受信用のACKレジスタ５７ａの通信路(i)のフラグを、受信できたか否かによって設定する。すなわち、通信状態認識部５７は、受信できていれば０、受信できなかった場合には１を設定する。
【０２５８】
ステップＳ２３５において、データ通信コントローラ５６は、通信路(i)の受信パケットがダミーパケットか否かを判定し、例えば、ダミーパケットであると判定された場合、その処理は、ステップＳ２３９に進み、ダミーパケットではないと判定された場合、その処理は、ステップＳ２３６に進む。
【０２５９】
ステップＳ２３６において、データ通信コントローラ５６は、通信路(i)の受信パケットがテストパケットか否かを判定し、例えば、テストパケットではないと判定された場合、その処理は、ステップＳ２３７に進む。
【０２６０】
ステップＳ２３７において、データ通信コントローラ５６は、通信路(i)の受信パケットがデータパケットか否かを判定し、例えば、データパケットではないと判定された場合、すなわち、ダミーパケット、テストパケット、さらにデータパケットでもないのであるので、制御パケットであると判定され、その処理は、ステップＳ２３８に進む。ステップＳ２３８において、通信状態認識部５７は、制御パケット処理を実行する。
【０２６１】
ここで、図３３のフローチャートを参照して、制御パケット処理について説明する。制御パケット処理は、受信処理の中における制御パケットを受け取ったときの処理である。制御パケット処理の目的としては、第１に前回送ったデータを再送するか否かを判断することである。
【０２６２】
通信状態認識部５７は、制御パケットのACK/NACK情報を調べて、データパケット、または制御パケットを送った通信路に１つでもNACKがあれば、データ再送フラグを立てる。本実施例では、受信側が簡単にデータを並べ替えることができるように（パラレル−シリアル変換ができるように）、データの順番の並列送信機（LEDアレイ）の空間アドレスの順番にしている。そのため、１つでもデータを受け取ってもらえなかった場合には、データを再送するようにしている。
【０２６３】
もちろん、パケットのヘッダ中にデータの順番の情報を入れることで、データの到着順を可変にすることは可能である。この場合、データの再送は、NACKの返ってきた通信路のデータのみ行えばよい。
【０２６４】
制御パケット処理の第２の目的は、送信機の並列度を変更するか否かを判断することである。制御パケットのACK/NACK情報に基づいて、ACKの率がある閾値(RACK=25%)よりも小さいことが何回か続くと(THDOWN回よりも多くなると）、並列度を１レベル下げる。もしACK率が100%であることが何回か続くと(THUP回よりも多くなると)、並列度を１レベルあげる。
【０２６５】
さらに、制御パケット処理の第３の目的は、通信路テーブル５７ｂの設定を行うことである。使用する通信路を動的に切り替えて、利用できる通信路のみを通信に使う機能を、ここで実現している。並列度が変わらないときには、制御パケットのACK/NACK情報に基づいて、NACKが返ってきた通信路は、ダミーパケットを送るように、ACKが返ってきた通信路テーブルは、制御パケットまたはデータパケットを送るように通信路テーブル５７ｂを設定する。並列度が変わったときには、NACKの情報は関係なしに、全通信路で制御パケットまたはデータパケットを送るように通信路テーブル５７ｂが設定される。
【０２６６】
すなわち、ステップＳ２６１において、通信状態認識部５７は、受信用のACKレジスタ５７ａに、受信した制御パケット内のACK/NACK情報を格納する。
【０２６７】
ステップＳ２６２において、通信状態認識部５７は、並列度テスト中であるか否かを判定する。すなわち、通信状態認識部５７は、並列度テスト中か否かを、並列度テスト中フラグに基づいて判断する。例えば、並列度テスト中フラグが１であると判定された場合（フラグが立っていると判定された場合）、並列度テスト処理が実行されている最中なので、その処理は、終了する。
【０２６８】
一方、並列度テスト中フラグが１ではない（フラグが立っていない）と判定された場合、その処理は、ステップＳ２６３に進む。
【０２６９】
ステップＳ２６３において、通信状態認識部５７は、受信用のACKレジスタ５７ａと通信路テーブル５７ｂを比較して、通信路テーブル５７ｂで制御パケットまたはデータパケットを送信していた通信路について、受信用のACKレジスタ５７ａではNACKになっているものがあると判定した場合、ステップＳ２６４において、相手側に制御パケットまたはデータパケットが受信されなかったことがわかるので、データ再送フラグを立てる（＝１に設定する）。ステップＳ２６３において、例えば、NACKがないと判定された場合、ステップＳ２６５において、通信状態認識部５７は、データ再送フラグを立てない（＝０に設定する）。データ再送フラグは、データパケット生成処理において参照され、送信するデータパケットを生成する時点で、データ再送フラグを参照し、フラグが立っていれば、再送データのデータパケットを生成するようになっている。
【０２７０】
ステップＳ２６６において、並列度制御部５８が、送信側の並列度の設定処理を実行する。
【０２７１】
ここで、図３４のフローチャートを参照して、並列度の設定処理について説明する。
【０２７２】
ステップＳ２８１において、並列度制御部５８は、今現在の並列度が最小であるか否かを判定する。すなわち、並列度制御部５８は、並列度レジスタ５８ａを参照して、現在の並列度が最小（並列度レジスタの値が０）であるか否かを判断する。例えば、ステップＳ２８１において、並列度が最小であると判定された場合、その処理は、ステップＳ２９６に進む。一方、ステップＳ２８１において、並列度が最小ではないと判定された場合、その処理は、ステップＳ２８２に進む。
【０２７３】
ステップＳ２８２において、並列度制御部５８は、全通信路のうちACKの占める割合(RACK)を計算する。なお、割合RACKの計算方法は、上述した図２１のフローチャートにおけるステップＳ２６の処理と同様であるので、その説明は省略する。
【０２７４】
ステップＳ２８３において、並列度制御部５８は、求められたACKの割合RACKと閾値RTHとを比較し、割合RACKが閾値RTHよりも小さいか否かを判定する。ステップＳ２８３において、例えば、割合RACKが閾値RTHよりも小さいと判定された場合、ステップＳ２８４において、並列度制御部５８は、割合RACKが閾値RTHよりも小さいと判定された回数NDOWNを１インクリメントする。一方、ステップＳ２８３において、割合RACKが閾値RTHよりも小さくないと判定された場合、ステップＳ２８４の処理がスキップされる。
【０２７５】
ステップＳ２８５において、並列度制御部５８は、ステップＳ２８２乃至Ｓ２８４の処理を所定回数繰り返したか否かを判定し、所定回数繰り返していないと判定した場合、その処理は、ステップＳ２８１に戻る。すなわち、並列度が最小とならない限り、ステップＳ２８２乃至Ｓ２８５の処理が繰り返される。
【０２７６】
ステップＳ２８５において、ステップＳ２８２，Ｓ２８３の処理が所定回数繰り返されたと判定された場合、ステップＳ２８６において、並列度制御部５８は、割合RACKが閾値RTHよりも小さいと判定された回数NDOWNが、所定の閾値THDOWN（割合RACKが所定の閾値RTHよりも低い回数の閾値）よりも大きいか否かを判定する。
【０２７７】
例えば、ステップＳ２８６において、割合RACKが閾値RTHよりも小さいと判定された回数NDOWNが、所定の閾値THDOWN（割合RACKが所定の閾値RTHよりも低い回数の閾値）よりも大きいと判定された場合、割合RACKが閾値RTHよりも小さい傾向が強いとみなし、ステップＳ２９３において、並列度制御部５８は、並列度のレベルを１レベルさげて、処理を終了する。一方、ステップＳ２８６において、割合RACKが閾値RTHよりも小さいと判定された回数NDOWNが、所定の閾値THDOWN（割合RACKが所定の閾値RTHよりも低い回数の閾値）よりも大きくないと判定された場合、その処理は、ステップＳ２８７に進む。
【０２７８】
ステップＳ２８７において、並列度制御部５８は、今現在の並列度が最大値であるか否かを判定し、最大であると判定した場合、その処理を終了する。一方、ステップＳ２８７において、今現在の並列度が最大値ではないと判定された場合、ステップＳ２８８において、並列度制御部５８は、受信用のACKレジスタ５７ａ、すなわち受信した制御パケットの内のACK/NACK情報を調べて、NACKがなかったか否かを確認し、例えば、NACKがないと判定した場合、ステップＳ２８９において、NACKが存在しなかった回数NUPを１インクリメントし、その処理は、ステップＳ２９０に進む。一方、ステップＳ２８８において、NACKがあると判定された場合、ステップＳ２８９の処理がスキップされて、その処理は、ステップＳ２９０に進む。
【０２７９】
ステップＳ２９０において、並列度制御部５８は、ステップＳ２８７，Ｓ２８８の処理が所定回数繰り返されたか否かを判定し、例えば、所定回数繰り返されていないと判定された場合、その処理は、ステップＳ２８７に戻る。すなわち、ステップＳ２８７，Ｓ２８８の処理が所定回数繰り返されるまで、ステップＳ２８７乃至Ｓ２９０の処理が繰り返される。
【０２８０】
そして、ステップＳ２９０において、所定回数繰り返されたと判定された場合、ステップＳ２９１において、並列度制御部５８は、NACKが無かった回数NUP（ACK率が１００％だった回数）が、所定の閾値THUP（ACK率が１００％の回数の閾値）よりも大きいか否かを判定する。例えば、NACKが無かった回数NUP（ACK率が１００％だった回数）が、所定の閾値THUP（ACK率が１００％の回数の閾値）よりも大きいと判定された場合、ステップＳ２９２において、並列度制御部５８は、現状の並列度では十分な通信状態が維持されているので、並列度を上げても安定的に通信することが可能であるとみなし、並列度のレベルを１レベル上げたのち、その処理を終了する。
【０２８１】
一方、ステップＳ２９１において、NACKが無かった回数NUP（ACK率が１００％だった回数）が、所定の閾値THUP（ACK率が１００％の回数の閾値）よりも大きくないと判定された場合、ステップＳ２９２の処理がスキップされて、処理が終了する。すなわち、この場合、並列度は変更がないことになる。
【０２８２】
尚、上述の処理が終了されるとき、割合RACKが閾値RTHよりも小さいと判定された回数NDOWN、および、NACKが無かった回数NUPは、０に初期化される。
【０２８３】
すなわち、並列度の設定処理は、受信用のACKレジスタ５７ａ（すなわち、制御パケット内のACK/NACK情報を参照して、割合RACKが所定の閾値(RACK=25%)よりも小さい傾向が強くなると、並列度は１レベル下げられる。また、NACKが存在しない傾向が強くなると、並列度は１レベル上げられる。
【０２８４】
以上の処理により、ACKの占める割合が高く、通信状態が良好な状態が続けば、並列度はレベルが上げられ、通信速度を高められるが、一方で、NACKの現れる傾向が強くなり、通信状態が悪化するような場合、並列度のレベルを下げて通信の安定性を向上させることが可能となり、結果として、高速で、かつ、安定的な通信を実現させることが可能となる。
【０２８５】
尚、もちろん、並列度の上下の判断基準は別の方法を用いても構わない。例えば、並列度を上げる条件をNACKが存在しない場合ではなく、比較的NACKが少ない傾向が現れているときには、一度並列度を上げてみるようにしてもよい。
【０２８６】
ここで、図３３のフローチャートの説明に戻る。
【０２８７】
ステップＳ２６７において、通信状態認識部５７は、並列度の変更があったか否かを判定する。例えば、並列度に変更がないと判定された場合、ステップＳ２６８において、通信状態認識部５７は、通信路テーブルセット処理を実行し、NACKの返ってきた通信路はダミーパケットを送信するように通信路テーブル５７ｂを再設定する。尚、通信路テーブルセット処理の詳細については後述する。
【０２８８】
一方、並列度に変更があったと判定された場合、通信状態認識部５７は、通信路テーブルの初期化処理を実行し、通信路テーブル５７ｂにはダミーパケットなしで、制御パケットとデータパケットのみを設定する。尚、通信路テーブルの初期化処理の詳細については、図２４のフローチャートを参照して説明した処理と同様であるので、その説明は省略する。
【０２８９】
ここで、図３５を参照して、上述のステップＳ２６８の処理である通信路テーブルセット処理について説明する。
【０２９０】
ステップＳ３２１において、通信状態認識部５７は、変数iを初期化（０クリア）する。ここでは変数iは、送信パケットの種別をセットする通信路の番号（通信路テーブルのアドレス）を示すものである。
【０２９１】
ステップＳ３２２において、通信状態認識部５７は、受信用のACKレジスタ５７ａを参照し、通信路(i)がACKであるか否かを判定し、例えば、ACKであると判定した場合、ステップＳ３２３において、通信路(i)の送信パケット種別を１にセットすなわち、通信路(i)を制御パケットに割り当てる。
【０２９２】
一方、ステップＳ３２２において、通信路(i)がACKではないと判定された場合、ステップＳ３２４において、通信状態認識部５７は、通信路(i)の送信パケット種別を２にセットし、通信路(i)をダミーパケットに割り当てる。
【０２９３】
ステップＳ３２５において、通信状態認識部５７は、変数iを１インクリメントする。
【０２９４】
ステップＳ２３６において、通信状態認識部５７は、変数ｉが並列度より小さいか否かを判定する。すなわち、並列度は、並列度レジスタの値＋１であり、変数iが並列度よりも小さい間は、通信路テーブル５７ａの設定を継続するため、その処理は、ステップＳ３２７に進み、変数iが並列度よりも小さくない場合、通信路テーブルの設定は完了したことになるので、処理を終了する。
【０２９５】
ステップＳ３２７において、通信状態認識部５７は、受信用のACKレジスタ５７ａを参照して、通信路(i)がACKであるか否かを判定する。例えば、ステップＳ３２７において、通信路(i)がACKである場合、ステップＳ３２８において、通信状態認識部５７は、通信路(i)の送信パケット種別を０に設定、すなわち、通信路(i)をデータパケットに割り当て、その処理は、ステップＳ３２５に戻る。
【０２９６】
一方、ステップＳ３２７において、通信路(i)がACKではないと判定された場合、通信状態認識部５７は、通信路(i)の送信パケット種別を２にセットし、通信路(i)をダミーパケットに割り当て、その処理は、ステップＳ３２５に戻る。
【０２９７】
以上の処理により、並列度の数（並列度レジスタの値＋１）だけ、通信路テーブル５７ｂに送信パケットの種別をセットする。このとき、受信用のACKレジスタ５７ａ（すなわち、受信した制御パケット内のACK/NACK情報）を参照して、NACKの返ってきた通信路は、ダミーパケットを送信するようにセットし、ACKの返ってきた通信路のみを使って、制御パケット（１通信路）とデータパケット（残りの通信路）を送信するように割り当てられる。
【０２９８】
ここで、図３２のフローチャートの説明に戻る。
【０２９９】
ステップＳ２３９において、データ通信コントローラ５６は、変数iが相手側の最大並列度よりも小さいか否かを判定する。尚、図３の情報通信システムにおいては、通信装置１−１，１−２の両者とも最大並列度は６４並列である。したがって、受信パケット格納メモリも６４個まで受信パケットが格納できるように用意した。したがって、変数(i)は、０から６３の値をとり、６４未満の場合には、次の受信パケットの処理を行うために、ステップＳ２４０において、変数ｉを１インクリメントさせた後、その処理は、ステップＳ２３３に戻る。変数ｉが６４になった場合、すべて受信パケットについての処理が終了していることになるので、その処理は、ステップＳ２４１に進む。
【０３００】
ステップＳ２４１において、データ通信コントローラ５６は、受信データ格納メモリ５６ｂの内容を、ホストコントローラ５１に出力する。さらに、ステップＳ２４２において、データ通信コントローラ５６は、受信パケット格納メモリ５６ａ、および、受信データ格納メモリ５６ｂを初期化（０クリア）し、処理を終了する。
【０３０１】
一方、ステップＳ２３７において、受信パケットがデータパケットであると判定された場合、ステップＳ２４３において、データ通信コントローラ５６は、データパケットのデータ領域の情報を抜き出し、受信データ格納メモリ５６ｂに格納し、その処理は、ステップＳ２３９に進む。本実施例では、データパケットは、空間アドレスの小さいものから大きい順にデータが格納されているので、受信データ格納メモリへのデータ格納も、空間アドレスの小さいデータを受信データ格納メモリの小さいアドレスに入れていけばよい。
【０３０２】
さらに、ステップＳ２３６において、受信パケットがテストパケットであると判定された場合、ステップＳ２４４において、データ通信コントローラ５６は、テストパケット処理を実行する。
【０３０３】
ここで、図３６のフローチャートを参照して、テストパケット処理について説明する。
【０３０４】
ステップＳ３４１において、並列度制御部５８は、並列度を１にセット、すなわち、並列度レジスタ５８ａに０をセットする。
【０３０５】
ステップＳ３４２において、通信状態認識部５７は、通信路テーブルの初期化処理を実行し、決定した並列度（並列度レジスタの値＋１）の数だけ、通信路テーブルに送信パケットの種別をセットする。尚、今の場合、制御パケットを１つ送信すればよいので、最初の通信路（通信路（０））に制御パケットの種別番号をセットして、それ以外の通信路には、データパケットの種別番号をセットする。ここでは、並列度は１なので、データパケットはセットしない。尚、通信路テーブルの初期化処理については、図２４のフローチャートを参照して説明したので、その説明は省略する。
【０３０６】
すなわち、テストパケットを受信したら、相手側が並列度テストを行っていることがわかるので、自らは、並列度を１にして、制御パケットを送信することにする。
【０３０７】
すなわち、以上の処理により、データ通信コントローラ５６が受信装置５４から受信パケットデータを取得し、受信パケット格納メモリ５６ａに格納する。また、通信状態認識部５７は、受信パケットメモリに格納された全受信パケットについて解析して、各通信路において受信できたか否かを参照して調べ、受信用のACKレジスタ５７ａに記録する。さらに、受信できたパケットの種類を調べる。
【０３０８】
データパケットであれば、データ通信コントローラ５６は、受信データを抽出して受信データ格納メモリ５６ｂに格納し、制御パケットであれば、制御パケットに含まれるACK/NACK情報から、並列度の見直しと送信装置の通信路の使用・未使用の再設定を行う（通信路テーブルの再設定）。
【０３０９】
また、データ通信コントローラ５６は、データパケットであれば、並列度を１にして、制御パケットを送信するように設定する（並列度レジスタ＝０、通信路テーブルの再設定）。そして、通信コントローラ５２は、１回の並列受信が完了したら、受信データをホストコントローラ５１に出力する。
【０３１０】
結果として、動的に並列度を変化させながら、高速で、かつ、安定的な通信を実現させることが可能となる。
【０３１１】
次に、パケットのデコード処理について説明する。なお、比較部９２においては２フレーム間差分を採用し、受信装置１４のフレームレートが、送信装置５３のベース周波数の２倍である場合を例に説明する。
【０３１２】
パケットのデコードは、図５に示すようにデコード処理部９３で実行されるが、そのデコードにおいてデコード用メモリ９４を用いる。デコード用メモリ９４は、図６で示されるように、2次元受光部８２からの信号のデコード過程で各受光素子のデコード状況を示すステータス情報（ここでは「フラグ」と称する）とデコードして得られたデータ部分（ここでは「データ」と称する）を格納するためのフレームメモリである。フラグは、図６で示されるように、デコードカウンタ(3bit)、デコードステータス(7bit)、CRC結果フラグ(1bit)、およびエンドフラグ(1bit)から構成される。また、データはヘッダ(15bit)、受信データ(64ビット)、エラー検出符号(16bit)を格納する領域（エリア）で、デコードできたビットから順に格納される。
【０３１３】
図７には、このうちデコードカウンタおよびデコードステータスの変化が示されている。まずは、スタートコードが検出される。
【０３１４】
最初に初期化された後は、デコードカウンタおよびデコードステータス共に０となる。その後、送信点滅パターンのSt0には、立ち上がりエッジが含まれるので、それを検出して(CP(n)=1を検出して)、デコードステータスは０から１に変化し、デコードカウンタは、この後、１フレーム毎にカウントアップ動作が行なわれる。
【０３１５】
次に、スタートコードのSt1からSt2の間に立ち下がりエッジが含まれるので、それを検出して（CM(n)=1を検出して）、デコードステータスはさらに１から２に変化し、デコードカウンタは、一度１に設定されて、次のフレームからは、１フレーム毎にカウントアップされる。
【０３１６】
その次には、St2からSt3の間に立ち上がりエッジが含まれるので、それを検出して（CP(n)=1を検出して）、「デコードステータス」はさらに２から３に変化し、デコードカウンタは、一度１に設定されて、次のフレームからは、１フレーム毎にカウントアップされる。
【０３１７】
そして、St３の真ん中で立下りエッジがあるので、それを検出して（CM(n)=1を検出して）、デコードステータスはさらに３から４に変化し、デコードカウンタは、一度１に設定されて、次のフレームからは、１フレーム毎にカウントアップされる。
【０３１８】
以上のように、デコードステータス１からデコードステータス３までの区間はスタートコードの区間であり、スタートコードの点滅パターンは固定なので、光の立ち上がり変化、立下り変化のパターンも固定になる。したがって、デコードステータス１からデコードステータス３の各ステータスの長さ（フレーム数）も固定である。すなわち、デコードステータス１は６フレーム、デコードステータス２は４フレーム、デコードステータス３は２フレームとなる。
【０３１９】
また、このデコードステータスが３から４に変化するフレームを、説明のために「ヘッダ基準点」と呼ぶことにする。すると、この後、受信されるヘッダ15bit+データ64ビットのデータは、この「ヘッダ基準点」から４フレーム毎に受信することができる。
【０３２０】
「ヘッダ基準点」から４フレーム後は、ちょうどH0の真ん中に相当し、H0が０であっても、１であっても、マンチェスタ符号なので、光の立下りか立ち上がり変化が発生する。すなわち、H0=1のときには、マンチェスタ符号は0から1なので、立ち上がり変化が発生するのでCP(n)=1となり、H0=0のときにはマンチェスタ符号は1から0なので、立下り変化が発生してCM(n)=1となる。これにより、H0のデータを判定することができる。もし、CP(n) =CM(n)=0となる場合には、マンチェスタ符号が受信できなかったことになるので、エラーと判断して、この画素のデコードは、この後、スタートコードの検出からスタートするために、「フラグ」「データ」が０に初期化される。
【０３２１】
H1からH14、そしてD0からD63（データ64bit）、さらにE0からE15（誤り検出符合16bit）のデコードも、H0以降、４フレーム毎に同様の処理が行なわれる。
【０３２２】
次に、図３７のフローチャートを参照して、デコード処理について説明する。
【０３２３】
ステップＳ３６１において、デコード処理部９３は、フラグをすべて初期化（０に設定）すると共に、デコード用メモリ９４を初期化（０に設定）する。ここで、デコード処理部９３は、デコードカウンタとデコードステータスをも共に０に初期化する。
【０３２４】
ステップＳ３６２において、デコード処理部９３は、比較部９２よりCP(n),CM(n)が入力されるタイミングにあわせて、入力されるCP(n),CM(n)の座標（注目画素の座標）に相当するフラグ・データ情報を、デコード用メモリ９４から読み出す。
【０３２５】
ステップＳ３６３において、デコード処理部９３は、デコードメイン処理を実行し、図７を参照して説明した処理を行う。なお、デコードメイン処理について、詳細を後述する。
【０３２６】
ステップＳ３６４において、デコード処理部９３は、デコードメイン処理で更新されたフラグおよびデータの内容を、デコード用メモリ９４内の処理対象（注目画素）の座標のアドレスに書き戻す。
【０３２７】
ステップＳ３６５において、デコード処理部９３は、フラグが、１パケットにおける最後のエンドフラグ（デコードメイン処理において設定されるフラグであり、１パケットの最後まで受信した場合に１に設定されて、立つフラグである）が立っているか否かを判定する（エンドフラグが１になっているか否かを判定する）。
【０３２８】
ステップＳ３６５において、例えば、エンドフラグが立っていると判定された場合、ステップＳ３６７において、エラー検出部９５は、エラー検出処理を実行する。すなわち、CRCを用いて復元したデータ（スタートコードを除くヘッダ、データ、およびエラー検出符合）のエラー検出処理が実行される。エラー検出部９５は、CRCとして代表的なITU-T(国際電信電話諮問委員会)の勧告によるもので、生成多項式(Generator Polynomial) G(x)=x16+x12+x5+1を用いる。ここでは、エラー検出処理が実行されるため、シンドローム多項式(Syndrome polynomial)が計算され、シンドローム多項式が０になればエラーなし、０以外であればエラーが発生したことを検出する。このとき、エラー検出部９５は、後段のP/S変換部に受信したパケットデータと受信した受光素子の座標を出力する。尚、エラー検出処理については、詳細を後述する。
【０３２９】
ステップＳ３８６において、デコード処理部９３は、入力されたCP(n),CM(n)が１フレーム分終了したか否かを判定し、１フレーム分終了していないと判定された場合、ステップＳ３６６において、アドレスカウンタを１インクリメントして、その処理は、ステップＳ３６２に戻り、１フレーム分の処理が終了するまで、ステップＳ３６２乃至Ｓ３６８の処理が繰り替えされる。
【０３３０】
そして、ステップＳ３６８において、１フレーム分の処理が終了したと判定された場合、ステップＳ３６９において、通信終了か否かを判定して、通信終了であると判定された場合、その処理は、終了する。一方、通信終了ではないと判定された場合、ステップＳ３７０において、デコード処理部９３は、次の処理に備えて、デコード用メモリ９４のアドレスカウンタを初期化して、その処理は、ステップＳ３６２に戻る。
【０３３１】
また、ステップＳ３６５において、エンドフラグが立っていないと判定された場合、その処理は、ステップＳ３６６に進む。
【０３３２】
次に、図３８のフローチャートを参照して、上述した、ステップＳ３６３の処理であるデコードメイン処理について説明する。
【０３３３】
ステップＳ３８１において、デコード処理部９３は、比較部９２より供給される比較結果CP(n)==0で、かつ、デコードカウンタ==0で、かつ、デコードステータス==0であるか否かを判定する。すなわち、図３７のステップＳ３６１において、初期化がなされた後、図７で示されるように、すぐはデコードカウンタ、デコードステータスは共に０である。そして比較部９２より供給される比較結果CP(n)==1（光の立ち上がり変化）が来てはじめて、スタートコードのデコードが開始する。すなわち、「CP(n)==0 & デコードカウンタ==0 & デコードステータス==0」を満たすことは、まだこの注目画素では、パケットのデコードが開始されていないことを示している。
【０３３４】
ステップＳ３８１において、比較結果CP(n)==0で、かつ、デコードカウンタ==0で、かつ、デコードステータス==0であると判定された場合、このフレームでは、CP(n)==0なので、デコードは開始しないので、処理を終了する。
【０３３５】
ステップＳ３８１において、比較結果CP(n)==0で、かつ、デコードカウンタ==0で、かつ、デコードステータス==0ではないと判定された場合、ステップＳ３８２において、デコード処理部９３は、この注目画素のデコード処理を開始する、またはデコード処理途中であるので、ステップＳ３８２において、エラーフラグをクリア（＝０）して初期化する。尚、エラーフラグは、デコードメイン処理内のローカルフラグであり、スタートコード処理、および、データ受信処理において、光の変化が来るべきフレームで、光の変化が検出されなかった（CP(n)==0, CM(n)==0）場合に、エラーフラグに１がセットされる。
【０３３６】
ステップＳ３８３において、デコード処理部９３は、デコードステータスが４よりも小さいか否かを判定する。
【０３３７】
例えば、ステップＳ３８３において、デコードステータスが４よりも小さい場合、すなわち、デコードステータスが０乃至３である場合、スタートコードのデコード処理が、実行中であることを示している。したがって、処理は、ステップＳ３８４に進み、デコード処理部９３は、スタートコード処理を実行し、スタートコードのデコード処理を実行する。尚、スタートコード処理については、詳細を後述する。
【０３３８】
一方、ステップＳ３８３において、デコードステータスが４より小さくない場合、すなわち、デコードステータスが４以上の場合、データの受信処理中のステータスであるので、その処理は、ステップＳ３８７に進み、デコード処理部９３は、データ受信処理を実行し、データ受信のためのデコード処理を実行する。尚、データ受信処理についての詳細は後述する。
【０３３９】
ステップＳ３８５において、デコード処理部９３は、エラーフラグが1であるか否かを判定する。エラーフラグとは、スタートコード処理およびデータ受信処理において、光の変化が来るべきフレームで、光の変化が検出されなかった（CP(n)==0, CM(n)==0）場合に、エラーフラグに１がセットされる。
【０３４０】
ステップＳ３８５において、エラーフラグが１であると判定された場合、注目画素はデコード途中でエラーが発生したとものとみなし、ステップＳ３８６において、デコード処理部９３は、デコードカウンタ、デコードステータス、およびCRC結果フラグを初期化（０にセット）する。これにより、この注目画素は、これ以降、デコードの初期状態に戻り、スタートコード検出から開始されることになる。
【０３４１】
一方、ステップＳ３８５において、エラーフラグが１ではない場合、エラーが発生していないことになるので、デコードが成功していると思われるので、その処理は終了する。
【０３４２】
次に、図３９のフローチャートを参照して、図３８のステップＳ３８４の処理であるスタートコード処理について説明する。
【０３４３】
ステップＳ４０１において、デコード処理部９３は、デコードステータスが０であるか否かを判定する。例えば、デコードステータスが０であると判定された場合、ステップＳ４０２において、デコード処理部９３は、ステータス０の処理を実行する。
【０３４４】
ステップＳ４０１において、デコードステータスが０ではないと判定された場合、ステップＳ４０３において、デコード処理部９３は、デコードステータスが１であるか否かを判定する。例えば、デコードステータスが１であると判定された場合、ステップＳ４０４において、デコード処理部９３は、ステータス１の処理を実行する。
【０３４５】
ステップＳ４０３において、デコードステータスが１ではないと判定された場合、ステップＳ４０５において、デコード処理部９３は、デコードステータスが２であるか否かを判定する。例えば、デコードステータスが２であると判定された場合、ステップＳ４０６において、デコード処理部９３は、ステータス２の処理を実行する。
【０３４６】
ステップＳ４０５において、デコードステータスが２ではないと判定された場合、デコード処理部９３は、ステータス３の処理を実行する。
【０３４７】
すなわち、デコードステータスに対応してステータスの処理が実行される。
【０３４８】
ここで、図４０乃至図４３を参照して、それぞれステータス０の処理乃至ステータス３の処理について説明する。
【０３４９】
まず、図４０を参照して、ステータス０の処理について説明する。ステップＳ４２１において、デコード処理部９３は、デコードカウンタが０であるか否かを判定する。図７で示されるように、デコードカウンタが０の場合、対応する注目画素についてはデコードが開始されていない。
【０３５０】
例えば、ステップＳ４２１において、デコードカウンタが０ではない場合、ステップＳ４２２において、デコード処理部９３は、デコードカウンタが４であるか否かを判定する。すなわち、図７のデコードカウンタの遷移を見ても分かるように、デコードステータスが０から１に遷移するのは、デコードステータスが０でデコードカウンタが４であるときである。すなわち、デコードカウンタが４であるか否かの確認は、デコードステータスが０から１に遷移するための条件であるか否かの確認である。
【０３５１】
例えば、ステップＳ４２２において、デコードカウンタが４ではない、すなわち、デコードカウンタが０でもなく、４でもない場合、デコードカウンタの値は、１乃至３であることになる。そこで、ステップＳ４２３において、デコード処理部９３は、デコードカウンタの値を１インクリメントして、処理を終了する。
【０３５２】
一方、ステップＳ４２１において、デコードカウンタが０である、または、ステップＳ４２２において、デコードカウンタが４である場合、ステップＳ４２４において、デコード処理部９３は、比較結果CP(n)が1であるか否かを判定する。すなわち、ヘッダの最初は、光の立ち上がり変化から始まる。したがって、比較結果CP(n)が1であるか否かを確認することで、デコードステータスが０→１に遷移するか否かを確認することができる。
【０３５３】
ステップＳ４２４において、比較結果CP(n)が1であると判定された場合、すなわち、デコードステータスが０→１に遷移すると判定された場合、ステップＳ４２５において、デコード処理部９３は、次のステータスへの移行処理として、デコードステータスを１インクリメントし、デコードステータスの遷移にあわせて、デコードカウンタを０に初期化して処理を終了する。
【０３５４】
ステップＳ４２４において、比較結果CP(n)が1ではないと判定された場合、すなわち、デコードステータスが０→１に遷移しないとみなされた場合、ステップＳ４２６において、デコード処理部９３は、光の立ち上がり変化が来るべきときにこなかったので、エラーフラグに１をセットして、処理を終了する。図３８で説明したように、ステップＳ３８４のスタートコード処理の後に、ステップＳ３８５の処理でエラーフラグの確認が行なわれ、エラーフラグが１だったら、この注目画素は、フラグおよびデータがクリアされて、初期状態に戻る。
【０３５５】
次に、図４１を参照してステータス１の処理について説明する。尚、図４１のフローチャートにおけるステップＳ４４２，Ｓ４４４，Ｓ４４５の処理は、図４０のステップＳ４２３，Ｓ４２５，Ｓ４２６と同様の処理であるので、その説明は省略する。ステップＳ４４１において、デコード処理部９３は、デコードカウンタが６であるか否かを判定する。図７で示されるように、デコードステータスが１から２に遷移するための条件は、デコードカウンタが６のときのフレームで立ち下がりがあるか否かで判断することができる。
【０３５６】
例えば、ステップＳ４４１において、デコードカウンタが６ではない場合、その処理は、ステップＳ４４２に進む。また、デコードカウンタが６である場合、その処理は、ステップＳ４４３において、デコード処理部９３は、比較結果CM(n)が1であるか否かを判定する。すなわち、デコードカウンタが６のときに、光の立下りエッジ(CM(n)=1)が検出されると、スタートコード内の２つめのエッジを検出できたことになり、次のデコードステータスへ遷移する（デコードステータスが１から２に遷移する）。
【０３５７】
次に、図４２を参照してステータス２の処理について説明する。尚、図４２のフローチャートにおけるステップＳ４６２乃至Ｓ４６５の処理は、図４０のステップＳ４２３乃至Ｓ４２６と同様の処理であるので、その説明は省略する。ステップＳ４６１において、デコード処理部９３は、デコードカウンタが４であるか否かを判定する。図７で示されるように、デコードカウンタの遷移を見ると分かるように、デコードステータスが２→３に遷移するための条件は、デコードカウンタが４のときのフレームで、光の立ち上がるか否かで判断できる。
【０３５８】
例えば、ステップＳ４６１において、デコードカウンタが４ではない場合、その処理は、ステップＳ４６２に進む。また、デコードカウンタが４である場合、その処理は、ステップＳ４６３に進む。すなわち、デコードカウンタが４のときに、光の立下りエッジ(CM(n)=1)が検出されると、スタートコード内の３つめのエッジが検出されたことになり、次のデコードステータスへ遷移する（デコードステータスが２から３に遷移する）。
【０３５９】
次に、図４３を参照してステータス３の処理について説明する。尚、図４３のフローチャートにおけるステップＳ４８２乃至Ｓ４８５の処理は、図４１のステップＳ４４３乃至Ｓ４４６と同様の処理であるので、その説明は省略する。ステップＳ４８１において、デコード処理部９３は、デコードカウンタが２であるか否かを判定する。図７で示されるように、デコードカウンタの遷移を見ると分かるように、デコードステータスが３から４に遷移するための条件は、デコードカウンタが２のときのフレームで、光の立ち下がるか否かで判断できる。
【０３６０】
例えば、ステップＳ４８１において、デコードカウンタが２ではない場合、その処理は、ステップＳ４８２に進む。また、デコードカウンタが２である場合、その処理は、ステップＳ４８３に進む。すなわち、デコードカウンタが２のときに、光の立下りエッジ(CM(n)=1)が検出されると、スタートコード内の４つめのエッジが検出されたことになり、次のデコードステータスへ遷移する（デコードステータスが３から４に遷移する）。
【０３６１】
次に、図４４のフローチャートを参照して、図３８のフローチャートにおけるステップＳ３８７の処理であるデータ受信処理について説明する。
【０３６２】
ステップＳ５０１において、デコード処理部９３は、デコードカウンタが4であるか否かを判定する。図７のデコードカウンタの遷移に示されるように、データ基準点のフレームから、４フレーム毎に、立ち上がりエッジ(CP(n)=1)が検出されるか、または、立下りエッジ(CM(n)=1)が検出されるかを調べることで、データをデコードすることができる。従って、デコードカウンタが４のときのフレームを検出すればよい。
【０３６３】
ステップＳ５０１において、デコードカウンタが４であると判定された場合、ステップＳ５０２において、デコード処理部９３は、比較結果CP(n)が1であるか否かを判定する。例えば、ステップＳ５０２において、比較結果CP(n)が1ではないと判定された場合、ステップＳ５０３において、デコード処理部９３は、比較結果CM(n)が1であるか否かを判定する。
【０３６４】
例えば、ステップＳ５０３において、比較結果CM(n)が1ではないと判定された場合、ステップＳ５０４において、デコード処理部９３は、エラーフラグを１に設定して、処理を終了する。すなわち、ステップＳ５０３において、比較結果CM(n)が1ではないと判定されたということは、データ０もデータ１も検出されなかったことを意味する。すなわち光の変化が来るべきフレームで、光の変化が検出されなかったので、エラーフラグを立てて（１に設定して）処理を終了する
【０３６５】
ステップＳ５０１において、デコードカウンタが４ではないと判定された場合、すなわち、デコードカウンタが１乃至３の場合、ステップＳ５０５において、デコード処理部９３は、デコードカウンタを１インクリメントして処理を終了する。
【０３６６】
ステップＳ５０２において、比較結果CP(n)が1であると判定された場合、ステップＳ５０６において、デコード処理部９３は、現在のデコードステータスに対応するデータレジスタのビットに１を書き込み、その処理は、ステップＳ５０８に進む。すなわち、比較結果CP(n)が1であるということは、データ１が検出されたことになる。そこで、現在のデコードステータスに対応するデータレジスタのビットに１を書き込む。ここで、データレジスタの書きこみビットは、図７で示されるように、デコードステータスが４のときはH0、５のときはH1、６のときはH2、７のときはH3、８のときはH4、９のときはH5、１０のときはH6、１１のときはH7となる。したがって、デコードステータス４がLSB方向からみたデータのビット番号に相当する。ここでいうデータとは、ヘッダ(H0-H14)、データ(D0-D63)、および、エラー検出符号(E0-E15)の計95ビットである。
【０３６７】
一方、ステップＳ５０３において、比較結果CM(n)が1であると判定された場合、ステップＳ５０７において、デコード処理部９３は、現在のデコードステータスに対応するデータレジスタのビットに１を書き込み、その処理は、ステップＳ５０８に進む。すなわち、比較結果CM(n)が０であるということは、データ０が検出されたことになる。そこで、現在のデコードステータスに対応するデータレジスタのビットに１を書き込む。すなわち、データレジスタの書きこみビットは、図７で示されるように、デコードステータスが４のときはH0、５のときはH1、６のときはH2、７のときはH3、８のときはH4、９のときはH5、１０のときはH6、１１のときはH7となる。したがって、デコードステータス４がLSB方向からみたデータのビット番号に相当する。ここでいうデータとは、ヘッダ(H0-H14)、データ(D0-D63)、および、エラー検出符号(E0-E15)の計95ビットである。
【０３６８】
ステップＳ５０８において、デコード処理部９３は、デコードステータスが99であるか否かを判定する。すなわち、デコードステータスは０乃至99の値をとる。デコードステータスが99の次は０に遷移するため、この判定を行う。すなわち、デコードステータス０乃至３はスタートコード(S0-S3)、デコードステータス４乃至１８はヘッダ（H0-H14）、デコードステータス１９乃至８３はデータ(D0-D63)、デコードステータス８４乃至９９は誤り検出符号(E0-E15)となる。
【０３６９】
従って、ステップＳ５０８において、デコードステータスが９９ではない場合、すなわち、９９未満の値である場合、ステップＳ５０９において、デコード処理部９３が、デコードステータスを１インクリメントする。また、ステップＳ５０８において、デコードステータスが９９であった場合、ステップＳ５１０において、デコード処理部９３は、デコードステータスを０にする。
【０３７０】
ステップＳ５１１において、デコード処理部９３は、デコードカウンタを０に初期化する。
【０３７１】
ステップＳ５１２において、デコード処理部９３は、デコードステータスが０であるか否かを判定し、デコードステータスが０である場合、ステップＳ５１３において、エンドフラグを１に設定する。すなわち、データ受信処理中にデコードカウンタが４で、かつデコードステータスが０である条件は、現在のフレームがE15のデータ（誤り検出符号の最後のビット）を受信したことを意味する。したがって、この注目画素では、９５ビットのデータ（ヘッダ(15bit)、受信データ(64ビット)、エラー検出符号(16bit)）を欠けることなく受信できたので、それを示すために、「エンドフラグ」を設定する。尚、エンドフラグは、デコード処理部９３の後段であるエラー検出部９５で参照される。すなわち、エンドフラグ＝１の画素（受光素子）については、エラー検出部９５でCRCを用いた誤り検出を行い、エンドフラグ＝０の画素は受信データがないので、処理を行わない。また、エラーフラグの初期化は、図３７のフローチャートにおけるステップＳ３６１の処理である初期化処理及び図３８のフローチャートにおけるステップＳ３８６の処理で行なわれる。
【０３７２】
以上の処理により、マンチェスタ符号化され、さらに、LEDアレイ６２の各LED７１の点滅パターンを２次元受光部８２により取得した後、デコードすることが可能となる。
【０３７３】
尚、以上においては、受信装置５４にレンズ８１などの光学系を設けて、２次元受光部８２により検出される信号を通信にのみ用いた場合の例について説明してきたが、例えば、図４５で示されるように、映像フレームメモリ２０１および画像処理部２０２を設けて、ADC８３の出力をデコード処理部８４のみならず、映像フレームメモリ２０１に供給し、画像処理部２０２が適宜画像処理することにより、データ通信と同時に、映像を撮像することも可能となる。
【０３７４】
映像用フレームメモリ２０１は、高速撮像の映像(例えば1000fps)から通常のレートの映像（例えば30fps）を生成するために使用する。この場合、もっとも単純な映像生成方法は、33枚の画像を足し合わせて、30fps相当の映像を生成する方法である。したがって、映像用フレームメモリ２０１には、少なくとも１フレーム分のメモリを用意して、ADC８３の出力データを前フレームまで積算された映像データと足し合わせて書き戻す処理を行うことで実現可能である。
【０３７５】
画像処理部２０２は、映像用フレームメモリ２０１を用いて30fps相当の画像を生成する処理と、その30fps相当のカラーの復元処理（デモザイク処理）、ガンマ補正やオートホワイトバランス処理、オートゲインコントロールなど、一般的なイメージセンサの後段処理を行う。
【０３７６】
また、図４６は、機能性イメージセンサ２１１を用いた構成例を示している。このセンサは、通常のイメージセンサに比べて、フレームレートが高く、フレームメモリと演算機能を有している。すなわち、このイメージセンサは、図４７に示すように、受光部２２１で受光した信号を、IDフレームメモリ２２２と比較部２２３をイメージセンサ内に有しており、外部の回路は比較的小規模になるのが、メリットの１つである。
【０３７７】
また、高速フレームレートのイメージセンサで問題となるのが、イメージセンサと外部回路とのバンド幅が大きくなってしまうことであるが、このイメージセンサにおいては、出力データが比較演算によってデータ量の大幅な削減がなされることから、イメージセンサと外部回路とのバンド幅の問題は大幅に緩和される。したがって、本発明の一実装として、最適なデバイスの１つといえる。なお、この機能性イメージセンサは、数Kfps乃至数十Kfpsのフレームレートでフレーム間差分演算を行うことができる。
【０３７８】
以上によれば、光空間通信の並列度を最適化することにより、通信路特性が優れないときには並列度を小さくして通信の安定性を向上させ、通信路特性が優れるときには並列度を大きくして高速通信を可能とすることにより、高速で、かつ、安定的な通信を実現することが可能となる。また、動的にデータ送信する通信路を選択することで、高効率で、かつ、安定な情報通信システムを構成することが可能となる。
【０３７９】
上述した一連の処理は、ハードウェアにより実行させることもできるが、ソフトウェアにより実行させることもできる。一連の処理をソフトウェアにより実行させる場合には、そのソフトウェアを構成するプログラムが、専用のハードウェアに組み込まれているコンピュータ、または、各種のプログラムをインストールすることで、各種の機能を実行させることが可能な、例えば汎用のパーソナルコンピュータなどに記録媒体からインストールされる。
【０３８０】
プログラムが記録されている記録媒体は、図２に示すように、コンピュータとは別に、ユーザにプログラムを提供するために配布される、プログラムが記録されている磁気ディスク４１（フレキシブルディスクを含む）、光ディスク４２（CD-ROM(Compact Disc-Read Only Memory)，DVD（Digital Versatile Disk）を含む）、光磁気ディスク４３（MD（Mini-Disc）を含む）、もしくは半導体メモリ４４などよりなるパッケージメディアにより構成されるだけでなく、コンピュータに予め組み込まれた状態でユーザに提供される、プログラムが記録されているROM２２や、記憶部２８に含まれるハードディスクなどで構成される。
【０３８１】
尚、本明細書において、記録媒体に記録されるプログラムを記述するステップは、記載された順序に沿って時系列的に行われる処理は、もちろん、必ずしも時系列的に処理されなくとも、並列的あるいは個別に実行される処理を含むものである。
【０３８２】
また、本明細書において、システムとは、複数の装置により構成される装置全体を表すものである。
【図面の簡単な説明】
【０３８３】
【図１】本発明を適用した情報通信システムの一実施の形態の構成を示す図である。
【図２】図１の通信装置の構成を示す図である。
【図３】図２の通信装置の構成により実現される機能を示す図である。
【図４】図３のデコード処理部の構成を示す図である。
【図５】図４の比較部の構成を示す図である。
【図６】デコードメモリ上フラグとデータを説明する図である。
【図７】デコードのタイミングを説明するタイミングチャートである。
【図８】空間アドレスを説明する図である。
【図９】空間アドレスを説明する図である。
【図１０】データパケットの構成を説明する図である。
【図１１】制御パケットの構成を説明する図である。
【図１２】ダミーパケットの構成を説明する図である。
【図１３】テストパケットの構成を説明する図である。
【図１４】受信パケット格納メモリの構成を説明する図である。
【図１５】受信データ格納メモリの構成を説明する図である。
【図１６】ACKレジスタの構成を説明する図である。
【図１７】通信路テーブルの構成を説明する図である。
【図１８】並列度レジスタの構成を説明する図である。
【図１９】LED発光パターンテーブルの構成を説明する図である。
【図２０】通信処理を説明するフローチャートである。
【図２１】並列度テスト処理を説明するフローチャートである。
【図２２】テストパケット送受信処理を説明するフローチャートである。
【図２３】テスト用通信路テーブルセット処理を説明するフローチャートである。
【図２４】通信路テーブルの初期化処理を説明するフローチャートである。
【図２５】送信処理を説明するフローチャートである。
【図２６】データパケット生成処理を説明するフローチャートである。
【図２７】符号化処理を説明するフローチャートである。
【図２８】LED発光パターンテーブルの交信処理を説明するフローチャートである。
【図２９】テストパケット生成処理を説明するフローチャートである。
【図３０】制御パケット生成処理を説明するフローチャートである。
【図３１】ダミーパケット生成処理を説明するフローチャートである。
【図３２】受信処理を説明するフローチャートである。
【図３３】制御パケット処理を説明するフローチャートである。
【図３４】並列度の設定処理を説明するフローチャートである。
【図３５】通信路テーブルのセット処理を説明するフローチャートである。
【図３６】テストパケット処理を説明するフローチャートである。
【図３７】パケットのデコード処理を説明するフローチャートである。
【図３８】デコードメイン処理を説明するフローチャートである。
【図３９】スタートコード処理を説明するフローチャートである。
【図４０】ステータス０の処理を説明するフローチャートである。
【図４１】ステータス１の処理を説明するフローチャートである。
【図４２】ステータス２の処理を説明するフローチャートである。
【図４３】ステータス３の処理を説明するフローチャートである。
【図４４】データ受信処理を説明するフローチャートである。
【図４５】受信装置のその他の構成を示す図である。
【図４６】受信装置のその他の構成を示す図である。
【図４７】図４６の機能性イメージセンサの構成を説明する図である。
【符号の説明】
【０３８４】
１，１−１，１−２  通信装置，  ５２，５２−１，５２−２  通信コントローラ，  ５６，５６−１，５６−２  データ通信コントローラ，  ５６ａ，５６ａ−１，５６ａ−２  受信パケット格納メモリ，  ５６ｂ，５６，−１，５６ｂ−２  受信データ格納メモリ，  ５７，５７−１，５７−２  通信状態認識部，  ５７ａ，５７ａ−１，５７ａ−２  ACKレジスタ，  ５７，５７ｂ−１，５７ｂ−２  通信路テーブル，  ５８，５８−１，５８−２  並列度制御部，  ５８ａ，５８ａ−１，５８ａ−２  並列度レジスタ，  ５９，５９−１，５９−２  LED発光パターンテーブル，  ９２  比較部，  ９３  デコード処理部，  ９４  デコード用メモリ，  ９５  エラー検出部
【図１】
2006191313.tif 000005
【図２】
2006191313.tif 000006
【図３】
2006191313.tif 000007
【図４】
2006191313.tif 000008
【図５】
2006191313.tif 000009
【図６】
2006191313.tif 000010
【図７】
2006191313.tif 000011
【図８】
2006191313.tif 000012
【図９】
2006191313.tif 000013
【図１０】
2006191313.tif 000014
【図１１】
2006191313.tif 000015
【図１２】
2006191313.tif 000016
【図１３】
2006191313.tif 000017
【図１４】
2006191313.tif 000018
【図１５】
2006191313.tif 000019
【図１６】
2006191313.tif 000020
【図１７】
2006191313.tif 000021
【図１８】
2006191313.tif 000022
【図１９】
2006191313.tif 000023
【図２０】
2006191313.tif 000024
【図２１】
2006191313.tif 000025
【図２２】
2006191313.tif 000026
【図２３】
2006191313.tif 000027
【図２４】
2006191313.tif 000028
【図２５】
2006191313.tif 000029
【図２６】
2006191313.tif 000030
【図２７】
2006191313.tif 000031
【図２８】
2006191313.tif 000032
【図２９】
2006191313.tif 000033
【図３０】
2006191313.tif 000034
【図３１】
2006191313.tif 000035
【図３２】
2006191313.tif 000036
【図３３】
2006191313.tif 000037
【図３４】
2006191313.tif 000038
【図３５】
2006191313.tif 000039
【図３６】
2006191313.tif 000040
【図３７】
2006191313.tif 000041
【図３８】
2006191313.tif 000042
【図３９】
2006191313.tif 000043
【図４０】
2006191313.tif 000044
【図４１】
2006191313.tif 000045
【図４２】
2006191313.tif 000046
【図４３】
2006191313.tif 000047
【図４４】
2006191313.tif 000048
【図４５】
2006191313.tif 000049
【図４６】
2006191313.tif 000050
【図４７】
2006191313.tif 000051