Parviz · Build docs

Electronics

Every electronic component in the Parviz build: what it does, whether it is owned, and where to download a reference CAD model. Status comes from the 2026-07-13 inventory re-audit plus the 2026-07-14 order batch (Tray 1, ordered NOT yet delivered; see ASSEMBLY.md for the full BOM including mechanical hardware).

2026-07-14 order batch (changes the plan): Pi 5 8GB (lifts the 2GB RAM ceiling), 2x Sense HAT Rev2 (covers the IMU + env-sensor buys, adds color/light + LED matrix + joystick), AI Camera IMX500 (resolves the AWARENESS.md "AI camera" open decision), 2x Joy-IT RPI5-HEATSINK5 coolers (bigger than the verified head keep-out -- see its row), a 30x10 5V fan, an A4988 bipolar stepper driver and 6x N20 gearmotors (no design use yet, options noted below). Everything in this batch is VERIFY_ON_ARRIVAL for dims.

Reference models matter because the CAD placeholders in src/motors.py and the sensor/board placeholders in src/chassis.py were dimensioned from datasheets; a downloaded mesh is the fastest way to sanity-check a placeholder against the real part. Verify any downloaded mesh against the datasheet before trusting fits -- some Thingiverse "models" are low-poly illustrations, not mechanical CAD.

Integrated into the assembly (2026-07-13): the downloaded meshes for the 28BYJ-48, TT gearmotor, HC-SR04, Arduino Uno, and Camera Module 3 now REPLACE their box/cylinder placeholders in web/assembly.glb, so the viewer shows the real part geometry. src/refparts.py poses each real mesh onto the placeholder's oriented bounding box by a 24-orientation best-fit, so it lands at the exact placeholder location and orientation. Exception (2026-07-16): the 28BYJ-48 is registered deterministically instead -- the OBB best-fit is blind to its eccentric shaft and parked every real stepper ~15 mm off its gear axis, so refparts recovers the placeholder's exact pose (Kabsch over the vertex correspondence) and applies a fixed measured native-to-local transform; the shaft now lands on the pan/tilt/antenna gear axes within the mesh's own 0.125 mm eccentricity slop (guarded by tests/test_refparts_28byj.py). The same pass deleted the placeholder's phantom 9 mm gearbox tier (see CLAUDE.md) so the real motor's shaft actually reaches its gears. They are bought parts, never printed, and skipped by the boolean interference/fit gates (like the non-watertight screen mesh). PLACEHOLDER_PARTS=1 make build restores the analytic placeholders and their full gate coverage. The ULN2003 has no downloaded mesh (see below), so it keeps its placeholder.

Compute + head module

Component Role Status Reference model
Raspberry Pi 5 (2GB) Brain: face render, perception, local LLM, voice OWNED (on the bench, moshe-pi5-2gb.local) No board model on Thingiverse; official STEP at rpi products page -- and the repo already carries the combined screen+Pi mesh in reference/rpi-7in-touchscreen-model/
Raspberry Pi 5 8GB Brain upgrade: lifts the 2GB RAM ceiling (AWARENESS.md budget: 1.7B-class ambient LLM + bigger ASR fit NEXT TO the face now) ORDERED 2026-07-14 (Tray 1) same board mechanically; drop-in on the display standoffs
Official 7" Touch Display The face OWNED clough42 reference model (thing:1646255) -- repo already has the official STEP/STL
Camera Module 3 The eye (imx708) OWNED CM3 Wide mockup (thing:6939162), CC BY-SA, DOWNLOADED to reference/electronics/rpi-cam3-wide-mockup-6939162/ (mesh 25.0x23.9 = official 25x24 board; Wide lens barrel differs)
AI Camera (IMX500) Eye upgrade: on-sensor NPU runs detection ON the camera, freeing Pi CPU/RAM for the brain (resolves the AWARENESS "AI camera" decision) ORDERED 2026-07-14 (Tray 1) 25x24 board like CM3 but DEEPER module + different lens barrel: the forehead cam pod (Ø6.3 lens bore + recess depth) is CM3-sized, so the pod needs a re-fit pass -- VERIFY_ON_ARRIVAL, keep CM3 as the modeled default until measured
Joy-IT RPI5-HEATSINK5 x2 Head thermal (80C breaker trips under brain bursts) ORDERED 2026-07-14 (Tray 1). WARNING: 65x45x15 mm (+ 30x30x10 fan) EXCEEDS the verified official-cooler keep-out (63.5x42.5x13.7) on every axis, and the tilt-sweep margin was only 0.60 mm -- re-run tools/probe_cooler.py with the Joy-IT envelope before installing in the head; if it fails, fall back to the official Active Cooler (envelope already verified) or duct the separate 30x10 fan at the louvres dims from the Joy-IT manual
Fan 5VDC 30x10 (B-3010-D05-MLA) Spare / louvre-duct option if the Joy-IT cooler fails the head probe ORDERED 2026-07-14 (Tray 1) n/a
Gooseneck mics x2 + CM108 Ears (Ø17 windscreen through head side walls) ORDERED, not yet in inventory none needed -- placeholder ear_mic_L/R

Motion

Component Role Status Reference model
28BYJ-48 stepper x4 Pan (2:1 spur), tilt (3-start worm), 2x antenna deploy OWNED x6 (Bags 5, 14) MajicDesigns (thing:4919536) -- Fusion360 + IGES + STL; also CastorX (thing:3247370)
ULN2003 driver x4 Stepper drivers OWNED x9 seandoughtie clearance model (thing:3781347), CC0 -- NOT downloaded (Chrome silently swallows this thing's download; grab manually if needed)
TT gearmotor 1:120 x2 Track drive (2 more OPTIONAL for twin-drive) OWNED x3 (Bag 5); buy 1 only for the 4th station CCFIVE yellow TT motor (thing:1079893), CC BY, DOWNLOADED to reference/electronics/tt-motor-1079893/ (STL + STEP, 69.5x22.4x29.9); also mademodeller (thing:4890871)
MX1588 H-bridge Drives both TTs OWNED x5 none found; trivial 2-layer module, model from measurement
A4988 (Pololu) No station yet. Option it enables: rewire a 28BYJ-48 bipolar (cut the red common) for ~+40% torque on pan or tilt if the 4:1/2:1 margins prove thin on hardware ORDERED 2026-07-14 (Tray 1) n/a
N20 gearmotor 6V (240RPM x4, 400RPM x2) No station yet. Prime candidate: the deferred gripper-arm actuation (rack-and-sector parallel gripper, reference/hand-mechanism/) ORDERED 2026-07-14 (Tray 1) n/a

Sensors

Two planes since 2026-07-14: the Sense HAT Rev2 rides the Pi's I2C bus (it is a Pi peripheral with kernel/python support, not an Arduino part) while the timing- critical and 5V modules stay on the Arduino I/O plane (docs/AWARENESS.md).

Component Role Status Reference model
Sense HAT Rev2 x2 One board covers THREE former buy-list rows: LSM9DS1 9-DoF IMU (accel+gyro+MAG), LPS25H pressure/temp, HTS221 humidity/temp -- plus NEW capabilities: TCS3400 color/ambient-light sensor, 8x8 RGB LED matrix, 5-way joystick. All I2C (0x6a/0x1c IMU, 0x5c, 0x5f, 0x29 color, 0x46 matrix+joystick). Mounts REMOTELY on the chassis equipment base (65x56.5 HAT outline, M2.5 at the 58x49 pattern) fed by a thin I2C drop down the neck -- it can NOT stack on the Pi (no head clearance + the cooler owns that space), see firmware/WIRING.md. 2nd unit = spare / bench Pi ORDERED 2026-07-14 x2 (Tray 1) official; dims VERIFY_ON_ARRIVAL
Arduino Uno R3 I/O plane: sonar timing, vibration, mmWave, touch, LEDs, reflexes; one USB to the Pi OWNED x3 (Bag 6) DesignSpark CAD (thing:346338), CC BY-SA, DOWNLOADED to reference/electronics/arduino-uno-r3-346338/ (OBJ + RSDOC); also 1:1 replica (thing:6564384)
HC-SR04 x4 Forward + rear obstacle, 2x cliff BUY (none owned) dvemac (thing:3653635), CC BY, DOWNLOADED to reference/electronics/hcsr04-dvemac-3653635/ (STL+STEP/SLDPRT+3MF, 45.2x18.5x26.5 = 45x20 board + barrels); also markbenson OpenSCAD (thing:122136), CC BY-NC, in hcsr04-markbenson-122136/
LD2410-class mmWave Presence, boresight-forward behind the front hex grille BUY dims VERIFY_ON_ARRIVAL (LD2450 does NOT fit the bay)
BME688 ~~Env sensing~~ DOWNGRADED to optional: the Sense HAT covers temp/humidity/pressure; buy a BME688 only if VOC/gas sensing ("room feels stuffy") is wanted OPTIONAL (was BUY) dims VERIFY_ON_ARRIVAL
MPU6050/ICM-20948 IMU ~~Motion, near the pan axis~~ COVERED by the Sense HAT's LSM9DS1 -- off the buy list. NOTE the chassis_base IMU posts at (14,-12) become the Sense HAT seat in the next base iteration (cheap reprint by design) COVERED (was BUY) n/a
SW-420 Vibration, hard pad at (-48,-95) BUY dims VERIFY_ON_ARRIVAL
TTP223 x2-4 Cap touch (head-top pass deferred) BUY dims VERIFY_ON_ARRIVAL

I2C address note: the Sense HAT's TCS3400 sits at 0x29, the same address as the VL53L1X ToF that was once a cliff-sensing candidate -- if a VL53L1X ever joins the bus it needs its XSHUT re-address dance or a mux.

Power (firmware/WIRING.md)

Component Role Status Reference model
30W+ USB-C PD brick Wall power BUY (official 27W works marginally) n/a
12V PD trigger Rear jack, sets the harness rail BUY n/a
XL4015-class 5A buck Pi rail (trimmed 5.25V) on the belly tray BUY (owned LM2596s are 2-3A class) Thingiverse has only enclosures (tag:xl4015); board dims VERIFY_ON_ARRIVAL
MP1584 mini buck Motor rail BUY (a selectable-5V module could stand in) enclosures only (thing:5324190 etc.); dims VERIFY_ON_ARRIVAL
Inline blade-fuse holder 5A Pi-rail fuse (fuse itself OWNED, ATC/ATO assortment) BUY holder n/a
SK6805-2427 narrow strip 1m Forehead LED slot (42x5 -- a standard 8x5050 stick does NOT fit) BUY n/a

Thingiverse download workflow

Thingiverse blocks headless downloads (search returns a React shell, download: endpoints 401 without an app token), but "Download all files" works anonymously in a real browser. Zips land as <Name> - <thingId>.zip with files/ + images/. Drop downloads into reference/ with the thing URL + license recorded here; things are individually licensed (usually CC variants) and the repo is public.