$fn=64; // --- Parameters --- // Wall Plate Dimensions wall_plate_width = 40; wall_plate_thickness = 8; wall_plate_up = 40; // Extension above the arm wall_plate_down = 90; // Extension below the arm // Arm Dimensions arm_length = 130; // Distance from wall to center of hanging hole arm_thickness = 10; arm_base_width = 40; // Width of arm at the wall // Hanging End Dimensions hang_ring_od = 45; // Outer diameter of the hanging end hang_hole_id = 20; // Inner diameter for suspending PlantStack // Gusset (Diagonal Support) gusset_thickness = 8; gusset_length = 90; // How far it extends under the arm gusset_height = 50; // How far it extends down the wall plate // Mounting Holes top_screw_z = 20; bottom_screw_z = -70; screw_hole_d = 5.5; // Clearance for M5 or #10 screw screw_head_d = 12; // Countersink diameter cs_depth = 4; // Countersink depth // --- Module --- module plantstack_bracket() { difference() { // Main Body union() { // Wall Plate translate([-wall_plate_thickness, 0, 0]) { hull() { translate([0, 0, wall_plate_up - wall_plate_width/2]) rotate([0, 90, 0]) cylinder(d=wall_plate_width, h=wall_plate_thickness); translate([0, 0, -wall_plate_down + wall_plate_width/2]) rotate([0, 90, 0]) cylinder(d=wall_plate_width, h=wall_plate_thickness); } } // Horizontal Arm (embedded slightly into wall plate for manifoldness) hull() { translate([-1, -arm_base_width/2, -arm_thickness]) cube([1, arm_base_width, arm_thickness]); translate([arm_length, 0, -arm_thickness]) cylinder(d=hang_ring_od, h=arm_thickness); } // Support Gusset (embedded slightly into wall plate) translate([0, gusset_thickness/2, -arm_thickness - gusset_height]) rotate([90, 0, 0]) linear_extrude(height=gusset_thickness) polygon([ [-1, 0], [-1, gusset_height], [gusset_length, gusset_height] ]); } // --- Subtractions --- // Hanging Hole translate([arm_length, 0, -arm_thickness - 1]) cylinder(d=hang_hole_id, h=arm_thickness + 2); // Top Mounting Hole translate([0, 0, top_screw_z]) { // Screw shaft translate([-wall_plate_thickness - 1, 0, 0]) rotate([0, 90, 0]) cylinder(d=screw_hole_d, h=wall_plate_thickness + 2); // Countersink translate([-cs_depth, 0, 0]) rotate([0, 90, 0]) cylinder(d1=screw_hole_d, d2=screw_head_d, h=cs_depth + 0.01); } // Bottom Mounting Hole translate([0, 0, bottom_screw_z]) { // Screw shaft translate([-wall_plate_thickness - 1, 0, 0]) rotate([0, 90, 0]) cylinder(d=screw_hole_d, h=wall_plate_thickness + 2); // Countersink translate([-cs_depth, 0, 0]) rotate([0, 90, 0]) cylinder(d1=screw_hole_d, d2=screw_head_d, h=cs_depth + 0.01); } } } // Render the bracket plantstack_bracket();