diff --git a/monitor/hinge.py b/monitor/hinge.py index aceb53a..0763cf4 100644 --- a/monitor/hinge.py +++ b/monitor/hinge.py @@ -10,33 +10,31 @@ screw_head_h = 2.5 screw_head_radius = 3.5 screw_radius = 1.5 -hinge_s = 7.5 -hinge_t = 5 +hinge_w = 7.5 +hinge_h = 15 +hinge_t = ti_depth - 1 hinge_gap = screw_shaft - 2 * hinge_t - +# The side of the screw head hinge_profile_1 = ( cq.Sketch() - .segment((0, 0), (0, hinge_s)) - .arc((0, hinge_s), (hinge_s / 2, 1.5 * hinge_s), (hinge_s, hinge_s)) - .segment((hinge_s, 0)) + .segment((0, 0), (0, hinge_h)) + .arc((0, hinge_h), (hinge_w / 2, hinge_h + hinge_w / 2), (hinge_w, hinge_h)) + .segment((hinge_w, 0)) .close() - .arc((hinge_s / 2, hinge_s), screw_radius, 0, 360) + .arc((hinge_w / 2, hinge_h), screw_radius, 0, 360) .assemble() ) hinge_profile_2 = ( cq.Sketch() - .segment((0, 0), (0, hinge_s)) - .arc((0, hinge_s), (hinge_s / 2, 1.5 * hinge_s), (hinge_s, hinge_s)) - .segment((hinge_s, 0)) + .segment((0, 0), (0, hinge_h)) + .arc((0, hinge_h), (hinge_w / 2, hinge_h + hinge_w / 2), (hinge_w, hinge_h)) + .segment((hinge_w, 0)) .close() - .arc((hinge_s / 2, hinge_s), ti_radius, 0, 360) + .arc((hinge_w / 2, hinge_h), ti_radius, 0, 360) .assemble() ) -# TODO countersink -# TODO proper threaded insert depth sizing - hinge = ( cq.Workplane("bottom") .placeSketch(hinge_profile_1) @@ -46,4 +44,4 @@ hinge = ( .extrude(hinge_t) ) -exporters.export(hinge, "hinge.stl") +# exporters.export(hinge, "hinge.stl") diff --git a/monitor/lower_arm.py b/monitor/lower_arm.py new file mode 100644 index 0000000..9af55e0 --- /dev/null +++ b/monitor/lower_arm.py @@ -0,0 +1,49 @@ +# This is the arm from the tripod to the "elbow" + +import cadquery2 as cq +from cadquery2 import exporters + +from hinge import hinge_gap, hinge_w + +# monitor hinge dimensions +inner_monitor_hinge = 3.2 / 2 +outer_monitor_hinge = hinge_w / 2 + +# tripod hinge dimensions +inner_tripod_hinge = 7.5 / 2 +outer_tripod_hinge = 17.5 / 2 +tripod_hinge_width = 5.5 + + +monitor_hinge_shape = ( + cq.Sketch().circle(outer_monitor_hinge).circle(inner_monitor_hinge, mode="s") +) + +tripod_hinge_shape = ( + cq.Sketch().circle(outer_tripod_hinge).circle(inner_tripod_hinge, mode="s") +) + +arm_width = min(tripod_hinge_width, hinge_gap) +arm_length = 150 + +lower_arm = ( + cq.Workplane("XY") + .rect(arm_width, arm_width) + .extrude(arm_length) + .edges("|Z or Z") + .fillet(0.25) + .faces(">Y") + # Add hinge that connects to the monitor + .workplane(centerOption="CenterOfBoundBox", offset=(hinge_gap - arm_width) / 2) + .center(0, arm_length / 2 + (outer_monitor_hinge - inner_monitor_hinge)) + .placeSketch(monitor_hinge_shape) + .extrude(-hinge_gap) + .center(0, -(arm_length + outer_tripod_hinge)) + # Undo previous offset + new offset + .workplane(offset=-(hinge_gap - arm_width - tripod_hinge_width + arm_width) / 2) + # Add hinge that connects to the tripod + .placeSketch(tripod_hinge_shape) + .extrude(-tripod_hinge_width) +) + +exporters.export(lower_arm, "lower_arm.stl") diff --git a/monitor/rear_mount.py b/monitor/rear_mount.py index a171641..76ce802 100644 --- a/monitor/rear_mount.py +++ b/monitor/rear_mount.py @@ -10,9 +10,13 @@ screw_head_h = 2.5 screw_head_radius = 3.5 screw_radius = 1.5 +from hinge import hinge_profile_1, hinge_profile_2, hinge_t, hinge_gap, hinge_w reinforcement_height = 1 + 1 + ti_depth - shell_t +rear_mount_thickness = reinforcement_height + screw_head_h + shell_t +rear_mount_width = width / 2 + 2 * shell_t + back_reinforcement_cutout = ( cq.Sketch() .trapezoid(width / 2 + 1, 15 + 1, 90, mode="a") @@ -23,22 +27,25 @@ back_reinforcement_cutout = ( back_reinforcement_outer = ( cq.Sketch() - .trapezoid(width / 2 + 2 * shell_t, 15 + 2 * shell_t, 90, mode="a") + .trapezoid(rear_mount_width, 15 + 2 * shell_t, 90, mode="a") .reset() .vertices() .fillet(2) ) +# FIXME: use counterbore holes function instead + screw_holes = cq.Sketch().rarray(width / 8, 0, 4, 1).circle(screw_radius, mode="a") screw_countersinks = ( cq.Sketch().rarray(width / 8, 0, 4, 1).circle(screw_head_radius, mode="a") ) + rear_mount = ( # Basic filleted box shape cq.Workplane("bottom") .placeSketch(back_reinforcement_outer) - .extrude(reinforcement_height + screw_head_h + shell_t) + .extrude(rear_mount_thickness) .faces(">Y") .workplane(centerOption="CenterOfBoundBox") .placeSketch(back_reinforcement_cutout) @@ -51,6 +58,18 @@ rear_mount = ( .workplane(centerOption="CenterOfBoundBox") .placeSketch(screw_countersinks) .cutBlind(-screw_head_h) + # Hinge integration + .faces(">X") + .workplane(centerOption="CenterOfBoundBox", offset=-(rear_mount_width - 20) / 2) + .transformed(rotate=cq.Vector(0, 0, 90)) + .center(-hinge_w / 2, rear_mount_thickness / 2) + .tag("hingeplane") + .placeSketch(hinge_profile_1) + .extrude(-hinge_t) + .workplaneFromTagged("hingeplane") + .workplane(offset=-hinge_t - hinge_gap) + .placeSketch(hinge_profile_2) + .extrude(-hinge_t) ) exporters.export(rear_mount, "rear_mount.stl") diff --git a/monitor/upper_arm.py b/monitor/upper_arm.py new file mode 100644 index 0000000..012cfda --- /dev/null +++ b/monitor/upper_arm.py @@ -0,0 +1,54 @@ +# This is the arm from the monitor to the "elbow" + +import cadquery2 as cq +from cadquery2 import exporters + +from hinge import hinge_gap, hinge_w, hinge_profile_1, hinge_profile_2, hinge_t + +# monitor hinge dimensions +inner_monitor_hinge = 3.2 / 2 +outer_monitor_hinge = hinge_w / 2 + +monitor_hinge_shape = ( + cq.Sketch().circle(outer_monitor_hinge).circle(inner_monitor_hinge, mode="s") +) + +# Both hinges are the same shape, just one is outer and the other inner +elbow_hinge_shape = ( + cq.Sketch().circle(outer_monitor_hinge).circle(inner_monitor_hinge, mode="s") +) + +arm_length = 150 +arm_width = hinge_gap + +upper_arm = ( + cq.Workplane("XY") + .rect(hinge_w, hinge_gap) + .extrude(arm_length) + .edges("|Z or Z") + .fillet(0.25) + .faces(">Y") + # Add hinge that connects to the monitor + .workplane(centerOption="CenterOfBoundBox") + .center(0, arm_length / 2 + (outer_monitor_hinge - inner_monitor_hinge)) + .placeSketch(monitor_hinge_shape) + .extrude(-hinge_gap) + .center(0, -(arm_length + outer_monitor_hinge)) + # Add hinge that connects to the elbow + .transformed(rotate=cq.Vector(0, 0, 180)) + .workplane(offset=(20 - arm_width) / 2) + .center(-hinge_w / 2, 0) + .tag("hingeplane") + .placeSketch(hinge_profile_1) + .extrude(-hinge_t) + .workplaneFromTagged("hingeplane") + .workplane(offset=-hinge_t - hinge_gap) + .placeSketch(hinge_profile_2) + .extrude(-hinge_t) + .workplaneFromTagged("hingeplane") + .center(+hinge_w / 2, 0) + .rect(hinge_w, hinge_w + 6) + .extrude(-(2 * hinge_t + hinge_gap)) +) + +exporters.export(upper_arm, "upper_arm.stl")