ぷよスロキャプチャ環境構築記
[作ってみた]
タイヨーエレック社のパチスロ機「ぷよぷよ!M」の基板から出ている液晶信号をキャプチャする環境を構築しました。
はじめに
先日、自宅での鑑賞および打ち込みのために、タイヨーエレック社のパチスロ機「ぷよぷよ!M」(以下、ぷよスロと表記) の実機を購入しました。例によってあまりに重かったので、ぷよ橋に持ち込むのは早々に諦めましたが……。
液晶つきでキャラもよく動く (歴代ぷよの中でもトップクラスだと思います) ので、せっかくならキレイな形で記録に残したい……ということで、基板から出ている液晶信号をキャプチャする環境を構築しました。そして、後に続く奇特な人が現れることを期待して、その記録を残しておくことにしました。
ソースコード(のパッチ)一式を公開しました。著作権は放棄します(CC0 とします)。
注意! あくまでも本環境は個人の私的な鑑賞・記録用途で製作したものです。同様のシステムを構築する際は、記録した映像の著作権上の扱いについて、十分確認してください。
最終的に必要だったもの
- ぷよスロ筐体 1台 (そりゃそうだ)
- Digilent Arty Z7-20 1枚
- 自作基板(両面) 1枚
- FFC ケーブル (0.5 mm ピッチ、40ピン、20 cm) 2本
- FFC コネクタ (0.5 mm ピッチ、40ピン) 2個
- ピンヘッダ (2.54 mm ピッチ、1列) 適量
- HDMI ケーブル (3 m) 1本
- USB A-MicroB ケーブル (3 m) 1本
- microSD カード (容量不問) 1枚
- USB ポートつきの電源タップ 1個
- マジクロボンド (いわゆるマジックテープ) 適量
その他、ドライバーとはんだ付けに必要な用具一式が必要です。また、HDMI 映像 (720p) のキャプチャ・保存には、別途適当な機材が必要です (私は AverMedia 社のゲームレコーダー HD II を使用しています)。
音声信号は取り出せるようにはしていないので、音声をセットで取り込みたい場合は別途イヤホンコンバータなどを作成するか、販社から購入する必要があります。この辺りは解説記事なども多く見られます (例: ぱちぱちいじりの retoro 氏による作例) ので、このページでは割愛します。
ひとまず調査
購入前: どう作るか?
実機の購入を決める前に、まずは先人がいるかどうか、いるとしたらどういう環境を構築しているかを調査しました。そこで見つけたのが、へるきち氏のニコ生コミュニティです。配信環境のリストを残してくださっていたので、自分の構築する環境も、それを参考に設計していきました。
使用するボードは Digilent 社の Arty Z7-20 にしました。Xilinx 社の SoC 型 FPGA である Zynq-7000 が載っています。安さで選べば Cora Z7 (約11,000円) がベストなのですが、HDMI の接続周りを自作する自信は持てませんでした。少し高くても (約26,000円)、最初から HDMI のコネクタが付いているボードを選ぶのが安心と判断しました。
(2020-10-13追記) Cora Z7 の Pmod 端子から別途アダプタボードを使うことで、HDMI 出力に対応させることが可能そうです。この場合のコストは15,000円弱といったところでしょうか。
FPGA 内部の映像キャプチャから HDMI 出力周りのロジックは、Digilent 社のボードで HDMI を扱う場合の定番構成、かつ自分でも使ったことがあるものでしたので、そのまま私の環境にも取り入れました。
購入後: どう取り出すか?
実機が届いて一通り遊んだところで、まずは映像信号まわりの調査を行いました。
下の写真の青枠で示すコネクタを外し、赤丸で示すネジをドライバーで外すと、映像信号を生成している基板 (サブ基板) の裏側にある液晶を駆動する基板が見られるようになります (改造後に撮影したため、写真右側でフラットケーブルが垂れてますがご愛嬌)。
サブ基板とは40ピンのフラットケーブルで接続されている (下の写真の赤枠) こと、この基板上で何らかの変換が行われたあと別のケーブルで液晶パネルと接続されていることが確認できます。
基板上のチップの型番から、どうやらこの液晶パネルの解像度は 1366 x 768 (いわゆる WXGA) であり、LVDS で接続されているようだということが確認できました。信号としてはかなり高速で、これを取り出すのはちょっと厳しそうな感じです。
一方、液晶上の画面をよく観察してみると、元々サブ基板から出力されている映像信号の解像度は 800 x 480 (いわゆる WVGA) であり、それをこの基板で WXGA に拡大してから液晶パネルに映しているようだ、ということもわかりました。また、フラットケーブルから引き出されている信号は20本ほどで、おそらくこの信号は 16~18 ビット程度のデジタル RGB であろうことが推測できました。これなら高々 33 MHz 程度の信号なので、適当に引き出しても十分キャプチャできそうです。
以上の調査から、フラットケーブルの信号を中継・横取りする自作基板を製作して、FPGA で取り込む、という方針が固まりました。
自作基板を作る
プリント基板を作成するツールにはいくつかありますが、今回は単純な基板のため PCBE を使いました。
話は簡単で、下 (CN3) から来た信号を上 (CN2) に受け流しつつ、必要な信号を Arty Z7 の汎用 I/O コネクタ (CN1A, CN1B) に渡しています。事前の調査から、恐らく必要な信号は8~34番ピンの計20本の信号だろう、と当たりをつけていたのですが、どうやら38番ピンも必要だった (恐らくピクセルクロック) ようです。幸い、これを取りこぼしてもキャプチャは可能でしたが。
この基板設計データを、大陸系の格安基板製造サービスである FusionPCB に送って、基板を製造してもらいました。PCBE から必要なデータを作成するには、「ファイル → 基板制作見積」を選択し、基板メーカーを「データ作成 (ドリル=NC)」に設定してファイルを作成すればよいようです (関口氏による説明ページを参考にしました)。少なくとも私は、この方法で設計通りの基板を受け取ることができました。
基板が出来上がったところで、サブ基板と液晶を駆動する基板との間のフラットケーブルを差し替え、自作基板を中継するように接続しました。
FPGA 部分を設計する
FPGA 部分の設計は、おおむね3段階に分かれました。まず前段階として、映像信号をそのままサンプリングするシステムを作成し、信号ピンの配置や同期のタイミングを確認しました。この段階で1画面分以上の信号をサンプリングして取り出していたので、信号を正しく処理すればひとまず静止画が表示できます。こうなってくるとテンションが上がります。
次に、適当なテストパターンを HDMI で出力するシステムを作成しました。最後に、テストパターンを生成してた部分をキャプチャ回路で置き換え、キャプチャから出力までの一連の処理を行うシステムを完成させました。
こうした Zynq のシステムは Xilinx 社のハードウェア開発ツールである Vivado のブロック図作成機能 (IP Integrator) で作成します。最終的に出来上がったブロック図を下に示します (クリックで拡大します)。
赤枠で囲んだのが、今回自作したキャプチャ回路です。SystemVerilog でガリガリとハードウェアを書いています。全体で600行ほどですが、他から使い回している回路もあるし、うっかり付け足した映像拡大の回路に250行ぐらい費やしているので、本質部分は100行強です。面倒なところは既存の IP コアにほとんどお任せできています。便利な世の中です。
※ 振り返ってみると、自作基板でちゃんとピクセルクロックを引き出していれば、キャプチャ部分も既存 IP (Video In to AXI4-Stream) で作れた気がします。……気づかなかったことにしましょう。
キャプチャした映像は、同期ズレを防ぐために一旦 DRAM のフレームバッファに格納してから出力しています。この辺りをうまく制御してくれるのが、中央にあるビデオ DMA コントローラ (AXI VDMA) です。出力映像は AXI4-Stream to Video Out でデジタル RGB に変換し、さらに RGB to DVI Video Encoder (rgb2dvi) で HDMI (DVI) の信号に変換します。
ハードの部分が出来上がったら、その設計を Xilinx 社のソフトウェア開発ツールである Vitis にエクスポートして、キャプチャ回路や AXI VDMA を初期化するソフト部分を書いていきます。AXI VDMA の初期化周りは、Xilinx 社謹製のチュートリアルを参考にしました (手順28以降がポイント)。
Vitis でシステムのプロジェクトをビルドすると、FPGA のプログラミングファイルとソフト部分のバイナリがひとまとめになった BOOT.BIN というファイルが出来上がります。これを FAT32 でフォーマットした microSD にコピーして、Arty Z7 の SD カード端子に挿入し、ジャンパピンを SD から起動するモードに設定したら、準備オッケーです。
ボードをインストールする
最後に、キャプチャがしやすいようにボードをぷよスロ筐体内部にしまっていきます。今回は、Arty Z7 の基板裏側にマジックテープを貼り付けて、筐体の液晶裏に貼り付けて固定することにしました。
HDMI ケーブルと、給電用の microUSB ケーブルは、筐体裏側の適当な穴から筐体外部へと取り出します。
Arty Z7 は保護回路がそれほど充実しているわけではないので、ボードに電源が入っていないときに I/O ピンや HDMI に信号が与えられると、ボードの損傷の原因になります。そのため、microUSB ケーブルは USB ポートつきの電源タップに接続し、ぷよスロ筐体と連動して電源をオン・オフできるようにしました。また、HDMI ケーブルは筐体の電源を入れた後で、モニタや HDMI キャプチャユニットに接続する運用としています。
ともあれ、全ての準備を済ませたら、ぷよスロ筐体の電源を入れ、HDMI ケーブルをモニタに接続します。
無事、映像が HDMI で接続されたモニタに表示されました! ばっちぐーです。
追加情報
以下は参考情報です。調べた限りでは、液晶信号は以下のような仕様となっています。
ピン | 用途 | ピン | 用途 | ピン | 用途 | ピン | 用途 |
---|---|---|---|---|---|---|---|
1 | VDD (3.3V) | 11 | GND | 21 | G[4] | 31 | GND |
2 | VDD (3.3V) | 12 | B[5] | 22 | G[3] | 32 | R[2] |
3 | VDD (3.3V) | 13 | B[4] | 23 | GND | 33 | R[1] |
4 | VDD (3.3V) | 14 | B[3] | 24 | G[2] | 34 | R[0] ※1 |
5 | GND | 15 | GND | 25 | G[1] | 35 | GND |
6 | テスト用? | 16 | B[2] | 26 | G[0] | 36 | GND |
7 | GND | 17 | B[1] | 27 | GND | 37 | GND |
8 | HSync | 18 | B[0] ※1 | 28 | R[5] | 38 | PClk ? ※2 |
9 | GND | 19 | GND | 29 | R[4] | 39 | GND |
10 | VSync | 20 | G[5] | 30 | R[3] | 40 | GND |
※1 実際には未使用 (プルダウンされている) のため、表現可能な色数は実質 2^16 = 65536 色。
※2 未確認。LCDCaps 基板では取り出していない。
項目 | 値 | |
---|---|---|
PClk 周波数 | 33.264 MHz | |
項目 | Hsync | Vsync |
極性 | 負論理 | 負論理 |
フロントポーチ | 95 | 5 |
同期パルス幅 | 128 | 2 |
バックポーチ | 33 | 38 |
有効 | 800 | 480 |
合計 | 1,056 | 525 |