Appearance
組立・検証手順書(ベンチ作業編)
手持ち部品で進められる作業を、図を見ながらそのまま手を動かせる粒度で書く。 在庫の正は Parts Manager(miniArcade)。寸法の正は cad/params.scad。ピン割当の正は firmware/pico-lever/main.py。 図は docs/img/gen_svg.py から生成している(数値を変えたら再生成する)。
| 作業 | 所要 | 必要なもの | 得られる判断 |
|---|---|---|---|
| A. Pico 2 の準備 | 15 分 | Pico 2、USB ケーブル、Mac | ファームが動く状態 |
| B. RKJXV の端子確認と配線 | 20 分 | RKJXV、テスター、ジャンパ | 端子の実配線・INVERT_X/Y |
| C. ボタン 4 個の配線 | 15 分 | タクト赤 2・黒 2 | 連射の動作 |
| D. Dock に接続して NES で操作 | 15 分 | Dock、現行 bitstream | A/B の実機動作 |
| E. RKJXV の実測 | 15 分 | ノギス | CAD の LEVER_* 確定 |
| F. LCD 3 枚の点灯比較 | 30 分 | Dock、LCD ×3 | 本番パネルの決定 |
| G. PAM8403 の試聴 | 20 分 | M8403VD、φ27 ×2 | スピーカー決定・#4 クローズ |
| H. インサートの試し圧入 | 10 分 | 試し刷りパーツ、半田ごて | 下穴径の確定 |
A. Pico 2 の準備(ファーム書き込み)
やること: MicroPython を入れて、レバー+4 ボタンのファームを自動起動させる。
- https://micropython.org/download/RPI_PICO2/ から RPI_PICO2 用 UF2 をダウンロード(Pico H 用ではない。RP2350 と RP2040 で UF2 が違う)
- Pico 2 の BOOTSEL を押しながら USB を Mac に挿す →
RPI-RP2ドライブが出る - UF2 をドライブにドラッグ → 自動で再起動しドライブが消える
- Thonny を起動 → 右下のインタプリタ表示をクリック → MicroPython (Raspberry Pi Pico) を選ぶ → 下の Shell に
>>>が出れば接続 OK - リポジトリの
firmware/pico-lever/lever_logic.pyを Thonny で開く → File → Save as → Raspberry Pi Pico → 名前lever_logic.py - 同様に
main.pyを Pico にmain.pyとして保存(4 ボタン対応は PR #20 のブランチfeature/issue-19-turbo-buttons) - USB を抜き差し → Shell に
lever: center x=... y=...が出れば自動起動している
何も繋いでいない状態では ADC が浮くので
centerの値は毎回変わる。これは正常。
判定: Shell に lever: center ... が出る。
B. RKJXV の端子確認と配線
やること: RKJXV の 8 端子(X 3 本・Y 3 本・SW 2 本)をテスターで特定してから Pico に繋ぐ。データシートの端子番号は実装向きで変わるので当てにしない。
- テスターを抵抗レンジにする
- 片側の 3 端子で 10kΩ で一定になる 2 本を探す → それが A・C(両端)。残りが B(中点)。スティックを倒して B–A が変化することを確認
- 反対側の 3 端子で同じことをする。倒す方向で変化する側が X(左右) / Y(上下)
- 残り 2 端子は SW。押した時だけ導通する
- 図2 の表のとおりに配線する(図1 のピン番号を見る)
- X の A・Y の A → 3V3_OUT(pin 36)
- X の C・Y の C・SW2 → GND
- X の B → GP26(pin 31) / Y の B → GP27(pin 32) / SW1 → GP16(pin 21)
- USB を挿し直す。起動から 1 秒はレバーに触らない(中立を自動校正している)
- 中立で LED 消灯、倒すと点灯、中央を押すと点灯 → OK
- Thonny の Shell で
main.pyのDEBUG = Trueにして保存・再起動 →x y {'up':..,'down':..,'left':..,'right':..} pushedが流れる - 右に倒して
right: Trueなら OK。leftになるならINVERT_X = True。下に倒してdownでなければINVERT_Y = True DEBUG = Falseに戻して保存
判定: 8 方向すべて期待どおり、中立で全て False。→ INVERT_X / INVERT_Y の値を issue #15 にコメント
XH コネクタで作る場合: 4P ハウジング 1=3V3, 2=X-B, 3=Y-B, 4=GND、SW は 2P。コンタクトは購入済み(秋月 112265)。
C. ボタン 4 個の配線
やること: 12mm タクト 4 個を Pico に繋ぎ、連射が効くことを LED で確認する。
- タクトスイッチの 対角の 2 端子を使う(隣同士は内部で繋がっているので誤動作する)
- 片側を全部 GND にまとめる(ブレッドボードの GND レールへ)
- もう片側を Pico へ:
| ボタン | キャップ | 位置 | Pico |
|---|---|---|---|
| A | 赤 | 手前 | GP7(pin 10) |
| B | 黒 | 手前 | GP8(pin 11) |
| A連射 | 赤 | A の奥 | GP9(pin 12) |
| B連射 | 黒 | B の奥 | GP10(pin 14) |
- USB を挿し直す → A を押すと LED 点灯、A連射を押すと LED が 15Hz で明滅(チラつきが見える)
- A と A連射を同時に押すと点灯しっぱなし(通常ボタン優先)
判定: 4 ボタンが独立に効き、連射で明滅する。→ 動画か一言を issue #19 にコメント
連射速度を変えたいときは
main.pyのTURBO_HZ。NES は 60fps なので 15(2 フレーム ON / 2 フレーム OFF)が上限目安。30 だと 1 フレームずつになり取りこぼす作品がある。
D. Dock に接続して NES で操作
やること: Pico の出力を Dock の PMOD に繋ぎ、NES コアで レバー 4 方向・Start・A/B・連射が効くことを確認する。FPGA の再ビルドは不要。Dock には 09_fpga_env.md の bitstream(820e2b3f…、レバー GPIO+Joystick2 併存)を書く。GPIO 経路(P6 T7 P8 T9 / T11)と I2C 経路(T8/P9)のどちらでもレバーが効くので、まず GPIO 5 本だけで試し、I2C はプルアップが用意できたら追加する。
- Dock の赤い DIP スイッチ 1 番が ON であることを確認(OFF だと画面真っ暗・無応答。09_fpga_env.md)
- Dock を USB-C で給電して NES を起動しておく
- GND を先に繋ぐ: Pico GND → Dock PMOD0 の GND
- 図3 の赤い線を繋ぐ。Dock 裏面シルクの PMOD0 を見ながら:
| Pico | Dock | 機能 | 現行 bitstream |
|---|---|---|---|
| GP11(pin 15) | PMOD0 下段 R8 | A | ✅ |
| GP12(pin 16) | PMOD0 下段 T6 | B | ✅ |
| GP20(pin 26) | PMOD0 下段 T8 | I2C SDA(レバー 4 方向+Start) | ✅ Joystick2 として認識 |
| GP21(pin 27) | PMOD0 下段 P9 | I2C SCL | ✅ |
| GP2〜GP5 / GP6 | PMOD0 上段 P6 T7 P8 T9 / PMOD1 T11 | GPIO 4 方向 / Start | ✅ 820e2b3f… bitstream で有効(fpga-famicom#17) |
SDA / SCL には 4.7kΩ のプルアップを 3V3 との間に入れる(Pico 側のブレッドボードで可)。Joystick2 実機は内蔵していたが Pico には無い。
- Pico の GPIO 出力はオープンドレインなので Dock の 3V3 に繋ぐ線は無い(I2C のプルアップは Pico の 3V3_OUT へ)
- Pico を再起動 → Shell に
rom_boot: done in ... msとjoy2=Trueが出ること(#24 bitstream+GP0/GP1 配線時。no ackが続く場合は J14/J16 の配線か bitstream を確認) - ゲームでレバー 4 方向・中央プッシュ(Start)・A/B・連射を試す。レバーの反応が鈍ければ
main.pyのJOY2_FULL_SCALEを下げる(例 16000)
判定: レバー・Start・A/B・連射が全部ゲームで効く。Pico の USB を抜くとキャラクターが止まる(fail-neutral)。
⚠️ PMOD1 の
T12 R11 M14 M15 J14 J16は LED 出力。ここに Pico の出力を繋ぐと衝突するので触らない。
E. RKJXV の実測(CAD 確定用)
やること: ノギスで 4 つ測って issue #6 にコメントする。これで params.scad の LEVER_* と、コンパネ図(図4)を確定できる。
| # | 測るもの | 測り方 | 反映先 |
|---|---|---|---|
| 1 | 可動部の最大外径 | スティックを一杯に倒し、台座の外周が描く円の直径(4 方向で最大値) | LEVER_OPEN_D(φ22〜24 の決定) |
| 2 | 本体の高さ | 基板(or 取付面)から台座上面まで、中立で | LEVER_UNDER(14 想定) |
| 3 | 端子の出っ張り | 基板裏面から端子先端まで | パネル下の余裕 |
| 4 | 固定方法 | 本体のツメの位置 / 小基板に載せるなら穴ピッチ | M2 ボス の座標 |
判定: 4 つの数値。→ #6 にコメントすれば CAD+シミュレーターの修正 PR を作る。
F. LCD 3 枚の点灯比較
やること: QT43272B576 ×1 と YXKJ430240 ×2 を順に Dock に挿して、筐体本番に使う 1 枚を決める。3 枚ともピン配・タイミングは同一で bitstream 変更は不要。
- Dock の電源を切る
- DISPLAY コネクタ(40P FPC)のロックを起こし、FPC を既存パネルと同じ向きで奥まで挿してロックを倒す
- 電源 ON → NES 画面が出ることを確認
- 同じ画面で比較する:
- 斜め 45° から見た時の色の反転・白飛び(視野角)
- 赤・青の沈み、黒の締まり(発色)
- 10 分点灯後の裏面の温度(BL 発熱)
- 3 枚繰り返す
判定: 本番 1 枚・開発機 1 枚・予備 1 枚を決める。→ 私に伝えれば Parts Manager の status を更新する。
G. PAM8403 の試聴(#4)
やること: M8403VD(PAM8403+VR)で φ27 スピーカーを鳴らし、音量とノイズを判断する。
- M8403VD の 5V / GND に USB(モバイルバッテリー or Pico の VBUS)から 5V
- VR を最小にして電源 ON → スピーカーに耳を当て「サー」音(ノイズ床)を確認
- Dock の 3.5mm → 3.5mm ケーブルを切って L / R / GND を M8403VD の入力へ(GND を Dock と共通に)
- φ27 SPK27R08BA を L+ L− / R+ R− に繋ぐ(極性はどちらでも鳴るが、2 個の向きは揃える)
- NES の音を出して VR を上げる。展示の環境音に負けない音量が出るか
- ポップ音・ハム・ジーがあれば、購入済みの 1000uF(高分子)を 5V/GND 間に足して再確認
判定: φ27 で足りる → #4 クローズ。足りない → 秋月 30mm UGSM30A-8-01(¥120 ×2)。
H. M3 インサートの試し圧入
やること: PR #14 マージ後に bezel か front を試し刷りし、ウルトラサート IV を圧入して保持力を確認する。
cd cad && openscad -D 'PART="front"' -o out/front.stl plate.scad→ X2D で印刷(PLA・ブリム)- 半田ごてを **200〜230℃**にし、インサートを下穴(φ4.2)の上に置いてこて先で垂直に押し込む。面一で止める
- 冷めてから M3×8 を締める。空回り・抜けが無いか
判定: 緩ければ params.scad の INSERT_D を 4.0 に、きつくて割れるなら 4.4 に。
I. nes-rom-reader の組立(#13)
別セッションで作成した図解ガイドを移設した: Famicom ROM Dumper 組み立て図解(別タブ・元は Artifact)。 M5Stamp S3A は手持ちあり。1.27mm ピンソケット/ヘッダ(秋月 103866 ×2 / 103865)で嵩上げ実装する。
J. ボタンの組込み(押さえプレート・#31)
ユニバーサル基板は使わない(ボタン座標が 2.54mm グリッドに乗らないため)。
- コンパネを裏返し、12mm タクト ×4 を位置決め枠に入れる。端子が左右(コンパネの長辺方向)を向く向きにする
- LS601 ×2 を 8.2 角穴に裏から入れる。端子(スイッチ 4 本+ LED のアノード/カソード 2 本)が左右を向く向きにする
button_plateをリブのある面をスイッチ側にして被せる。タクトの端子はスロット、LS601 の端子は両側の窓を通す- プレートの下面に出た端子(ザグリの中に約 2.7mm 出る)にリード線を半田付けする(GND は渡り配線)。先にプレートを被せてから半田付けする(渡り配線はスロットを通らない)
- M2 × 6 のなべネジ ×4 でボスに留める(締めすぎない。プレートがボスに当たれば止める)
判定: 6 個ともクリック感があり、A/B のキャップが約 2.5mm、Start/Select が約 1.2mm 出る。→ 結果を #31 にコメント。
コンパネの配置(参考)
E の実測が入るまでレバー開口 φ23 とパネル下 14 は仮。ボタン座標は確定(#19)。
進捗の記録先
| 作業 | 記録先 |
|---|---|
B の INVERT_X/Y | issue #15 コメント |
| C・D の動作 | issue #19 / PR #20 コメント |
| E の実測値 | issue #6 コメント |
| F の本番パネル・G の結論 | issue #4 / Parts Manager |