dreamstack/docs/explorations.md

16 KiB
Raw Permalink Blame History

DreamStack Hardware Explorations

Research notes on form factors, display technologies, and touch input methods for DreamStack-powered surfaces.


1. USB Dongle (Chromecast-like)

The DreamStack relay protocol + delta codec already does 90% of the work. A dongle receives the bitstream and outputs to HDMI.

Path A: ESP32-S3 HDMI Dongle (~$15 DIY)

Component Part Cost
SoC ESP32-S3-WROOM-1 (N16R8) ~$4
HDMI output CH7035B or ADV7513 HDMI encoder IC ~$3
USB-C power Standard power-only connector ~$0.50
PCB + passives Custom PCB (JLCPCB) ~$5 for 5 boards
HDMI connector Type-A male or mini-HDMI ~$1
  • ESP32-S3 LCD parallel interface → HDMI encoder IC → HDMI out
  • WiFi connects to DreamStack relay, receives delta-compressed frames
  • Resolution limit: ~480×320 smooth, 800×600 at lower FPS
  • Input via BLE HID remote or HDMI CEC (pin 13)

Path B: Linux Stick / Allwinner (~$25-40)

MangoPi MQ-Pro / Radxa Zero form factor:

Component Part Cost
SoC Allwinner H616/H618 (HDMI built-in) ~$15 module
RAM 512MB DDR3 onboard included
WiFi RTL8723CS ~$3
Storage 8GB eMMC or SD ~$3
  • Runs minimal Linux (Buildroot), headless browser or C receiver writing to /dev/fb0
  • Native HDMI — no encoder IC needed
  • Full DreamStack JS runtime in headless Chromium/WPE-WebKit
  • CEC for remote control

Best for proving the concept immediately — $15, mini-HDMI out, WiFi, runs DreamStack natively.

Laptop                    WiFi/LAN           Pi Zero 2 W (in 3D-printed HDMI case)
──────                    ─────────          ─────────────────────────────────────
dreamstack dev app.ds                        headless browser / ds_runtime
  → relay-bridge ──────── WebSocket ───────→   → HDMI out to TV
                          ←── CEC/BLE ←────  remote control

Off-the-shelf stick computers

Device Price HDMI WiFi Notes
Raspberry Pi Zero 2 W $15 Mini-HDMI Best form factor
MangoPi MQ-Pro (RISC-V) $20 HDMI Stick form factor
Radxa Zero $25 Micro-HDMI Amlogic S905Y2
T-Dongle S3 (LilyGO) $12 No (LCD only) ESP32-S3, tiny LCD

2. Projected Touch Wall

Architecture

SOURCE (laptop/Pi)              RELAY (:9100)              WALL
───────────────                 ─────────────              ────
DreamStack app                  WebSocket hub              UST Projector
800×1280 canvas                                            + touch overlay

pixels → XOR delta → RLE ────→ relay ─────────────────→   decode → project
                                ←── touch {x,y,phase} ←── touch sensor

Ultra-Short-Throw Projectors

Product Price (new) Price (used) Notes
Xiaomi Laser Cinema 2 ~$1,200 ~$400 Good value
BenQ V7050i ~$2,500 ~$800 4K HDR
JMGO U2 ~$1,000 ~$300 Budget friendly
Epson LS500 ~$2,000 ~$600 Bright

Wall prep: screen paint (Silver Ticket / Rust-Oleum, ~$30).


3. Touch Input Technologies

Ranked from fastest to slowest latency:

3a. Piezoelectric Sensors (<1ms, ~$7)

Stick 3-4 piezo discs on the back of the wall. Finger taps create vibrations; time-difference-of-arrival (TDOA) triangulates X,Y.

Part Cost
4× piezo disc (35mm) ~$2
ESP32-S3 (built-in ADC, 40kHz+ sampling) ~$5
Wall (drywall, glass, wood, whiteboard)
┌───────────────────────────────────────┐
│  P1 ●                       ● P2     │
│               👆 TAP                 │
│  P3 ●                       ● P4     │
└───────────────────────────────────────┘
       └────── ESP32 (TDOA → x,y) ─────┘

Pros: Near-instant, invisible, dirt cheap, works through paint Cons: Only detects taps (not drag/hover), needs hard surface


3b. Capacitive Wire/Paint Grid (1-3ms, ~$21 DIY)

Grid of conductors (copper tape or conductive paint) behind the wall. Measures capacitance change when a finger approaches.

Part Cost
Copper tape grid (30 channels) or graphite paint ~$10
MPR121 capacitive controller ×3 ~$6
ESP32 ~$5

Supports: Touch Drag Multi-touch Hover (~1-2cm) Resolution: Depends on grid pitch — 3cm pitch ≈ 30×40 nodes over 100"

How Mutual Capacitance Works

Two layers of conductors (rows + columns) cross each other, separated by a thin insulator. Each intersection forms a capacitor. A finger near any intersection absorbs electric field, reducing measured capacitance.

The controller scans one row at a time (AC drive), reads all columns simultaneously. Full scan of 30×40 grid: ~0.5-1ms. Continuous scanning gives automatic drag/swipe detection. Sub-pixel interpolation from adjacent node readings gives ~1mm accuracy from 5mm pitch.

IC Grid Size Touch Points Price
MTCH6303 (Microchip) 15×49 10 ~$5
IQS7211A (Azoteq) 15×22 5 ~$3
GT911 (Goodix) 26×14 5 ~$2
FT5x06 (FocalTech) 24×14 5 ~$2

3c. FTIR — Frustrated Total Internal Reflection (3-8ms, ~$110-250)

Acrylic sheet on wall with IR LEDs on edges (total internal reflection). Finger touch "frustrates" the reflection → bright spots detected by IR camera.

Part Cost
4mm acrylic sheet (100") ~$80-150
IR LED strip (850nm) on edges ~$10
IR camera (120fps, no IR filter) ~$15
ESP32-S3 or Pi ~$5-75

Pros: Multi-touch, precise, pressure-sensitive (brighter blob = more pressure) Cons: Needs smooth flat surface (acrylic)


3d. IR Touch Frame (8-15ms, ~$250-500)

Aluminum frame with IR LEDs + sensors on 4 edges. Finger breaks IR beams → X,Y.

Size Price Touch Points
65" ~$250 6-10 pt
82" ~$350 10-20 pt
100" ~$500 10-20 pt
120"+ ~$800+ 20+ pt

Premium: Neonode zForce (~6-8ms, 200Hz). Budget: generic Chinese frames (~15-30ms, 100Hz).

Pros: USB HID plug-and-play, works on any surface Cons: Physical border/bezel on wall


3e. Depth Camera (15-30ms, ~$80-450)

Camera FPS Latency Range Price
Intel RealSense D405 90fps ~11ms 7cm-50cm ~$80
RealSense D435i 90fps ~11ms 10cm-10m ~$200
OAK-D SR (Short Range) 60fps ~12ms 2cm-100cm ~$150
OAK-D Pro 30fps depth ~15ms 20cm-15m ~$200
Stereolabs ZED Mini 100fps ~10ms 10cm-12m ~$300
Stereolabs ZED X Mini 120fps ~8ms 10cm-15m ~$450
Orbbec Gemini 2 60fps ~16ms 15cm-10m ~$130

RealSense D405 is ideal for wall touch — 90fps hardware stereo depth, 7cm minimum distance, global shutter. No ML needed for touch detection: just threshold the depth map (depth < 5mm → TOUCH, < 150mm → HOVER).

Layer MediaPipe on top (parallel) for gesture classification.


3f. Hybrid: Best of All Worlds

Input Method Latency
Tap detection + pressure Piezo (4 corners) <1ms
Touch + drag + hover Capacitive grid 1-3ms
Hand gestures (air) RealSense D405 ~15ms

4. Gesture / Hand Tracking

DIY Approaches (Ultraleap alternative)

Stereo IR Camera + MediaPipe (~$30-50)

Two OV2710 IR USB cameras (stereo pair, $15 each) + 850nm IR LED strip ($5). MediaPipe Hands on Pi 5 or Jetson: 21 landmarks per hand, 30-120fps. Stereo triangulation gives Z. Latency: ~20-30ms.

Single Depth Camera (~$80-150)

Use RealSense D405 or OAK-D SR (see above). Hardware depth gives Z-distance from wall.

ESP32-S3 + IR Matrix (~$20, lowest latency)

IR LEDs flood the area in front of the wall. 2-3 IR cameras do blob detection at 120fps on ESP32-S3. Z estimated from blob size. No ML needed. Latency: 5-10ms.


5. Conductive Paint Recipes

For capacitive grid electrodes painted directly on walls.

Graphite Paint (easiest, ~$5)

Ingredient Amount Source
Graphite powder (<45μm) 3 tbsp Art supply, Amazon (~$8/lb)
PVA glue (white school glue) 2 tbsp Any store
Water 1 tbsp Tap

~60% graphite, 30% glue, 10% water by volume. Resistance: ~500-2000 Ω/sq. Good enough for capacitive sensing.

Carbon Black + Acrylic (~$15)

20-25% carbon black powder (conductive grade) in 75-80% acrylic medium. Resistance: ~200-800 Ω/sq. Better adhesion. Wear mask + gloves.

Nickel Paint (~$20)

MG Chemicals 841, premade. Resistance: ~5-50 Ω/sq. Mid-range.

Silver Paint (~$30-50)

Premade: Bare Conductive (~$25/50ml), MG Chemicals 842. DIY: 70-80% silver flake powder (<10μm), 15-20% acrylic medium, 5-10% butyl acetate. Resistance: ~0.5-5 Ω/sq. Near-wire conductivity.

For capacitive sensing: graphite is sufficient

Capacitive touch doesn't need low resistance — just enough conductivity to couple with a finger. Paint lines with tape masking at 3-5cm spacing.


6. Pixel Paint — Paint-On Displays

Electroluminescent (EL) Paint Display

Real and buildable. A stack of painted layers that glow when AC voltage is applied.

Layer stack (painted in order):

  5. Clear topcoat
  4. Transparent conductor (PEDOT:PSS)         ← rows
  3. Phosphor layer (ZnS:Cu in acrylic)        ← glows
  2. Dielectric (BaTiO₃ in acrylic)            ← insulator
  1. Base conductor (silver/carbon paint)       ← columns
  ─── Wall surface ───

Row/column intersection = one pixel. AC across a specific row+column → only that intersection glows (passive matrix).

Layer Material Cost/m²
Base conductor (columns) Silver paint, painted in strips ~$50
Dielectric Barium titanate (BaTiO₃) in acrylic ~$30
Phosphor ZnS:Cu powder in acrylic ~$20
Top conductor (rows) PEDOT:PSS ~$40
Driver electronics HV507 shift registers + ESP32 ~$30
Total ~$170/m²

Resolution at different pitches

Pixel Pitch Pixels (100" wall) Comparable To
20mm 110×65 = 7,150 LED sign
10mm 220×130 = 28,600 Scoreboard
5mm 440×260 = 114,400 ~400×260 display
2mm 1100×650 = 715,000 Near SD

At 5mm pitch: 440×260 — enough for DreamStack UIs, dashboards, snake game.

Color

  • ZnS:Cu → green (brightest)
  • ZnS:Cu,Mn → amber/orange
  • ZnS:Cu,Al → blue-green
  • Full RGB requires 3 sub-pixels per pixel (3× driver count)
  • Monochrome green is practical and looks great

Built-in touch (free!)

The row/column electrodes double as capacitive sensing electrodes via time-multiplexing:

  1. Sense phase (1ms): measure capacitance = touch position
  2. Drive phase (15ms): apply AC = illuminate pixels

Same paint layers, no extra hardware.

Driver IC

HV507 — 64-channel high-voltage shift register. Drives 100V+ outputs from 3.3V SPI. Chain several for full display.

Other Display Paint Technologies (Future)

Technology Status Color Speed
Electrochromic (PEDOT:PSS, WO₃) Real Grayscale 1-30s (too slow for video)
Thermochromic + resistive grid Hackable Limited 1-5s
Perovskite spray-on LEDs Lab only Full color ~ms
QD-LED inkjet Lab only Full color ~ms

Perovskite / QD-LED spray-on is the future (~2028-2030) but not available today.


7. Off-the-Shelf Solutions

Capacitive Touch Overlays (stick-on film)

Product Max Size Touch Points Latency Price
Displax Skin Ultra 105" 40 ~6ms ~$800-1500
Visual Planet TouchFoil 100"+ 40 ~8ms ~$600-1200
PQ Labs iTouch Plus 150"+ 32 ~8ms ~$400-900
AliExpress "PCAP touch foil" 100"+ 10 ~10-15ms ~$200-400

Displax Skin Ultra: transparent polymer film with nano-wire grid, adhesive-backed, works through 6mm of material, USB HID, detects hover at ~2cm. Stick on wall, plug USB, done.

All-in-One Interactive Projectors

Product Size Touch Latency Price (new)
Epson BrightLink 770Fi 100" 10pt + pen ~10ms ~$2,500
Epson BrightLink 735Fi 100" 10pt + pen ~10ms ~$2,000
BenQ LW890UST 100" 10pt ~12ms ~$1,800
Boxlight Mimio MiXX 100" 20pt ~8ms ~$2,200

Used education projectors (schools constantly upgrade):

Used Option Price
Epson BrightLink 695Wi/696Ui $300-600
BenQ MW855UST+ with PointWrite $400-700
Promethean UST + ActivBoard $300-500

Interactive Flat Panels (giant touchscreen monitors)

Product Size Price (new) Price (used)
SMART Board MX 65-86" $3,000-6,000 $500-1,500
Promethean ActivPanel 65-86" $3,000-5,000 $600-1,200
ViewSonic ViewBoard 65-98" $2,000-8,000 $500-1,500
Samsung Flip 55-85" $2,000-4,000 $800-2,000
Microsoft Surface Hub 2S 50-85" $5,000-12,000 $1,500-3,000

Budget: $675

Component Source Price
Used SMART Board 65" eBay ~$600
Pi 5 Official ~$75

Plug HDMI + USB, run DreamStack, done.

Mid-Range: $700

Component Price
UST projector (used) ~$300
PCAP touch foil 100" (AliExpress) ~$300
Pi 5 ~$75
Screen paint ~$30

Premium: $1,050

Component Price
UST projector (used) ~$400
100" IR touch frame ~$350
RealSense D405 (gestures + hover) ~$80
Pi 5 ~$75
Piezo sensors (4 corners, tap confirm) ~$7
Screen paint ~$30

Touch at 8-15ms + hover/gestures at 15ms + tap confirmation at <1ms.

DIY Maximum: ~$200 + wall paint

Component Price
Conductive graphite paint (capacitive grid) ~$10
MPR121/MTCH6303 cap-touch IC ~$5
ESP32-S3 ~$5
UST projector (used) ~$300

Paint your own touch grid on the wall, 1-3ms latency, no frame needed.


9. DreamStack Integration

All touch methods feed into the existing relay protocol:

Touch sensor (any method above)
  → ESP32 or Pi reads touch events
  → Encodes as DreamStack protocol:
       0x01 Pointer move    (x, y)
       0x02 Pointer down    (x, y, buttons)
       0x03 Pointer up
       0x10 KeyDown         (keyCode)
       0x20 Hover           (x, y, z_distance)    ← new
       0x21 Swipe           (direction, velocity)  ← new
       0x22 Pinch/Grab      (state)                ← new
  → WebSocket → DreamStack relay
  → App receives as signal updates

DreamStack syntax for handling:

on hover(ev) -> opacity = lerp(0.5, 1.0, ev.z)
on swipe(ev) -> navigate(if ev.dir == "left" then "/next" else "/prev")
on grab(ev) -> scale = if ev.closed then 0.9 else 1.0