【備忘録】Raspberry Pi Pico で CircuitPython を使って DVI 出力する方法

# 0. はじめに

Raspberry Pi Pico で DVI 出力する方法を探しても、Pico SDK や Arduino の例は見つかるが、CircuitPython の例が見つからなかったので、調べた結果をここにまとめておく。

# 1. Adafruit DVI Breakout Board


↓こちらで購入した

https://www.switch-science.com/products/7423?variant=42382159282374

実態は HDMI 端子だ。音声が無いから DVI（Digital Visual Interface）と言う??


# 2. Picoとの接続

[Adafruitの商品説明ページ](https://learn.adafruit.com/adafruit-dvi-breakout-board)にあった、以下の写真と同じ接続にした。　


[<img width="300" alt="dvi" src="https://cdn-learn.adafruit.com/assets/assets/000/122/995/original/components_4984-05.jpg?1690379540" />](https://learn.adafruit.com/assets/122995)

|	DVIボード	|	Pico	|
|	:-:	|	:-:	|
|	TXC-	|	GP15	|
|	TXC+	|	GP14	|
|	TX0-	|	GP13	|
|	TX0+	|	GP12	|
|	TX1-	|	GP19	|
|	TX1+	|	GP18	|
|	TX2-	|	GP17	|
|	TX2+	|	GP16	|
|	GND x3	|	GND	|



<br><img width="300" alt="IMG_3318.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/d89ce23a-36c9-a40a-6493-ef8e6e6a482d.png" />


# 3. テストコード

以下のコードでDVI出力を確認できた。

当然のことながら、Adafruitの各種ライブラリを使用している。

```python:CircuitPython
import displayio
displayio.release_displays()

import time
import board
import picodvi
import framebufferio

w=320
h=240
cd=8

fb = picodvi.Framebuffer(
    width=w, height=h, color_depth=cd,
    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 = displayio.Group()
display.root_group = splash

from adafruit_display_shapes.rect import Rect
from adafruit_display_shapes.circle import Circle
from adafruit_display_shapes.roundrect import RoundRect
from adafruit_display_shapes.triangle import Triangle
from adafruit_display_shapes.line import Line
from adafruit_display_shapes.polygon import Polygon


# Make a background color fill
color_bitmap = displayio.Bitmap(320, 240, 1)
color_palette = displayio.Palette(1)
color_palette[0] = 0xFFFFFF
bg_sprite = displayio.TileGrid(color_bitmap, x=0, y=0, pixel_shader=color_palette)
splash.append(bg_sprite)


###################################################

splash.append(Line(220, 130, 270, 210, 0xFF0000))
splash.append(Line(270, 210, 220, 210, 0xFF0000))
splash.append(Line(220, 210, 270, 130, 0xFF0000))
splash.append(Line(270, 130, 220, 130, 0xFF0000))

# Draw a blue star
polygon = Polygon(
    [
        (255, 40),
        (262, 62),
        (285, 62),
#        (265, 76),
#        (275, 100),
#        (255, 84),
#        (235, 100),
#        (245, 76),
#        (225, 62),
#        (248, 62),
    ],
    outline=0x0000FF,
)
splash.append(polygon)


triangle = Triangle(170, 50, 120, 140, 210, 160, fill=0x00FF00, outline=0xFF00FF)
splash.append(triangle)

rect = Rect(80, 20, 41, 41, fill=0x0)
splash.append(rect)

circle = Circle(100, 100, 20, fill=0x00FF00, outline=0xFF00FF)
splash.append(circle)

rect2 = Rect(50, 100, 61, 81, outline=0x0, stroke=3)
splash.append(rect2)

roundrect = RoundRect(10, 10, 61, 81, 10, fill=0x0, outline=0xFF00FF, stroke=6)
splash.append(roundrect)

time.sleep(3)

while True:
    stack = []
    for _ in range(10):
        stack.append(splash.pop())
        time.sleep(1)
    for s in stack:
        splash.append(s)
        time.sleep(1)
```

WQHDモニターにHDMI接続した。
モニター側での解像度は 640x480（60Hz）。
もっと高解像度にできるのかは、今後 調査と実験が必要。



<iframe width="396" height="226" src="https://www.youtube.com/embed/wPv31KSkqJU?loop=1&playlist=wPv31KSkqJU" title="Raspberry Pi Pico で DVI 出力" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>

# 4. 環境

- Raspberry Pi Pico W<br>　

- Adafruit CircuitPython 9.0.4 on 2024-04-16

  * adafruit-circuitpython-raspberry_pi_pico_w-ja-9.0.4.uf2<br>　

- Bundles

  * adafruit-circuitpython-bundle-9.x-mpy-20240521.zip<br>　

- Community Bundle
  * circuitpython-community-bundle-9.x-mpy-20240521.zip




#### 以上