Files
kyleandClaude Sonnet 5.5 cb2bb28cd4 Verify the enclosure STLs and renders against the model; document how to regenerate them
Re-exported all ten STLs and the eight poster pose parts with OpenSCAD 2021.01: same
triangles as the committed files. Recovered the camera for renders/assembly.png and
exploded.png (pixel-identical apart from a few anti-aliased pixels) and wrote the
recipes into enclosure/README.md. The poster script now finds DejaVu fonts on more
distros (or via POSTER_FONT_DIR) and the poster README's pose_info command works on 2021.01.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AFN8nRRCiDiMN7ChBpHJhs
2026-10-05 18:52:34 -07:00
..
2026-10-04 14:28:01 -07:00
2026-10-04 14:28:01 -07:00
2026-10-04 14:28:01 -07:00

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.

Regenerating the STLs and the renders

Checked 2026-10-05 with OpenSCAD 2021.01: every file in stl/, poster/pose/, renders/ and the poster matches the model (same triangles; the two PNGs differ in a handful of anti-aliased pixels). Without installing anything, via Docker:

O="docker run --rm --user $(id -u):$(id -g) -v $PWD:/src -w /src openscad/openscad:2021.01"
$O openscad -D 'PART="body"' -o stl/body.stl hermes_robot.scad          # any PART
# PNGs need a virtual display with GLX and software GL; without these flags it hangs
R="docker run --rm --user $(id -u):$(id -g) -v $PWD:/src -w /src -e LIBGL_ALWAYS_SOFTWARE=1 openscad/openscad:2021.01 \
   xvfb-run -a -s '-screen 0 1280x1024x24 +extension GLX' openscad --imgsize=1100,1500 --viewall --autocenter --colorscheme=Tomorrow"
$R -o renders/assembly.png --camera=0,0,0,72,0,-30,500 -D 'PART="assembly"' hermes_robot.scad
$R -o renders/exploded.png --imgsize=1100,1700 --camera=0,0,0,70,0,150,500 -D 'PART="exploded"' hermes_robot.scad

Known quirk: back.stl has two non-manifold edges (four faces meet at one corner, near the back's rear screw cup); slicers repair it silently.

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.