2020-04-13 13:06:09 -04:00
|
|
|
//
|
|
|
|
// 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/>.
|
|
|
|
//
|
|
|
|
|
|
|
|
//
|
|
|
|
//! Dual inline IC packages and sockets
|
|
|
|
//
|
|
|
|
include <../utils/core/core.scad>
|
|
|
|
|
|
|
|
pdip_pin = [0.25, 2.54, 0.5, 3.0, 1.524, 1];
|
|
|
|
|
|
|
|
function pdip_pin_t(type) = type[0]; //! Pin thickness
|
|
|
|
function pdip_pin_s(type) = type[1]; //! Height above seating plane
|
|
|
|
function pdip_pin_w(type) = type[2]; //! Pin width
|
|
|
|
function pdip_pin_h(type) = type[3]; //! Pin height
|
|
|
|
function pdip_pin_W(type) = type[4]; //! Pin shoulder width
|
|
|
|
function pdip_pin_n(type) = type[5]; //! Pin neck
|
|
|
|
|
|
|
|
module pdip_pin(type, l, end) { //! Draw a pin
|
|
|
|
w = pdip_pin_w(type);
|
|
|
|
t = pdip_pin_t(type);
|
|
|
|
h = pdip_pin_h(type);
|
|
|
|
W = pdip_pin_W(type);
|
|
|
|
s = pdip_pin_s(type);
|
|
|
|
n = pdip_pin_n(type);
|
|
|
|
slope = (W - n);
|
|
|
|
r = t;
|
|
|
|
x0 = end < 0 ? -w / 2 : -W / 2;
|
|
|
|
n0 = end < 0 ? -w / 2 : -n / 2;
|
|
|
|
W1 = end != 0 ? W / 2 + w / 2 : W;
|
|
|
|
n1 = end != 0 ? n / 2 + w / 2 : n;
|
|
|
|
color("silver") {
|
|
|
|
translate([x0, -r - t / 2 - l, s - t / 2])
|
|
|
|
cube([W1, l, t]);
|
|
|
|
|
|
|
|
translate([x0, -r - t / 2, s - r - t / 2])
|
|
|
|
rotate([90, 0, 90])
|
|
|
|
rotate_extrude(angle = 90, $fn = 32)
|
|
|
|
translate([r, 0])
|
|
|
|
square([t, W1]);
|
|
|
|
|
|
|
|
translate_z(-h)
|
|
|
|
rotate([90, 0, 0])
|
|
|
|
linear_extrude(t, center = true) {
|
|
|
|
|
|
|
|
translate([-w / 2, 0])
|
|
|
|
square([w, h]);
|
|
|
|
|
|
|
|
hull() {
|
|
|
|
translate([x0, h + slope])
|
|
|
|
square([W1, s - t / 2 - r - slope]);
|
|
|
|
|
|
|
|
translate([n0, h])
|
|
|
|
square([n1, eps]);
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
module dil_pin_positions(rows, w, pitch)
|
|
|
|
for(i = [0 : rows - 1], $side = [-1, 1], $x = i * pitch - (rows - 1) * pitch / 2)
|
|
|
|
translate([0, $x])
|
|
|
|
rotate($side * 90)
|
|
|
|
translate([0, w / 2])
|
|
|
|
children();
|
|
|
|
|
|
|
|
module dil_socket(rows, w, pitch = inch(0.1)) {
|
|
|
|
vitamin(str("dil_socket(", rows, ", ", w, arg(pitch, inch(0.1), "pitch"), "): DIL socket ", rows * 2, " x ", w / inch(1), "\""));
|
|
|
|
|
|
|
|
h = 4;
|
|
|
|
h2 = 6;
|
|
|
|
t = 0.8;
|
|
|
|
length = rows * pitch;
|
|
|
|
width = w + pitch;
|
|
|
|
hole = [0.8, 0.5];
|
|
|
|
pin_l = 3;
|
|
|
|
|
2020-06-20 05:17:29 -04:00
|
|
|
color(grey(20)) {
|
2020-04-13 13:06:09 -04:00
|
|
|
linear_extrude(h)
|
|
|
|
difference() {
|
|
|
|
square([width, length], center = true);
|
|
|
|
|
|
|
|
square([w - pitch, length - 2 * pitch], center = true);
|
|
|
|
|
|
|
|
dil_pin_positions(rows, w, pitch)
|
|
|
|
square(hole, center = true);
|
|
|
|
|
|
|
|
translate([0, rows * pitch / 2])
|
|
|
|
circle(d = 1.5);
|
|
|
|
}
|
|
|
|
rotate([90, 0, 0])
|
|
|
|
linear_extrude(length, center = true)
|
|
|
|
for(side = [-1, 1])
|
|
|
|
hull() {
|
|
|
|
t2 = pitch / 2 - hole.y / 2;
|
|
|
|
translate([side * (width / 2 - t / 2) - t / 2, 0])
|
|
|
|
square([t, h2]);
|
|
|
|
|
|
|
|
translate([side * (width / 2 - t2 / 2) - t2 / 2, 0])
|
|
|
|
square([t2, h]);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
color("silver")
|
|
|
|
dil_pin_positions(rows, w, pitch)
|
|
|
|
translate_z(-pin_l / 2)
|
|
|
|
cube([0.5, 0.25, pin_l], center = true);
|
|
|
|
|
|
|
|
translate_z(h)
|
|
|
|
children();
|
|
|
|
}
|
|
|
|
|
|
|
|
module dip(n, part, size, w, pitch, pin) { //! Draw DIP package
|
|
|
|
D = [3, 0.6];
|
|
|
|
|
|
|
|
translate_z(pdip_pin_s(pin)) {
|
2020-06-20 05:17:29 -04:00
|
|
|
color(grey(20)) {
|
2020-04-13 13:06:09 -04:00
|
|
|
rotate([90, 0, 0])
|
|
|
|
linear_extrude(size.x, center = true)
|
|
|
|
difference() {
|
|
|
|
hull() {
|
|
|
|
square([size.y, pdip_pin_t(pin)], center = true);
|
|
|
|
|
|
|
|
square([size.y - 1, size.z], center = true);
|
|
|
|
}
|
|
|
|
square([D.x + 1, size.z + 1], center = true);
|
|
|
|
}
|
|
|
|
|
|
|
|
translate_z(-D.y / 2)
|
|
|
|
cube([D.x + 1 + eps, size.x, size.z - D.y], center = true);
|
|
|
|
|
|
|
|
linear_extrude(size.z / 2)
|
|
|
|
difference() {
|
|
|
|
square([D.x + 1 + eps, size.x], center = true);
|
|
|
|
|
|
|
|
translate([0, size.x / 2])
|
|
|
|
circle(d = D.x);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
color("white")
|
|
|
|
translate([0, -D.x / 4, size.z / 2])
|
|
|
|
rotate(-90)
|
|
|
|
linear_extrude(eps)
|
|
|
|
resize([(size.x - D.x / 2) * 0.75, size.y / 3])
|
|
|
|
text(part, halign = "center", valign = "center");
|
|
|
|
}
|
|
|
|
|
|
|
|
l = size.x / 2 - pdip_pin_W(pin) / 2;
|
|
|
|
dil_pin_positions(n, w, pitch)
|
|
|
|
pdip_pin(pin, w / 2, $side * (abs($x) > l ? sign($x) : 0));
|
|
|
|
}
|
|
|
|
|
|
|
|
module pdip(pins, part, socketed, w = inch(0.3), pitch = inch(0.1)) { //! Draw standard 0.1" PDIP IC package
|
|
|
|
vitamin(str("pdip(", pins, ", ", part, arg(w, inch(0.3), "w"), arg(pitch, inch(0.1), "pitch"),"): IC ", part, " PDIP", pins));
|
|
|
|
n = ceil(pins / 2);
|
|
|
|
k = in([4, 8], n) ? n - 1 : n;
|
|
|
|
length = k * pitch + pitch / 2;
|
|
|
|
width = w - pitch / 2;
|
|
|
|
height = 3;
|
|
|
|
if(socketed)
|
|
|
|
dil_socket(n, w, pitch)
|
|
|
|
dip(n, part, [length, width, height], w, pitch, pdip_pin);
|
|
|
|
else
|
|
|
|
dip(n, part, [length, width, height], w, pitch, pdip_pin);
|
|
|
|
}
|