1. 計測
2. 送信
3. 自己テスト
4. 受信
QR の条件
バージョン (1-40)
ECC レベル
L
M
Q
H
L=7% M=15% Q=25% H=30%
モジュールの px (1-24)
PC のモニタに 1 モジュールを何 px で描くか
DSi での占有率 (%)
プレビュー短辺 (192px) の何 % を QR が占めるか
実測では手持ちで 60〜76%。90% は達成できていない(docs/05 §8)
★ 寄せる方が効く: 占有率 60% → 80% で、どのバージョンでも期待スループットが約 2 倍になる。バージョンをいじる前に、まず QR を大きく・正対して・ブレずに撮る
★ 成功率だけで選ばない: 送信側は無限にフレームを送り続け、RLNC なので届いた分だけ rank が上がる。効くのは「1 試行あたりの期待バイト数 = 実効 × 成功率」で、成功率が低くても容量の大きいバージョンが勝つことがある(v10 の 25% は v4 の 67% より速い)
ペイロード (バイト)
上限にする
全画面 (F11 ではなくこれ)
全画面中も左下に条件が出る。ESC で戻る
表示中のペイロード(実機の読み取り結果と目視照合する)
送るもの
画像 → .DIM(photo-viewer)
ファイルをそのまま(file-manager)
1. ファイル → FLR1
ファイル
先頭に FLR1 ヘッダ(名前・サイズ・CRC32)を付けてそのまま送る。名前は UTF-8 で 200 バイトまで (拡張子を残して末尾を切る)、\ / : * ? " < > | と制御文字は _ に置換、末尾の . と空白は削る。 受信側の上限は 4MB。ファイルはこの端末の中で処理され、どこにも送信されない
1. 画像 → .DIM
画像ファイル
256x192 に収まるよう縮小 → RGB555 に丸め → 256 色以下へ減色
format
0: RGB555 raw
1: 8bpp indexed
2: 8bpp indexed + RLE
.DIM を保存
減色後のプレビュー (2x)
2. .DIM → QR ループ
バージョン (1-40)
ECC
L
M
Q
H
モジュールの px (1-24)
PC のモニタに 1 モジュールを何 px で描くか
画面に合わせる
オンにすると px を無視し、表示領域(全画面中は画面)いっぱいに整数倍で描く。スマホ向け。幅 600px 未満で開くと最初からオン
DSi での占有率 (%)
プレビュー短辺 (192px) の何 % を QR が占めるか
実測では手持ちで 60〜76%。90% は達成できていない(docs/05 §8)
★ 寄せる方が効く: 占有率 60% → 80% で、どのバージョンでも期待スループットが約 2 倍になる。バージョンをいじる前に、まず QR を大きく・正対して・ブレずに撮る
★ 成功率だけで選ばない: 送信側は無限にフレームを送り続け、RLNC なので届いた分だけ rank が上がる。効くのは「1 試行あたりの期待バイト数 = 実効 × 成功率」で、成功率が低くても容量の大きいバージョンが勝つことがある(v10 の 25% は v4 の 67% より速い)
1 フレーム (ms)
★★ PC の画面輝度を最大にすること。必須条件。
aptina.c で FRAME_LENGTH を下げてフレームレートを上げた結果、露光時間の上限も下がった。 明るければ短い露光で足りるが、暗いと必要な露光がフレーム長に収まらず読めなくなる。 実機で輝度を戻したら転送が止まった(2026-09-09)。動かないときはまず輝度を疑う。 部屋を明るくするのは逆効果(画面のコントラストが落ちる)。上げるのは画面側だけ
★★
既定の 120ms が実測の最適点
(2026-09-09、480 チャンクの画像で掃引)。 80/100/110/120/130/140/150ms を実機で通しきった結果、所要は 72.9 / 74.4 / 66.6 /
64.5
/ 66.3 / 68.4 / 74.5 秒。120ms を 3 回測って 64.5 / 65.1 / 65.0 秒で再現。 速い側は
露光中に画面が切り替わって継ぎ接ぎの QR になる
(歩留まり 89%→53%)、 遅い側は
同じ QR を 2 度撮る
(重複が 4→110 枚)。両方が効いて 120ms が山の頂点。 詳細は docs/07-photo-viewer-design.md 4.5.7。
この値はカメラのフレーム周期 90ms に紐づく
ので aptina.c を変えたら測り直すこと
★ 下限を決めるのは 2 つ。(1)
カメラのフレーム周期
より短くしても読む機会が増えない。 当初 110ms(実測)だったが aptina.c の FRAME_LENGTH_A を下げて短縮した。 (2)
露光時間
。露光中に QR が切り替わると 2 枚が混ざって検出が落ちる (実機で「350ms でぎりぎり滲まない」→ その後 100ms でも通るところまで来た)。 画面輝度を上げると自動露出が露光を短くするので、滲みが減って下げられる。 16ms は 60Hz の 1 リフレッシュで、ブラウザ側の物理的な下限
RLNC なのでマニフェストも欠番も無い。ファイルは k<=512 チャンクの世代に分かれ、 毎フレームがどれか 1 世代の乱択線形結合になる。世代は 1 枚ずつ順番に回す (ラウンドロビン)ので、途中から構えた受信側でも全世代が同じ速さで埋まる。 受信側は世代ごとに rank が k に達した時点でその世代を復元する。表示は無限ストリーム
ループ開始
停止
全画面
★ この所要時間は粗い見積もり。信じすぎないこと: 成功率は px/mod の 4 段しかない階段関数(docs/05 §8 の暫定値)で、 世代の上乗せは実測が 8 世代までしかない。さらに ロックオン実装後は表示間隔を 200〜300ms まで下げられる見込みなので、 2000ms 前提のこの数字は「今の素朴受信での上限」であって、到達点ではない
自己テストを実行
RLNC の往復(係数生成・掃き出し・欠落耐性)と、バイト列の保存性を確かめる
DSi の画面の QR をカメラで読む(DSi → この端末)
カメラを開始
停止
受信をやり直す
解析する大きさ
長辺 640px
長辺 960px
長辺 1280px
小さいほど 1 枚の読み取りが速いが、QR が小さく写ると読めない
カメラを許可してください(「カメラを開始」を押すとブラウザが許可を求める)
背面カメラを使う。QR は DSi の上画面にだけ出る。上画面が画面いっぱいに写るように構え、下画面や他の QR は写さない(jsQR は QR が 2 つ写ると読めない)。 DSi の画面の明るさは最大にする。映像はこの端末の中で処理され、どこにも送信されない
もう一度保存
QR の読み取り: ブラウザ標準の BarcodeDetector があれば先に使い、読めなければ
jsQR
1.4.0(Copyright 2017 Cosmo Wolfe, Apache License 2.0。 ライセンス全文はこのページのソース内に同梱)で読む