dreamstack/docs/explorations.md

449 lines
16 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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
### Path C: Pi Zero 2 W (~$15, recommended MVP)
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.
#### Recommended ICs
| 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 |
---
## 8. Recommended Builds
### 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
```