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

104 lines
6.2 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.
# Hermes robot enclosure
![Assembly](renders/assembly.png)
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.