2019-06-08 17:10:47 -04:00
|
|
|
//
|
|
|
|
// 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/>.
|
|
|
|
//
|
|
|
|
|
|
|
|
//
|
|
|
|
//! Toggle switches
|
|
|
|
//
|
2020-02-29 12:52:36 -05:00
|
|
|
include <../utils/core/core.scad>
|
2019-06-08 17:10:47 -04:00
|
|
|
use <nut.scad>
|
|
|
|
use <washer.scad>
|
2020-02-22 14:44:01 -05:00
|
|
|
use <../utils/thread.scad>
|
|
|
|
use <../utils/tube.scad>
|
2019-06-08 17:10:47 -04:00
|
|
|
|
|
|
|
function toggle_part(type) = type[1]; //! Part description
|
|
|
|
function toggle_width(type) = type[2]; //! Body width
|
|
|
|
function toggle_height(type) = type[3]; //! Body height
|
|
|
|
function toggle_depth(type) = type[4]; //! Body depth
|
|
|
|
function toggle_thickness(type)= type[5]; //! Metal thickness
|
|
|
|
function toggle_inset(type) = type[6]; //! How far the metal is inset into the body
|
|
|
|
function toggle_colour(type) = type[7]; //! Body colour
|
|
|
|
function toggle_od(type) = type[8]; //! Barrel outside diameter
|
|
|
|
function toggle_id(type) = type[9]; //! Barrel inside diameter
|
|
|
|
function toggle_thread(type) = type[10]; //! Length of threaded barrel
|
|
|
|
function toggle_collar_d(type) = type[11]; //! Collar diameter
|
|
|
|
function toggle_collar_t(type) = type[12]; //! Collar thickness
|
|
|
|
function toggle_pivot(type) = type[13]; //! Z offset of the pivot point above the top of the body
|
|
|
|
function toggle_angle(type) = type[14]; //! Angle of the paddle
|
|
|
|
function toggle_paddle_l(type) = type[15]; //! Length of the paddle
|
|
|
|
function toggle_paddle_d1(type)= type[16]; //! Diameter at the top of the paddle
|
|
|
|
function toggle_paddle_w(type) = type[17]; //! Width at the top for non-spherical end
|
|
|
|
function toggle_nut(type) = type[18]; //! Nut type
|
|
|
|
function toggle_washer(type) = type[19]; //! Washer type
|
|
|
|
function toggle_pins(type) = type[20]; //! Number of pins
|
|
|
|
function toggle_pin_l(type) = type[21][0]; //! Pin length
|
|
|
|
function toggle_pin_w(type) = type[21][1]; //! Pin width
|
|
|
|
function toggle_pin_t(type) = type[21][2]; //! Pin thickness
|
|
|
|
function toggle_pin_vp(type) = type[21][3]; //! Pin y pitch
|
|
|
|
function toggle_pin_hp(type) = type[21][4]; //! Pin x pitch
|
|
|
|
|
|
|
|
function toggle_hole_radius(type) = toggle_od(type) / 2 + 0.1; //! Radius of the panel hole
|
|
|
|
|
|
|
|
module toggle(type, thickness) { //! Draw specified toggle switch with the nuts and washers positioned for the specified panel thickness
|
|
|
|
vitamin(str("toggle(", type[0], ", 3): Toggle switch ", toggle_part(type)));
|
|
|
|
|
|
|
|
inset = toggle_inset(type);
|
|
|
|
t = toggle_thickness(type);
|
|
|
|
h1 = toggle_depth(type) - t;
|
|
|
|
h2 = toggle_depth(type) - inset;
|
|
|
|
t2 = (toggle_od(type) - toggle_id(type)) / 2;
|
|
|
|
nut = toggle_nut(type);
|
|
|
|
washer = toggle_washer(type);
|
|
|
|
chamfer = t2 / 2;
|
|
|
|
thread = toggle_thread(type);
|
|
|
|
stack = chamfer + nut_thickness(nut) + 3 * washer_thickness(washer) + thickness + toggle_collar_t(type);
|
|
|
|
back_nut = thread - stack > nut_thickness(nut);
|
|
|
|
gap = back_nut ? thread - stack - nut_thickness(nut) : 0;
|
|
|
|
|
|
|
|
module stack()
|
|
|
|
washer(washer)
|
|
|
|
translate_z(thickness)
|
|
|
|
explode(20, true) washer(washer)
|
|
|
|
explode(5, true) star_washer(washer)
|
|
|
|
explode(5) nut(nut);
|
|
|
|
|
|
|
|
translate_z(-washer_thickness(washer) - (back_nut ? nut_thickness(nut) : 0) - gap - toggle_collar_t(type)) {
|
|
|
|
color(toggle_colour(type))
|
|
|
|
translate_z(-h1 / 2 - t)
|
|
|
|
cube([toggle_width(type), toggle_height(type), h1], center = true);
|
|
|
|
|
2020-02-22 14:44:01 -05:00
|
|
|
if(show_threads) {
|
|
|
|
d = toggle_od(type);
|
|
|
|
pitch = inch(1/40);
|
|
|
|
h = 5 * pitch * sqrt(3) / 16;
|
|
|
|
|
|
|
|
male_metric_thread(d, pitch, thread, center = false, solid = false, colour = silver);
|
|
|
|
|
|
|
|
color(silver)
|
|
|
|
tube(or = d / 2 - h, ir = toggle_id(type) / 2, h = thread, center = false);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
color(silver)
|
|
|
|
rotate_extrude()
|
|
|
|
difference() {
|
|
|
|
hull() {
|
|
|
|
square([toggle_od(type) / 2, thread - chamfer]);
|
|
|
|
|
|
|
|
square([toggle_od(type) / 2 - chamfer, thread]);
|
|
|
|
}
|
|
|
|
square([toggle_id(type) / 2, thread + 1]);
|
|
|
|
}
|
|
|
|
|
|
|
|
color(silver) {
|
2019-06-08 17:10:47 -04:00
|
|
|
if(toggle_collar_t(type))
|
|
|
|
cylinder(d = toggle_collar_d(type), h = toggle_collar_t(type));
|
|
|
|
|
|
|
|
translate_z(-t / 2)
|
|
|
|
cube([toggle_width(type), toggle_height(type), t], center = true);
|
|
|
|
|
|
|
|
translate_z(-h2 / 2)
|
|
|
|
cube([toggle_width(type) + 2 * eps, toggle_height(type) - 2 * inset, h2], center = true);
|
|
|
|
|
|
|
|
|
|
|
|
translate_z(toggle_pivot(type)) {
|
|
|
|
angle = toggle_angle(type);
|
|
|
|
l1 = toggle_paddle_l(type);
|
|
|
|
l2 = toggle_thread(type) - toggle_pivot(type);
|
|
|
|
l = l1 + l2;
|
|
|
|
sphere(d = toggle_id(type));
|
|
|
|
|
|
|
|
d1 = toggle_paddle_d1(type);
|
|
|
|
d2 = toggle_id(type) - 2 * l2 * tan(abs(angle));
|
|
|
|
d3 = d2 - (d1 - d2) * l2 / l1;
|
|
|
|
|
|
|
|
hull() {
|
|
|
|
rotate([max(angle, 0), 0, 0])
|
|
|
|
if(toggle_paddle_w(type))
|
|
|
|
translate_z(l)
|
2020-03-29 15:18:57 -04:00
|
|
|
linear_extrude(eps, center = true)
|
2019-06-08 17:10:47 -04:00
|
|
|
intersection() {
|
|
|
|
circle(d = d1);
|
|
|
|
|
|
|
|
square([d1 + 1, toggle_paddle_w(type)], center = true);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
translate_z(l - d1 / 2) sphere(d = d1);
|
|
|
|
|
|
|
|
rotate([max(angle, 0), 0, 0])
|
|
|
|
translate_z(l2)
|
|
|
|
cylinder(d = d2, h = eps);
|
|
|
|
|
|
|
|
sphere(d = d3);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
pins = toggle_pins(type);
|
|
|
|
rows = pins > 3 ? 2 : 1;
|
|
|
|
color("gold")
|
|
|
|
translate_z(-toggle_depth(type) - toggle_pin_l(type) / 2)
|
2020-03-29 15:18:57 -04:00
|
|
|
linear_extrude(toggle_pin_l(type), center = true)
|
2019-06-08 17:10:47 -04:00
|
|
|
for(i = [0 : pins - 1]) {
|
|
|
|
x = rows < 2 ? 0 : (i % 2) - 0.5;
|
|
|
|
y = rows < 2 ? i - 1 : floor(i / 2) - 1;
|
|
|
|
translate([x * toggle_pin_hp(type), y * toggle_pin_vp(type)])
|
|
|
|
square([toggle_pin_w(type), toggle_pin_t(type)], center = true);
|
|
|
|
}
|
|
|
|
|
|
|
|
not_on_bom()
|
|
|
|
translate_z(gap + toggle_collar_t(type))
|
|
|
|
if(back_nut)
|
|
|
|
nut(nut) stack();
|
|
|
|
else
|
|
|
|
stack();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
module toggle_hole(type, h = 100) //! Drill the hole in a panel
|
|
|
|
drill(toggle_hole_radius(type), h);
|