Stream video and images from a Raspberry Pi 5 to a Sega Dreamcast by emulating a DreamEye camera peripheral on a Pico 2 microcontroller.
RPi 5 ──USB CDC──▸ Pico 2 ──Maple Bus──▸ Dreamcast
(encode) (relay) (decode + display)
I wanted to create a DVD player peripheral for Dreamcast! Very impractical - but who cares?
- DVD playback — rip and stream DVD clips with menu navigation
- Video streaming — any video file or live camera input, auto-transcoded to MPEG-1 + MP2 audio
- Static images — send 320×240 RGB565 images at 181 KB/s (~0.83s per frame)
- DreamEye emulation — Pico 2 appears as a camera peripheral with 5 parallel sub-devices for throughput
| Component | Details |
|---|---|
| Sega Dreamcast | With Broadband Adapter (BBA) for dc-tool-ip |
| Raspberry Pi 5 | Encodes video, sends over USB CDC |
| Pico 2 | GPIO 11 → MAPLE_A, GPIO 12 → MAPLE_B, connected to DC controller port A |
| DVD Reader | USB DVD player hooked up to the RPI 5 |
Pico 2 Level Shifter DC Controller Port A
┌──────────┐ (3.3V ↔ 5V)
│ GP11 ───┼── MAPLE_A ──▸│ A1 B1 │──▸ Pin 1 (SDCKA)
│ GP12 ───┼── MAPLE_B ──▸│ A2 B2 │──▸ Pin 5 (SDCKB)
│ GND ───┼──────────────┼── GND ─┼──▸ Pin 3 (GND)
│ │ └────────┘
│ USB ───┼──── to RPi 5
└──────────┘
GP11 and GP12 use internal pull-ups. No external resistors needed. The Sense line (pin 4) is intentionally left unconnected.
- KallistiOS toolchain installed at
/opt/toolchains/dc/kos/ - Pico SDK (v2.0+)
dc-tool-ipfor deploying to the Dreamcastffmpegon the RPi for video transcoding- Python 3 with
pyserialon the RPi
Set these before running any scripts:
export RPI_HOST="user@192.168.1.100" # RPi 5 SSH destination
export DC_IP="192.168.1.25" # Dreamcast BBA IP address
export PICO_SDK_PATH="/path/to/pico-sdk"A pass.txt file in the project root is used by sshpass for RPi SSH authentication.
Pico firmware:
cd pico/build
PICO_SDK_PATH=/path/to/pico-sdk cmake .. -DPICO_BOARD=pico2
make -j$(nproc)Dreamcast binary:
source /opt/toolchains/dc/kos/environ.sh
cd dc && makeLaunch the DVD player (full menu navigation):
./dvd.sh [--rebuild]Other misc scripts and junk in the "tools" directory.
The Pico 2 firmware emulates a Sega DreamEye camera on the Maple Bus. The Dreamcast's KallistiOS-based viewer requests image/video data through standard Maple commands (GETCOND, CAMCONTROL), and the Pico serves data received over USB CDC from the RPi.
For video, the RPi transcodes input to MPEG-1 video with MP2 audio via ffmpeg and streams chunks over USB. The Dreamcast decodes with pl_mpeg and renders frames to the PVR.
Transfer uses 960-byte chunks distributed round-robin across 5 sub-devices for parallel throughput.