$fn = 64; // --- Parametric Variables --- clamp_gap = 12; // Width of the slot to clamp onto pot/tray edge arm_width = 16; // Thickness (Z-height) of the arms joint_radius = 10; // Radius of the articulating joints hole_dia = 5.5; // Diameter of bolt holes (M5 clearance) lower_arm_length = 100; // Length of the first arm segment upper_arm_length = 80; // Length of the second arm segment // Note: The design uses support-free half-lap joints. // During assembly, simply flip every other part upside down to mate them. // --- Layout for 3D Printing --- translate([40, 0, 0]) clamp_base(); translate([0, 35, 0]) arm_segment(lower_arm_length); translate([0, 65, 0]) arm_segment(upper_arm_length); translate([0, 105, 0]) light_mount(); // --- Modules --- // Standardized cutout to create the half-lap joint module joint_cutout() { // 0.2mm tolerance added to prevent binding when tightened translate([0, 0, arm_width/2 - 0.2]) cylinder(r=joint_radius + 1, h=arm_width/2 + 2); } // Base that clamps to the edge of a pot or tray module clamp_base() { difference() { union() { // Main clamp body translate([-20, 0, arm_width/2]) cube([40, 35, arm_width], center=true); // Joint cylinder cylinder(r=joint_radius, h=arm_width); } // Joint cutouts joint_cutout(); translate([0, 0, -1]) cylinder(d=hole_dia, h=arm_width+2); // Slot for pot/tray edge translate([-25, 0, arm_width/2]) cube([20, clamp_gap, arm_width + 2], center=true); // Set screw hole for tightening against the edge translate([-20, -17.5, arm_width/2]) rotate([90, 0, 0]) cylinder(d=hole_dia, h=25, center=true); } } // Reusable articulating arm segment module arm_segment(length) { difference() { // Arm body hull() { cylinder(r=joint_radius, h=arm_width); translate([length, 0, 0]) cylinder(r=joint_radius, h=arm_width); } // Joint cutouts at both ends joint_cutout(); translate([length, 0, 0]) joint_cutout(); // Bolt holes translate([0, 0, -1]) cylinder(d=hole_dia, h=arm_width+2); translate([length, 0, -1]) cylinder(d=hole_dia, h=arm_width+2); } } // Flat plate for mounting the LED grow light module light_mount() { difference() { union() { // Joint cylinder cylinder(r=joint_radius, h=arm_width); // Mounting plate translate([0, -25, 0]) cube([50, 50, 4]); } // Joint cutouts joint_cutout(); translate([0, 0, -1]) cylinder(d=hole_dia, h=arm_width+2); // Mounting slots for zip-ties or screws for(y = [12, -12]) { hull() { translate([20, y, -1]) cylinder(d=hole_dia, h=10); translate([40, y, -1]) cylinder(d=hole_dia, h=10); } } } }