Files
hexapod-robot/2026-current/hardware/openscad/servo.scad
T
mangavalkandClaude Opus 5.5 91b5b99fd5 2026: OpenSCAD robot and remote, physical joint limits, model in Unity
hardware/openscad/ rebuilds the broken Fusion models as OpenSCAD:
body (top/bottom plate, standoffs, battery bay, switch), legs (coxa
bracket, femur link, tibia, horn adapters, TPU socks, servo cables),
the whole robot, and the remote (shell, lid, Nextion 3.5", JH-D400X-R4
sticks, 18650 UPS board, IMU, Teensy 4.0, USB-C breakout). Every part
was checked by slicing against the original STEP solids; the original's
bugs are fixed and listed in PLANNING.md.

The robot now uses a hexagon leg layout (corner legs 60 deg round from
the mid legs; the corner coxa brackets need turning on their splines).
Physical limits from a collision sweep of the model are in Config.h:
per-leg coxa limits and LEG_CLEARANCE_MM 56 (a leg is 55.2 mm wide at
the joints); the sim API exports them (version 7). sim_smoke passes.

Unity loads the model (export_unity.py -> Resources/OpenScadModel,
OpenScadModel.cs builds a new rig in place of the old scene's robot).
The PCB model's mounting holes now use the exact EasyEDA grid. README
shows renders of both.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-14 12:14:32 +01:00

29 lines
1.2 KiB
OpenSCAD

// Hitec HS-485HB, from the servo's Fusion model (servo-hitec-hs-485hb).
// Local frame: shaft on the Z axis, case extending +X, Z = 0 at the ear
// underside. Include (not use) this file to get the constants.
SERVO_CASE = [[-10, -10, -28], [30, 10, 9.75]];
SERVO_EARS = [[-16, -10, 0], [36, 10, 3]];
SERVO_EAR_HOLES = [[-13.9, 5], [-13.9, -5], [34.35, 5], [34.35, -5]];
SERVO_EAR_SCREW_D = 2.5; // pilot hole for the ear screws in printed parts
POCKET_CLEAR = 0.5;
module servo_pocket_2d() {
translate([SERVO_CASE[0][0] - POCKET_CLEAR, SERVO_CASE[0][1] - POCKET_CLEAR])
square([SERVO_CASE[1][0] - SERVO_CASE[0][0] + 2*POCKET_CLEAR,
SERVO_CASE[1][1] - SERVO_CASE[0][1] + 2*POCKET_CLEAR]);
for (h = SERVO_EAR_HOLES) translate(h) circle(d = SERVO_EAR_SCREW_D);
}
module hs485hb() {
color("#303030") {
translate(SERVO_CASE[0]) cube(SERVO_CASE[1] - SERVO_CASE[0]);
difference() {
translate(SERVO_EARS[0]) cube(SERVO_EARS[1] - SERVO_EARS[0]);
for (h = SERVO_EAR_HOLES) translate([h[0], h[1], -1]) cylinder(d = 4.42, h = 5);
}
translate([0, 0, 9.75]) cylinder(d = 14, h = 2.25);
}
color("#e0e0e0") translate([0, 0, 12]) cylinder(d = 5, h = 3.25);
}