Q-boのドットコード解析
2018年6月20日
6月24日改訂
7月9日改訂


 Q-boはドットコードを印刷物から読み込み対応した音声を再生するロビ2の付属デバイスです。
 音声を再生すると同時に読み込んだドットコードに対応するデータをロビ2にBluetooth(BLE)で送信します。
 Q-boで使われているドットコードはGrid onputという規格のものです。

 この規格の詳しい仕様は公開されておらずロビ2 49号の見えないドットコードAという記事を元に仕様を解明しています。
 今回は実際にドットコードの読み方について解説してみます。


ドットコードの読込み



 スキャナーでドットコードを読み取りますが、カラーで印刷されている部分は通常の印刷の色も読取ってしまうのでなるべく白い部分を読取ります。
 スキャナーの解像度はドットコードの解像度と同じ500DPIに設定します。
 また色の設定は後でしきい値を調整しながら白黒に二値化するのでカラーモード読み込んでください。



 スキャナーで読み取った画像はPhotoShopのようなカラー画像を二値化(白黒)画像できる画像ソフトに読み込んでください。
 画像ソフトがない場合は二値化しないでカラーやグレースケールのままドットコードを読取る事もできます。
 ドットコードの部分を拡大してドットの位置を判別しやすいように白黒に二値化します。
 この時のしきい値は一つのドットが2〜4ドットになるようにします。(理想は2×2)

 最初にキードットを探します。  縦に整列していいるドットを探します。  これが格子ドット(青色で表示)です。
 格子ドットの縦の並びが分かったらその周りの格子ドットの中で縦方向に少しずれている並びを探します。
 それがキードット(赤色で表示)です。  キードットは格子ドットの縦横4つおき存在します。

 キードットが分かればそれを起点に4×4のマス目がひとつのドットコードとなります。





 ロビ2 49号1ページの情報ドットのコード表に照らし合わせてコードに変換していきます。
 この後、ドットコードの何番の数字というのは49号1ページの最初の図に記載されている番号で分かりよすいように列の区切りにハイフンを入れています。  この時ドットコードの位置によって区切り方(+と×)は決まっていますのでそれを手がかりに変換していくと間違わずに変換できます。
 +の位置に偶数、×の位置には奇数のコードになるはずです。

 この場合。コードは左上から縦に読んでいくと0547-3016-0361-7256となります。
   なおQ-boで使われているコードは7番から15番(160361725)は同じ値のようです。

 前述のようにコードの最終ビットは区切り方を示すもので各情報ビットのデータとしての有効ビットは2ビットという事になります。
 また16番はチェックサムのような使われ方をしていてデータの正当性を検証する役目があります。

 通常のチェックサムのようにすべての値のXOR(排他的論理和)を計算してその答えと最後の値が合っていれば有効データとみなします。
 Q-boの場合、通常のチェックサムと違い少し複雑な計算をしています。

 まず3〜15番の値の有効ビット(上2ビット)でXORを取ります。
 この値に+1します。4の場合は0 (2ビットマスクと同じ)
 この値と1番と2番をXORします。
 その値から-1します。-1の場合は3 (2ビットマスクと同じ)
 式で書くと((1^2^((3^4^5^6^7^8^9^10^11^12^13^14^15)+1)&0x03)-1)&0x03となります。


ドットコードと音声ファイルの対応

 Q-boのドットコードと音声ファイルの対応について説明します。
 Q-boのぼうけんの最初のページの本文を例に説明します。
 このドットコードは4165-1616-0361-7252で有効な2ビットで表すと2032-0303-0130-3121となり固定値(7〜15番目)とパリティ(16番目)を除くと203203となります。



 Q-boのココロの音声ファイルは、フォルダー番号とファイル番号を12ビットの値で表されています。
 黄色い部分(5ビット)がフォルダーの番号を青い部分(7ビット)がファイルの番号を表します。
 ドットコードとの対応は最初の4ビットが5番目と6番目の値(上記参照)、次の4ビットが3番目と4番目の値、最後の4ビットが1番目と2番目の値となります。
 なお各値は区切り方のビットを除く2ビットになりますので6つの値で12ビットを表します。

 まずそれぞれの4ビットごとに変換します。
 4ビット単位なので16進数の一桁になります。
 この時、ドットコードの2ビット単位の数字の並びを逆にします。
 例の場合は、203203ですので302302となります。

 これを2桁(4ビット)ずつ見ていくと、最初の4ビットが30でC(16進)、次の4ビットが23でB(16進)、最後の4ビットが02で2(16進)となります。
 次にそれぞれの値に対応する変換テーブルで4ビットづつ変換していきます。



 最初の4ビットと次の4ビットはこのテーブルを使って変換します。
 最初の4ビットはC=12(10進)なので3となります。
 次の4ビットはB=11(10進)なのでEとなります。



 最後の4ビットはこのテーブルを使って変換します。
 この値は2なのでAとなります。

 フォルダーを表す最初の値は3で次の値はEなのでこれらの値より上位5ビットは3*2+1(Eは一番上位のビットが1なので)=7となります。
 この値に231300525440(最初のフォルダー番号)を足したのが目的のフォルダー番号は231300525447となります。

 ファイルを表す値はフォルダー番号で使った2番目の4ビットのうち下の3ビットと最後の4ビットと合わせた7ビットとなります。
 Eの下3ビットは6で最後の4ビットはA=10(10進)なので6x16+10となり106となります。
 実際にこの音声はD231300525447フォルダーのDS106.MP3となり計算結果と一致します。

 ちなみにBluetoothで送信されるコードは上記の12ビットの値から0x200を引いた値に1を足した値になります。
 今回の値は0x3EAなので0x3EA-0x200+1で0x1EBとなります。
 なおこの値が1以下になるとBluetoothからの送信は行われないようです。

 ドットコードの7番目から15番目まではそれぞれのドットコードに対応したフォルダーに割り当てられています。
 ドットコードとフォルダーの対応についてはこちらを参照してください。


ドットコードの出力

 読込んだドットコードと同じ画像を作成する事でQ-boが読めるドットコードが印刷できます。
 Q-boが読めるのは赤外線を反射しないインクもしくはトナーで通常のインクジェットの染料インクで印刷したものは読めません。
 モノクロレーザプリンターもしくはカラーレーザプリンターで印刷したものが読めますのでここではモノクロレーザプリンターを使ったやり方を紹介します。



 Q-bo用ドットコード作成プログラムを起動して情報ドットコードに読込んだドットコードの1番〜6番を入力します。
 ただし入力するのは有効ビット(上2ビット=0〜3)でドットコードの値を2で割った整数となります。
 7〜15番はQ-boの場合固定で最後の桁はプログラムで計算するので入力する必要はありません。
 パラメーターはディフォルトのままで構いませんがプリンターによってはドットサイズが2×2では読取れない事があるのでその場合は1×1に切り替えてやってみてください。

 出力された画像ファイルはPhotoShopのような解像度がそのまま印刷できる画像ソフトに読み込んで印刷してください。
 画像の解像度はプログラムで画像に書き込まれていますが画像ソフトで解像度を確認してください。
 画像ソフトによっては500の小数点以下が表示される場合がありますがそのままの値で構いません。
 印刷する場合はプリンターの解像度指定は500dpi以上の解像度を指定してください。
 プリンターの解像度指定は印刷の際のプリンターのプロバティで指定できます。
 プリンターの機種によって違いますので各プリンターの説明書をご覧ください。

 Windows標準のペイントでも印刷できます。
 ペイントによる印刷方法はこちらを参照してください。

 Q-bo用ドットコード作成プログラムは下記のURLよりダウンロードする事ができます。
  MakeGrid.zip

 今まで配布されたQ-boのドットコードの一覧です。(Microsoft Excel)
  Qbodotcode.xls

目次に戻る