Raspberry Pi PicoのVGA出力(アナログRGB)を試してみました。VGA出力の回路図は「Hardware Design with RP2040」という公式のドキュメントで公開されています。
https://datasheets.raspberrypi.com/rp2040/hardware-design-with-rp2040.pdf
この中の「Chapter 3. VGA, SD Card & Audio Demo Board」と互換性のある回路が、Pimoroniという会社から「Pico VGA Demo Base」という名前で売られています。実売価格は2970円。、、、うーむ、ちょっと高い。
今回はVGA出力回路を自作する事で、これを買わずに済ませます。
材料は次の通り。
・抵抗(5種類×3組)。
・D-subコネクタ(15pin)
・ピンソケット(1列80pinを切断)
・ユニバーサル基板(Cタイプ。ドリルで穴を空けました。)
・Raspberry Pi Pico。テクノロジアで購入しました。
もしUSBホスト機能(キーボード接続など)を使う場合には次の部品を用意します。
・USBコネクタ
・ポリスイッチ
「Demo Board」を勝手にアレンジした回路図。この抵抗を並べただけのDA変換が面白いです。
RGB各5ビットなので、32×32×32=32768色という計算になります。オリジナルは499/1k/2k/4k/8k ohm抵抗を使っていますが、抵抗値を変更しています。このため、発色が微妙に違うかもしれません。
「VSYS」端子は1.8〜5.5Vの電圧を入れると、内部で3.3Vを作り出してくれるというDC/DCコンバータになっています。ショットキーバリア・ダイオードは逆流防止用として使っています。
Pico側のUSBポートにキーボード/ゲームパッド(要USBホストケーブル)が刺さっていた場合、「VBUS」端子から給電します。オリジナルはジャンパーピンで接続していますが、ポリスイッチで大電流で切断するようにアレンジしてます。
オリジナルはI2Sオーディオ出力(PCM5101A)とSDカードスロットが付いているのですが、今回は節約して付けません。
完成。
公式のサンプルの中にVGA出力のデモ(scanvideo)があります。自分の場合はラズパイ4でソースをビルドしました。
https://github.com/raspberrypi/pico-playground
Picoにuf2ファイルを書き込みます。BOOTSELボタンを押してPicoをラズパイ4のUSBポートに接続すると、仮装ドライブとしてマウントされるので、uf2ファイルをドラッグ&ドロップします。
「demo1」。ラズパイのマークが画面内を移動するデモです。
ちなみにこのVGAケーブルは10年以上放置してた物ですが、まさか今になって活躍するとは。
「mandelbrot」。マンデルブロ集合のデモ。図形が果てしなく拡大されます。
「hscroll_dma_tiles」。画面が横方向にスクロールするデモ。この左側に出てるドット絵って、権利的にアウトな気が、、、。
「sprite_demo」。スプライトのデモ。Ebenさんの顔が動き回ります。
というわけで、難なくVGA出力に成功しました。PicoじゃないRaspberry Piには予めhdmiポートが付いていて、安価に画面表示することができます。そうなると、PicoでわざわざVGA出力することにどんな意味があるのか? 改めて問題になってくるかと思います。
VGA出力の使い道として、2つの例を紹介します。
VGA出力の例、その1。
液晶が故障したゲームボーイから信号を取り出して、TV出力するという装置。Element14の動画で、アンディ・ウエストさんという方が製作してました。ソースはGitHubに公開されているのですが、370行くらいで書かれていて驚きです。
VGA出力の例、その2。
Picoで動く「DOOM」です。「DOOM」はオープンソース化されていて、もう珍しいゲームではありませんが、500円くらいのマイコンで動いてしまうのは技術的興味がそそられます。どういうわけか、GitHubにはuf2ファイルがなくて、ソースしか置いてありません。ラズパイ4でビルドを試みたのですが、エラーが出てうまくいきませんでした。まだバージョン0.1なので、今後改善されるかもしれません。
(2022/4/21追記) 無理やりビルドしてみましたが、この直後に画面が真っ暗になってしまいます。うまく動きません。あと、ディスプレイが非対応の解像度を使っているみたいです。