# MB-001 — Servo control, servo picks, wiring & power *Remote pan-tilt stereo camera rig that follows an Apple Vision Pro wearer's head pose.* *Researched 2026-11-03 (Asia/Hong_Kong, UTC+8). Prices are "as shown on the linked page on that date"; currency stated. Nothing was bought.* ## 0. Topology (user-confirmed) * **Rig machine** (Raspberry Pi 5 or similar) sits at the remote site. Everything on the rig is **wired**: * 2× USB UVC cameras → USB ports of the machine. * Servo control → wired from the same machine (I²C to PCA9685, **or** USB/UART to a bus-servo adapter, **or** USB-serial to a microcontroller such as Pololu Maestro / Arduino / ESP32). * **The only wireless link is rig machine ⇄ Apple Vision Pro over Wi-Fi 6**: * rig → AVP: stereo video stream. * AVP → rig: head pose as UDP packets (from a visionOS app). * Nothing is mounted on the headset. (Headset-mounted variant dropped per user.) * Controller-over-Wi-Fi options (ESP32 receiving UDP and driving servos directly) are demoted to a footnote (§A.4). --- ## A. Servo control options ### A.1 Comparison (machine = Raspberry Pi 5, wired control) | Option | Link to Pi | Resolution | Update rate / latency | Jitter | Ease on Pi 5 | Notes / source | |---|---|---|---|---|---|---| | Pi 5 software PWM (gpiozero/lgpio/RPi.GPIO-style) | GPIO | timing set by OS scheduler | no number sourced | **Worst of the list**: timing set by Linux scheduling, no figure sourced | **pigpio and RPi.GPIO do not work on Pi 5** (RP1 chip) | Avoid. [Raspberry Pi docs](https://www.raspberrypi.com/documentation/computers/raspberry-pi.html) | | Pi 5 hardware PWM (RP1) | GPIO12/13/18/19, `dtoverlay=pwm-2chan` (sysfs `/sys/class/pwm`); or `dtoverlay=pwm-pio,gpio=N` (PIO-based) | ns-level period/duty via sysfs | Set-and-forget; 50 Hz frame | Low (hardware-generated) — no figure sourced | Medium: overlay + sysfs | Good for exactly 2 servos (pan+tilt). Only 2–4 channels. | | **PCA9685** 16-ch I²C PWM | I²C (wired, 3.3 V logic OK) | 12-bit (4096 steps/period) → at 50 Hz ≈ 4.9 µs per count | I²C write per update, ~ sub-ms; chip free-runs PWM 24–1526 Hz | Very low (own oscillator; **independent of Linux scheduling**) | **Easy** (Adafruit CircuitPython lib, Python) | [Adafruit #815](https://www.adafruit.com/product/815) $14.95 USD | | Arduino (Uno/Nano) via USB-serial | USB-serial | `Servo` library timing; exact resolution not verified | Limited by serial protocol you write | Low (timer-based) | Medium (firmware + protocol) | Not verified in detail; no number sourced | | ESP32 LEDC (USB-serial, wired) | USB-serial | up to 20-bit LEDC duty, 16 channels | your own protocol | Low (hardware PWM) | Medium (firmware) | Over-kill; see footnote A.4 | | **Pololu Micro Maestro (6-ch)** | USB (virtual COM) | 0.25 µs target resolution | USB, built-in speed/accel limiting per channel | **<200 ns** jitter (Pololu spec) ; serial timeout → servos go to home positions | **Easy** (simple serial protocol, Linux support) | [Pololu #1350](https://www.pololu.com/product/1350) $27.95 USD | | **Feetech STS3215 on Waveshare Bus Servo Adapter (A)** | USB **or** UART (jumper), half-duplex TTL to servos, 38 400 bps–1 Mbps (1 Mbps default) | **4096 counts / 360°** (12-bit magnetic encoder) = ~0.088° | Packet-based; position/speed/accel set per command; **feedback**: position, load, speed, voltage | No PWM at all → no PWM jitter; closed-loop in servo | Easy (Waveshare/Feetech Python SDK) | [Waveshare adapter](https://www.waveshare.com/product/bus-servo-adapter-a.htm) $4.99 USD | ### A.2 Recommendation 1. **Preferred (heavy and also fine for light): Raspberry Pi 5 → USB → Waveshare Bus Servo Adapter (A) → 2× Feetech STS3215.** * Fully wired, no PWM jitter, built-in feedback (position/load/voltage), servo holds position, daisy-chained cable (one 3-wire bus), accel/speed profile in the servo → smooth motion even if UDP packets are irregular. * Cheapest controller of the list ($4.99 adapter). 2. **Light/cheap config: Pi 5 → I²C → PCA9685 → 2× hobby servos** (Savox SH-0257MG+ or MG90S). The PCA9685 outputs stable PWM independent of Linux scheduling. 3. Fallback if you want a self-contained USB controller with failsafe in hardware: **Pololu Micro Maestro** (serial timeout → home). ### A.3 Control path on the wired leg (what the Pi does) `UDP in (Wi-Fi 6)` → `sequence/stale check` → `filter (1€ / low-pass)` → `rate-limit` → `interpolate at fixed 100 Hz` → `map to servo units` → `wired write (I²C or USB bus)`. ### A.4 Footnote: ESP32 over Wi-Fi An ESP32 could receive the UDP head pose itself and drive servos directly via LEDC (up to 20-bit, 16 ch). Not recommended here: the cameras are USB-wired to the rig machine anyway (an ESP32 cannot be the UVC host), so a second Wi-Fi node adds a second radio hop and a second thing to power for no benefit. ### A.5 Network: latency, jitter, smoothing, failsafe **Measured numbers: none sourced.** Wi-Fi 6 latency/jitter must be measured on the user's network (design target: send at 60–90 Hz; measure one-way variation by echoing `t_send_us`). Reasoning only: * Head-pose UDP packets are tiny (24 B) → the Wi-Fi leg adds a few ms typical with occasional spikes (unmeasured). **The dominant motion-to-photon delay is the video path** (capture → encode → Wi-Fi → decode), not the servo command path. * Servo mechanical speed also matters: MG996R 0.14 s/60° at 6 V; STS3215 0.192 s/60° at 7.4 V no-load; Savox SC-1258TG+ 0.08 s/60° (sources in §B). A fast head turn will out-run any of these → the rig will lag the head. Rate-limit rather than slam. **Smoothing (recommended order):** 1. Drop out-of-order/stale packets (by `seq`). 2. **One Euro filter** (Casiez et al., CHI 2012, [paper/site](https://gery.casiez.net/1euro/)): low cutoff at slow speed (kills jitter), higher cutoff when moving fast (low lag). Start: `mincutoff≈1.0 Hz, beta≈0.05–0.1, dcutoff=1.0` at the ~100 Hz loop rate; tune by eye. Reference implementation: [casiez/OneEuroFilter](https://github.com/casiez/OneEuroFilter). 3. **Rate/slew limit** (deg/s) matched to the servo's real speed and to payload torque (§B.1). 4. **Interpolate** between packets at a fixed 100 Hz command rate (linear; allow ≤ 50 ms extrapolation using last velocity, then clamp). 5. Clamp to mechanical limits (pan ±90°, tilt −30…+45° initial values — design choices). **Failsafe (covers Wi-Fi link dropping, headset app killed, packet-loss bursts):** * `t_hold` (e.g. 250 ms with no valid packet) → **hold** last commanded angle (STS3215 can hold torque; with PWM servos stay powered). * `t_park` (e.g. 2 s) → **glide to park pose** (0°, 0°) at a low rate limit (e.g. 20°/s), or disable torque (STS3215 supports torque off) if the park pose is unsafe. * On resume: **don't snap** — ramp from the current angle to the new target using the rate limit. * Also watchdog the Pi process (systemd `WatchdogSec=`); for Maestro use its serial-timeout so servos go home if the Pi dies. **Example packet (UDP, little-endian, 24 bytes):** ``` offset size field 0 2 magic = 0x4D42 ("MB") 2 1 version = 1 3 1 flags (bit0 = recenter request, bit1 = pause/park) 4 4 seq (u32, increments each packet; drop if <= last) 8 8 t_send_us (u64, headset monotonic µs; for jitter/age stats only) 16 4 yaw_deg (f32, + = look right, relative to recenter) 20 4 pitch_deg (f32, + = look up) ``` Python: `struct.pack(' T_PARK: goal, rate = PARK_POSE, PARK_RATE # 2 s: glide home elif age > T_HOLD: goal, rate = cmd, 0 # 250 ms: hold else: goal, rate = target, MAX_RATE step = rate / LOOP_HZ cmd = tuple(approach(c, g, step) for c, g in zip(cmd, goal)) # slew limit write_servos(cmd) # PCA9685 I2C duty OR bus-servo position packet sleep_until(t + 1/LOOP_HZ) ``` --- ## B. Servo picks for the pan-tilt head ### B.1 Payload and torque estimate **Payload masses** | Item | Mass | Source | |---|---|---| | Logitech Brio 4K (excl. cable) | **65 g** (datasheet); **63 g** in Logitech's getting-started guide; 102 × 27 × 26.5 mm | [datasheet](https://www.logitech.com/content/dam/logitech/en/video-collaboration/pdf/brio-datasheet.pdf), [product page](https://www.logitech.com/en-gb/products/webcams/brio-4k-hdr-webcam.html), [getting-started PDF](https://www.logitech.com/assets/70295/brio_4k_getting_started_(ww).pdf). *Earlier sources show 85 g in some listings; use 65 g (datasheet), design margin covers it.* Clip removed. Brio clip is 69.2 g (datasheet) / 44 g (guide) | | ELP-USB48MP01 module, 38 × 38 mm | **100 g per ELP listing (board+cable?)** — looks heavy for a bare module; **unverified** | [webcamerausb.com](https://www.webcamerausb.com/elp-high-definition-48megapixels-fast-autofocus-scanning-camera-no-distortion-100degree-lens-1080p-30fps-4k-8k-48mp-mini-usb-camera-module-for-raspberry-pi-jetson-nano-p-508.html). **User's Quanrui USB48MP01-QFZ: weigh it.** | | Bar/bracket/cable allowance | assumption (not sourced) | design | **Design cases (assumptions flagged):** * **Light:** 2 × 38 mm module @ 100 g (worst-case listing) + 40 g bar = **0.24 kg**, COM 30 mm from tilt axis. * **Heavy:** 2 × Brio (130 g) + bar/bracket/cable allowance → design envelope **0.40 kg**, COM 50 mm from tilt axis. **Calculation** (g = 9.81 m/s²; 1 kgf·cm = 0.0981 N·m; head-turn angular acceleration assumption α = 50 rad/s² ≈ 2900 °/s²; point-mass inertia I = m·L²): * Tilt static: T = m·g·L * Tilt dynamic: T = m·L²·α * Pan (vertical axis, no gravity torque): T = (m·r² + m_servo·r_s²)·α * Required rating = 3 × (static + dynamic) (safety factor 3 for stall margin, friction, cable drag, thermal) | | Light (0.24 kg, L=30 mm) | Heavy (0.40 kg, L=50 mm) | |---|---|---| | Tilt static T = m·g·L | 0.24·9.81·0.030 = 0.0706 N·m = **0.72 kgf·cm** | 0.40·9.81·0.050 = 0.196 N·m = **2.00 kgf·cm** | | Tilt dynamic | 0.24·0.03²·50 = 0.0108 N·m = 0.11 kgf·cm | 0.40·0.05²·50 = 0.050 N·m = 0.51 kgf·cm | | Tilt total | 0.83 kgf·cm | 2.51 kgf·cm | | **Tilt servo needs (×3)** | **≥ 2.5 kgf·cm** | **≥ 7.5 kgf·cm** | | Pan inertia (r = 40/60 mm; tilt servo 13.4 g / 55 g at 20/30 mm) | 3.9e-4 kg·m² → 0.0195 N·m = 0.20 kgf·cm | 1.5e-3 kg·m² → 0.0745 N·m = 0.76 kgf·cm | | **Pan servo needs (×3)** | **≥ 0.6 kgf·cm** | **≥ 2.3 kgf·cm** | Conclusion: the **tilt axis** sets the torque requirement. Pan mostly needs a **bearing** (the whole payload + tilt servo sits on the pan output shaft; use a thrust/ball bearing as in ServoCity SPT200 or the generic kits with cupped bearing). ### B.2 Servo comparison Specs from the vendor pages linked in the last column; torque in kgf·cm. | Servo | Torque @4.8 / 6 V (or other) | Speed (s/60°) | Size (mm) / weight | Voltage | Type / gears | Stall / run current | Price (date 2026-11-03) | Link | |---|---|---|---|---|---|---|---|---| | **TowerPro MG90S** | 1.8 / 2.2 (TowerPro); Waveshare listing says 2.0 / 2.8 | 0.10 / 0.08 (TowerPro); Waveshare 0.11 / 0.09 | 22.8×12.2×28.5 / 13.4 g (TowerPro), 12.2 g (Waveshare) | 4.8–6 V | analog, metal gear | not in TowerPro spec; ~700–750 mA @4.8 V and ~860–900 mA @6 V in third-party datasheets (secondary, **unverified**) | **$2.30 USD** (1–9 pcs, Waveshare) | [TowerPro](https://towerpro.com.tw/product/mg90s-3/) · [Waveshare](https://www.waveshare.com/product/modules/motors-servos/mg90s-servo.htm) | | **Savox SH-0257MG+** | 1.8 / 2.2 | 0.13 / 0.09 | 22.8×12.0×25.4 / 14 g | 4.8–6 V | **digital**, metal gear | blocking 1400 mA, rated 180 mA, quiescent 5 mA (Savox) | **€21.95** incl. VAT (€18.14 excl.) | [Savox](https://savox-servo.com/en/product/SH-0257MGplus/) | | **TowerPro MG996R** | 9.4 / 11 (TowerPro/Digikey PDF); Waveshare listing says 9 / 11 | 0.17 / 0.14 (TowerPro); Waveshare 0.19 / 0.18 | 40.7×19.7×42.9 / 55 g | 4.8–7.2 V | listed "digital", metal gear (datasheet text says digital; 5 µs deadband on Waveshare page) | **stall 2.5 A @6 V, running 500–900 mA @6 V** (datasheet) | **$4.70 USD** (1–9 pcs, Waveshare); RobotShop shows $6.26 for the Waveshare item (re-stocking; not re-fetched) | [Datasheet](https://mm.digikey.com/Volume0/opasdata/d220001/medias/docus/204/MG996R.pdf) · [Waveshare](https://www.waveshare.com/product/modules/motors-servos/mg996r-servo.htm) | | Adafruit std. high-torque metal gear (MG995-class) | 8.5 / 10 | 0.20 / 0.16 | 40.7×19.7×42.9 / 62.4 g | 4.8–6 V | metal gear | not listed | **$19.95 USD** | [Adafruit #1142](https://www.adafruit.com/product/1142) | | **DSSERVO DS3218** | 18 @5 V / 21.5 @6.8 V | 0.16 @5 V / 0.14 @6.8 V | 40×20×40.5 / 60 g | 4.8–6.8 V | **digital**, metal (copper+Al) gear, IP66, 3 µs deadband, dual bearings | **stall 1.8 A @5 V, 2.2 A @6.8 V**; idle 4–5 mA (datasheet) | **$30.18–$32.09 USD** (RCBuying range) | [datasheet](https://etechrobot.com/wp-content/uploads/2024/07/DS-3218-Servo-Motor-High-Torque-20Kg-Datasheet.pdf) · [RCBuying](https://rcbuying.com/products/dsservo-ds3218mg-waterproof-20kg-high-speed-metal-gear-digital-servo-for-1-8-1-10-1-12-scale-rc-cars) | | **Savox SC-1258TG+** | 9.6 / 12.0 | 0.10 / 0.08 | 40.3×20.2×37.4 / 64 g | 4.8–6 V | **digital coreless**, titanium gear, 12-bit | blocking **5000 mA**, rated 120 mA, quiescent 5 mA (Savox) | **€69.95** incl. VAT (€57.81 excl.) | [Savox](https://savox-servo.com/en/product/SC-1258TGplus/) | | **Feetech STS3215** (Waveshare ST3215 7.4 V) | 19.5 @6 V / "19 kg·cm" @7.4 V listing (Waveshare: "19.5 kg·cm @7.4 V") | 0.192 @7.4 V (52 rpm), no load | 45.2×24.7×35 / 55 g (Feetech wiki/datasheet) | 4–7.4 V (7.4 V variant); 12 V variant 6–12.6 V = 30 kg·cm | **digital bus servo**, metal gear 1:345, **magnetic encoder 4096 steps/360°**, feedback of position/load/speed/voltage | **locked 2.5 A @7.4 V, no-load 150 mA** (Waveshare) | **$16.99 USD** (page also shows $21.99 — two variant prices, I could not map which is which; check at order) | [Waveshare ST3215](https://www.waveshare.com/st3215-servo.htm) · [Feetech wiki](https://ftservo.github.io/ftservo-wiki/en/products/models/st-3215-c001/main/) | Caveats: MG996R figures differ between TowerPro/Digikey and Waveshare listings (speed especially); clone/relabel quality varies. Savox/Feetech are first-party-ish pages; DS3218 datasheet is a reseller copy of DSSERVO's. ### B.3 Pan-tilt kits / brackets | Kit | What it is | Spec | Price (2026-11-03) | Link status | |---|---|---|---|---| | ServoCity **SPT200** Pan & Tilt | ABS plate, aluminium servo horns, 1/4" ball bearing each axis, direct-drive, standard servos 24T/25T | max payload 2 lb (0.9 kg), kit weight 5.5 oz (156 g); servos not included | **$45.99 USD — "Currently Sold Out"** | [resolves](https://www.servocity.com/spt200-pan-tilt-kit/) | | **Lynxmotion** pan & tilt (aluminium, no servos), RobotShop RB-Lyn-77 | two aluminium servo brackets, Hitec-style standard servos (HS-3xx…59xx verified fit; others "not likely") | no payload spec | **$11.70 USD, on backorder** (RobotShop data as of 2026-11-02 UTC) | [resolves in WebFetch; 403 to curl](https://www.robotshop.com/products/lynxmotion-pan-and-tilt-kit-aluminium) | | Generic aluminium 2-DOF bracket (MG995/MG996R, 40×20×36 servos) | matte aluminium, 125 × 55 mm; no servos; K-Technics says ~50–60 g, cupped bearing | fit for DS3218 (40.5 mm tall) **not verified** | **€3.55** incl. VAT (Otronic); **€3.59** (Sigmanortec) | [Otronic](https://www.otronic.nl/en/multi-functional-servo-pan-tilt-gimbal-mount-kit-mg995-mg996) ✔ · [Sigmanortec](https://sigmanortec.ro/en/2-axis-servo-mount-pt-for-mg995-and-mg996r) ✔ | | Generic assembled kit with 2× MG996R (Amazon YWMJZEU) | Al mount + bearing + 2 servos | 5.5 oz | **$29.69 USD** (search result snippet only) | [Amazon link returns 404 to curl — **unverified**](https://www.amazon.com/YWMJZEU-Pan-tilt-Servo-Gimbal-Camera/dp/B0DMW5H71K) | | Adafruit Mini Pan-Tilt Kit (assembled, micro servos) | for micro payloads; 37 g | top platform 38×36 mm | **$18.95 USD**, in stock | [Adafruit #1967](https://www.adafruit.com/product/1967) ✔ | ### B.4 Recommended configurations **Light config** (2× 38 mm module ≈ 0.24 kg; tilt needs ≥ 2.5 kgf·cm, pan ≥ 0.6) * **Savox SH-0257MG+ ×2** (digital, metal gear; 2.2 kgf·cm @6 V) — *marginal for tilt*: 2.2 kgf·cm vs 2.5 required. Acceptable only if the real module weighs ≈ 30–40 g (user's Quanrui; weigh it) or the COM is moved to ≤ 20 mm. Otherwise step up to the **STS3215**. * Driver: **PCA9685** over I²C, 5–6 V UBEC, plus the mini pan-tilt bracket or the printed OpenSCAD head. * Rough cost: 2×€21.95 + $14.95. **Heavy config** (2× Brio ≈ 0.4 kg envelope; tilt ≥ 7.5, pan ≥ 2.3 kgf·cm) — **recommended build** * **Feetech STS3215 ×2 (7.4 V) on Waveshare Bus Servo Adapter (A) over USB.** 19.5 kgf·cm = 7.8× tilt requirement; 4096-step feedback; torque hold; 55 g each (a bare 40 mm servo in the MG996R class is 55 g too). * Budget alternative: **DS3218 ×2** + PCA9685 (21.5 kgf·cm @6.8 V; ~2.2 A stall each). * Cheapest: MG996R ×2 (11 kgf·cm @6 V; ×1.5 safety margin only, poor deadband) — 11 kgf·cm is only 1.5× the ×3-derated requirement (4.4× the raw 2.5 kgf·cm), so it works for the 2× Brio case with the least margin; plus cheap aluminium bracket. --- ## C. Wiring & power ### C.1 Power plan * **Pi 5**: official **27 W USB-C PD supply, 5.1 V / 5 A** ([Adafruit #5814](https://www.adafruit.com/product/5814) **$14.04 USD**, in stock; [Pimoroni](https://shop.pimoroni.com/products/raspberry-pi-27w-usb-c-power-supply) £11.40 — shown *out of stock*). With 5 V/5 A PD negotiated, Pi 5 raises downstream USB limit from 600 mA to **1.6 A total** ([Raspberry Pi 27 W brief](https://pip-assets.raspberrypi.com/categories/898-raspberry-pi-27w-usb-c-power-supply/documents/RP-008245-DS-1-27w-usb-c-power-supply-product-brief.pdf), [PD whitepaper](https://pip-assets.raspberrypi.com/categories/685-app-notes-guides-whitepapers/documents/RP-009856-WP-1-USB%20Power%20delivery%20on%20Raspberry%20Pi%205.pdf)). * **Servos on a separate supply — never from the Pi 5 V pins/USB.** * PWM servos (MG90S, Savox, MG996R, DS3218): **5–6 V** (DS3218 up to 6.8 V). Options: a 5–6 V ≥ 5 A wall supply; or a 2S LiPo/Li-ion through a **UBEC/step-down** — e.g. [Pololu D24V50F5 5 V/5 A](https://www.pololu.com/product/2851) **$32.95 USD** (fixed 5 V; 6 V needs the adjustable D24V50Fx variant — not checked) or [Pololu S18V20F5](https://www.pololu.com/product/2574) $29.95 USD (2 A only — light config only). * STS3215-7.4 V: **7.4 V = 2S LiPo direct** (or regulated 7.4 V) into the adapter's DC jack/terminal. **Check:** the Waveshare adapter page lists "Power supply DC 9–12.6 V (ST series servo)" yet also says the input can be selected for the servo used — confirm on the [adapter wiki](https://docs.waveshare.com/Bus_Servo_Adapter_A) before feeding 7.4 V; if it needs 9–12.6 V, use the 12 V servo variant (30 kgf·cm @12 V, locked 2.7 A, no-load 200 mA). * **Common ground**: servo supply − tied to Pi GND (via PCA9685 GND, or adapter GND/USB). * **Bulk capacitor**: 470–1000 µF (≥ 10 V) per 1–2 servos at the servo power input, 1000–2200 µF at the supply for the heavy build (rule of thumb; **no sourced value** — adjust after scope/brown-out test). The PCA9685 board already has a footprint for an electrolytic. * Fuse the servo rail (≈ 5–7 A, stall-sized). * **Cameras**: from the Pi USB ports: 2× USB48MP01 = 2 × 550–610 mA = **1.10–1.22 A** — fits the 1.6 A total only if little else is on USB. 2× Brio: **500 mA declared each (descriptor)**, **~896 mA reported live** by one user ([source](https://www.sgade.de/blog/2023-01-06-logitech-brio-webcam/)) → 1.0–1.8 A, may exceed 1.6 A → use a **powered USB 3.0 hub** (Brio needs USB 3.0 for 4K; Pi 5 has 2× USB 3.0). Servo adapter on USB adds only a little. Check Pi 5 CPU load for 2× 4K MJPEG. ### C.2 Current budget (headline) **Headline: servo rail ≈ 0.4–1.0 A running, ≈ 5 A stall for the heavy builds (2× MG996R: 5.0 A; 2× STS3215: 5.0 A; 2× DS3218: 4.4 A @6.8 V; 2× Savox SC-1258TG+: 10 A blocking); light build ≈ 2–2.8 A stall. Pi + cameras ≈ 5 V / 2–3 A, covered by the 27 W PSU (5 A).** | Rail | Load | Running | Stall / worst case | Source | |---|---|---|---|---| | Pi 5 supply 5.1 V/5 A | Pi 5 itself + peripherals | n/a (not sourced) | PSU = 5 A; USB total ≤ 1.6 A | Raspberry Pi briefs above | | USB (from Pi) | 2× USB48MP01 | 1.10–1.22 A | same | ELP page | | USB (powered hub) | 2× Brio | 1.0–1.8 A (500 mA declared, ~896 mA reported each) | same | Brio descriptor / blog | | Servo rail 5–6 V | 2× Savox SH-0257MG+ | 2×0.18 = 0.36 A (rated) | 2×1.4 = 2.8 A | Savox | | Servo rail 5–6 V | 2× MG90S | ~0.2 A each assumed (**not sourced**) | ~1.7–1.8 A (2×~0.86–0.9, secondary) | third-party datasheets | | Servo rail 6 V | 2× MG996R | 2×0.5–0.9 = 1.0–1.8 A | 2×2.5 = **5.0 A** | TowerPro/Digikey datasheet | | Servo rail 6.8 V | 2× DS3218 | idle 2×~5 mA; running not given | 2×2.2 = **4.4 A** (3.6 A @5 V) | DS3218 datasheet | | Servo rail 6 V | 2× Savox SC-1258TG+ | 2×0.12 = 0.24 A (rated) | 2×5.0 = **10 A** (blocking) | Savox | | Servo rail 7.4 V | 2× STS3215 | no-load 2×0.15 = **0.30 A** (loaded: not sourced) | 2×2.5 = **5.0 A** | Waveshare | Size the servo BEC/supply for ≥ the stall figure (or fuse + software torque/current limit on STS3215). Camera current and Pi current are on separate paths from the servo rail. ### C.3 Diagram (mermaid) ```mermaid flowchart LR subgraph HEADSET["Apple Vision Pro (visionOS app)"] HP["ARKit head pose\n(yaw, pitch)"] VD["Video decode\n+ display"] end subgraph RIG["Remote rig machine (Raspberry Pi 5)"] UDP["UDP rx\nseq check, 1-euro filter,\nrate limit, interpolation,\nwatchdog failsafe"] ENC["Video capture/encode"] CTL["Servo control\n(PCA9685 | bus adapter | Maestro)"] end CAM["2x USB UVC cameras\n~63 mm apart"] SRV["Pan + tilt servos"] PSU1["27 W USB-C PD\n5.1 V / 5 A"] PSU2["Servo supply\n5-6 V UBEC or 7.4 V 2S\n+ bulk caps + fuse"] HP -. "Wi-Fi 6 UDP head pose\n60-90 Hz (wireless)" .-> UDP ENC -. "Wi-Fi 6 video stream (wireless)" .-> VD CAM == "USB (wired)" ==> ENC UDP --> CTL CTL == "I2C / USB-UART (wired)" ==> SRV PSU1 -->|"5 V"| RIG PSU2 -->|"servo V+"| SRV PSU2 ---|"common GND"| RIG ``` Wiring diagram image: `MB-001-wiring.svg` / `MB-001-wiring.png` (same folder). --- ## D. CAD Parametric OpenSCAD (remote rig only): `/workspace/makerbot/cad/mb001_rig.scad`. OpenSCAD 2021.01 AppImage (apt install failed). * Parameters: `cam_type` (`module38` | `brio`), `servo_type` (`mg90s` | `sh0257` | `mg996r` | `ds3218` | `sts3215`), `cam_spacing` (63 default), `tripod_hole`, `use_nut_trap`, `pan_deg`, `tilt_deg`, `show_ghosts`, `part` (`assembly` | `base` | `yoke` | `cam_bar`). * Parts: base deck with a 1/4"-20 clearance hole, nut trap, desk-screw holes, Pi 5 58×49 hole pattern and a pan-servo cradle. Yoke with a pan plate and two tilt arms. Camera bar with a spacing parameter. Ghosts for servos, cameras, Pi 5, PCA9685 and the power module. * **Brio at 63 mm:** a Brio is 102 mm wide, so two cannot sit side by side at 63 mm. The model mounts them rotated 90° (portrait, 102 mm tall × 27 mm wide). Their lens axes are then 63 mm apart. The model therefore uses a wider yoke and a higher tilt axis. Check that the Brio lens is centred in the housing. * Servo L×W×H come from the vendor pages. Shaft offset, flange and spline height are approximations. The 38 mm module depth (15 mm) is an assumption. Check both before printing. * Tilt sweep: the camera bar can hit the yoke plate at large angles. Limit tilt to about ±30° (estimate, not verified). * Files: `cad/mb001___{base,yoke,cam_bar,assembly}.stl` for `module38_sts3215`, `module38_sh0257` and `brio_mg996r`. Assembly GLBs (in metres) for three.js. PNG renders: iso, front, side, top and rear. --- ## E. Not verified / open items * Mass of the user's Quanrui USB48MP01-QFZ (ELP listing says "100 g"; weigh it). Also its current draw (ELP states 550–610 mA; Quanrui unverified). * Brio mass differs by source: 63 g (guide) / 65 g (datasheet) / some listings 85 g — used 65 g. * Wi-Fi 6 latency/jitter, AVP pose rate, and servo motion-to-photon: **not sourced — measure**. * Pi 5 software-PWM jitter number — none sourced; MG90S stall current (secondary only); MG90S running current; MG996R "digital vs analog" (datasheet says digital, seller listings inconsistent). * Waveshare ST3215: page shows $16.99 and $21.99 for two variants; mapping to 7.4 V vs 12 V not resolved. Waveshare adapter power input range for 7.4 V servos needs wiki confirmation. * ServoCity SPT200 is sold out; Lynxmotion on backorder; Amazon YWMJZEU kit link did not resolve via curl; Feetech.cn page timed out. * Capacitor sizes, fuse, UBEC size and filter constants are engineering rules of thumb, not sourced. * CAD servo shaft offsets, 38 mm module depth and Brio lens centring are assumed (see §D). * DS3218 bracket fit (40.5 mm body vs 36 mm "standard" bracket) not checked. ## F. Buy-link check (2026-11-03 HKT) | Item | URL | Result | |---|---|---| | Adafruit PCA9685 | https://www.adafruit.com/product/815 | 200, $14.95 | | Pololu Micro Maestro 6 | https://www.pololu.com/product/1350 | 200, $27.95 | | Waveshare Bus Servo Adapter (A) | https://www.waveshare.com/product/bus-servo-adapter-a.htm | 200, $4.99 | | Waveshare ST3215 | https://www.waveshare.com/st3215-servo.htm | 200, $16.99 / $21.99 | | Waveshare MG90S | https://www.waveshare.com/product/modules/motors-servos/mg90s-servo.htm | 200, $2.30 | | Waveshare MG996R | https://www.waveshare.com/product/modules/motors-servos/mg996r-servo.htm | 200, $4.70 | | RCBuying DS3218MG | https://rcbuying.com/products/dsservo-ds3218mg-waterproof-20kg-high-speed-metal-gear-digital-servo-for-1-8-1-10-1-12-scale-rc-cars | 200, $30.18–$32.09 | | Savox SH-0257MG+ | https://savox-servo.com/en/product/SH-0257MGplus/ | 200, €21.95 | | Savox SC-1258TG+ | https://savox-servo.com/en/product/SC-1258TGplus/ | 200, €69.95 | | Adafruit #1142 | https://www.adafruit.com/product/1142 | 200, $19.95 | | ServoCity SPT200 | https://www.servocity.com/spt200-pan-tilt-kit/ | 200, **sold out** | | RobotShop Lynxmotion | https://www.robotshop.com/products/lynxmotion-pan-and-tilt-kit-aluminium | 200 (WebFetch), 403 (curl), backorder | | Otronic bracket | https://www.otronic.nl/en/multi-functional-servo-pan-tilt-gimbal-mount-kit-mg995-mg996 | 200, €3.55 | | Sigmanortec bracket | https://sigmanortec.ro/en/2-axis-servo-mount-pt-for-mg995-and-mg996r | 200, €3.59 | | Amazon YWMJZEU kit | https://www.amazon.com/YWMJZEU-Pan-tilt-Servo-Gimbal-Camera/dp/B0DMW5H71K | 404 to curl — unverified | | Adafruit 27 W PSU | https://www.adafruit.com/product/5814 | 200, $14.04, in stock | | Pimoroni 27 W PSU | https://shop.pimoroni.com/products/raspberry-pi-27w-usb-c-power-supply | 200, £11.40, out of stock | | Pololu D24V50F5 | https://www.pololu.com/product/2851 | 200, $32.95 | | Pololu S18V20F5 | https://www.pololu.com/product/2574 | 200, $29.95 | | Adafruit Mini Pan-Tilt | https://www.adafruit.com/product/1967 | 200, $18.95 | | ELP USB48MP01-AF100 | https://www.webcamerausb.com/elp-high-definition-48megapixels-fast-autofocus-scanning-camera-no-distortion-100degree-lens-1080p-30fps-4k-8k-48mp-mini-usb-camera-module-for-raspberry-pi-jetson-nano-p-508.html | 200, $121.80 (user already owns a Quanrui unit) |