あっきぃ日誌

ラズピッピブログのようなオタクブログのようななにか

Raspberry Pi Pico(Pico2)でDVI出力

今更なんですが、Raspberry Pi PicoでDVI出力をしてみました。あと、Pico2でもCircuitPythonのPRがMergedになったので、ナイトリー版でも触りました。

購入したのはスイッチサイエンスさんのやつ。アリエクとかでも転がってますが、Pico2を買ったときに合わせ買いしました。

Raspberry Pi Pico用DVIアダプタ基板 — スイッチサイエンス

スイッチサイエンスさんのボードも、オープンハードのPico-DVI-Sockがベースになっていて、ピン割り当ては互換です。

github.com

あそぶ

例によってCircuitPythonで触ったのですが、CircuitPythonはPicoDVIというのが用意されているので、初期化とフレームバッファの用意ができれば、あとはdisplayioで遊べるといった感じです。

たとえば、これはなんか雑にビットマップを出すやつ。もともとST7789向けに会たものですが、ST7789の部分をすげ替えるだけで動きます。べんりだね。

import board
# display
from displayio import release_displays, Group, OnDiskBitmap, TileGrid
import picodvi
import framebufferio

release_displays()

# Display setup
fb = picodvi.Framebuffer(
    width=320, height=240, color_depth=8,
    clk_dp=board.GP14, clk_dn=board.GP15,
    red_dp=board.GP12, red_dn=board.GP13,
    green_dp=board.GP18, green_dn=board.GP19,
    blue_dp=board.GP16, blue_dn=board.GP17)
display = framebufferio.FramebufferDisplay(fb)

# splash
splash = Group()
display.root_group = splash

bitmap = OnDiskBitmap("/test.bmp")
tile_grid = TileGrid(bitmap, pixel_shader=bitmap.pixel_shader)
splash.append(tile_grid)

while True:
  pass

こんな感じで表示できました。実は、これを表示できるまでに、ピンソケットを逆向きにつけてしまい、ハンダをやり直したらそれでも表示できず、パターンを破壊したかとドキドキしたりしたのですが、単にCircuitPython9.2.0のAlphaでPicoDVIが壊れているだけでした。焦った。

しかしこう、ディスプレイを設定したらdisplayio以降は同じで良いとすると、前に作ったアレとかアレもDVIで出せるよなと気付き、いつもの田園都市線の在線アプリをやろうとしたのですが、残念ながらPicoではメモリ不足で動きませんでした。きびしい。

Pico2ならいける

Picoで試した時点では、Pico2のPicoDVIは未実装の状態だったのですが、昨日見たらちょうどマージされていました。

Refactor RP2350 unique module build settings by tannewt · Pull Request #9617 · adafruit/circuitpython · GitHub

マージ後のバイナリはまだリリースされていないので、Absolute NewestでS3に飛んで、PR9617とつくuf2ファイルをダウンロードします。9.2.0 Alpha 2352以降のリリースがでているようなら、それでいいです。

circuitpython.org

Pico2に環境を用意して、コードを書き換えて実行したら……きたーっ!

きたーっ!のはいいんだけど、終電後だからもう電車こねーじゃんというわけで翌朝再度実行。よかった、ちゃんと動いてた。

しれっとWIZnetのEthernetHATを使用していますが、例によってGPIOポートが重複したので、HATである意味を破壊して、違うところにつなぎ替えています。ピン番号かぶりは難しいわね。

Pico的には320x240のdepth16で出力していますが、どの画面でも代替出せるので、普段使っている32インチ4Kモニターにも出せるし、ベッドのところで死蔵してる前使ってた27インチモニターにも出せます。

social.mikutter.hachune.net

なにが良いって、Picoなのでどんな大画面に出そうが0.6Wとか言う低消費電力で動く(カリカリに節電チューニングしたZeroWより低い)し、起動は一瞬なので、表示内容によってはSBCで無駄にリッチなサイネージを作るより、Picoで良い可能性すらでてきますよね。


HSTX

Pico2ではHSTX(High-Speed Serial Transmit)ポートというものが追加されているそうで、出力特化の用途に使うと早くて良いそうです。

www.cnx-software.com

そのポートがまさに今回のDVI用ボードで使われていたGP12〜GP19の8個で、絶対これDVI拡張で使われることを意識して配置しただろって感じがしました。CircuitPythonのPico2向けPicoDVIでもこのHSTXで転送されているみたいです。画面書き換えのベンチマークとかでもできればよいのでしょうが、わたしにはわからんのでそのあたりは割愛します。

シメ

DVI出力が思ったより楽しくて、さすがにちょっとテンションが上りました。