コード板リファレンス設計
2ⁿでない分解能のアブソリュートコード板:360位置・1000位置の巡回グレイコード

360または1000の絶対位置で、最後と最初のコードの間も一ビットしか変わらないようにするには、反射グレイコードの中央の対称な区間を切り出し、両端からそれぞれ(2ⁿ − M)/2個のコードを除く。本記事では対称性、切出しと復号の式を導き、奇数の位置数がなぜ実現できないかを説明し、360位置・1000位置のトラック数、コード要素幅、復号表、レイアウトの確認項目を示す。
割出し盤、バルブアクチュエータ、十進表示の計器では、一回転あたり360(一位置1°)または1000の絶対位置が必要になることが多い。グレイコードのビット数で決まるのは一回転2ⁿ個のコードであり、360も1000も2のべき乗ではない。最も単純なのは9ビットグレイコードの最初の360個を使う方法だが、最初のコードG(0) = 000000000と最後のコードG(359) = 111010100は5ビットも異なる。継ぎ目を通過するときに各ビットの反転順序が少しでもずれると、真の位置から遠く離れた中間コードを読んでしまう。本記事では最初と最後のコードも一ビットしか違わない構成法、復号式、レイアウトで注意すべき点を示す。

反射グレイコードの対称性
nビット反射グレイコードは G(i) = i XOR (i » 1)、i = 0…2ⁿ − 1 である。iをその鏡像 i′ = 2ⁿ − 1 − i、すなわちiのnビットをビットごとに反転したものに置き換えると
i′ = i XOR (2ⁿ − 1)、i′ » 1 = (i » 1) XOR (2^(n−1) − 1)
二式の排他的論理和をとると
G(2ⁿ − 1 − i) = G(i) XOR 2^(n−1)
つまり、中点に関して対称な二つのコードは最上位ビットだけが異なる。これが「反射」という名前の由来である。下位n − 1ビットは後半が前半の鏡像になり、最上位ビットは0から1に変わる。
切出しの条件と復号
M位置の巡回コードを得るには、中央の番号 i = s … 2ⁿ − 1 − s を残し、両端からそれぞれ
s = (2ⁿ − M) / 2
個のコードを除く。区間の先頭G(s)と末尾G(2ⁿ − 1 − s)はちょうど鏡像の対で最上位ビットだけが異なるので、最後から最初へ閉じる箇所でも一ビットしか変わらない。区間内はもともと一つずつ一ビットしか変わらない。ビット数は n = ⌈log₂M⌉ とし、sは整数でなければならないので、Mは偶数でなければならない。
復号は二段階である。まずグレイコードを二進数に変換する:b(n−1) = g(n−1)、b(k) = b(k+1) XOR g(k)。次にオフセットを引く:p = B − s。B < s または B > 2ⁿ − 1 − s なら、除外したコードを読んだことになり、そのまま読取りエラーと判定できる。機械的原点を別に定める必要があれば、さらに定数を加えてMを法とする剰余をとればよい。
対称な切出しが唯一の方法というわけではない。9ビットコードで開始点を一つずつ探索すると、長さ360で最初と最後が一ビットだけ異なる連続区間は4個あり、開始点は76、204、332、460である。後の三つはいずれも511 → 0の継ぎ目をまたぐので、復号に剰余演算が一回余分に必要になる。対称区間は二進値が連続しており、復号は一回の減算だけで済むので最も扱いやすい。
奇数の位置数はなぜ実現できないか
nビットのコードをn次元立方体の頂点とみなすと、「一ビットだけ変わる」とは一本の辺に沿って一歩進むことであり、一歩ごとにコードワード中の1の個数の偶奇が反転する。一周して出発点に戻るには偶奇がもとに戻らなければならないので、歩数、すなわち位置数Mは偶数でなければならない。この結論は構成法によらず、一歩ごとに一ビットだけ変わる巡回コードはどれも奇数個の位置を実現できない。
奇数の位置数(たとえば125)が必要な場合の道は二つある。一つは2M位置の巡回コードを作り、出力時に2で割る方法で、125位置なら8ビットコードの250区間、s = 3 を使う。もう一つは継ぎ目で一度に二ビット変わることを許し、インクリメンタルトラックとの同期で読取りを保証する方法で、継ぎ目での読取り許容差を別途解析する必要がある。
360位置と1000位置のパラメータ
| 項目 | 360位置 | 1000位置 |
|---|---|---|
| トラック数n | 9 | 10 |
| オフセットs | 76 | 12 |
| 残す番号 | 76…435 | 12…1011 |
| 一位置の角度 | 1° | 0.36°(21.6′) |
| 最下位ビット半径の例 | 15 mm | 18 mm |
| コード要素の弧長2πr/M | 261.8 μm | 113.1 μm |
| 最も細いストライプ幅(2コード要素) | 523.6 μm | 226.2 μm |
| 最初のコード/最後のコード | 001101010 / 101101010 | 0000001010 / 1000001010 |
| 無効コードの割合 | 152/512 = 29.7% | 24/1024 = 2.3% |
360位置の復号表(抜粋):
| 位置p | 番号i | コードワードb8…b0 | 二進数B | B − 76 |
|---|---|---|---|---|
| 0 | 76 | 001101010 | 76 | 0 |
| 1 | 77 | 001101011 | 77 | 1 |
| 179 | 255 | 010000000 | 255 | 179 |
| 180 | 256 | 110000000 | 256 | 180 |
| 359 | 435 | 101101010 | 435 | 359 |
トラックのパターンを図2に示す。切出し後は各トラックの遷移数もそれに応じて減り、360位置ではb0が180回、b1が90回で、b8は相変わらず半周が明、半周が暗である。

レイアウトで注意すべき二点
**継ぎ目での不規則なストライプ幅。**切出し後、各トラックの継ぎ目をまたぐ区間は区間の先頭と末尾の二つの断片をつないだものになり、幅はそのトラックの通常値ではなくなる。360位置では、b4の通常のストライプ幅は32位置だが、継ぎ目をまたぐ透過区間は8位置しかない。b6、b7にもそれぞれ232位置、104位置の不規則な区間が現れる。最も細い線幅は依然としてb0の2コード要素で決まるので製造性には影響しないが、レイアウトの照合やAOIの規則を「トラックごとにストライプ幅一定」として書くことはできず、一周全体にわたって位置ごとにコード表と照合しなければならない。
**無効コードによる誤り検出能力は限られる。**除外したコードは正常な読取りでは現れないので、読めばエラーとして報告できる。しかし一ビットの読み誤りのうち無効コードに落ちるのは、360位置では約9.9%、1000位置では約1.4%にすぎない。最上位ビットの読み誤りはちょうど鏡像コードになり、常に有効なコードなので決して検出できない。読取りコードの診断が必要なら、別途チェック手段を加える必要がある。
実務上のポイント
- 切出しの式:n = ⌈log₂M⌉、s = (2ⁿ − M)/2、i = s…2ⁿ − 1 − s を残す。360位置ではs = 76、1000位置ではs = 12。
- 復号はグレイコードを二進数に変換してsを引くだけ。二進値がs…2ⁿ − 1 − sの範囲外なら読取りエラーと判定する。
- 最初のM個をそのまま使わない:360位置では最初と最後が5ビット異なり、継ぎ目で真の位置から遠いコードを読むおそれがある。
- 奇数の位置数には一歩一ビットの巡回コードがない。2M位置にして2で割るか、継ぎ目でインクリメンタルトラックと同期させる。
- レイアウトは「トラックごとにストライプ幅一定」ではなく、一周分のコード表と位置ごとに照合する:360位置のb4には継ぎ目に8位置幅しかない区間がある。
- 除外したコードで捕まえられるのは一ビット誤りの約10%以下で、最上位ビットの誤りは決して検出できない。診断には別の対策が要る。
まとめ
反射グレイコードでは、中点に関して対称な二つのコードは最上位ビットだけが異なる。中央の対称区間を切り出せば任意の偶数位置の巡回グレイコードが得られ、復号は減算が一回増えるだけである。奇数の位置数は偶奇の制約により一歩一ビットの巡回では実現できない。360位置、1000位置にはそれぞれ9本、10本のトラックが必要で、レイアウトでは継ぎ目の不規則なストライプ幅を特に照合しなければならない。
中国語原文記事の翻訳 (0303). ENC7 コード板メーカー(お問い合わせ) · 技術記事 · https://enc7.com
© 廊坊晶正光電技術有限公司(Langfang Jingzheng Optoelectronic Technology Co., Ltd.)無断転載を禁じます。本記事はAIの支援を受けて作成されています。