NopSCADlib/vitamins/sk_bracket.scad

124 lines
4.8 KiB
OpenSCAD

//
// NopSCADlib Copyright Chris Palmer 2020
// nop.head@gmail.com
// hydraraptor.blogspot.com
//
// This file is part of NopSCADlib.
//
// NopSCADlib is free software: you can redistribute it and/or modify it under the terms of the
// GNU General Public License as published by the Free Software Foundation, either version 3 of
// the License, or (at your option) any later version.
//
// NopSCADlib is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
// without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
// See the GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License along with NopSCADlib.
// If not, see <https://www.gnu.org/licenses/>.
//
//! SK shaft support brackets
//
include <../core.scad>
include <../utils/fillet.scad>
use <washer.scad>
sk_bracket_colour = grey(70);
function sk_diameter(type) = type[1]; //! Rod hole diameter
function sk_hole_offset(type) = type[2]; //! Rod hole offset
function sk_size(type) = [type[4],type[6],type[5]]; //! Size of bracket
function sk_base_height(type) = type[7]; //! Height of base containing the screws
function sk_screw_separation(type) = type[9]; //! Separation of screws in the base
module sk_bracket(type) { //! SK shaft support bracket
vitamin(str("sk_bracket(", type[0], "): SK", sk_diameter(type), " shaft support bracket"));
d = sk_diameter(type);
h = sk_hole_offset(type);
E = type[3];
W = sk_size(type)[0];
L = sk_size(type)[2];
F = sk_size(type)[1];
G = sk_base_height(type);
P = type[8];
B = sk_screw_separation(type);
S = type[10];
bolthole_radius = type[11];
color(sk_bracket_colour) {
translate([0 , -h, 0]) {
fillet = 0.5;
rotate([-90, 0, 0])
linear_extrude(G)
difference() {
translate([-(W - 2*fillet) / 2, -L / 2, 0])
square([W - 2 * fillet, L]);
translate([-B / 2, 0])
circle(r = bolthole_radius);
translate([B / 2, 0])
circle(r = bolthole_radius);
}
for(x = [W / 2 - 2 * fillet, -W / 2 + 2 * fillet])
translate([x, G / 2, 0])
rounded_rectangle([4 * fillet, G, L], fillet);
}
translate([0, -h, -L /2])
linear_extrude(L) {
fillet = 0.75;
difference() {
translate([-P / 2, 0])
rounded_square([P, F], fillet, center = false);
cut_width = 1;
translate([-cut_width / 2, h + cut_width])
square([cut_width, F - h]);
translate([0, h])
circle(d = d);
}
translate([P/2,G])
fillet(fillet, 0);
translate([-P/2,G])
rotate(90)
fillet(fillet, 0);
}
}
// Add the retaining bolt. No hole was cut, since it is only for display.
color(grey(20))
translate([P / 2 - screw_head_height(M3_cap_screw) / 2, (F - h + d / 2) / 2, 0])
rotate([0,90,0])
not_on_bom() no_explode()
screw(M3_cap_screw, P - screw_head_height(M3_cap_screw) / 2 + eps);
}
module sk_bracket_hole_positions(type) { //! Place children at hole positions
for (x = [-sk_screw_separation(type), sk_screw_separation(type)])
translate([x / 2, sk_base_height(type) - sk_hole_offset(type), 0])
rotate([-90, 0, 0])
children();
}
module sk_bracket_assembly(type, part_thickness = 2, screw_type = M5_cap_screw, nut_type = undef, max_screw_depth = 6) { //! Assembly with fasteners in place
sk_bracket(type);
screw_type = is_undef(screw_type) ? scs_screw(type) : screw_type;
screw_washer_thickness = washer_thickness(screw_washer(screw_type));
nut_type = is_undef(nut_type) ? screw_nut(screw_type) : nut_type;
nut_washer_type = nut_washer(nut_type);
nut_washer_thickness = nut_washer_type ? washer_thickness(nut_washer_type) : 0;
nut_offset = sk_base_height(type) + part_thickness;
screw_length = max_screw_depth ? screw_shorter_than(sk_base_height(type) + screw_washer_thickness + max_screw_depth)
: screw_longer_than(nut_offset + screw_washer_thickness + nut_washer_thickness + nut_thickness(nut_type));
sk_bracket_hole_positions(type) {
screw_and_washer(screw_type, screw_length);
translate_z(-nut_offset)
vflip()
if(nut_washer_type)
nut_and_washer(nut_type);
else
sliding_t_nut(nut_type);
}
}