NopSCADlib/vitamins/module.scad

145 lines
5.0 KiB
OpenSCAD

//
// NopSCADlib Copyright Chris Palmer 2018
// 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/>.
//
//
//! Random screw down modules. Currently just DROK buck converters.
//
include <../core.scad>
function mod_part(type) = type[1]; //! Description
function mod_length(type) = type[2]; //! Body length
function mod_width(type) = type[3]; //! Body width
function mod_height(type) = type[4]; //! Body height
function mod_screw(type) = type[5]; //! Screw type
function mod_screw_z(type)= type[6]; //! Thickness of screw lug
function mod_hole_r(type) = type[7] / 2; //! Screw hole radius
function mod_holes(type) = type[8]; //! Screw hole positions
module mod(type) { //! Draw specified module
vitamin(str("mod(", type[0], "): ", mod_part(type)));
module drok_buck() {
l = mod_length(type);
w = mod_width(type);
h = mod_height(type);
body_l = 31;
end_t = 1.5;
chamfer = 2;
lug_l = (l - body_l) / 2 - end_t;
lug_w = 19;
lug_w2 = 10;
lug_t = 2;
lug_r = 2.5;
hole_r = mod_hole_r(type);
vane_t = 1;
vane_h = 5;
vane_l = 7;
vane_p = 10;
boss_od = 7.5;
boss_id = 5;
boss_h = 2.3;
boss_chamfer = 1;
module profile()
hull() {
translate([-w / 2, 0])
square([w, h - chamfer]);
translate([-w / 2 + chamfer, 0])
square([w - 2 * chamfer, h]);
}
module lug()
difference() {
hull() {
for(side = [-1, 1])
translate([side * lug_w2 / 2, lug_l - lug_r])
circle(lug_r);
translate([-lug_w / 2, -1])
square([lug_w, 1]);
}
hull()
for(y = [hole_r, 100])
translate([0, y])
circle(hole_r);
}
color("silver")
rotate([90, 0, 90])
linear_extrude(body_l, center = true)
profile();
color(grey(20))
for(end = [-1, 1])
translate([end * body_l / 2, 0, 0])
rotate([90, 0, end * 90])
union() {
linear_extrude(end_t) // endcap
profile();
translate_z(end_t)
rotate([90, 0, 180])
linear_extrude(lug_t) // lug
lug();
for(side = [-1, 1]) {
translate([side * vane_p / 2, lug_t, end_t]) // buttress vanes
rotate([0, -90, 0])
linear_extrude(vane_t, center = true)
polygon([[0, 0], [0, vane_h - lug_t], [vane_l, 0]]);
translate([side * vane_p / 2, h / 2, end_t]) // bosses
rotate_extrude()
difference() {
hull() {
square([boss_od / 2,boss_h - boss_chamfer]);
square([boss_od / 2 - boss_chamfer, boss_h]);
}
translate([0, boss_h - boss_chamfer])
square([boss_id / 2, boss_h]);
}
}
}
}
drok_buck();
}
module mod_screw_positions(type) //! Position children at the screw positions
for(p = mod_holes(type))
translate([p.x, p.y])
children();
module module_assembly(type, thickness) { //! Module with its fasteners in place
screw = mod_screw(type);
screw_length = screw_length(screw, thickness + mod_screw_z(type), 2, nyloc = true);
mod(type);
mod_screw_positions(type) {
translate_z(mod_screw_z(type))
nut_and_washer(screw_nut(screw), true);
translate_z(-thickness)
vflip()
screw_and_washer(screw, screw_length);
}
}