diff --git a/models/flexmount/flexmount.scad b/models/flexmount/flexmount.scad new file mode 100644 index 0000000..5839f51 --- /dev/null +++ b/models/flexmount/flexmount.scad @@ -0,0 +1,199 @@ +// import BOSL2 +include + + + +/* [Hidden] */ +// constants which shouldn't be changed +$fn=100; + +// This is the HomeRacker base unit. don't change this! +BASE_UNIT=15; // mm +// Standard tolerance for the mount. This is a sane default. +TOLERANCE=0.2; // mm +// Base strength. This is a sane default. +BASE_STRENGTH=2; // mm +// Chamfer size. This is a sane default. +CHAMFER=1; // mm +// Lock Pin side length +LOCK_PIN_SIDE=4; // mm +// lock pin edge distance +LOCK_PIN_EDGE_DISTANCE=5.5; // mm + +/* [Device Measurements] */ +// Width of the device in mm. Will determine how far apart the actual mounts are in width. +device_width=100 // [20:0.1:500] +; // TODO test for zero cube +// Depth of the device in mm. Will determine how far apart the actual mounts are in depth. +device_depth=99; // [54:0.1:400] +// Height of the device in mm. Will determine how far apart the actual mounts are in height. +device_height=25.5; // [10:0.1:400] + +/* [Bracket] */ +// Defines the bracket thickness on top of the device. +bracket_strength_top=7.5; // [1:0.1:50] +// Defines how much the bracket will overlap to the sides of the device. +bracket_strength_sides=7.5; // [2:0.1:50] + +// diff_width resembles the gap between the device and the mount. This gap will be filled with a cuboid +modulo_width=(BASE_UNIT - ( device_width + TOLERANCE ) % BASE_UNIT); +WIDTH_DIFF = modulo_width==15 ? 0 : modulo_width; +echo("Diff Width: ", WIDTH_DIFF); +mount_gap_filler_start=(device_width+TOLERANCE)/2; +// echo("mount_gap_filler_start: ", mount_gap_filler_start); +// echo("effective mount distance: ", device_width+WIDTH_DIFF+TOLERANCE); + + +DEPTH_DIFF=device_depth % BASE_UNIT; +echo("Diff Depth: ", DEPTH_DIFF); +mount_offset_depth=(device_depth-DEPTH_DIFF-BASE_UNIT)/2; +echo("mount_offset_depth*2: ", mount_offset_depth*2); + +/* Code */ +// creates a bracket around the device with TOLERANCE as additional space and BASE_STRENGTH as the strength of the bracket +module bracket(width,depth,height) { + // Bracket + outer_width=width+BASE_STRENGTH*2+TOLERANCE; + outer_depth=depth+BASE_STRENGTH*2+TOLERANCE; + outer_height=height+BASE_STRENGTH; + inner_width=width-bracket_strength_top*2+TOLERANCE; + inner_depth=depth-bracket_strength_top*2+TOLERANCE; + bottom_recess_height=height-bracket_strength_sides; + + intersection(){ + difference() { + // Outer + cuboid( + size=[outer_width,outer_depth,outer_height], + anchor=BOTTOM, + chamfer=CHAMFER, edges=[TOP,FRONT,BACK,LEFT,RIGHT], except=[BOTTOM] + ); + // Top Skeleton (cut the middle to leave only a bracket to the sides) + cuboid( + size=[inner_width,inner_depth,outer_height], + anchor=BOTTOM, + chamfer=-CHAMFER, edges=[TOP] + ); + // Bottom Recess (cut the cube to leave only a top bracket) + cuboid( + size=[outer_width,outer_depth,bottom_recess_height], + anchor=BOTTOM + ); + // Subtract Device to from bracket (cut the device into the bracket) + cuboid( + size=[width+TOLERANCE,depth+TOLERANCE,height+TOLERANCE/2], + anchor=BOTTOM + ); + } + // chamfer intersection for the outer bottom chamfer of the bracket + translate([0,0,outer_height]) + cuboid( + size=[outer_width,outer_depth,bracket_strength_sides+BASE_STRENGTH-TOLERANCE/2], + anchor=TOP, + chamfer=CHAMFER, edges=[BOTTOM] + ); + } +} + + +// Mount +module mount(){ + depth=BASE_UNIT+BASE_STRENGTH*2+TOLERANCE; + gap_filler_width=(WIDTH_DIFF)/2; + + // depth translation + translate([0,mount_offset_depth,0]) + + union(){ + + translate([mount_gap_filler_start,0,0]) + // Mount + union(){ + top_width=BASE_STRENGTH; + bottom_width=BASE_UNIT+gap_filler_width; + // Bridge + difference(){ + cuboid_width = bottom_width; + cuboid_chamfer = bottom_width; + prismoid( + size1 = [bottom_width, depth], // Bottom face: width 30, depth 60 + size2 = [top_width, depth], // Top face: becomes a line segment (width 0) + shift = [(-bottom_width+top_width)/2, 0], // Shift top edge center to X=+15 (aligns with right edge of base) + chamfer=CHAMFER, + h = device_height, // Height + //chamfer=CHAMFER/2, + anchor = BOTTOM+LEFT // Anchor bottom left + ); + translate([0,0,BASE_STRENGTH]) + cuboid( + size=[cuboid_width,BASE_UNIT,device_height], + anchor=BOTTOM+LEFT, + chamfer=BASE_UNIT/2, edges=[BOTTOM], except=[RIGHT] + ); + } + + // Depth enforcement + depth_enforcement_x = BASE_STRENGTH; + depth_enforcemnt_y2 = BASE_UNIT*2; + prismoid( + size1 = [depth_enforcement_x, depth], + size2 = [depth_enforcement_x, depth_enforcemnt_y2], + shift = [0, (depth-depth_enforcemnt_y2)/2], + h = device_height, + chamfer=[CHAMFER,0,0,CHAMFER], + anchor = BOTTOM+LEFT + ); + + // Mount Rail with holes + difference(){ + // Mount Rail + difference(){ + height=BASE_UNIT+TOLERANCE/2; + // outer + cuboid( + size=[bottom_width,depth,height], + anchor=TOP+LEFT, + chamfer=CHAMFER, edges=[BOTTOM,RIGHT], except=[TOP] + ); + // support recess + cuboid( + size=[bottom_width,BASE_UNIT+TOLERANCE,height], + anchor=TOP+LEFT + ); + } + // holes + translate([bottom_width-LOCK_PIN_EDGE_DISTANCE,0,-LOCK_PIN_EDGE_DISTANCE-TOLERANCE/2]) + cuboid( + size=[LOCK_PIN_SIDE,depth,LOCK_PIN_SIDE], + anchor=TOP+RIGHT + ); + } + } + } +} + + +module mirror_mount_x_plane(){ + mount(); + x_mirror_plane = [1,0,0]; + mirror(x_mirror_plane) { + mount(); + } +} + +// Assembly +rotate([180,0,0]) +union() { + bracket(device_width,device_depth,device_height); + + // Mount Right + mirror_mount_x_plane(); + + y_mirror_plane = [0,1,0]; + mirror(y_mirror_plane) { + mirror_mount_x_plane(); + } + +} + +