以下に本発明の実施の形態を説明するが、本明細書に記載の発明と、発明の実施の形態との対応関係を例示すると、次のようになる。この記載は、本明細書に記載されている発明をサポートする実施の形態が本明細書に記載されていることを確認するためのものである。従って、発明の実施の形態中には記載されているが、発明に対応するものとして、ここには記載されていない実施の形態があったとしても、そのことは、その実施の形態が、その発明に対応するものではないことを意味するものではない。逆に、実施の形態が発明に対応するものとしてここに記載されていたとしても、そのことは、その実施の形態が、その発明以外の発明には対応しないものであることを意味するものでもない。
さらに、この記載は、本明細書に記載されている発明の全てを意味するものではない。換言すれば、この記載は、本明細書に記載されている発明であって、この出願では請求されていない発明の存在、すなわち、将来、分割出願されたり、補正により出現、追加される発明の存在を否定するものではない。
即ち、本発明のデータ通信装置は、データを他のデータ通信装置に送信する際に、並列的に発光装置を発光させるための並列度を決定する並列度決定手段(例えば、図3の並列度制御部58)と、並列度に応じた個数を単位として、近接する発光装置をグループ化するとともに、同一グループ内の各発光装置を同期して点滅させる制御を行うことで、他のデータ通信装置へのデータの送信を制御する発光制御手段(例えば、図3の通信コントローラ52)と、2次元平面上に近接して配置した複数の光電変換素子からなり、他のデータ通信装置において、他のデータ通信装置の発光制御手段によりグループに対応するグループ内の各発光装置が同期して点滅されることで並列に送信されてくるデータを、発光装置単位で受光することにより受信する受信手段(例えば、図3の受信装置54)とを備え、受信手段は、他のデータ通信装置から送信されてくる、他のデータ通信装置でデータが受信できたか否かを示すフィードバック情報を受信し、並列度決定手段は、フィードバック情報に基づいて、並列に送信したデータのうち受信が成功したデータの割合が所定の閾値より大きいと判定された場合、並列度を上げることを特徴とする。
本発明のデータ通信方法は、データを他のデータ通信装置に送信する際に、並列的に上記発光装置を発光させるための並列度を決定する並列度決定ステップ(例えば、図33のフローチャートにおけるステップS266の処理)と、並列度に応じた個数を単位として、近接する発光装置をグループ化するとともに、同一グループ内の各発光装置を同期して点滅させる制御を行うことで、他のデータ通信装置へのデータの送信を制御する発光制御ステップ(例えば、図25のフローチャートにおけるステップS103の処理)と、2次元平面上に近接して配置した複数の光電変換素子により、他のデータ通信装置における発光制御ステップの処理によりグループに対応するグループ内の各発光装置が同期して点滅されることで並列に送信されてくるデータを、発光装置単位で受光することにより受信する受信ステップ(例えば、図22のフローチャートにおけるステップS55の処理)とを含み、受信ステップの処理は、他のデータ通信装置から送信されてくる、他のデータ通信装置でデータが受信できたか否かを示すフィードバック情報を受信し、並列度決定ステップの処理は、フィードバック情報に基づいて、並列に送信したデータのうち受信が成功したデータの割合が所定の閾値より大きいと判定された場合、並列度を上げることを特徴とする。
尚、プログラムについては、データ通信方法と同様であるので、その説明は省略する。
図1は、本発明を適用した情報通信システムの一実施の形態の構成を示す図である。
通信装置1−1,1−2は、後述するLEDアレイ62(図3)と2次元受光部82とを用いて、相互に空間内でLEDアレイ62(図3)のLED71(図3)の発光パターンを2次元受光部82により受光してデータを授受する。尚、以降において、通信装置1−1,1−2について特に区別する必要が無い場合、単に、通信装置1と称するものとし、その他の構成についても同様に称するものとする。また、図1において、通信装置1が2個であり、相互にデータを授受する例について説明するが、それ以上の台数の通信装置1が相互に通信する構成であっても良いことは言うまでもない。
次に、図2を参照して、通信装置1の構成について説明する。尚、通信装置1−1,1−2については、それぞれ同様の構成である。
通信装置1は、例えば、いわゆるパーソナルコンピュータである。CPU(Central Processing Unit)21は、ROM(Read Only Memory)22、または記憶部28に記憶されているプログラムに従って各種の処理を実行する。RAM(Random Access Memory)23には、CPU21が実行するプログラムやデータなどが適宜記憶される。これらのCPU21、ROM22、およびRAM23は、バス24により相互に接続されている。
CPU21には、バス24を介して入出力インタフェース25が接続されている。入出力インタフェース25には、キーボード、マウス、マイクロホンなどよりなる入力部26、ディスプレイ、スピーカなどよりなる出力部27が接続されている。CPU21は、入力部26から入力される指令に対応して各種の処理を実行する。そして、CPU21は、処理の結果得られた画像や音声等を出力部27に出力する。
入出力インタフェース25に接続されている記憶部28は、例えばハードディスクなどで構成され、CPU21が実行するプログラムや各種のデータを記憶する。通信部29は、その他の通信装置1と通信する。
また、記憶部28は、各種のプログラムを記憶しており、CPU21は、これらのプログラムを読み出して対応する処理を実行する。
入出力インタフェース25に接続されているドライブ30は、磁気ディスク41、光ディスク42、光磁気ディスク43、或いは半導体メモリ44などが装着されたとき、それらを駆動し、そこに記録されているプログラムやデータなどを取得する。取得されたプログラムやデータは、必要に応じて記憶部28に転送され、記憶される。
次に、図3を参照して、図2の通信装置1により実現される機能について説明する。尚、図3においては、図中の上部の通信装置1−1については、送信側の構成を詳細に示しており、図中の下部の通信装置1−2については、受信側の構成を詳細に示しているが、いずれも同様の構成であり、それぞれが通信装置1−1,1−2間でデータの送受信を実行している。また、図中の符号については、「−1」、「−2」が付されていないものもあるが、図中に付されていないものであっても、通信装置1−1を構成するものには「−1」が付されており、通信装置1−2を構成するものには「−2」が付されているものとする。
ホストコントローラ51−1,51−2は、それぞれ通信装置1−1,1−2のメインコントローラであり、ここでは、送信データをそれぞれ通信コントローラ52−1,52−2に送り、受信データを通信コントローラ52−1,52−2からそれぞれ受け取る。
通信コントローラ52−1,52−2は、それぞれホストコントローラ51−1,51−2より供給される送信データを送信装置53−1,53−2に供給し、それぞれ通信装置1−2,1−1に対して送信させる。より詳細には、通信コントローラ52−1,52−2は、それぞれホストコントローラ51−1,51−2より供給された送信データを並列の光信号で送信するために、64bitごとに分割し、送信装置53−1,53−2に供給し、それぞれ通信装置1−2,1−1に送信させる。また、通信コントローラ52−1,52−2は、送信する各種のパケットをマンチェスタ符号化し、マンチェスタ符号化された信号に基づいて、送信装置53のLEDアレイ62の個々のLED71毎の発光パターンを決定し、LED発光パターンテーブル59に記憶させる。
通信コントローラ52−1,52−2のデータ通信コントローラ56−1,56−2は、受信装置54−1,54−2よりそれぞれ通信装置1−2,1−1より送信されてきたデータを受信すると、パケット単位で受信パケット格納メモリ56a−1,56a−2に記憶させると共に、パケットのうち受信データを構成する部分を受信データ格納メモリ56bに記憶させる。
通信状態認識部57−1,57−2は、後述するように送信装置53のLEDアレイ62を構成するLED71の1個分の光を受光する、受信装置54−1,54−2の2次元受光部82の画素により通信路が形成されるが、この通信路単位でデータが受信できたか否かに基づいて、通信経路毎に受信できた場合ACKを、受信できなかった場合NACKをそれぞれの送信装置53−1,53−2を制御して、制御情報(制御パケット)として送信させる。このとき、通信状態認識部57−1,57−2は、通信経路毎にACKまたはNACKの情報をACKレジスタ57a−1,57a−2に記憶させる。また、通信状態認識部57−1,57−2は、送信装置53を制御して近傍にある複数のLEDを同期させて並列に発光させるときの並列度のテストパケットを並列度制御部58の並列度レジスタ58aの情報に基づいて送信させる。通信状態認識部57は、送信先の通信装置1における受信装置54の2次元受信部82により受信できなかった通信路に対応するLED71について、ダミーパケットを送信するように、対応する通信路のLEDアレイ62上のLED71についてダミーパケットを送信させる。
上述したように、送信装置53により送信されるパケットは、制御パケット、データパケット、テストパケット、およびダミーパケットがある。通信状態認識部57−1,57−2は、どの通信路に、制御パケット、データパケット、テストパケット、およびダミーパケットが送信されているかの情報を通信路テーブル57b−1,57b−2として記憶する。
並列度制御部58は、近接する複数のLED71を1個のLEDであるかのように同期して発光させることにより並列的にLED71を発光させるための並列度を、ACKレジスタ57aに基づいて計算し、並列度レジスタ58aに記憶させる。
送信装置53−1,53−2の発光制御部61は、LED発光パターンテーブル59に記憶されている、LEDアレイ62上の個々のLED71のパターンに基づいて、LEDアレイ62上の個々のLED71を発光させる。
受信装置54−1,54−2は、2次元受信部82−1,82−2がレンズ81−1,81−2を介して、送信装置53−2,53−1より送信されてくる2次元の並列の光信号を各画素単位で受光する。2次元受信部82−1,82−2は、光電変換素子を用いた、例えば、フォトダイオードアレイなどにより構成される。また、2次元受信部82は、撮像素子であればよいので(高速撮像素子であることが望ましい)、通常映像を取得することを目的としたCCD(Charge Coupled Device:電荷結合素子)イメージセンサやCMOS(Complementary Metal-Oxide Semiconductor)イメージセンサなどにより構成するようにしても良い。CMOSイメージセンサは、比較的消費電力が低いので、高速に光を受光して、その光の変化を捉える用途には、より適していると考えられる。以降においては、2次元受信部82は、高速撮像素子(イメージセンサ)により構成されているものとして説明する。
ADC(A/D(Analog/Digital)コンバータ)83−1,83−2は、2次元受光部82−1,82−2を構成するイメージセンサの各画素から読み出した輝度データをアナログ量からデジタル量に変換し、デコード部84−1,84−2に供給する。尚、2次元受光部82がCMOSイメージセンサである場合、ADCが内蔵されている構成であっても良い。
デコード部84−1,84−2は、2次元受光部82により受光された送信装置53−1,53−2からの並列光信号を復号する。デコード部84は図4で示されるように、フレームメモリ91、比較部92、デコード処理部93、デコードメモリ94、および、エラー検出部95より構成される。
フレームメモリ91(91−1,91−2)は、フレーム間差分演算を行うために使用するADC83より供給された各画素の輝度値の情報を記憶する。フレームメモリ91は、少なくとも1フレーム分のメモリを用意して、前フレームの映像(2次元受光部82の各画素により受光された輝度値の情報)を蓄え、適宜比較部92に供給する。
比較部92は、フレームメモリ91に蓄えられているADC83より供給された現在のフレームの画像データと前フレームの画像データとの差分を求める。
比較部92は、図5で示されるように構成されており、光の変化を検出するためのMフレーム間差分を求め、さらに、求められたMフレーム間差分結果をコンパレータ112,114で閾値と比較した結果を出力する。
すなわち、比較部92の正フレーム間差分計算部111、および、負フレーム間差分計算部113は、光の変化を検出するために、今撮像されているフレームを基準として、2Mフレーム前までの、2Mフレーム間の差分値を求め、それぞれコンパレータ112,114に出力する。コンパレータ112,114は、入力された差分値を、それぞれ所定の閾値Ref(+),Ref(-)と比較し、比較結果に対応して1、または、0の値を出力部に供給する。より具体的には、正フレーム間差分計算部111は、差分値が閾値Ref(+)より大きいとき1を、それ以外のとき0を出力し、負フレーム間差分計算部113は、差分値が閾値Ref(-)より小さいとき1を、それ以外のとき0を出力する。尚、Mは、正の整数を示す。また、説明の便宜上、以下の説明においては、Ref(+)=−Ref(-)であるものとするが、これに限るものではない。
より詳細には、正フレーム間差分計算部111は正の2Mフレーム間差分を以下の式(1)で示されるように計算して、コンパレータ112の端子112aに出力する。
尚、式(1)におけるf(n)は、第nフレームにおける所定の画素位置の画素値を示しており、式(1)の第1項は、第nフレームから第(n−M−1)フレームの画素値のサメーションを示しており、第2項は、第(n−M)フレームから第(n−2M−1)フレームの画素値のサメーションを示している。すなわち、正フレーム間差分計算部111は、式(1)を演算することにより、時系列的に、今のフレームに近い新しい画素値の和から、今のフレームに遠い古い画素値の和を引いた値を正フレーム間差分YP(M,n)として求める。
また、同様にして、負フレーム間差分計算部113は正の2Mフレーム間差分を以下の式(2)で示されるように計算して、コンパレータ114の端子114aに出力する。
尚、式(2)の第1項は、第(n−M)フレームから第(n−2M−1)フレームの画素値のサメーションを、第2項は、第nフレームから第(n−M−1)フレームの画素値のサメーションをそれぞれ示している。すなわち、負フレーム間差分計算部113は、式(2)を演算することにより、時系列的に、今のフレームに遠い古い画素値の和から今のフレームに近い新しい画素値の和を引いた値を負フレーム間差分YM(M,n)として求める。
さらに、コンパレータ112は、端子112aに入力されてくる正フレーム間差分値YP(M,n)と、端子112bに入力されるリファレンス値Ref(+)(リファレンス値Ref(+)は、任意に設定される値である)とを比較し、正フレーム間差分値YP(M,n)がリファレンス値Ref(+)よりも大きい場合、第nフレームにおける比較結果としてCP(n)=1を後段に出力し、逆に、正フレーム間差分値YP(M,n)がリファレンス値Ref(+)よりも小さい場合、第nフレームにおける比較結果としてCP(n)=0を後段に出力する。
同様に、コンパレータ114は、端子114aに入力されてくる負フレーム間差分値YM(M,n)と、端子114bに入力されるリファレンス値Ref(-)(リファレンス値Ref(-)は、任意に設定される値)とを比較し、負フレーム間差分値YM(M,n)がリファレンス値Ref(-)よりも小さい場合、第nフレームにおける比較結果としてCM(n)=1を後段に出力し、逆に、負フレーム間差分値YM(M,n)がリファレンス値Ref(-)よりも大きい場合、第nフレームにおける比較結果としてCM(n)=0を後段に出力する。
すなわち、LED71で点滅する光を検出する上で、最も単純な方法は、受光量をある決められた閾値と比較することで2値化して、受光量を1,0のデジタル信号にする方法である。この方法は、最もシンプルで実装も容易であるが、周囲の明るさが変化すると、固定された閾値と比較して2値化する方法では、安定したデータ伝送は望めない。
そこで、上述したように、光の変化を検出するのに、受光量をあるレートでサンプリングして、時間方向に連続するサンプリング区間の受光量の比較を行うことで光の変化を検出する。
より具体的には、時間が経つにしたがって増加するフレームのサンプリング番号をn、各サンプリング区間での受光量をf(n)とし、Mを1とすると、光の変化量は、上述の式(1)よりY(1,n)=f(n)-f(n-1)で表され、Y(1,1)>0のときに光が「暗」から「明」に変化したこと(LED71がOFFの消灯状態からONの発光状態になったこと)が検出され、Y<0のときに光が「明」から「暗」になったこと(LED71がONの発光状態からOFFの消灯状態になったこと)を検出したことになる。
上記Y(1,n)=f(n)-f(n-1)を1フレーム間差分と定義して、さらに拡張してMフレーム間差分を定義する。ここでMは1以上の整数である。すなわち、M=1の場合は、上述の式(1)は、Y(1,n)=f(n)-f(n-1)で定義され、M=2の場合には、Y(2,n)=f(n)+f(n-1)-f(n-2)-f(n-3)、M=3の場合には、Y(3,n)=f(n)+f(n-1)+f(n-2)-f(n-3)-f(n-4)-f(n-5)となる。
従って、Mが大きいほど、光の変化の検出感度は高くなるが、その一方、Mが大きくなると受光側のサンプリング周波数を固定とすると、光の点滅周波数を落とさなければならず、データの転送効率が悪くなるデメリットもある。
安定して光の変化を検出するためには、受光部のフレームレートはLED71の点滅周波数のN倍以上の関係になければならない。ここでNは、光の変化の検出方法によって決まる値である。1フレーム間差分では、N>2であり、2フレーム間差分ではN>3である。すなわち、Mフレーム間差分(ここでMは1以上の整数)の場合、N>M+1となる。ここでNは小さい値の方が、同じフレームレートでもデータ転送レートが大きく出来ることから有利であるので、N=M+1とすると最適となる。
尚、以降においては、M=1すなわち1フレーム間差分を用いて説明する。しかしながら、本発明は、光の変化検出にフレーム間差分以外の方式を用いても、同様に効果が得られるので、特にこの光の変化検出方法に限られるものではない。
結果として、Mフレーム間差分を用いることで、光の立ち上がり変化と立下り変化を検出することが可能となる。すなわち、光の立ち上がり変化の検出を行うには、新しいフレームの輝度から古いフレームの輝度を引く、上述した式(1)で示される正のMフレーム間差分を用いることができる。
また、光の立ち下がり変化の検出を行うには、古いフレームの輝度から新しいフレームの輝度を引く、上述した式(2)で示される負のMフレーム間差分を用いることができる。
以上の式(1),式(2)で定義されるYP(M,n),YM(M,n)を用いて、光の立ち上がり変化と立ち下がり変化を求めるために、ある閾値を用いて二値化した値が、上述したCP(n),CM(n)として定義される。すなわち、上述したREF(+),REF(-)は、それぞれ光の立ち上がりと立ち下がりの変化の大きさに対する閾値であり、光の変化が閾値を越えたときに、CP(n),CM(n)は1となる。
デコード処理部93は、比較部92より供給される比較結果(CP(n),CM(n))に基づいて、データの復元を行い、データと受信座標を出力する。デコード用メモリ94は、2次元受光部82の各画素(受光素子)で受光して復元したデータや復元途中のステータスデータを蓄えるのに利用する。
より詳細には、デコード用メモリ94は、図6で示されるように、2次元受光部82より供給される信号のデコード過程で各画素の座標位置(図6においては、2次元受光部82の画素配列がX方向にM画素、Y方向にN画素であるものとする)デコード状況を示すステータス情報(以降においては、フラグとも称する)とデコードして得られたデータ部分(以降においては、データとも称する)を格納するためのフレームメモリである。フラグは、図10で示されるように、デコードカウンタ(3bit)、デコードステータス(7bit)、CRC結果フラグ(1bit)、およびエンドフラグ(1bit)から構成される。また、データはヘッダ(15bit)、受信データ(64bit)、およびエラー検出符号(16bit)を格納するエリアで、デコードできたビットから順に格納される。
エラー検出部95(図4)は、CRC(Cyclic Redundancy Check)を用いて復元したデータ(図6のヘッダ、データ、およびエラー検出符号)のエラー検出を行う。CRCを用いた手法としては、例えば、CRCとして代表的なITU-T(国際電信電話諮問委員会)の勧告によるもので、生成多項式(Generator Polynomial) G(x)=x16+x12+x5+1を用いるようにしてもよい。エラー検出部95(図4)は、エラー検出をおこなうため、シンドローム多項式(Syndrome polynomial)を計算し、シンドローム多項式が0になればエラーなし、0以外であればエラーが発生したことを検出する(詳細は、「誤り訂正符合とその応用」(江藤良純、金子敏信監修)(オーム社)参照)。エラー検出部95は、後段の通信コントローラ52に受信したパケットデータと受信した2次元受光部82上の画素の座標を出力する。
ここで、以降の説明を容易にするために、通信装置1−1より通信装置1−2にデータを送信する動作を簡単に説明する。
通信コントローラ52−2は、デコード部84−2(デコード部の中のエラー検出部95−2)より、各画素(受光素子)で受信したパケットデータを受け取り、並列で受信したパケットをデータ順に並べ替える。また、各通信路の通信ができたか否かを調べ、通信できた空間アドレスにはACKを、通信できなかった空間アドレスにはNACKを送信側に返すための制御パケットを生成し、送信装置53−2に供給する。送信装置53−2は、供給された制御パケットを通信装置1−1に対して送信する。
通信コントローラ52−2は、ホストコントローラ51−2より供給される送信データを取得し、送信データを並列の光信号で送信するために、64bitごとに分割する。送信装置53−1内の発光制御部61−1は、通信コントローラ52−1より供給される、LEDアレイ62−1の各LED71の発光パターンを取得し、取得した発光パターンに応じてLEDアレイ62−1の各LED71の点滅を制御する。
LEDアレイ62−1上の各LED71が発光することにより送信する送信データの順序は、受信後のデータの再構成を簡単にするために、LEDアレイ62の空間アドレスの順番に送り、順序が入れ替わることがないようにしている。したがって、例えば、後述する図8で示されるようにLEDアレイ62のLED71の配列が、8個×8個である場合、空間アドレス(0,0), (1,0), (2,0) … (7,0), (0,1), (1,1), (2,1) … (7,1), … (7,7)の順にデータがパケットに詰められて、送信される。
各パケットの構成は、スタートコード、ヘッダ、データ、エラー検出符号の4つの部分から構成され、正しいヘッダの値をセットしたパケットを生成する。また、CRCの生成多項式を用いてエラー検出符号が生成され、パケットの最後に付加される。
通信コントローラ52−1は、その一方で、受信装置54−1により受信されたパケットを取得する。通信コントローラ52−1は、通信装置1−2の送信装置53−2より送信されてくる、上述した制御パケット(ACK/NACK情報を含むパケット)を受け取り、この情報(どの通信路が通信可能で、どの通信路が通信失敗だったか)に基づいて、利用する通信路を決定する。すなわち、ACKの返ってきた通信路を利用して、データパケットと制御パケットの送信を行う。NACKの帰ってきた通信路にはダミーパケットを送信する。
また通信コントローラ52−1,52−2は、通信路の状況に応じて、並列度を決定する。
従って、通信コントローラ51−1は、通信が可能な通信路の情報に基づいて、決定された並列度で、送信データを送信装置53−1に送信させる。結果として、送信装置53−1のLEDアレイ62のLED71が所定の発光パターンで発光することによりデータが通信装置1−2に供給される。
通信装置1−2の受信装置54−2の2次元受光部82は、通信装置1−1の送信装置53−1より供給されるデータを、発光パターンとして受信する。
通信コントローラ52−1,52−2は、送信する各種のパケットをマンチェスタ符号化し、マンチェスタ符号化された信号に基づいて、送信装置53のLEDアレイ62の個々のLED71毎の発光パターンを決定し、LED発光パターンテーブル59に記憶させる。
ここで、マンチェスタ符号化について説明する。LEDなど高速に点滅可能な光源から発する点滅パターンに送信データをのせて、データ通信を行うことは、テレビジョン受像機などのリモートコンロトーらやIrDA(Infrared Data Association:赤外線通信)などで行われている。点滅パターンを信号化する上で、ONを1、OFFを0とするのが最も高効率ではあるが、安定したデータ転送を行うためのエラー検出が困難である。
マンチェスタ符号化は、データ0を10、データ1を01として表現する。ここで1を光源ON、0を光源OFFと考える。するとデータ送信区間は必ず点滅することになり、長く光源OFFになったり、光源ONになったりしないので、環境光との判別も比較的容易となり、安定した通信が可能となる。
例えば、「10010010」という8ビットの送信データをマンチェスタ符号化する場合、すなわち、送信データとして73を送信したい場合、送信データは、2進数の1/0がそれぞれON/OFFを表しているとき、LED71は、「OFF-ON→ON-OFF→ON-OFF→OFF-ON→ON-OFF→ON-OFF→OFF-ON→ON-OFF」となるように点滅制御部253により制御されることになる。
このようにマンチェスタ符号化することにより、1、または、0をとる信号は3個以上連続することが無く、各送信区間は必ず点滅することになり、長くLED71がOFFの状態となったままになったり、LED71がONの状態となったままになるようなことが防止され、環境光との判別も比較的容易となるので、安定した通信が可能となる。
また、マンチェスタ符号化された信号の先頭位置には、固定されたスタートコードが付されており、このスタートコードが検出された直後の位置からデコードを開始することで、マンチェスタ符号化された信号をデコードすることができる。
すなわち、図7で示されるように、一番上のラインに、4bitのスタートコード(St0,St1,St2,St3)と8bitのヘッダの(H0-H7)がマンチェスタ符号化されているものとする。尚、スタートコードとヘッダの構成については詳細を後述するが、実際のスタートコードは4bitであるが、ヘッダのbit数は異なる。しかしながら、ここでは、マンチェスタ符号化の説明のためヘッダのビット数は、図7で示されるビット数であるものとする。
図7の上段の菱形内に示されるように、スタートコードは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)から構成されている。ここで、図7において、横軸は時間軸を表す。また、縦線の1区間がイメージセンサの2フレームに相当する。したがって、H0=10(ON→OFF)は受信される信号の4フレーム目の時間に相当する。さらに、光の立ち上がり変化を示すCP(n)と光の立下り変化を示すCM(n)を、3段目と4段目に示す。
このときスタートコードのパターンは固定なので(スタートコードが固定されている理由については後述する)、CP(n)=1になってから(区間St0内におけるCP(n)=1)、6フレーム後にCM(n)=1となり(区間St2内におけるCM(n)=1)、さらに4フレーム後にCP(n)=1(区間St3内におけるCP(n)=1)、そしてその2フレーム後にCM(n)=1(区間St3内におけるCM(n)=1)となる。結果として、4フレーム分の信号がヘッダであることが認識できる。ここで、説明の便宜上、この最初のCP(n)=1となるフレームを「スタートコード基準点」、スタートコードの最後のCM(n)=1となるフレームを「ヘッダ基準点」と称するものとする。
ヘッダ、データ、誤り検出符号のデコード(復元)は、ヘッダ基準点から4フレーム毎に、CP(n),CM(n)の状態を確認することで、行うことができる。すなわち、データ基準点から4フレーム毎のフレームにおいて、CP(n)=1ならば、そのビットは1であり、CM(n)=1ならば、そのビットは0となる。もし、CP(n)=CM(n)=0の場合には、マンチェスタ符号を受信することができなかったので、エラーとして処理する。
この結果、区間H0において、送信されてくるデータは、「10」であるので、デコード結果は0となり、区間H1において、送信されてくるデータは、「01」であるので、デコード結果は0となり、区間H2乃至H4,H6,H7において、送信されてくるデータは、「10」であるので、デコード結果は0となり、区間H5において、送信されてくるデータは、「01」であるので、デコード結果は1となる。
尚、図7において、5段目のデコードタイミングは、光信号の立ち上がりを上向の矢印で示し、立ち下がりを下向きの矢印で示しており、各矢印の間の丸中の数値が間隔となるフレーム数を示している。また、6段目には、デコードデータ示されており、7段目にはデコードカウンタ、8段目にはデコードステータスが示されている。7,8段目のデコードカウンタおよびデコードステータスについては、詳細を後述する。
次に、LEDアレイ62の空間アドレスについて説明する。
例えば、LEDアレイ62が図8で示されるようにLED71が8個×8個で配置されていた場合、最大で64個のLED71により並列に64個の発光信号を送信することができることになる。この場合、空間アドレスは、図8で示されるように、左上から(0,0)、(1,0)・・・(7,0)と設定され、さらに、下段に進み(0,1),(1,1)・・・と設定され、最終的に最下段の左端が(7,0)と設定され、右端が(7,7)に設定され、全部で64個(=8個×8個)の空間アドレスが設定されることになる。この場合、各空間アドレスに設定されるLED71について、個々に1bitの通信路が1個設定されることになる。
しかしながら、通信状態により1個のLED71の発光パターンでは十分に2次元受光部82で受光できないような状況が考えられる。このような場合、近接する複数のLED71をグループ化して同期して発光させるようにすることで、LED71の発光する面積を高めることで、受光し易くすることが考えられる(近接していない状態でも、近傍のLED71であればよい)。例えば、図9で示されるように、2個×2個の合計4個のLED71を同期して発光させることで1bitの通信路が、16個(=4個×4個)設定されることになる。このような場合、空間アドレスは、図9の点線で囲まれている4個のLED71の単位で設定され、上段の左から(0,0),(1,0),・・(4,0)と設定され、最下段の左端の4個のLED71が(0,3)に、右端の4個のLED71が(3,3)にそれぞれ設定される。結果として、16個の通信路が確保されることになる。
同様にして、4個×4個のLED71をグループ化して同期して発光させるようにすることで、さらに、2次元受光部82による受光能力を高めることも可能であり(通信路は4個)、最大では、64個のLED71をグループ化して同期させて発光させることにより1bitのみであるが送信させるようにすることも可能である。ただし、この場合、通信路は1個である。
以上のようにして、近傍の所定数のLED71をグループ化して同期して発光させることで安定した通信を実現させることが可能となる。ただし、グループ化するLED71の数が増えると、LEDアレイ62全体として通信路の数は低下することになる。以降においては、LEDアレイ62全体での(通信路−1)を並列度と称するものとする。尚、「−1」されるのは、並列度を6bitの値(0乃至63)で表現するためである。
次に、送信装置53と受信装置54により授受されるパケットについて説明する。
パケットは、データパケット、制御パケット、ダミーパケット、およびテストパケットの4種類がある。
データパケットは、送信データを含むパケットである。データパケットは、図10で示される。図中の左端部がLSBであり右端部がMSBである。パケットは、LSBからスタートコード、ヘッダ、データ、およびエラー検出符号が配置される。
スタートコードはどの種類のパケットも同一のパターンであり、「01110010」である。ヘッダは、データ識別制御フラグが1bit、並列度テストフラグが1bit、ダミーフラグ1bit、並列度の値6bit、および空間アドレス6bitの合計15bitから構成される。
データパケットの場合、データ識別制御フラグ=0、並列度テストフラグ=0、ダミーフラグ=0に設定される。また並列度は、LEDアレイ62における並列度を表す。図10においては、64個(8個×8個)のLED71からなるLEDアレイ62を想定して、最大値が63となるように6bitに設定(通信路−1で表す)されている。空間アドレスは、このデータパケットを送信するLEDアレイ62内のLED71の位置である。先頭3bitがX方向の位置を示しており、後半の3bitがY方向の位置を示す。
データは、並列度が最大である場合を想定し、送信データをLSBからMSBへの順にデータD0, D1, D2 … ,D63(合計64bit)が設定されている。エラー検出符号は、ヘッダ、およびデータの情報に基づいて生成されるCRCの符号が設定される。
制御パケットは、各通信路毎に送信装置53より送信されたデータが受信できたか否かを示す情報(ACK/NACK)を含むパケットである。エラーもなくパケットが受信された通信路(空間アドレス)においては、ACKが設定されることになる。何らかの原因でパケットが受信されなかった通信路(空間アドレス)については、NACKが設定されることになる。すなわち、この制御パケットが相互に授受されることにより、利用する通信路の通信状態を認識することが可能となり、通信に利用する通信路が選択される。
図11は、制御パケットの構成を示している。スタートコードは、どの種類のパケットでも同じ(01110010)である。ヘッダは、制御パケットを示すために、データ識別制御フラグ=1、並列度テストフラグ=0、ダミーフラグ=0が設定される。また並列度は、LEDアレイ62における並列度を表す。図11においては、64個(8個×8個)のLED71からなるLEDアレイ62を想定して、最大値が63となるように6bitに設定(通信路−1で表す)されている。
また、データには、通信路の場所を表す空間アドレス(0,0)(1,0)(2,0)…(7,0)(0,1)(1,1)(2,1)…(7,7)の順にACKまたはNACKが設定される。すなわちACKの場合には0が、NACKの場合には1がそれぞれ設定される。データ部分は64ビットあるので、最大64個のLED71が並列に各通信路としてデータを受信できたか否か(ACK/NACK)の情報を設定することが可能な構成になっている。
ダミーパケットは、前回の送信時において、受信装置54においてデータが受信できなかった通信路に対して送信されるパケットである。受信装置54においてデータ受信できなかった通信路は、データが受信される通信装置1から送られてきた制御パケットのACK/NACK情報に基づいて認識することが可能である。
図12にダミーパケットの例を示す。スタートコードは、どの種類のパケットでも同じ(01110010)である。ヘッダは、ダミーパケットを示すために、データ識別制御フラグ=1、並列度テストフラグ=0、およびダミーフラグ=1に設定される。また並列度は、LEDアレイ62における並列度を表す。図12においては、64個(8個×8個)のLED71からなるLEDアレイ62を想定して、最大値が63となるように6bitに設定(通信路−1で表す)されている。
また、データの部分には、制御パケットと同様、通信路の場所を表す空間アドレス(0,0) (1,0) (2,0) … (7,0) (0,1) (1,1) (2,1) … (7,7)の順にACKまたはNACKが設定される。すなわち、ACKの場合には0が、NACKの場合には1が設定される。もちろん、データ部分に必ずACK/NACKを入れる必要はないが、制御パケットを送信する通信路が使えなくなった場合(制御パケットを送信するLED71の点滅パターンが認識できない場合)、ダミーパケットを通じて相手側に制御パケットの情報(ACK/NACK)を伝えることができる。そこで、ダミーパケットのデータ部分にACK/NACKがセットされている。
テストパケットは、並列度のテストを行うときに送信するパケットである。並列度のテストについては、詳細を後述する。図13にテストパケットの例を示す。スタートコードは、どの種類のパケットでも同じ(01110010)である。ヘッダは、テストパケットを示すために、データ識別制御フラグ=1、並列度テストフラグ=1、およびダミーフラグ=0に設定される。また並列度は、LEDアレイ62における並列度を表す。図12においては、64個(8個×8個)のLED71からなるLEDアレイ62を想定して、最大値が63となるように6bitに設定(通信路−1で表す)されている。またデータの部分には、制御パケットと同様、通信路の場所を表す空間アドレス(0,0) (1,0) (2,0) … (7,0) (0,1) (1,1) (2,1) … (7,7)の順にACKまたはNACKが設定される。
次に、通信コントローラ52における各種のメモリ、テーブル、およびレジスタについて説明する。
データ通信コントローラ52の受信パケット格納メモリ56aは、図14で示されるように、受信装置54より受け取った受信パケットを格納する。最大64パケットを一度に受信する可能性があるので、64パケット分のメモリとなっている。
受信データ格納メモリ56bは、図15で示されるように、通信コントローラ52が、データを、デコード部84より供給された受信パケットから抽出して、データ(1)乃至(63)として格納する。
通信状態認識部57のACKレジスタ57aには、受信用と送信用のものがあり、それぞれ同様の構成である。ACKレジスタ57aは、図16で示されるように、デコード部84より供給された受信パケットから、受信方向の各通信路のデータが受け取れたか否かの情報を記録する。このレジスタの内容が、送信する制御パケットのACK/NACK情報となる。すなわち、例えば、この例においては、データが受信できた通信路についてはACKであるので0に設定され、データが受信できなかった通信路についてはNACKであるので1に設定されて記録される(当然のことながら、設定される0,1の値は逆であっても良い)。本実施例では64個(8個×8個)のLED71からなるLEDアレイ62であるので、64ビットのレジスタが設定されている。
通信状態認識部57の通信路テーブル57bは、送信方向の各通信路が、どの種類のパケット(制御/データ/ダミー/テスト)を送信するかを示すテーブルである。図17で示されるように、最大で64個のLED71により64個の通信路が設定されることになるため、通信路テーブルは、通信路(0)乃至通信路(63)が設定されており、それぞれ2bitのデータより構成される。この例においては、例えば、00(=10進表記で0)がデータパケット、01(=10進表記で1)が制御パケット、10(=10進表記で2)がダミーパケット、11(=10進表記で3)がテストパケットとして設定することによりそれぞれのパケットの種類を識別する。尚、識別するための2bitの信号は、上記以外でも良いことはいうまでもない。
並列度制御部58の並列度レジスタ58aは、受信した制御パケットから、送信方向の通信の成功状況(ACK/NACK)に応じて決定された並列度の値を記憶する。並列度レジスタ58aは、図18で示されるように6bitであり、最大並列度も63であることから、並列度レジスタ58aには、(通信路−1)が記憶される。すなわち、64並列(8×8)であれば63が、並列度なし(通信路は1本)であれば0が記憶される。
LED発光パターンテーブル59は、通信コントローラ52により通信路毎に、送信パケットが生成された後、マンチェスタ符号化されたデータにスタートコードを付加して、生成された発光パターンを、その通信路に対応するLED71のアドレスに記憶する。すなわち、LEDアレイ62の並列度が63であった場合、64個のLED71が用いられることになるので、図19で示されるように、マンチェスタ符号化されたデータである198bitのデータがLED(0)乃至LED(63)のアドレスに、記憶されることになる。
次に、図20のフローチャートを参照して、図3の情報通信システムによる通信処理について説明する。尚、図3の情報通信システムにおける通信装置1−1,1−2は、相互に同様の処理を実行し、適宜データを送受信している。
ステップS1において、各種のメモリ、レジスタ、およびテーブルが初期化される。より具体的には、通信コントローラ52のデータ通信コントローラ56は、受信パケット格納メモリ56aおよび受信データ格納メモリ56bを、すべて0に初期化する。通信状態認識部57は、ACKレジスタ57aおよび通信路テーブル57bを0に初期化する。並列度制御部58は、並列度レジスタを0に初期化する。通信コントローラ52は、LED発光テーブル59を0に初期化する。
ステップS2において、並列度制御部58は、並列度テスト処理を実行する。すなわち、送信装置53におけるLEDアレイ62のLED71の並列度がテストにより決定される。並列度制御部58は、並列度が1レベルずつ上げられていき、データが受信される通信装置1−2から各通信路においてテストパケットが受信できたか否か(LED71の点滅パターンを2次元受光部82により受光してパケットとして受信することができたか否か)を、制御パケットによって知らせてもらい、最適な並列度を決定する。並列度制御部58は、決定した並列度を並列度レジスタ58aに記憶させる。また、通信状態認識部57は、並列度レジスタ58aを参照し、通信路テーブル57bを初期化する(どの通信路でデータパケットを送信して、どの通信路で制御パケットを送信するかを設定する)。尚、並列度テスト処理については、詳細を後述する。
ステップS2において、並列度テスト処理が終了し、並列度が設定されると、送受信の準備が完了しているので、ステップS3において、通信コントローラ52は、受信装置54に問い合わせて、受信データあるか否かを判定する。より詳細には、通信コントローラ52は、2次元受光部82が送信装置54のLEDアレイ62のLED71の点滅パターンにより光を受光して、パケットを受信したか否かを受信装置54に問い合わせて、データ受信されたか否かを判定する。例えば、ステップS3において、受信データがないと判定された場合、その処理は、ステップS4に進む。
ステップS4において、通信コントローラ52は、ホストコントローラ51より送信データが供給されたか否かを判定し、送信データがないと判定された場合、その処理は、ステップS7に進む。
ステップS7において、通信コントローラ52は、通信終了が指示されているか否かを判定し、通信終了が指示されていない場合、その処理は、ステップS3に戻る。すなわち、受信すべきデータも送信すべきデータもない場合、通信終了が指示されるまで、ステップS3,S4,S7の処理が繰り返されて、受信データ、または、送信データの待ち状態となる。
ステップS4において、例えば、ホストコントローラ51より送信データが供給されたと判定された場合、ステップS5において、通信コントローラ52は、送信処理を実行し、その処理は、ステップS7に進む。すなわち、通信コントローラ52は、通信状態認識部57の通信路テーブル57bに基づいて、送信パケット(制御パケット、データパケット、ダミーパケットのいずれか)を生成し、マンチェスタ符号化処理を施し、LED発光パターンに変換すると共に、そのLED発光パターンをLED発光パターンテーブル59に記録する。送信装置53の発光制御部61は、LED発光パターンテーブル59の情報に基づいて、LEDアレイ62上の各LED71の発光パターンを制御し、LEDアレイ62の各LED71を発光させて、データを点滅パターンにより送信する。尚、送信処理については、詳細を後述する。
一方、ステップS3において、例えば、受信データが受信されたと判定された場合、ステップS6において、通信コントローラ52は、受信処理を実行し、その処理は、ステップS7に進む。
より詳細には、通信コントローラ52の通信状態認識部57は、2次元受光部82により各通信路となるLED71の点滅パターンとして受光した光信号を、デコード部84によりデコードして、パケットとして受信できたか受信できたか否かをACKレジスタ57aに記憶させる。すなわち、通信状態認識部57は、データが受信できた通信路に対してはACK(=0)としてACKレジスタ57aに記憶させ、受信できなかった通信路に対してはNACK(=1)としてACKレジスタ57aに記憶させる。
また、受信パケットがデータパケットであれば、データ通信コントローラ56は、受信データを受信データ格納メモリ56bに記憶させると共に、1回の並列受信が完了したところで、その内容をホストコントローラ51に供給する。
受信パケットが制御パケットであれば、通信コントローラ52は、制御パケット内に含まれるACKまたはNACKの情報(自らが送信したデータが受信されたか否かの情報)に基づいて、データを再送する必要があるか否かを判断する。また、並列度制御部58は、並列度を再設定する。通信状態認識部57は、有効なデータを送信する通信路を再設定する(通信路テーブル57bを再設定する)。尚、受信処理については詳細を後述する。
以上のような送信処理が実行されることにより、通信状態に応じて、通信路と並列度とが常に最適な状態に制御された状態で、データが通信されることになるため、高速で安定したデータの通信を実現することが可能となる。
次に、図21のフローチャートを参照して、並列度テスト処理について説明する。
並列度テスト処理は、通信の開始時に相手に送信するときの送信装置の並列度を決めるためのテストである。並列度制御部58は、低い並列度から1レベルずつ上げながら、送信したデータを受信する通信装置1から各通信路においてテストパケットが受信できたか否かを、制御パケットとして通知してもらうことにより、通信に最適な並列度を決定する。最適な並列度とは、通信速度が最高となる並列度であると考えることができる。以降の並列度テスト処理における並列度は、63(=8個×8個−1)、15(=4個×4個−1)、3(=2個×2個−1)、および0を、それぞれレベル4乃至1として4レベルのみを考えるものとする。
ステップS21において、並列度制御部58は、並列度のレベルを1に設定し、並列度テスト処理が実行中であることを示す、並列度テスト中フラグ=1に設定する。すなわち、並列度制御部58は、最初の並列度をレベル1にセットし、並列度レジスタ58aに0(=通信路−1)を記憶させ、並列度テスト処理を開始するので、並列度テスト中フラグを1にセットする。
ステップS22において、並列度制御部58は、テストパケット送受信処理を実行する。
ここで、図22を参照して、テストパケット送受信処理について説明する。
ステップS51において、通信状態認識部57は、テスト用通信路テーブルセット処理を実行する。
ここで、図23のフローチャートを参照して、テスト用通信路テーブルセット処理について説明する。
ステップS71において、通信状態認識部57は、通信路を識別する変数iを0に初期化する。変数iは、並列度の数だけ(通信路の数だけ)テストパケット属性をセットするためのカウンタ値である。
ステップS72において、通信状態認識部57は、通信路テーブル57bの通信路(i)のアドレスにテストパケットの属性(2進数で「11」=10進数で3)をセットする。
ステップS73において、通信状態認識部57は、変数iをインクリメントする(i=i+1)。
ステップS74において、通信状態認識部57は、変数iが並列度よりも小さいか否かを判定し、小さい場合、その処理は、ステップS72に戻る。すなわち、通信状態認識部57は、並列度について並列度制御部58に問い合わせて、並列度レジスタ58aにおける並列度を参照する。変数iが並列度よりも小さい場合、まだテストパケット属性をセットする通信路(i)が存在することになるので、通信状態認識部57は、通信路(i)の送信パケット種別を3にセットする処理を繰り返す(ステップS72乃至S74の処理が繰り返される)
ステップS74において、変数iが並列度よりも小さくない、すなわち、変数iが並列度と等しくなるか、または、それ以上になった場合、全ての通信路の属性がテストパケット属性にセットされたことになるので、その処理は、終了する。
すなわち、以上の処理により、通信路テーブル57bは、並列度に応じて設定された全ての通信路の属性がテストパケットにセットされることになる。
ここで、図22のフローチャートの説明に戻る。
ステップS52において、通信状態認識部57は、通信路テーブル57bの情報に基づいて、送信装置53を制御して送信処理を実行する。すなわち、通信状態認識部57は、通信路テーブル57bの情報にしたがって、並列度の数だけテストパケットを生成して、符号化した後、スタートコードを加えて、発光パターンを生成し、その発光パターンをLED発光パターンテーブル59に記憶させる。送信装置1の発光制御部61は、LED発光パターンテーブル59に記録された発光パターンに基づいて、LEDアレイ62のLED71を発光させてデータを光により送信する。尚、送信処理については、詳細を後述する。
ステップS53において、通信状態認識部56は、一定の時間が経過したか否かを判定し、一定の時間が経過するまで、同様の処理を繰り返し、一定時間だけ処理待ちの状態となる。そして、ステップS53において、一定の時間が経過したと判定された場合、ステップS54において、通信コントローラ52は、受信装置54に問い合わせて、制御パケットが送信されてきて受信され始めたか否かを判定し、受信されていないと判定された場合、その処理は、ステップS52に戻る。すなわち、制御パケットが送信されてきていないと言うことはデータが、送信したデータが受信されていない恐れがあるので、再度テストパケットを送信する。
一方、ステップS54において、制御パケットが受信され始めたと判定された場合、ステップS55において、通信状態認識部57は、各通信路において制御パケットが受信できたか否かをACKレジスタ57aに記憶させる。すなわち、通信状態認識部57は、受信できたら通信路についてはACK(=0)としてACKレジスタ57aに記憶させ、受信できなかった通信路についてはNACK(=1)として(受信用)ACKレジスタ57aに記憶させる。また、通信状態認識部57は、受信パケットは制御パケットであるので、制御パケット内に含まれるACKまたはNACK情報(こちらから前回送信したデータが相手側に受け取られたか否かの情報)を(送信用)ACKレジスタ57aにセットした後、受信処理を完了する。尚、受信処理については、詳細を後述する。
以上のように、通信コントローラ52がテストパケットを送信して、一定時間の間、相手側から制御パケットが送られてくるのを待ち、もし送られてくればその制御パケットを受信する。制御パケットが送られてこない場合、テストパケットを再送信して、また一定時間の間、相手側から制御パケットが送られてくるのを待ち、もし送られてくればその制御パケットを受信する。このようにして、相手側から制御パケットが返ってくるまで、この処理を繰り返す。もちろん、何回か処理を繰り返しても、相手からの応答が得られなかった場合には、この処理を終了し、ホストコントローラ51にその結果を伝えて、通信を終えるようにしても良い。
ここで、図21のフローチャートの説明に戻る。
ステップS23において、通信状態認識部57は、受信した制御パケットを解析して、ACKが返ってきているか否かを判定し、例えば、ACKが返ってきていないと判定した場合、その処理は、ステップS22に戻る。すなわち、ステップS23において、NACKが返ってきていた場合、ステップS22の処理に戻ることで、再度テストパケット送受信処理が実行される。もちろん、ここで、何回か処理を繰り返しても、相手からのACKの応答が得られなかった場合、ホストコントローラ51にその結果を伝えて、通信処理を終了するようにしても良い。また、より通信品質を知るために、テストパケット送受信処理を繰り返して、ACKが所定の回数以上受信できた場合に、ACKが返ってきたと判断するようにしても良い。
ステップS24において、並列度制御部58は、並列度レジスタ58aに記憶されている並列度のレベルを1レベル上げて記憶させる。例えば、並列度0(並列度レジスタ=0)であった場合、並列制御部58は、並列度3(並列度レジスタ=3)となる。今の場合、並列度のレベルを1から2に上げる。
ステップS25において、通信状態認識部57は、再びテストパケット送受信処理を実行する。尚、テストパケット送受信処理については、図22のフローチャートを参照して説明した処理と同様であるので、その説明は省略する。
ステップS26において、並列度制御部58は、受信した制御パケットのACKまたはNACKの情報から、全通信路(並列度の数だけある)のうち、ACKの返ってきた通信路の割合を計算する。計算式は以下の式(3)で示される。
RACK(%)=ACKの返ってきた通信路の数/並列度の数×100
・・・(3)
ここで、RACK(%)は、全通信路(並列度の数だけある)のうち、ACKの返ってきた通信路の割合(百分率)を示している。
ステップS27において、並列度制御部58は、RACK(%)が、閾値RTHよりも大きいか否かを判定する。ここで、閾値RTHは、25(%)と設定している。すなわち、今の場合、並列度のレベルは、レベル1で並列度が0、レベル2で並列度が3、レベル3で並列度が15、レベル4で並列度は63となり、レベル間の差は、並列度にして4倍ずつ変化している。従って、あるレベルにおいて、ACKが返ってくる割合が、25%以下となるということは、実質的に1レベル下げた方が、各通信路を構成するLED71の数が増えて、光による通信状態を改善できる可能性があることになる。このため、閾値RTHは、25%として設定されている。
例えば、ステップS27において、割合RACKが閾値RTHよりも大きいと判定された場合、すなわち、さらに並列度を上げることができる可能性がある場合、ステップS28において、並列度制御部58は、並列度が最大値となっているか否かを判定し、例えば、最大値ではないと判定された場合、その処理は、ステップS24に戻る。
すなわち、再び、ステップS25乃至S27の処理により、並列度のレベルが1レベル上げられて同様の処理が繰り返される。
そして、ステップS28において、並列度が最大値であると判定された場合、ステップS30において、通信状態認識部57は、通信路テーブル57bの初期化処理を実行する。
ここで、図24のフローチャートを参照して、通信路テーブルの初期化処理について説明する。
ステップS81において、通信状態認識部57は、変数iを0に初期化する。ここで、
変数iは、送信パケットの種別をセットする通信路の番号(通信路テーブル57bのアドレス)を示している。
ステップS82において、通信状態認識部57は、通信路(i)の送信パケットの種別を1に設定する。すなわち、最初の処理において、通信状態認識部57は、通信路テーブル57bの通信路(0)の領域に、1をセットする。ここで、送信パケットの種別=1は、制御パケットであることを示す値であるので、通信路(0)は制御パケットを送信するように設定される。
ステップS83において、通信状態認識部57は、変数iを1インクリメントする。
ステップS84において、通信状態認識部57は、通信路(i)の送信パケットの種別を0にセットする。すなわち、通信状態認識部57は、通信路テーブル57bの通信路(0)以外の領域を0にセットする。すなわち、送信パケットの種別=0は、データパケットであることを示す値であるので、通信路(0)以外の通信路(i)はデータパケットを送信するように設定される。
ステップS85において、通信状態認識部57は、変数iが並列度よりも小さいか否かを判定し、小さいと判定した場合、その処理は、ステップS83に戻る。すなわち、並列度は、並列度レジスタ58aの値+1であり、変数iが並列度よりも小さい間は、通信路テーブル57bの各送信パケットの設定処理を継続することになる。結果として、通信路(0)以外の通信路(i)は、全てデータパケットに割り当てられることになる。
ステップS85において、変数iが並列度よりも小さくない場合、すなわち、全ての通信路について送信パケットの設定処理が完了した場合、通信路テーブル57bの初期化処理は完了したことになるので、その処理は、終了する。すなわち、通信路テーブル57bは、通信路の送信パケットの種別を記録しておくので、通信路の数だけ設定する必要があるが、その通信路の数は並列度と等しい値であるので、全ての通信路について送信パケットの種別が設定されたとみなされる。
以上の処理により、通信状態認識部57は、並列度の数(並列度レジスタ58aの値+1)だけ、通信路テーブル57bに送信パケットの種別をセットする。ただし、1つの通信路には制御パケットを割り当てて、残りの通信路にはデータパケットを割り当てるようにすることで、通常のデータ通信中にも並列度を変化させることが可能となる。
ここで、図21のフローチャートの説明に戻る。
並列度制御部58は、並列度テスト処理が実行されていないことを示す、並列度テスト中フラグ=0に設定し、その処理を終了する。すなわち、並列度制御部58は、並列度テスト処理が完了したので、並列度テスト中フラグを0にセットする。
一方、ステップS27において、割合RACKが閾値RTHよりも大きくないと判定された場合、ステップS29において、並列度制御部58は、並列度レジスタ58aに1レベル下げた並列度を記憶させる。すなわち、例えば、並列度63(並列度レジスタ=63)のレベル4であった場合、1レベル下げられて、並列度は、並列度15(並列度レジスタ=15)のレベル3となる。
以上の処理により、並列度が1レベル上げられると、4倍の通信速度が実現されることになるので、所定のレベルで並列度に対してACKが返ってくる通信路の割合RACKが25%よりも大きい場合、順次並列度を上げてテストを繰り返し、割合RACKが25%よりも小さい場合、並列度のレベルが1レベル下げられた状態で設定され、割合RACKが25%よりも小さくならなかった場合、並列度が最大値に設定される。結果として、通信状態が良く、LEDアレイ62の各LED71の点滅パターンを個々に2次元受光部82が認識できるような場合、高い並列度が維持できるので、高速での通信を可能とすることができる。一方、通信状態が悪く、LEDアレイ62の各LED71の点滅パターンを個々に2次元受光部82が認識できないような場合、複数の近傍にあるLED71を同期して並列度を下げることにより、実質的な通信速度を低下させることで、2次元受光部82の認識能力を上げて通信の安定度を向上させることが可能となるので、データ通信における高速性と安定性をバランスよく維持することが可能となる。
尚、並列度テスト処理は、後述するが通信途中にも動的に行なわれるので、並列度テスト処理を、図20におけるステップS2において行わないようにすることも可能である。ただし、この場合においても、通信路テーブルの初期化処理のみは実行される必要がある。
また、並列度0から1レベルずつ並列度を上げていく並列度テスト処理の例について説明してきたが、最大並列度から1レベルずつ並列度を下げながらテストを繰り返して、並列度を設定するようにしても良い。
次に、図25を参照して、送信処理について説明する。
ステップS91において、通信状態認識部57は、変数iを0に初期化する。送信パケットは、並列度の数だけ(通信に使用される通信路の数だけ)生成されることになるので、生成されるパケットの数をカウントするために、変数iを用いる。
ステップS92において、通信状態認識部57は、通信路テーブル57b上の通信路(i)のパケットの属性が3、すなわち、テストパケットに設定されているか否かを判定し、例えば、パケットの属性が3に設定されていないと判定された場合、その処理は、ステップS93に進む。
ステップS93において、通信状態認識部57は、通信路テーブル57b上の通信路(i)のパケットの属性が1、すなわち、制御パケットに設定されているか否かを判定し、例えば、パケットの属性が1に設定されていないと判定された場合、その処理は、ステップS94に進む。
ステップS94において、通信状態認識部57は、通信路テーブル57b上の通信路(i)のパケットの属性が2、すなわち、ダミーパケットに設定されているか否かを判定し、例えば、パケットの属性が2に設定されていないと判定された場合、すなわち、パケットの属性が1乃至3ではないので、残されたパケットの属性であるデータパケットであると判定された場合、その処理は、ステップS95に進み、データパケット生成処理を実行する。
ここで、図26のフローチャートを参照して、データパケット生成処理について説明する。
ステップS111において、通信コントローラ52は、データパケットを生成するため
、図10で示される1bitのデータ/制御識別フラグを0に設定する。
ステップS112において、通信コントローラ52は、データパケットを生成するため、図10で示される1bitの並列度テストフラグを0に設定する。
ステップS113において、通信コントローラ52は、データパケットを生成するため、図10で示される1bitのダミーフラグを0に設定する。
ステップS114において、通信コントローラ52は、並列度レジスタ58aに記憶されている並列度を、図10で示される6bitの並列度の値にセットする。
ステップS115において、通信コントローラ52は、図10で示される6bitの空間アドレスに空間アドレスを設定する。例えば、通信路(i)の空間アドレスは、X=(i÷sqrt(並列度))の余り、Y=(i÷sqrt(並列度))の商となる。すなわち、図8,図9の空間アドレスの説明図において、4×4の16並列の場合においては、X方向、Y方向ともに4つの通信路があるので、通信路(i)の空間アドレス(X)は、i÷4の余りとなり、通信路(i)の空間アドレス(Y)は、i÷4の商となる。
以上のステップS111乃至S115の処理によりヘッダが生成される。
ステップS116において、通信コントローラ52は、データ再送フラグが1、すなわち、データの再送が要求されているか否かを判定し、例えば、データ再送フラグが1ではない、すなわち、データの再送が要求されていないと判定された場合、ステップS117において、図10で示される64bitのデータに送信用の送信データを設定する。
一方、ステップS116において、データ再送フラグが1である、すなわち、データの再送が要求されていると判定された場合、ステップS120において、通信コントローラ52は、図10で示される64bitのデータに再送が要求されている再送データを設定する。
ステップS118において、通信コントローラ52は、ステップS111乃至S115の処理で生成されたヘッダと、ステップS117またはS120の処理により生成されたデータからCRC符号を算出する。
ステップS119において、通信コントローラ52は、ステップS118の処理で算出されたCRC符号を、図10で示されるエラー検出符号の部分に設定する。
以上の処理により、データパケットが生成される。
ここで、図25のフローチャートの説明に戻る。
ステップS96において、通信コントローラ52は、符号化処理を実行する。
ここで、図27のフローチャートを参照して、符号化処理について説明する。
ステップS131において、通信コントローラ52は、パケットのヘッダ、データ
、および、エラー検出符号の各符号を、マンチェスタ符号化する。すなわち、通信コントローラ52は、送信データが0であれば、10の2ビットに、送信データが1であれば、01の2ビットに変換する。
ステップS132において、通信コントローラ52は、マンチェスタ符号化して生成した送信データにスタートコードを付加する。スタートコードは、全ての種類のパケットにおいて「01110010」である。
以上の処理により、通信コントローラ52は、パケットのヘッダ、データ、および、エラー検出符号の各符号を、マンチェスタ符号化して、さらにその先頭にスタートコードを付加する。スタートコードは、図10乃至図13に示したように、どの種類のパケットにおいて「01110010」である。
ここで、図25のフローチャートの説明に戻る。
ステップS97において、通信コントローラ52は、LED発光パターンテーブル更新処理を実行する。
ここで、図28のフローチャートを参照して、LED発光パターンテーブルの更新処理について説明する。
ステップS151乃至S154およびS162乃至S164において、通信コントローラ52は、並列度レジスタ58aに問い合わせて、並列度(並列度レジスタ58aの値)から、通信路のサイズであるブロックサイズ(BS)(以降においては、複数のLED71により構成される通信路のブロックを通信路ブロックと称するものとする)を算出する。ここで、1つの通信路のサイズは、BS×BS(=LEDの個数×LEDの個数)個のLEDで構成される。
すなわち、ステップS151において、通信コントローラ52は、並列度レジスタ58aの情報に基づいて、今現在の並列度が63であるか否か(並列度のレベルがレベル4であるか否か)を判定する。
例えば、ステップS151において、並列度が63であると判定された場合、ステップS162において、通信コントローラ52は、BSを1に設定する。
また、ステップS151において、並列度が63ではないと判定された場合、ステップS152において、通信コントローラ52は、並列度が15であるか否か(並列度のレベルがレベル3であるか否か)を判定し、例えば、並列度が15であると判定した場合、ステップS163において、BSを2に設定する。
さらに、ステップS152におて、並列度が15ではないと判定された場合、ステップS153において、通信コントローラ52は、並列度が3であるか否か(並列度のレベルがレベル2であるか否か)を判定し、例えば、並列度が3であると判定した場合、ステップS164において、BSを4に設定する。
また、ステップS153において、並列度が3ではないと判定された場合、すなわち、並列度が63でも、15でも、3でもないので、0であると判定された場合、ステップS154において、通信コントローラ52は、BSを8に設定する。
ステップS155において、通信コントローラ52は、変数kを0に初期化する。変数kは、通信路ブロック内の通信路のY座標を表す変数である。
ステップS156において、通信コントローラ52は、変数jを0に初期化する。変数jは、通信路ブロック内の通信路のX座標を表す変数である。
ステップS157において、通信コントローラ52は、LED発光パターンテーブル59の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発光パターンテーブル59の対応するアドレスに、通信路(i)の発光パターンを記憶させる。
ステップS158において、通信コントローラ52は、変数jを1インクリメントする。ステップS159において、通信コントローラ52は、変数jが、ブロックサイズBSよりも小さいか否かを判定し、小さい場合、すなわち、まだ、X方向のBS分のアドレスにLED発光パターンテーブル59に発光パターンを記憶させていない場合、その処理は、ステップS157に戻る。すなわち、X方向についてBSとなるアドレスになるまで、発光パターンを記憶させる処理が繰り返される。
一方、ステップS159において、変数jがBSよりも小さくない、すなわち、X方向についてBSとなるアドレスまで、発光パターンがLED発光パターンテーブル59に記憶されたと判定された場合、ステップS161において、通信コントローラ52は、変数kを1インクリメントする。
ステップS162において、通信コントローラ52は、変数kがBSよりも小さいか否かを判定し、例えば、変数kが小さい場合、すなわち、まだ、Y方向のBS分のアドレスにLED発光パターンテーブル59に発光パターンを記憶させていない場合、その処理は、ステップS157に戻る。すなわち、Y方向についてBSとなるアドレスになるまで、発光パターンを記憶させる処理が繰り返される。
一方、ステップS162において、変数kがBSよりも小さくない、すなわち、Y方向についてBSとなるアドレスまで、発光パターンがLED発光パターンテーブル59に記憶されたと判定された場合、その処理は、終了する。
以上により、通信路ブロックに対して、ステップS157の処理が、全て施されるまで処理が繰り返され、最終的にLEDアレイ62の各LED71の発光パターンが全て、LED発光パターンテーブル59に記憶させることになる。
ここで、図25のフローチャートの説明に戻る。
ステップS98において、通信状態認識部57は、変数iを1インクリメントする。
ステップS99において、通信状態認識部57は、変数iが並列度よりも小さいか否かを判定し、小さいと判定された場合、その処理は、ステップS92に戻る。
ステップS92において、通信路テーブル57b上の通信路(i)のパケットの属性が3、すなわち、テストパケットに設定されていると判定された場合、ステップS100において、通信コントローラ52は、テストパケット生成処理を実行する。
ここで、図29のフローチャートを参照して、テストパケット生成処理について説明する。尚、図29のフローチャートにおけるステップS174,S175,S177,S178の処理は、図26のフローチャートを参照して説明したステップS114,S115,S118,S119の処理と同様であるので、その説明は、省略する。
ステップS171において、通信コントローラ52は、テストパケットを生成するため
、図13で示される1bitのデータ/制御識別フラグを1に設定する。
ステップS172において、通信コントローラ52は、テストパケットを生成するため、図13で示される1bitの並列度テストフラグを1に設定する。
ステップS173において、通信コントローラ52は、テストパケットを生成するため、図13で示される1bitのダミーフラグを0に設定する。
ステップS176において、通信コントローラ52は、図12で示されるデータの部分に送信用のACKレジスタ57aの値を設定する。すなわち、テストパケットのデータ部に、送信用のACKレジスタ57aの値(相手側から受信したときに記録しておいた各通信路の受信の可否)が設定される。
以上の処理により、図12で示されるように、テストパケットとして識別できるヘッダが生成されることによりテストパケットが生成される。
ここで、図25のフローチャートの説明に戻る。
ステップS93において、通信路テーブル57b上の通信路(i)のパケットの属性が1、すなわち、制御パケットに設定されていると判定された場合、ステップS101において、通信コントローラ52は、制御パケット生成処理を実行する。
ここで、図30のフローチャートを参照して、制御パケット生成処理について説明する。尚、図30のフローチャートにおけるステップS194乃至S198の処理は、図29のフローチャートを参照して説明したステップS174乃至S178の処理と同様であるので、その説明は省略する。
ステップS191において、通信コントローラ52は、制御パケットを生成するため
、図11で示される1bitのデータ/制御識別フラグを1に設定する。
ステップS192において、通信コントローラ52は、制御パケットを生成するため、図11で示される1bitの並列度テストフラグを0に設定する。
ステップS193において、通信コントローラ52は、制御パケットを生成するため、図11で示される1bitのダミーフラグを0に設定する。
結果として、制御パケットを認識するためのヘッダが構成されることにより、制御パケットが生成される。
ここで、図25のフローチャートの説明に戻る。
ステップS94において、通信路テーブル57b上の通信路(i)のパケットの属性が2、すなわち、ダミーパケットに設定されていると判定された場合、ステップS102において、通信コントローラ52は、ダミーパケット生成処理を実行する。
ここで、図31のフローチャートを参照して、ダミーパケット生成処理について説明する。尚、図31のフローチャートにおけるステップS214乃至S218の処理は、図29のフローチャートを参照して説明したステップS174乃至S178の処理と同様であるので、その説明は省略する。
ステップS211において、通信コントローラ52は、ダミーパケットを生成するため、図12で示される1bitのデータ/制御識別フラグを1に設定する。
ステップS212において、通信コントローラ52は、制御パケットを生成するため、図12で示される1bitの並列度テストフラグを0に設定する。
ステップS213において、通信コントローラ52は、制御パケットを生成するため、図12で示される1bitのダミーフラグを1に設定する。
結果として、ダミーパケットを認識するためのヘッダが構成されることにより、ダミーパケットが生成される。
ここで、図25のフローチャートの説明に戻る。
ステップS99において、変数iが並列度よりも小さくない、すなわち、全ての通信路(i)に対してデータパケット、ダミーパケット、制御パケット、または、テストパケットのいずれかのパケットが設定されたと判定された場合、ステップS103において、通信コントローラ52は、LED発光パターンテーブル59に記憶されている発光パターンの情報を送信装置53に供給する。送信装置53の発光制御部61は、通信コントローラ52により供給された発光パターンの情報に基づいて、LEDアレイ62の各LED71を発光させることにより、光でデータを送信する。
以上の処理により、通信路テーブル57bの情報に基づいて、並列度の数だけ送信パケットとしてデータパケット、ダミーパケット、制御パケット、または、テストパケットのいずれかのパケットが生成されて、マンチェスタ符号化された後、スタートコードが加えられることにより、発光パターンが生成され、その発光パターンで、送信装置53のLEDアレイ62の各LED71が発光することによりデータが光で送信される。
次に、図32のフローチャートを参照して、受信処理について説明する。
尚、この受信処理は、並列度テスト処理において相手側から制御パケット(ACK/NACK情報)が返ってくるのを受信する場合、もしくは、並列度が設定された後、実際の通信が始まり、相手側からデータパケット、制御パケット、またはダミーパケットが受信される場合に行なわれる処理である。この受信処理は、上述した、どちらの場合にも利用できるようになっている。
ステップS231において、データ通信コントローラ56は、受信装置54により受信された受信パケットをすべて受信パケット格納メモリ56aに格納する。受信パケットは、最大の場合、並列度の数だけ受信されることになる。
ステップS232において、データ通信コントローラ56は、変数iを0に初期化する。尚、変数iは、受信パケット格納メモリ56aの受信パケットの番号、すなわちアドレスを示すものである。
ステップS233において、データ通信コントローラ56は、受信パケット格納メモリ56aのi番目の受信パケットを解析し、i番目の受信パケットが受信できたか否かを確認する。すなわち、受信パケットが格納されていれば0以外の値が入っているが、格納されていなければ、初期化されているので0が入っている。さらに、データ受信コントローラ56は、受信パケットの種類がデータパケット、制御パケット、テストパケット、または、ダミーパケットであるかを解析する。より具体的には、データ通信コントローラ56は、受信したパケットのヘッダの情報に基づいて、データパケット、制御パケット、テストパケット、または、ダミーパケットであるかを解析する。
ステップS234において、通信状態認識部57は、パケット(i)の解析結果に基づいて、受信パケットが受信パケット格納メモリ56aに格納されていれば、通信路(i)のパケットは受信できたことがわかり、格納されていなければ通信路(i)のパケットは受信できなかったことがわかる。通信状態認識部57は、受信用のACKレジスタ57aの通信路(i)のフラグを、受信できたか否かによって設定する。すなわち、通信状態認識部57は、受信できていれば0、受信できなかった場合には1を設定する。
ステップS235において、データ通信コントローラ56は、通信路(i)の受信パケットがダミーパケットか否かを判定し、例えば、ダミーパケットであると判定された場合、その処理は、ステップS239に進み、ダミーパケットではないと判定された場合、その処理は、ステップS236に進む。
ステップS236において、データ通信コントローラ56は、通信路(i)の受信パケットがテストパケットか否かを判定し、例えば、テストパケットではないと判定された場合、その処理は、ステップS237に進む。
ステップS237において、データ通信コントローラ56は、通信路(i)の受信パケットがデータパケットか否かを判定し、例えば、データパケットではないと判定された場合、すなわち、ダミーパケット、テストパケット、さらにデータパケットでもないのであるので、制御パケットであると判定され、その処理は、ステップS238に進む。ステップS238において、通信状態認識部57は、制御パケット処理を実行する。
ここで、図33のフローチャートを参照して、制御パケット処理について説明する。制御パケット処理は、受信処理の中における制御パケットを受け取ったときの処理である。制御パケット処理の目的としては、第1に前回送ったデータを再送するか否かを判断することである。
通信状態認識部57は、制御パケットのACK/NACK情報を調べて、データパケット、または制御パケットを送った通信路に1つでもNACKがあれば、データ再送フラグを立てる。本実施例では、受信側が簡単にデータを並べ替えることができるように(パラレル−シリアル変換ができるように)、データの順番の並列送信機(LEDアレイ)の空間アドレスの順番にしている。そのため、1つでもデータを受け取ってもらえなかった場合には、データを再送するようにしている。
もちろん、パケットのヘッダ中にデータの順番の情報を入れることで、データの到着順を可変にすることは可能である。この場合、データの再送は、NACKの返ってきた通信路のデータのみ行えばよい。
制御パケット処理の第2の目的は、送信機の並列度を変更するか否かを判断することである。制御パケットのACK/NACK情報に基づいて、ACKの率がある閾値(RACK=25%)よりも小さいことが何回か続くと(THDOWN回よりも多くなると)、並列度を1レベル下げる。もしACK率が100%であることが何回か続くと(THUP回よりも多くなると)、並列度を1レベルあげる。
さらに、制御パケット処理の第3の目的は、通信路テーブル57bの設定を行うことである。使用する通信路を動的に切り替えて、利用できる通信路のみを通信に使う機能を、ここで実現している。並列度が変わらないときには、制御パケットのACK/NACK情報に基づいて、NACKが返ってきた通信路は、ダミーパケットを送るように、ACKが返ってきた通信路テーブルは、制御パケットまたはデータパケットを送るように通信路テーブル57bを設定する。並列度が変わったときには、NACKの情報は関係なしに、全通信路で制御パケットまたはデータパケットを送るように通信路テーブル57bが設定される。
すなわち、ステップS261において、通信状態認識部57は、受信用のACKレジスタ57aに、受信した制御パケット内のACK/NACK情報を格納する。
ステップS262において、通信状態認識部57は、並列度テスト中であるか否かを判定する。すなわち、通信状態認識部57は、並列度テスト中か否かを、並列度テスト中フラグに基づいて判断する。例えば、並列度テスト中フラグが1であると判定された場合(フラグが立っていると判定された場合)、並列度テスト処理が実行されている最中なので、その処理は、終了する。
一方、並列度テスト中フラグが1ではない(フラグが立っていない)と判定された場合、その処理は、ステップS263に進む。
ステップS263において、通信状態認識部57は、受信用のACKレジスタ57aと通信路テーブル57bを比較して、通信路テーブル57bで制御パケットまたはデータパケットを送信していた通信路について、受信用のACKレジスタ57aではNACKになっているものがあると判定した場合、ステップS264において、相手側に制御パケットまたはデータパケットが受信されなかったことがわかるので、データ再送フラグを立てる(=1に設定する)。ステップS263において、例えば、NACKがないと判定された場合、ステップS265において、通信状態認識部57は、データ再送フラグを立てない(=0に設定する)。データ再送フラグは、データパケット生成処理において参照され、送信するデータパケットを生成する時点で、データ再送フラグを参照し、フラグが立っていれば、再送データのデータパケットを生成するようになっている。
ステップS266において、並列度制御部58が、送信側の並列度の設定処理を実行する。
ここで、図34のフローチャートを参照して、並列度の設定処理について説明する。
ステップS281において、並列度制御部58は、今現在の並列度が最小であるか否かを判定する。すなわち、並列度制御部58は、並列度レジスタ58aを参照して、現在の並列度が最小(並列度レジスタの値が0)であるか否かを判断する。例えば、ステップS281において、並列度が最小であると判定された場合、その処理は、ステップS296に進む。一方、ステップS281において、並列度が最小ではないと判定された場合、その処理は、ステップS282に進む。
ステップS282において、並列度制御部58は、全通信路のうちACKの占める割合(RACK)を計算する。なお、割合RACKの計算方法は、上述した図21のフローチャートにおけるステップS26の処理と同様であるので、その説明は省略する。
ステップS283において、並列度制御部58は、求められたACKの割合RACKと閾値RTHとを比較し、割合RACKが閾値RTHよりも小さいか否かを判定する。ステップS283において、例えば、割合RACKが閾値RTHよりも小さいと判定された場合、ステップS284において、並列度制御部58は、割合RACKが閾値RTHよりも小さいと判定された回数NDOWNを1インクリメントする。一方、ステップS283において、割合RACKが閾値RTHよりも小さくないと判定された場合、ステップS284の処理がスキップされる。
ステップS285において、並列度制御部58は、ステップS282乃至S284の処理を所定回数繰り返したか否かを判定し、所定回数繰り返していないと判定した場合、その処理は、ステップS281に戻る。すなわち、並列度が最小とならない限り、ステップS282乃至S285の処理が繰り返される。
ステップS285において、ステップS282,S283の処理が所定回数繰り返されたと判定された場合、ステップS286において、並列度制御部58は、割合RACKが閾値RTHよりも小さいと判定された回数NDOWNが、所定の閾値THDOWN(割合RACKが所定の閾値RTHよりも低い回数の閾値)よりも大きいか否かを判定する。
例えば、ステップS286において、割合RACKが閾値RTHよりも小さいと判定された回数NDOWNが、所定の閾値THDOWN(割合RACKが所定の閾値RTHよりも低い回数の閾値)よりも大きいと判定された場合、割合RACKが閾値RTHよりも小さい傾向が強いとみなし、ステップS293において、並列度制御部58は、並列度のレベルを1レベルさげて、処理を終了する。一方、ステップS286において、割合RACKが閾値RTHよりも小さいと判定された回数NDOWNが、所定の閾値THDOWN(割合RACKが所定の閾値RTHよりも低い回数の閾値)よりも大きくないと判定された場合、その処理は、ステップS287に進む。
ステップS287において、並列度制御部58は、今現在の並列度が最大値であるか否かを判定し、最大であると判定した場合、その処理を終了する。一方、ステップS287において、今現在の並列度が最大値ではないと判定された場合、ステップS288において、並列度制御部58は、受信用のACKレジスタ57a、すなわち受信した制御パケットの内のACK/NACK情報を調べて、NACKがなかったか否かを確認し、例えば、NACKがないと判定した場合、ステップS289において、NACKが存在しなかった回数NUPを1インクリメントし、その処理は、ステップS290に進む。一方、ステップS288において、NACKがあると判定された場合、ステップS289の処理がスキップされて、その処理は、ステップS290に進む。
ステップS290において、並列度制御部58は、ステップS287,S288の処理が所定回数繰り返されたか否かを判定し、例えば、所定回数繰り返されていないと判定された場合、その処理は、ステップS287に戻る。すなわち、ステップS287,S288の処理が所定回数繰り返されるまで、ステップS287乃至S290の処理が繰り返される。
そして、ステップS290において、所定回数繰り返されたと判定された場合、ステップS291において、並列度制御部58は、NACKが無かった回数NUP(ACK率が100%だった回数)が、所定の閾値THUP(ACK率が100%の回数の閾値)よりも大きいか否かを判定する。例えば、NACKが無かった回数NUP(ACK率が100%だった回数)が、所定の閾値THUP(ACK率が100%の回数の閾値)よりも大きいと判定された場合、ステップS292において、並列度制御部58は、現状の並列度では十分な通信状態が維持されているので、並列度を上げても安定的に通信することが可能であるとみなし、並列度のレベルを1レベル上げたのち、その処理を終了する。
一方、ステップS291において、NACKが無かった回数NUP(ACK率が100%だった回数)が、所定の閾値THUP(ACK率が100%の回数の閾値)よりも大きくないと判定された場合、ステップS292の処理がスキップされて、処理が終了する。すなわち、この場合、並列度は変更がないことになる。
尚、上述の処理が終了されるとき、割合RACKが閾値RTHよりも小さいと判定された回数NDOWN、および、NACKが無かった回数NUPは、0に初期化される。
すなわち、並列度の設定処理は、受信用のACKレジスタ57a(すなわち、制御パケット内のACK/NACK情報を参照して、割合RACKが所定の閾値(RACK=25%)よりも小さい傾向が強くなると、並列度は1レベル下げられる。また、NACKが存在しない傾向が強くなると、並列度は1レベル上げられる。
以上の処理により、ACKの占める割合が高く、通信状態が良好な状態が続けば、並列度はレベルが上げられ、通信速度を高められるが、一方で、NACKの現れる傾向が強くなり、通信状態が悪化するような場合、並列度のレベルを下げて通信の安定性を向上させることが可能となり、結果として、高速で、かつ、安定的な通信を実現させることが可能となる。
尚、もちろん、並列度の上下の判断基準は別の方法を用いても構わない。例えば、並列度を上げる条件をNACKが存在しない場合ではなく、比較的NACKが少ない傾向が現れているときには、一度並列度を上げてみるようにしてもよい。
ここで、図33のフローチャートの説明に戻る。
ステップS267において、通信状態認識部57は、並列度の変更があったか否かを判定する。例えば、並列度に変更がないと判定された場合、ステップS268において、通信状態認識部57は、通信路テーブルセット処理を実行し、NACKの返ってきた通信路はダミーパケットを送信するように通信路テーブル57bを再設定する。尚、通信路テーブルセット処理の詳細については後述する。
一方、並列度に変更があったと判定された場合、通信状態認識部57は、通信路テーブルの初期化処理を実行し、通信路テーブル57bにはダミーパケットなしで、制御パケットとデータパケットのみを設定する。尚、通信路テーブルの初期化処理の詳細については、図24のフローチャートを参照して説明した処理と同様であるので、その説明は省略する。
ここで、図35を参照して、上述のステップS268の処理である通信路テーブルセット処理について説明する。
ステップS321において、通信状態認識部57は、変数iを初期化(0クリア)する。ここでは変数iは、送信パケットの種別をセットする通信路の番号(通信路テーブルのアドレス)を示すものである。
ステップS322において、通信状態認識部57は、受信用のACKレジスタ57aを参照し、通信路(i)がACKであるか否かを判定し、例えば、ACKであると判定した場合、ステップS323において、通信路(i)の送信パケット種別を1にセットすなわち、通信路(i)を制御パケットに割り当てる。
一方、ステップS322において、通信路(i)がACKではないと判定された場合、ステップS324において、通信状態認識部57は、通信路(i)の送信パケット種別を2にセットし、通信路(i)をダミーパケットに割り当てる。
ステップS325において、通信状態認識部57は、変数iを1インクリメントする。
ステップS236において、通信状態認識部57は、変数iが並列度より小さいか否かを判定する。すなわち、並列度は、並列度レジスタの値+1であり、変数iが並列度よりも小さい間は、通信路テーブル57aの設定を継続するため、その処理は、ステップS327に進み、変数iが並列度よりも小さくない場合、通信路テーブルの設定は完了したことになるので、処理を終了する。
ステップS327において、通信状態認識部57は、受信用のACKレジスタ57aを参照して、通信路(i)がACKであるか否かを判定する。例えば、ステップS327において、通信路(i)がACKである場合、ステップS328において、通信状態認識部57は、通信路(i)の送信パケット種別を0に設定、すなわち、通信路(i)をデータパケットに割り当て、その処理は、ステップS325に戻る。
一方、ステップS327において、通信路(i)がACKではないと判定された場合、通信状態認識部57は、通信路(i)の送信パケット種別を2にセットし、通信路(i)をダミーパケットに割り当て、その処理は、ステップS325に戻る。
以上の処理により、並列度の数(並列度レジスタの値+1)だけ、通信路テーブル57bに送信パケットの種別をセットする。このとき、受信用のACKレジスタ57a(すなわち、受信した制御パケット内のACK/NACK情報)を参照して、NACKの返ってきた通信路は、ダミーパケットを送信するようにセットし、ACKの返ってきた通信路のみを使って、制御パケット(1通信路)とデータパケット(残りの通信路)を送信するように割り当てられる。
ここで、図32のフローチャートの説明に戻る。
ステップS239において、データ通信コントローラ56は、変数iが相手側の最大並列度よりも小さいか否かを判定する。尚、図3の情報通信システムにおいては、通信装置1−1,1−2の両者とも最大並列度は63である。したがって、受信パケット格納メモリも64個まで受信パケットが格納できるように用意した。したがって、変数(i)は、0から63の値をとり、64未満の場合には、次の受信パケットの処理を行うために、ステップS240において、変数iを1インクリメントさせた後、その処理は、ステップS233に戻る。変数iが64になった場合、すべて受信パケットについての処理が終了していることになるので、その処理は、ステップS241に進む。
ステップS241において、データ通信コントローラ56は、受信データ格納メモリ56bの内容を、ホストコントローラ51に出力する。さらに、ステップS242において、データ通信コントローラ56は、受信パケット格納メモリ56a、および、受信データ格納メモリ56bを初期化(0クリア)し、処理を終了する。
一方、ステップS237において、受信パケットがデータパケットであると判定された場合、ステップS243において、データ通信コントローラ56は、データパケットのデータ領域の情報を抜き出し、受信データ格納メモリ56bに格納し、その処理は、ステップS239に進む。本実施例では、データパケットは、空間アドレスの小さいものから大きい順にデータが格納されているので、受信データ格納メモリへのデータ格納も、空間アドレスの小さいデータを受信データ格納メモリの小さいアドレスに入れていけばよい。
さらに、ステップS236において、受信パケットがテストパケットであると判定された場合、ステップS244において、データ通信コントローラ56は、テストパケット処理を実行する。
ここで、図36のフローチャートを参照して、テストパケット処理について説明する。
ステップS341において、並列度制御部58は、並列度を1にセット、すなわち、並列度レジスタ58aに0をセットする。
ステップS342において、通信状態認識部57は、通信路テーブルの初期化処理を実行し、決定した並列度の数(並列度レジスタの値+1)だけ、通信路テーブルに送信パケットの種別をセットする。尚、今の場合、制御パケットを1つ送信すればよいので、最初の通信路(通信路(0))に制御パケットの種別番号をセットして、それ以外の通信路には、データパケットの種別番号をセットする。ここでは、並列度は0なので、データパケットはセットしない。尚、通信路テーブルの初期化処理については、図24のフローチャートを参照して説明したので、その説明は省略する。
すなわち、テストパケットを受信したら、相手側が並列度テストを行っていることがわかるので、自らは、並列度を0にして、制御パケットを送信することにする。
すなわち、以上の処理により、データ通信コントローラ56が受信装置54から受信パケットデータを取得し、受信パケット格納メモリ56aに格納する。また、通信状態認識部57は、受信パケットメモリに格納された全受信パケットについて解析して、各通信路において受信できたか否かを参照して調べ、受信用のACKレジスタ57aに記録する。さらに、受信できたパケットの種類を調べる。
データパケットであれば、データ通信コントローラ56は、受信データを抽出して受信データ格納メモリ56bに格納し、制御パケットであれば、制御パケットに含まれるACK/NACK情報から、並列度の見直しと送信装置の通信路の使用・未使用の再設定を行う(通信路テーブルの再設定)。
また、データ通信コントローラ56は、データパケットであれば、並列度を0にして、制御パケットを送信するように設定する(並列度レジスタ=0、通信路テーブルの再設定)。そして、通信コントローラ52は、1回の並列受信が完了したら、受信データをホストコントローラ51に出力する。
結果として、動的に並列度を変化させながら、高速で、かつ、安定的な通信を実現させることが可能となる。
次に、パケットのデコード処理について説明する。なお、比較部92においては2フレーム間差分を採用し、受信装置14のフレームレートが、送信装置53のベース周波数の2倍である場合を例に説明する。
パケットのデコードは、図5に示すようにデコード処理部93で実行されるが、そのデコードにおいてデコード用メモリ94を用いる。デコード用メモリ94は、図6で示されるように、2次元受光部82からの信号のデコード過程で各受光素子のデコード状況を示すステータス情報(ここでは「フラグ」と称する)とデコードして得られたデータ部分(ここでは「データ」と称する)を格納するためのフレームメモリである。フラグは、図6で示されるように、デコードカウンタ(3bit)、デコードステータス(7bit)、CRC結果フラグ(1bit)、およびエンドフラグ(1bit)から構成される。また、データはヘッダ(15bit)、受信データ(64ビット)、エラー検出符号(16bit)を格納する領域(エリア)で、デコードできたビットから順に格納される。
図7には、このうちデコードカウンタおよびデコードステータスの変化が示されている。まずは、スタートコードが検出される。
最初に初期化された後は、デコードカウンタおよびデコードステータス共に0となる。その後、送信点滅パターンのSt0には、立ち上がりエッジが含まれるので、それを検出して(CP(n)=1を検出して)、デコードステータスは0から1に変化し、デコードカウンタは、この後、1フレーム毎にカウントアップ動作が行なわれる。
次に、スタートコードのSt1からSt2の間に立ち下がりエッジが含まれるので、それを検出して(CM(n)=1を検出して)、デコードステータスはさらに1から2に変化し、デコードカウンタは、一度1に設定されて、次のフレームからは、1フレーム毎にカウントアップされる。
その次には、St2からSt3の間に立ち上がりエッジが含まれるので、それを検出して(CP(n)=1を検出して)、「デコードステータス」はさらに2から3に変化し、デコードカウンタは、一度1に設定されて、次のフレームからは、1フレーム毎にカウントアップされる。
そして、St3の真ん中で立下りエッジがあるので、それを検出して(CM(n)=1を検出して)、デコードステータスはさらに3から4に変化し、デコードカウンタは、一度1に設定されて、次のフレームからは、1フレーム毎にカウントアップされる。
以上のように、デコードステータス1からデコードステータス3までの区間はスタートコードの区間であり、スタートコードの点滅パターンは固定なので、光の立ち上がり変化、立下り変化のパターンも固定になる。したがって、デコードステータス1からデコードステータス3の各ステータスの長さ(フレーム数)も固定である。すなわち、デコードステータス1は6フレーム、デコードステータス2は4フレーム、デコードステータス3は2フレームとなる。
また、このデコードステータスが3から4に変化するフレームを、説明のために「ヘッダ基準点」と呼ぶことにする。すると、この後、受信されるヘッダ15bit+データ64ビットのデータは、この「ヘッダ基準点」から4フレーム毎に受信することができる。
「ヘッダ基準点」から4フレーム後は、ちょうどH0の真ん中に相当し、H0が0であっても、1であっても、マンチェスタ符号なので、光の立下りか立ち上がり変化が発生する。すなわち、H0=1のときには、マンチェスタ符号は0から1なので、立ち上がり変化が発生するのでCP(n)=1となり、H0=0のときにはマンチェスタ符号は1から0なので、立下り変化が発生してCM(n)=1となる。これにより、H0のデータを判定することができる。もし、CP(n) =CM(n)=0となる場合には、マンチェスタ符号が受信できなかったことになるので、エラーと判断して、この画素のデコードは、この後、スタートコードの検出からスタートするために、「フラグ」「データ」が0に初期化される。
H1からH14、そしてD0からD63(データ64bit)、さらにE0からE15(誤り検出符合16bit)のデコードも、H0以降、4フレーム毎に同様の処理が行なわれる。
次に、図37のフローチャートを参照して、デコード処理について説明する。
ステップS361において、デコード処理部93は、フラグをすべて初期化(0に設定)すると共に、デコード用メモリ94を初期化(0に設定)する。ここで、デコード処理部93は、デコードカウンタとデコードステータスをも共に0に初期化する。
ステップS362において、デコード処理部93は、比較部92よりCP(n),CM(n)が入力されるタイミングにあわせて、入力されるCP(n),CM(n)の座標(注目画素の座標)に相当するフラグ・データ情報を、デコード用メモリ94から読み出す。
ステップS363において、デコード処理部93は、デコードメイン処理を実行し、図7を参照して説明した処理を行う。なお、デコードメイン処理について、詳細を後述する。
ステップS364において、デコード処理部93は、デコードメイン処理で更新されたフラグおよびデータの内容を、デコード用メモリ94内の処理対象(注目画素)の座標のアドレスに書き戻す。
ステップS365において、デコード処理部93は、フラグが、1パケットにおける最後のエンドフラグ(デコードメイン処理において設定されるフラグであり、1パケットの最後まで受信した場合に1に設定されて、立つフラグである)が立っているか否かを判定する(エンドフラグが1になっているか否かを判定する)。
ステップS365において、例えば、エンドフラグが立っていると判定された場合、ステップS367において、エラー検出部95は、エラー検出処理を実行する。すなわち、CRCを用いて復元したデータ(スタートコードを除くヘッダ、データ、およびエラー検出符合)のエラー検出処理が実行される。エラー検出部95は、CRCとして代表的なITU-T(国際電信電話諮問委員会)の勧告によるもので、生成多項式(Generator Polynomial) G(x)=x16+x12+x5+1を用いる。ここでは、エラー検出処理が実行されるため、シンドローム多項式(Syndrome polynomial)が計算され、シンドローム多項式が0になればエラーなし、0以外であればエラーが発生したことを検出する。このとき、エラー検出部95は、後段のP/S変換部に受信したパケットデータと受信した受光素子の座標を出力する。尚、エラー検出処理については、詳細を後述する。
ステップS386において、デコード処理部93は、入力されたCP(n),CM(n)が1フレーム分終了したか否かを判定し、1フレーム分終了していないと判定された場合、ステップS366において、アドレスカウンタを1インクリメントして、その処理は、ステップS362に戻り、1フレーム分の処理が終了するまで、ステップS362乃至S368の処理が繰り替えされる。
そして、ステップS368において、1フレーム分の処理が終了したと判定された場合、ステップS369において、通信終了か否かを判定して、通信終了であると判定された場合、その処理は、終了する。一方、通信終了ではないと判定された場合、ステップS370において、デコード処理部93は、次の処理に備えて、デコード用メモリ94のアドレスカウンタを初期化して、その処理は、ステップS362に戻る。
また、ステップS365において、エンドフラグが立っていないと判定された場合、その処理は、ステップS366に進む。
次に、図38のフローチャートを参照して、上述した、ステップS363の処理であるデコードメイン処理について説明する。
ステップS381において、デコード処理部93は、比較部92より供給される比較結果CP(n)==0で、かつ、デコードカウンタ==0で、かつ、デコードステータス==0であるか否かを判定する。すなわち、図37のステップS361において、初期化がなされた後、図7で示されるように、すぐはデコードカウンタ、デコードステータスは共に0である。そして比較部92より供給される比較結果CP(n)==1(光の立ち上がり変化)が来てはじめて、スタートコードのデコードが開始する。すなわち、「CP(n)==0 & デコードカウンタ==0 & デコードステータス==0」を満たすことは、まだこの注目画素では、パケットのデコードが開始されていないことを示している。
ステップS381において、比較結果CP(n)==0で、かつ、デコードカウンタ==0で、かつ、デコードステータス==0であると判定された場合、このフレームでは、CP(n)==0なので、デコードは開始しないので、処理を終了する。
ステップS381において、比較結果CP(n)==0で、かつ、デコードカウンタ==0で、かつ、デコードステータス==0ではないと判定された場合、ステップS382において、デコード処理部93は、この注目画素のデコード処理を開始する、またはデコード処理途中であるので、ステップS382において、エラーフラグをクリア(=0)して初期化する。尚、エラーフラグは、デコードメイン処理内のローカルフラグであり、スタートコード処理、および、データ受信処理において、光の変化が来るべきフレームで、光の変化が検出されなかった(CP(n)==0, CM(n)==0)場合に、エラーフラグに1がセットされる。
ステップS383において、デコード処理部93は、デコードステータスが4よりも小さいか否かを判定する。
例えば、ステップS383において、デコードステータスが4よりも小さい場合、すなわち、デコードステータスが0乃至3である場合、スタートコードのデコード処理が、実行中であることを示している。したがって、処理は、ステップS384に進み、デコード処理部93は、スタートコード処理を実行し、スタートコードのデコード処理を実行する。尚、スタートコード処理については、詳細を後述する。
一方、ステップS383において、デコードステータスが4より小さくない場合、すなわち、デコードステータスが4以上の場合、データの受信処理中のステータスであるので、その処理は、ステップS387に進み、デコード処理部93は、データ受信処理を実行し、データ受信のためのデコード処理を実行する。尚、データ受信処理についての詳細は後述する。
ステップS385において、デコード処理部93は、エラーフラグが1であるか否かを判定する。エラーフラグとは、スタートコード処理およびデータ受信処理において、光の変化が来るべきフレームで、光の変化が検出されなかった(CP(n)==0, CM(n)==0)場合に、エラーフラグに1がセットされる。
ステップS385において、エラーフラグが1であると判定された場合、注目画素はデコード途中でエラーが発生したとものとみなし、ステップS386において、デコード処理部93は、デコードカウンタ、デコードステータス、およびCRC結果フラグを初期化(0にセット)する。これにより、この注目画素は、これ以降、デコードの初期状態に戻り、スタートコード検出から開始されることになる。
一方、ステップS385において、エラーフラグが1ではない場合、エラーが発生していないことになるので、デコードが成功していると思われるので、その処理は終了する。
次に、図39のフローチャートを参照して、図38のステップS384の処理であるスタートコード処理について説明する。
ステップS401において、デコード処理部93は、デコードステータスが0であるか否かを判定する。例えば、デコードステータスが0であると判定された場合、ステップS402において、デコード処理部93は、ステータス0の処理を実行する。
ステップS401において、デコードステータスが0ではないと判定された場合、ステップS403において、デコード処理部93は、デコードステータスが1であるか否かを判定する。例えば、デコードステータスが1であると判定された場合、ステップS404において、デコード処理部93は、ステータス1の処理を実行する。
ステップS403において、デコードステータスが1ではないと判定された場合、ステップS405において、デコード処理部93は、デコードステータスが2であるか否かを判定する。例えば、デコードステータスが2であると判定された場合、ステップS406において、デコード処理部93は、ステータス2の処理を実行する。
ステップS405において、デコードステータスが2ではないと判定された場合、デコード処理部93は、ステータス3の処理を実行する。
すなわち、デコードステータスに対応してステータスの処理が実行される。
ここで、図40乃至図43を参照して、それぞれステータス0の処理乃至ステータス3の処理について説明する。
まず、図40を参照して、ステータス0の処理について説明する。ステップS421において、デコード処理部93は、デコードカウンタが0であるか否かを判定する。図7で示されるように、デコードカウンタが0の場合、対応する注目画素についてはデコードが開始されていない。
例えば、ステップS421において、デコードカウンタが0ではない場合、ステップS422において、デコード処理部93は、デコードカウンタが4であるか否かを判定する。すなわち、図7のデコードカウンタの遷移を見ても分かるように、デコードステータスが0から1に遷移するのは、デコードステータスが0でデコードカウンタが4であるときである。すなわち、デコードカウンタが4であるか否かの確認は、デコードステータスが0から1に遷移するための条件であるか否かの確認である。
例えば、ステップS422において、デコードカウンタが4ではない、すなわち、デコードカウンタが0でもなく、4でもない場合、デコードカウンタの値は、1乃至3であることになる。そこで、ステップS423において、デコード処理部93は、デコードカウンタの値を1インクリメントして、処理を終了する。
一方、ステップS421において、デコードカウンタが0である、または、ステップS422において、デコードカウンタが4である場合、ステップS424において、デコード処理部93は、比較結果CP(n)が1であるか否かを判定する。すなわち、ヘッダの最初は、光の立ち上がり変化から始まる。したがって、比較結果CP(n)が1であるか否かを確認することで、デコードステータスが0→1に遷移するか否かを確認することができる。
ステップS424において、比較結果CP(n)が1であると判定された場合、すなわち、デコードステータスが0→1に遷移すると判定された場合、ステップS425において、デコード処理部93は、次のステータスへの移行処理として、デコードステータスを1インクリメントし、デコードステータスの遷移にあわせて、デコードカウンタを0に初期化して処理を終了する。
ステップS424において、比較結果CP(n)が1ではないと判定された場合、すなわち、デコードステータスが0→1に遷移しないとみなされた場合、ステップS426において、デコード処理部93は、光の立ち上がり変化が来るべきときにこなかったので、エラーフラグに1をセットして、処理を終了する。図38で説明したように、ステップS384のスタートコード処理の後に、ステップS385の処理でエラーフラグの確認が行なわれ、エラーフラグが1だったら、この注目画素は、フラグおよびデータがクリアされて、初期状態に戻る。
次に、図41を参照してステータス1の処理について説明する。尚、図41のフローチャートにおけるステップS442,S444,S445の処理は、図40のステップS423,S425,S426と同様の処理であるので、その説明は省略する。ステップS441において、デコード処理部93は、デコードカウンタが6であるか否かを判定する。図7で示されるように、デコードステータスが1から2に遷移するための条件は、デコードカウンタが6のときのフレームで立ち下がりがあるか否かで判断することができる。
例えば、ステップS441において、デコードカウンタが6ではない場合、その処理は、ステップS442に進む。また、デコードカウンタが6である場合、その処理は、ステップS443において、デコード処理部93は、比較結果CM(n)が1であるか否かを判定する。すなわち、デコードカウンタが6のときに、光の立下りエッジ(CM(n)=1)が検出されると、スタートコード内の2つめのエッジを検出できたことになり、次のデコードステータスへ遷移する(デコードステータスが1から2に遷移する)。
次に、図42を参照してステータス2の処理について説明する。尚、図42のフローチャートにおけるステップS462乃至S465の処理は、図40のステップS423乃至S426と同様の処理であるので、その説明は省略する。ステップS461において、デコード処理部93は、デコードカウンタが4であるか否かを判定する。図7で示されるように、デコードカウンタの遷移を見ると分かるように、デコードステータスが2→3に遷移するための条件は、デコードカウンタが4のときのフレームで、光の立ち上がるか否かで判断できる。
例えば、ステップS461において、デコードカウンタが4ではない場合、その処理は、ステップS462に進む。また、デコードカウンタが4である場合、その処理は、ステップS463に進む。すなわち、デコードカウンタが4のときに、光の立下りエッジ(CM(n)=1)が検出されると、スタートコード内の3つめのエッジが検出されたことになり、次のデコードステータスへ遷移する(デコードステータスが2から3に遷移する)。
次に、図43を参照してステータス3の処理について説明する。尚、図43のフローチャートにおけるステップS482乃至S485の処理は、図41のステップS443乃至S446と同様の処理であるので、その説明は省略する。ステップS481において、デコード処理部93は、デコードカウンタが2であるか否かを判定する。図7で示されるように、デコードカウンタの遷移を見ると分かるように、デコードステータスが3から4に遷移するための条件は、デコードカウンタが2のときのフレームで、光の立ち下がるか否かで判断できる。
例えば、ステップS481において、デコードカウンタが2ではない場合、その処理は、ステップS482に進む。また、デコードカウンタが2である場合、その処理は、ステップS483に進む。すなわち、デコードカウンタが2のときに、光の立下りエッジ(CM(n)=1)が検出されると、スタートコード内の4つめのエッジが検出されたことになり、次のデコードステータスへ遷移する(デコードステータスが3から4に遷移する)。
次に、図44のフローチャートを参照して、図38のフローチャートにおけるステップS387の処理であるデータ受信処理について説明する。
ステップS501において、デコード処理部93は、デコードカウンタが4であるか否かを判定する。図7のデコードカウンタの遷移に示されるように、データ基準点のフレームから、4フレーム毎に、立ち上がりエッジ(CP(n)=1)が検出されるか、または、立下りエッジ(CM(n)=1)が検出されるかを調べることで、データをデコードすることができる。従って、デコードカウンタが4のときのフレームを検出すればよい。
ステップS501において、デコードカウンタが4であると判定された場合、ステップS502において、デコード処理部93は、比較結果CP(n)が1であるか否かを判定する。例えば、ステップS502において、比較結果CP(n)が1ではないと判定された場合、ステップS503において、デコード処理部93は、比較結果CM(n)が1であるか否かを判定する。
例えば、ステップS503において、比較結果CM(n)が1ではないと判定された場合、ステップS504において、デコード処理部93は、エラーフラグを1に設定して、処理を終了する。すなわち、ステップS503において、比較結果CM(n)が1ではないと判定されたということは、データ0もデータ1も検出されなかったことを意味する。すなわち光の変化が来るべきフレームで、光の変化が検出されなかったので、エラーフラグを立てて(1に設定して)処理を終了する
ステップS501において、デコードカウンタが4ではないと判定された場合、すなわち、デコードカウンタが1乃至3の場合、ステップS505において、デコード処理部93は、デコードカウンタを1インクリメントして処理を終了する。
ステップS502において、比較結果CP(n)が1であると判定された場合、ステップS506において、デコード処理部93は、現在のデコードステータスに対応するデータレジスタのビットに1を書き込み、その処理は、ステップS508に進む。すなわち、比較結果CP(n)が1であるということは、データ1が検出されたことになる。そこで、現在のデコードステータスに対応するデータレジスタのビットに1を書き込む。ここで、データレジスタの書きこみビットは、図7で示されるように、デコードステータスが4のときはH0、5のときはH1、6のときはH2、7のときはH3、8のときはH4、9のときはH5、10のときはH6、11のときはH7となる。したがって、デコードステータス4がLSB方向からみたデータのビット番号に相当する。ここでいうデータとは、ヘッダ(H0-H14)、データ(D0-D63)、および、エラー検出符号(E0-E15)の計95ビットである。
一方、ステップS503において、比較結果CM(n)が1であると判定された場合、ステップS507において、デコード処理部93は、現在のデコードステータスに対応するデータレジスタのビットに1を書き込み、その処理は、ステップS508に進む。すなわち、比較結果CM(n)が0であるということは、データ0が検出されたことになる。そこで、現在のデコードステータスに対応するデータレジスタのビットに1を書き込む。すなわち、データレジスタの書きこみビットは、図7で示されるように、デコードステータスが4のときはH0、5のときはH1、6のときはH2、7のときはH3、8のときはH4、9のときはH5、10のときはH6、11のときはH7となる。したがって、デコードステータス4がLSB方向からみたデータのビット番号に相当する。ここでいうデータとは、ヘッダ(H0-H14)、データ(D0-D63)、および、エラー検出符号(E0-E15)の計95ビットである。
ステップS508において、デコード処理部93は、デコードステータスが99であるか否かを判定する。すなわち、デコードステータスは0乃至99の値をとる。デコードステータスが99の次は0に遷移するため、この判定を行う。すなわち、デコードステータス0乃至3はスタートコード(S0-S3)、デコードステータス4乃至18はヘッダ(H0-H14)、デコードステータス19乃至83はデータ(D0-D63)、デコードステータス84乃至99は誤り検出符号(E0-E15)となる。
従って、ステップS508において、デコードステータスが99ではない場合、すなわち、99未満の値である場合、ステップS509において、デコード処理部93が、デコードステータスを1インクリメントする。また、ステップS508において、デコードステータスが99であった場合、ステップS510において、デコード処理部93は、デコードステータスを0にする。
ステップS511において、デコード処理部93は、デコードカウンタを0に初期化する。
ステップS512において、デコード処理部93は、デコードステータスが0であるか否かを判定し、デコードステータスが0である場合、ステップS513において、エンドフラグを1に設定する。すなわち、データ受信処理中にデコードカウンタが4で、かつデコードステータスが0である条件は、現在のフレームがE15のデータ(誤り検出符号の最後のビット)を受信したことを意味する。したがって、この注目画素では、95ビットのデータ(ヘッダ(15bit)、受信データ(64ビット)、エラー検出符号(16bit))を欠けることなく受信できたので、それを示すために、「エンドフラグ」を設定する。尚、エンドフラグは、デコード処理部93の後段であるエラー検出部95で参照される。すなわち、エンドフラグ=1の画素(受光素子)については、エラー検出部95でCRCを用いた誤り検出を行い、エンドフラグ=0の画素は受信データがないので、処理を行わない。また、エラーフラグの初期化は、図37のフローチャートにおけるステップS361の処理である初期化処理及び図38のフローチャートにおけるステップS386の処理で行なわれる。
以上の処理により、マンチェスタ符号化され、さらに、LEDアレイ62の各LED71の点滅パターンを2次元受光部82により取得した後、デコードすることが可能となる。
尚、以上においては、受信装置54にレンズ81などの光学系を設けて、2次元受光部82により検出される信号を通信にのみ用いた場合の例について説明してきたが、例えば、図45で示されるように、映像フレームメモリ201および画像処理部202を設けて、ADC83の出力をデコード処理部84のみならず、映像フレームメモリ201に供給し、画像処理部202が適宜画像処理することにより、データ通信と同時に、映像を撮像することも可能となる。
映像用フレームメモリ201は、高速撮像の映像(例えば1000fps)から通常のレートの映像(例えば30fps)を生成するために使用する。この場合、もっとも単純な映像生成方法は、33枚の画像を足し合わせて、30fps相当の映像を生成する方法である。したがって、映像用フレームメモリ201には、少なくとも1フレーム分のメモリを用意して、ADC83の出力データを前フレームまで積算された映像データと足し合わせて書き戻す処理を行うことで実現可能である。
画像処理部202は、映像用フレームメモリ201を用いて30fps相当の画像を生成する処理と、その30fps相当のカラーの復元処理(デモザイク処理)、ガンマ補正やオートホワイトバランス処理、オートゲインコントロールなど、一般的なイメージセンサの後段処理を行う。
また、図46は、機能性イメージセンサ211を用いた構成例を示している。このセンサは、通常のイメージセンサに比べて、フレームレートが高く、フレームメモリと演算機能を有している。すなわち、このイメージセンサは、図47に示すように、受光部221で受光した信号を、IDフレームメモリ222と比較部223をイメージセンサ内に有しており、外部の回路は比較的小規模になるのが、メリットの1つである。
また、高速フレームレートのイメージセンサで問題となるのが、イメージセンサと外部回路とのバンド幅が大きくなってしまうことであるが、このイメージセンサにおいては、出力データが比較演算によってデータ量の大幅な削減がなされることから、イメージセンサと外部回路とのバンド幅の問題は大幅に緩和される。したがって、本発明の一実装として、最適なデバイスの1つといえる。なお、この機能性イメージセンサは、数Kfps乃至数十Kfpsのフレームレートでフレーム間差分演算を行うことができる。
以上によれば、光空間通信の並列度を最適化することにより、通信路特性が優れないときには並列度を小さくして通信の安定性を向上させ、通信路特性が優れるときには並列度を大きくして高速通信を可能とすることにより、高速で、かつ、安定的な通信を実現することが可能となる。また、動的にデータ送信する通信路を選択することで、高効率で、かつ、安定な情報通信システムを構成することが可能となる。
上述した一連の処理は、ハードウェアにより実行させることもできるが、ソフトウェアにより実行させることもできる。一連の処理をソフトウェアにより実行させる場合には、そのソフトウェアを構成するプログラムが、専用のハードウェアに組み込まれているコンピュータ、または、各種のプログラムをインストールすることで、各種の機能を実行させることが可能な、例えば汎用のパーソナルコンピュータなどに記録媒体からインストールされる。
プログラムが記録されている記録媒体は、図2に示すように、コンピュータとは別に、ユーザにプログラムを提供するために配布される、プログラムが記録されている磁気ディスク41(フレキシブルディスクを含む)、光ディスク42(CD-ROM(Compact Disc-Read Only Memory),DVD(Digital Versatile Disk)を含む)、光磁気ディスク43(MD(Mini-Disc)を含む)、もしくは半導体メモリ44などよりなるパッケージメディアにより構成されるだけでなく、コンピュータに予め組み込まれた状態でユーザに提供される、プログラムが記録されているROM22や、記憶部28に含まれるハードディスクなどで構成される。
尚、本明細書において、記録媒体に記録されるプログラムを記述するステップは、記載された順序に沿って時系列的に行われる処理は、もちろん、必ずしも時系列的に処理されなくとも、並列的あるいは個別に実行される処理を含むものである。
また、本明細書において、システムとは、複数の装置により構成される装置全体を表すものである。
1,1−1,1−2 通信装置, 52,52−1,52−2 通信コントローラ, 56,56−1,56−2 データ通信コントローラ, 56a,56a−1,56a−2 受信パケット格納メモリ, 56b,56,−1,56b−2 受信データ格納メモリ, 57,57−1,57−2 通信状態認識部, 57a,57a−1,57a−2 ACKレジスタ, 57,57b−1,57b−2 通信路テーブル, 58,58−1,58−2 並列度制御部, 58a,58a−1,58a−2 並列度レジスタ, 59,59−1,59−2 LED発光パターンテーブル, 92 比較部, 93 デコード処理部, 94 デコード用メモリ, 95 エラー検出部