// ============================================ // Tapo Ceiling Mount - Nut Fit Test // ============================================ // A small coupon with four captive-nut pockets side by side. Each pocket has // its own across-flats offset from m4_nut_flats (see fit_test_tols). Notches in // the front edge number the pockets: 1 notch = pocket 1, 4 notches = pocket 4. // Each pocket copies the clamp pocket: same boss, wall, depth, lead-in chamfer // and screw hole. // // Print it with the clamp material and settings. Press an M4 nut into each // pocket. Choose the tightest pocket that takes the nut fully (thumb, pliers // or a screw pull) and holds it upside down. Set nut_pocket_tol to its offset. // // Print it the same way as the clamps: pocket mouths on the bed. The exported // STL (tapo_nut_fit_test_print) is already turned over. The web between the // bosses prints as short bridges. No support material is needed. parameters_only = false; include ; /* [Nut Fit Test] */ // Across-flats offsets of pockets 1 to 4 from m4_nut_flats (mm). fit_test_tols = [-0.25, -0.2, -0.15, -0.1]; // Floor thickness under each pocket (mm). fit_test_floor = 2; // [1:0.2:4] // Thickness of the web that joins the bosses (mm). Keep it under the floor so // the pocket walls stand free, as on the clamp. fit_test_web_t = 1.2; // [0.6:0.2:2] ft_n = len(fit_test_tols); ft_h = fit_test_floor + nut_pocket_depth; ft_r = clamp_boss_d / 2; ft_pitch = clamp_boss_d + 3; ft_front = ft_r + 4; for (i = [0 : ft_n - 1]) echo(str("Fit test pocket ", i + 1, ": offset ", fit_test_tols[i], " mm, ", m4_nut_flats + fit_test_tols[i], " mm across flats")); module tapo_nut_fit_test() { difference() { union() { linear_extrude(fit_test_web_t) round2d(2) translate([-ft_r - 2, -ft_front]) square([(ft_n - 1) * ft_pitch + 2 * ft_r + 4, ft_front + ft_r + 2]); for (i = [0 : ft_n - 1]) translate([i * ft_pitch, 0, 0]) cylinder(d = clamp_boss_d, h = ft_h); } for (i = [0 : ft_n - 1]) translate([i * ft_pitch, 0, 0]) { clamp_nut_cut(m4_nut_flats + fit_test_tols[i], ft_h); for (k = [0 : i]) translate([(k - i / 2) * 2 - 0.5, -ft_front - 1, -1]) cube([1, 3, fit_test_web_t + 2]); } } } // The coupon turned over, pocket mouths on the bed, like the printed clamps. module tapo_nut_fit_test_print() { intersection() { translate([0, 0, ft_h - 1e-5]) mirror([0, 0, 1]) tapo_nut_fit_test(); translate([-500, -500, 0]) cube(1000); } } tapo_nut_fit_test();