Files
hermes-bot/enclosure/README.md
T
kyleandClaude Sonnet 5.5 720a7cfc34 Bring every doc up to date, and give the repo a Wi-Fi template that exists
CONTEXT.md had grown by appending and contradicted itself (all four nodes vs six, a retracted CPU
figure, "no calibration", "nobody enrolled", "audio untested as a service", the Wi-Fi-off boot as
not done, a class the tracker replaced). Rewritten as one current-state document organised by
subsystem, with fresh measurements, the owner's decisions, the gotchas, the neck's arrival-day plan
and what is genuinely still open.

README: status, speakers not fitted, new-session note for Hermes, the calibration section (shipped
calibration, coverage hints, outlier dropping, --from-views), running the tests, the docs row.
HANDOFF.md gets a status banner listing where the original brief has drifted. CLAUDE.md starts at
CONTEXT.md. The echo-cancel config no longer talks about a Pi Zero, and the enclosure guide no longer
tells you to centre a servo with a tool that does not exist yet.

pi/network-config.example is a tracked, credentials-free first-boot template: the README pointed at
pi/50-cloud-init.yaml, which is gitignored and so missing from a fresh clone. The dead IdentityCache
(replaced by the tracker) is removed. Docstrings corrected: audio scope publishing, the MCP health
topics, and what the calibration tool does.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AFN8nRRCiDiMN7ChBpHJhs
2026-10-05 08:38:32 -07:00

6.2 KiB
Raw Blame History

Hermes robot enclosure

Assembly

An upright cabinet for the Raspberry Pi 4 and BrainCraft HAT. The display is the face, and the speaker sits behind a grille below it. The whole cabinet pans on a bearing turntable, and a small yoke on top tilts only the camera. Everything is in one parametric OpenSCAD file, hermes_robot.scad. Ready-made STLs are in stl/, but don't print the large parts until the test pieces fit: most dimensions were taken from photos and datasheets.

Overall size: about 86 × 40 × 146 mm for the cabinet, on a 90 mm base. Total height is about 225 mm including the camera.

Parts to buy

Part Notes
2 × MG90S metal-gear micro servos Pan (in the base) and tilt (camera). Use the double-arm horns they come with.
6810-2RS ball bearing, 50 × 65 × 7 mm The turntable. The 50 mm bore leaves room for the servo and cables.
Adafruit 5986 speaker (or the CQRobot 8 Ω JST-PH equivalent) 70 × 30 × 17 mm box.
30 × 30 × 10 mm 5 V fan Optional; plugs into the HAT's fan header. Set fan = false to drop the mount.
Right-angle USB-C cable The left side has about 13 mm beside the board for the plug.
M3 screws: 4 × 8 mm (back cover), 4 × 8 mm (turntable), 2 × 12 mm + nuts (yoke), 1 × 16 mm (tilt axle) + washer Self-tapping into PETG where the model has 2.6 mm pilots.
4 × M2 × 6 mm screws Camera board to cradle.
4 small rubber feet, 10 mm Optional, in the base's recesses.

The servos plug into the HAT's GPIO12 (pan) and GPIO13 (tilt) ports. Those ports are factory-set to 5 V (checked by continuity on the "3pin Volt" jumper), so no soldering is needed.

Measure first

Every value marked MEASURE in the .scad file is an estimate. With calipers, check at least:

  1. The stack: the gap between the Pi and HAT boards (stack_gap), the tallest part on the HAT's front (hat_clear), and the screw-head size (head_d, head_h).
  2. HAT features: the display glass position (glass_px, glass_py), the mics, the audio switch and the LEDs. All are in Pi coordinates: px runs down the board from the microSD end, py across it from the USB-C edge.
  3. The speaker box (spk).
  4. The servo (srv_*) and its double-arm horn (horn_*): arm length from shaft centre to tip, widths at hub and tip, thickness, and the radii of its screw holes.
  5. The bearing (brg_*), if yours isn't a 6810.
  6. The camera board (cam_*): the hole positions and lens position.

Change a value, then re-export: openscad -D 'PART="body"' -o stl/body.stl hermes_robot.scad.

Print the test pieces first

Piece What it checks Rough time
test_front The front wall over the HAT. Press it onto the stack: the cups should seat on the screw heads, with the window over the display, the mic holes over the mics, the slot over the audio switch, and the thin LED spots over the LEDs. ~40 min
test_bearing The bearing seat in the base and the hub on the plate. The bearing should press in firmly by hand; adjust press if it's loose or won't go. ~1 h
test_servo The servo posts in the base: the screw holes should line up with the servo's tabs. ~25 min
test_yoke The tilt servo's mount plate: the case should slide through and the tabs line up. ~15 min

Printing (Adventurer 5M Pro, PETG)

Part Orientation (as exported) Notes
body Front face on the bed No supports. The front face takes the plate's texture.
back Outside face on the bed No supports.
base Upright No supports.
plate Top face on the bed, hub up No supports.
yoke Upright No supports.
cradle Horn flange on the bed No supports.

Suggested settings: 0.2 mm layers, 3 walls, 20% gyroid infill. Use 40% infill for plate and cradle, which carry the servo horns. Print the bearing seat and hub slowly on their outer walls for accuracy.

Assembly

  1. Base: set the pan servo on its posts, shaft up, and screw it through the tabs. Press the bearing into the seat. Feed the USB-C cable in through the slot at the back of the base, up through the bearing.
  2. Turntable: screw a double-arm horn into the pocket under the plate. Centre the servo (with a servo tester, or a 1.5 ms pulse on its PWM channel as in "Arrival day" in CONTEXT.md; turn_head(0, 0) works only once the head node exists and the bridge has head: true), press the plate's hub into the bearing so the horn meets the spline, and fit the horn's centre screw through the hole in the plate.
  3. Body onto the plate: pass the power cable and the pan servo's lead up through the floor hole. Then screw the plate on from inside the body with 4 × M3, before the speaker goes in.
  4. Speaker: route its lead up the left-hand channel, and set the box on its feet, facing the grille.
  5. Stack: plug in the speaker, the servo leads and the fan. Lower the Pi and HAT stack face-first onto the locating cups, then connect the right-angle USB-C plug on the left.
  6. Back cover: its cups clamp the stack, and its bars hold the speaker against the grille. Use 4 × M3.
  7. Camera: screw the board to the cradle (M2). Fit the second horn into the flange pocket. Centre the tilt servo, mount it in the yoke, push the flange onto its spline, and add the M3 axle on the other side. Feed the ribbon down through the slot. Bolt the yoke to the top with 2 × M3 and nuts from inside.

The camera ribbon drops straight from the cradle into the gap between the Pi and the HAT, then down to the camera connector. A 15–20 cm ribbon should be enough. Leave a gentle loop above the slot for the tilt.

Known compromises

  • The tilt servo hangs about 5 mm past the left side of the cabinet. Set cam_x_offset = 5 to move the camera and yoke right and bring it flush, at the cost of an off-centre camera.
  • The front's controls (joystick, button) aren't exposed. They sit about 7 mm behind the front wall. The LEDs glow through 0.6 mm of PETG, so light-coloured filament works best for that.
  • There's no hard stop on the pan. Software limits (±80°) and the slack in the power cable are what keep it from over-rotating.