Compare commits
38 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
a7d181ffc4 | ||
|
6b2f8d282b | ||
|
5bb95b2406 | ||
|
dc3905b284 | ||
|
bd2ea3f284 | ||
|
7f9122ae66 | ||
|
93b260b7b9 | ||
|
c33876530e | ||
|
8fea8f437b | ||
|
bc3ef607af | ||
|
6bcdc24cd3 | ||
|
b8b4232882 | ||
|
0394d9981f | ||
|
e4e7096e3c | ||
|
d71bb4bdfa | ||
|
89c3767f21 | ||
|
c837de721d | ||
|
f8c87bd8e3 | ||
|
ef58fe5818 | ||
|
9c0c0c0acf | ||
|
ac6e8e040a | ||
|
accf4f7bc1 | ||
|
6bd4638e7d | ||
|
4cca9d5285 | ||
|
c3fc352288 | ||
|
a8b634de39 | ||
|
1a55a08c59 | ||
|
8ca4bb5adc | ||
|
53e3378efe | ||
|
888199f698 | ||
|
f51e93969d | ||
|
757b808f07 | ||
|
eca8f2eccc | ||
|
b74cbee151 | ||
|
9f7efd50fb | ||
|
0b14d3fbc4 | ||
|
1a2e04367d | ||
|
abc38f2744 |
@@ -182,7 +182,7 @@ This is achieved by having a pair of modules: -
|
||||
}
|
||||
|
||||
module handle_fastened_assembly(thickness) { //! Assembly with fasteners in place
|
||||
screw_length = screw_longer_than(thickness + insert_length(insert) + 2 * washer_thickness(screw_washer(screw)));
|
||||
screw_length = screw_length(screw, thickness, 2, true, longer = true);
|
||||
|
||||
handle_assembly();
|
||||
|
||||
|
BIN
libtest.png
Before Width: | Height: | Size: 862 KiB After Width: | Height: | Size: 870 KiB |
@@ -118,6 +118,7 @@ use <tests/foot.scad>
|
||||
use <tests/handle.scad>
|
||||
use <tests/PCB_mount.scad>
|
||||
use <tests/printed_box.scad>
|
||||
use <tests/printed_pulleys.scad>
|
||||
use <tests/ribbon_clamp.scad>
|
||||
use <tests/screw_knob.scad>
|
||||
use <tests/socket_box.scad>
|
||||
@@ -170,6 +171,9 @@ translate([x5, cable_grommets_y + 370])
|
||||
translate([x5 + 60, cable_grommets_y + 200])
|
||||
strap_handles();
|
||||
|
||||
translate([640, cable_grommets_y + 200])
|
||||
printed_pulley_test();
|
||||
|
||||
translate([x5, cable_grommets_y + 250])
|
||||
handle();
|
||||
|
||||
|
@@ -75,9 +75,9 @@ function box_corner_overlap(type) = box_wall(type);
|
||||
function box_corner_rad(type) = box_sheet_slot(type) - sheet_slot_clearance / 2 + box_corner_gap(type) + box_corner_overlap(type);
|
||||
function box_sheet_r(type) = box_corner_rad(type) - box_sheet_slot(type) - box_corner_overlap(type);
|
||||
|
||||
function box_screw_length(type, top) = screw_longer_than(2 * washer_thickness(box_washer(type))
|
||||
+ sheet_thickness(top ? box_top_sheet(type) : box_base_sheet(type))
|
||||
+ box_corner_gap(type) + box_profile_overlap(type) + box_insert_l(type) - 1);
|
||||
function box_screw_length(type, top) =
|
||||
let(s = top ? box_top_sheet(type) : box_base_sheet(type))
|
||||
screw_length(box_screw(type), sheet_thickness(s) + box_corner_gap(type) + box_profile_overlap(type) - 1, washers = 2, insert = true, longer = true);
|
||||
|
||||
function box_wall_clearance(type) = box_sheet_slot(type) / 2 - sheet_thickness(box_sheets(type)) / 2;
|
||||
function box_margin(type) = box_profile_overlap(type) + box_corner_gap(type); //! How much the bezel intrudes on the specified height
|
||||
|
@@ -68,7 +68,7 @@ function cam_screw_length(cam) = let(
|
||||
front = cam_front_size(cam),
|
||||
screw = pcb_screw(camera_pcb(cam)),
|
||||
nut = screw_nut(screw)
|
||||
) screw_longer_than(front.z + washer_thickness(screw_washer(screw)) - nut_trap_depth(nut) + nut_thickness(nut, true));
|
||||
) screw_length(screw, front.z - nut_trap_depth(nut), 1, nyloc = true);
|
||||
|
||||
function hinge_z(cam) = cam_screw_length(cam) - hinge_r;
|
||||
|
||||
@@ -344,9 +344,8 @@ module camera_fastened_assembly(cam, thickness, angle = 0) {
|
||||
camera_bracket_position(cam)
|
||||
camera_bracket_screw_positions(cam) {
|
||||
nut = screw_nut(bracket_screw);
|
||||
washer = screw_washer(bracket_screw);
|
||||
t = bracket_thickness(cam);
|
||||
screw_length = screw_longer_than(thickness + t + nut_thickness(nut, true) + 2 * washer_thickness(washer));
|
||||
screw_length = screw_length(bracket_screw, thickness + t, 2, nyloc = true);
|
||||
vflip()
|
||||
translate_z(thickness)
|
||||
screw_and_washer(bracket_screw, screw_length);
|
||||
|
@@ -133,12 +133,10 @@ assembly(str("corner_block_M", 20 * screw_radius(screw))) {
|
||||
module fastened_corner_block_assembly(thickness, screw = def_screw, thickness_below = undef, thickness_side2 = undef, name = false, show_block = true, star_washers = true) { //! Printed block with all fasteners
|
||||
thickness2 = !is_undef(thickness_below) ? thickness_below : thickness;
|
||||
thickness3 = !is_undef(thickness_side2) ? thickness_side2 : thickness;
|
||||
washer = screw_washer(screw);
|
||||
insert = screw_insert(screw);
|
||||
function screw_length(t) = screw_shorter_than((star_washers ? 2 : 1) * washer_thickness(washer) + t + insert_length(insert) + overshoot);
|
||||
screw_length = screw_length(thickness);
|
||||
screw_length2 = screw_length(thickness2);
|
||||
screw_length3 = screw_length(thickness3);
|
||||
function screw_len(t) = screw_length(screw, t + overshoot, star_washers ? 2 : 1, true);
|
||||
screw_length = screw_len(thickness);
|
||||
screw_length2 = screw_len(thickness2);
|
||||
screw_length3 = screw_len(thickness3);
|
||||
|
||||
if(show_block)
|
||||
corner_block_assembly(screw, name) children();
|
||||
|
@@ -136,8 +136,7 @@ module door_hinge_assembly(top, door_thickness = 6) { //! The moving assembly th
|
||||
dir = top ? -1 : 1;
|
||||
pin_x = door_hinge_pin_x();
|
||||
pin_y = door_hinge_pin_y();
|
||||
washer = screw_washer(screw);
|
||||
screw_length = screw_shorter_than(thickness + door_thickness + washer_thickness(washer));
|
||||
screw_length = screw_length(screw, thickness + door_thickness, 1);
|
||||
|
||||
translate([0, pin_y - (thickness + door_thickness / 2), dir * width / 2]) {
|
||||
rotate([90, 0, 180])
|
||||
@@ -148,20 +147,20 @@ module door_hinge_assembly(top, door_thickness = 6) { //! The moving assembly th
|
||||
screw_and_washer(screw, screw_length);
|
||||
}
|
||||
|
||||
translate([pin_x, pin_y, top ? 0 : -washer_thickness(screw_washer(pin_screw))])
|
||||
washer(screw_washer(pin_screw));
|
||||
washer = screw_washer(pin_screw);
|
||||
wt = washer_thickness(washer);
|
||||
translate([pin_x, pin_y, top ? 0 : -wt])
|
||||
washer(washer);
|
||||
|
||||
translate([pin_x, pin_y, top ? washer_thickness(screw_washer(pin_screw)) + stat_width : width])
|
||||
screw_and_washer(pin_screw, screw_longer_than(2 * washer_thickness(screw_washer(pin_screw)) + width + stat_width));
|
||||
translate([pin_x, pin_y, top ? wt + stat_width : width])
|
||||
screw_and_washer(pin_screw, screw_length(pin_screw, width + stat_width, 2, longer = true));
|
||||
}
|
||||
|
||||
module door_hinge_static_assembly(top, sheet_thickness = 3) { //! The stationary assembly
|
||||
dir = top ? -1 : 1;
|
||||
pin_x = door_hinge_pin_x();
|
||||
|
||||
stat_washer = screw_washer(stat_screw);
|
||||
stat_nut = screw_nut(stat_screw);
|
||||
stat_screw_length = screw_longer_than(thickness + sheet_thickness + 2 * washer_thickness(stat_washer) + nut_thickness(stat_nut, true));
|
||||
stat_screw_length = screw_length(stat_screw, thickness + sheet_thickness, 2, nyloc = true);
|
||||
|
||||
translate([pin_x, 0, -dir * (stat_width / 2 + washer_thickness(screw_washer(pin_screw)))])
|
||||
rotate([90, 0, 0]) {
|
||||
@@ -169,9 +168,10 @@ module door_hinge_static_assembly(top, sheet_thickness = 3) { //! The stationary
|
||||
|
||||
door_hinge_stat_hole_positions() {
|
||||
screw_and_washer(stat_screw, stat_screw_length);
|
||||
|
||||
translate_z(-thickness - sheet_thickness)
|
||||
vflip()
|
||||
nut_and_washer(stat_nut, true);
|
||||
nut_and_washer(screw_nut(stat_screw), true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -61,7 +61,7 @@ module door_latch_assembly(sheet_thickness = 3) { //! The assembly for a specifi
|
||||
washer = screw_washer(screw);
|
||||
nut = screw_nut(screw);
|
||||
|
||||
screw_length = screw_longer_than(height - nut_trap_depth + sheet_thickness + 2 * washer_thickness(washer) + nut_thickness(nut, true));
|
||||
screw_length = screw_length(screw, height - nut_trap_depth + sheet_thickness, 2, nyloc = true);
|
||||
|
||||
translate([0, -height - washer_thickness(washer)])
|
||||
rotate([-90, 0, 0]) {
|
||||
|
@@ -122,9 +122,7 @@ assembly(str("fixing_block_M", 20 * screw_radius(screw))) {
|
||||
|
||||
module fastened_fixing_block_assembly(thickness, screw = def_screw, screw2 = undef, thickness2 = undef, show_block = true, star_washers = true) { //! Assembly with fasteners in place
|
||||
module fb_screw(screw, thickness) {
|
||||
washer = screw_washer(screw);
|
||||
insert = screw_insert(screw);
|
||||
screw_length = screw_longer_than((star_washers ? 2 : 1) * washer_thickness(washer) + thickness + insert_length(insert));
|
||||
screw_length = screw_length(screw, thickness, star_washers ? 2 : 1, true, longer = true);
|
||||
|
||||
if(thickness)
|
||||
translate_z(thickness)
|
||||
|
@@ -155,9 +155,7 @@ module hinge_fastened_assembly(type, thickness1, thickness2, angle, show_hinge =
|
||||
hinge_assembly(type, angle);
|
||||
|
||||
screw = hinge_screw(type);
|
||||
washer_t = 2 * washer_thickness(screw_washer(screw));
|
||||
nut = screw_nut(screw);
|
||||
nut_t = nut_thickness(nut, true);
|
||||
t = hinge_thickness(type);
|
||||
kr = hinge_knuckle_dia(type) / 2;
|
||||
|
||||
@@ -165,7 +163,7 @@ module hinge_fastened_assembly(type, thickness1, thickness2, angle, show_hinge =
|
||||
if(thickness)
|
||||
hinge_screw_positions(type) {
|
||||
translate_z(t)
|
||||
screw_and_washer(screw, screw_longer_than(t + thickness + washer_t + nut_t));
|
||||
screw_and_washer(screw, screw_length(screw, t + thickness, 2, nyloc = true));
|
||||
|
||||
translate_z(-thickness)
|
||||
vflip()
|
||||
|
@@ -69,10 +69,9 @@ module foot(type = foot) { //! Generate STL
|
||||
|
||||
module foot_assembly(t = 0, type = foot, flip = false) { //! Assembly with fasteners in place for specified sheet thickness
|
||||
screw = foot_screw(type);
|
||||
washer = screw_washer(screw);
|
||||
nut = screw_nut(screw);
|
||||
squeeze = 0.5;
|
||||
screw_length = screw_longer_than(foot_thickness(type) + t + 2 * washer_thickness(washer) + nut_thickness(nut, true) - squeeze);
|
||||
screw_length = screw_length(screw, foot_thickness(type) + t - squeeze, 2, nyloc = true);
|
||||
|
||||
vflip() explode(15, true) {
|
||||
stl_colour(pp4_colour) foot(type);
|
||||
@@ -146,9 +145,7 @@ assembly("insert_foot") {
|
||||
|
||||
module fastened_insert_foot_assembly(t = 3, type = insert_foot) { //! Assembly with fasteners in place for specified sheet thickness
|
||||
screw = foot_screw(type);
|
||||
washer = screw_washer(screw);
|
||||
insert = screw_insert(screw);
|
||||
screw_length = screw_shorter_than(insert_length(insert) + t + 2 * washer_thickness(washer));
|
||||
screw_length = screw_length(screw, t, 2, insert = true);
|
||||
|
||||
explode(-10) insert_foot_assembly(type);
|
||||
|
||||
|
@@ -91,7 +91,7 @@ assembly("handle") {
|
||||
}
|
||||
|
||||
module handle_fastened_assembly(thickness) { //! Assembly with fasteners in place
|
||||
screw_length = screw_longer_than(thickness + insert_length(insert) + 2 * washer_thickness(screw_washer(screw)));
|
||||
screw_length = screw_length(screw, thickness, 2, true, longer = true);
|
||||
|
||||
handle_assembly();
|
||||
|
||||
|
@@ -103,10 +103,9 @@ module pcb_mount_assembly(pcb, thickness, height = 5) { //! A PCB mount assembly
|
||||
|
||||
stl_colour(pp1_colour) pcb_mount(pcb, washers = false);
|
||||
|
||||
washer = screw_washer(screw);
|
||||
nut = screw_nut(screw);
|
||||
t = pcb_thickness(pcb);
|
||||
screw_length = screw_longer_than(height + t + washer_thickness + thickness + washer_thickness(washer) + nut_thickness(nut, true));
|
||||
screw_length = screw_length(screw, height + t + washer_thickness + thickness, 1, nyloc = true);
|
||||
|
||||
pcb_mount_screw_positions(pcb) {
|
||||
translate_z(height + t) {
|
||||
|
@@ -65,10 +65,8 @@ function pbox_insert(type) = screw_insert(pbox_screw(type)); //! The insert for
|
||||
function pbox_washer(type) = screw_washer(pbox_screw(type)); //! The washer for the base screws
|
||||
|
||||
function pbox_screw_length(type, panel_thickness = 0) = //! Length of the base screw
|
||||
let(foot = pbox_foot(type))
|
||||
screw_shorter_than(pbox_base(type) + washer_thickness(pbox_washer(type))
|
||||
+ insert_length(pbox_insert(type))
|
||||
+ (foot ? foot_thickness(foot) : panel_thickness));
|
||||
let(foot = pbox_foot(type), screw = pbox_screw(type))
|
||||
screw_length(screw, pbox_base(type) + (foot ? foot_thickness(foot) : panel_thickness), 1, true);
|
||||
|
||||
function pbox_mid_offset(type) = pbox_ridges(type).y + pbox_wall(type) / 2; // Offset to wall midpoint
|
||||
|
||||
|
200
printed/printed_pulleys.scad
Normal file
@@ -0,0 +1,200 @@
|
||||
//
|
||||
// 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/>.
|
||||
//
|
||||
//! Printed pulleys are a remix of droftarts's (see <https://www.thingiverse.com/droftarts/designs>) Parametric Pulleys
|
||||
//! on Thingiverse (see <https://www.thingiverse.com/thing:16627>) and are licensed under the
|
||||
//! Creative Commons - Attribution - Share Alike license (see <https://creativecommons.org/licenses/by-sa/3.0/>)
|
||||
//
|
||||
|
||||
include <NopSCADlib/core.scad>
|
||||
include <NopSCADlib/vitamins/pulleys.scad>
|
||||
|
||||
printed_pulley_GT2_profile = [[0.747183,-0.5],[0.747183,0],[0.647876,0.037218],[0.598311,0.130528],[0.578556,0.238423],[0.547158,0.343077],[0.504649,0.443762],[0.451556,0.53975],[0.358229,0.636924],[0.2484,0.707276],[0.127259,0.750044],[0,0.76447],[-0.127259,0.750044],[-0.2484,0.707276],[-0.358229,0.636924],[-0.451556,0.53975],[-0.504797,0.443762],[-0.547291,0.343077],[-0.578605,0.238423],[-0.598311,0.130528],[-0.648009,0.037218],[-0.747183,0],[-0.747183,-0.5]];
|
||||
|
||||
function printed_pulley_inverted(type) = pulley_hub_dia(type) < pulley_flange_dia(type); //! Need to print upside down to prevent overhang
|
||||
|
||||
function printed_pulley_od(tooth_count, tooth_pitch, pitch_line_offset)
|
||||
= tooth_count * tooth_pitch / PI - 2 * pitch_line_offset;
|
||||
|
||||
module printed_pulley_teeth_from_profile(tooth_count, tooth_depth, tooth_width, tooth_profile) {
|
||||
pulley_od = printed_pulley_od(tooth_count, 2, 0.254);
|
||||
|
||||
difference() {
|
||||
rotate (90 / tooth_count)
|
||||
circle(r = pulley_od / 2, $fn = tooth_count * 4);
|
||||
tooth_distance_from_centre = sqrt(pulley_od * pulley_od - (tooth_width + 0.2) * (tooth_width + 0.2)) / 2;
|
||||
for(i = [1 : tooth_count])
|
||||
rotate(i * 360 / tooth_count)
|
||||
translate([0, -tooth_distance_from_centre])
|
||||
scale([(tooth_width + 0.2) / tooth_width, 1])
|
||||
polygon(tooth_profile);
|
||||
}
|
||||
}
|
||||
|
||||
module printed_pulley_GT2_teeth(type) {
|
||||
tooth_count = pulley_teeth(type);
|
||||
if (tooth_count == 0)
|
||||
circle(r = pulley_od(type) / 2);
|
||||
else
|
||||
printed_pulley_teeth_from_profile(tooth_count, 0.764, 1.494, printed_pulley_GT2_profile);
|
||||
}
|
||||
|
||||
|
||||
module printed_pulley_teeth(type) { //! Draw the pulley's teeth
|
||||
tooth_count = pulley_teeth(type);
|
||||
tw = pulley_od(type) * PI / (tooth_count * 2);
|
||||
ir = pulley_ir(type);
|
||||
or = pulley_od(type) / 2;
|
||||
|
||||
T_angle = 40;
|
||||
GT_r = 0.555;
|
||||
for (i = [0 : 1 : tooth_count - 1])
|
||||
rotate(i * 360 / tooth_count)
|
||||
if (pulley_type(type)[0] == "G")
|
||||
translate([0, ir + GT_r])
|
||||
hull() {
|
||||
circle(GT_r);
|
||||
translate([0, GT_r])
|
||||
square(2 * GT_r, center = true);
|
||||
}
|
||||
else
|
||||
translate([0, (ir + or) / 2])
|
||||
hull() {
|
||||
for(side = [-1, 1])
|
||||
translate([side * tw / 2, 0])
|
||||
rotate(-side * T_angle / 2)
|
||||
square([eps, (or - ir)], center = true);
|
||||
|
||||
translate([0, 1])
|
||||
square([tw, eps], center = true);
|
||||
}
|
||||
}
|
||||
|
||||
module printed_pulley(type) { //! Draw a printable pulley
|
||||
ft = pulley_flange_thickness(type);
|
||||
hl = pulley_hub_length(type);
|
||||
w = pulley_width(type);
|
||||
r1 = pulley_bore(type) / 2;
|
||||
or = pulley_od(type) / 2;
|
||||
screw_z = pulley_screw_z(type);
|
||||
|
||||
stl(str("printed_pulley_", type[0]));
|
||||
|
||||
module core() {
|
||||
translate_z(pulley_hub_length(type) + ft)
|
||||
linear_extrude(w + 1) let($fa = 1, $fs = 0.1)
|
||||
if ("GT2" == str(pulley_type(type)[0], pulley_type(type)[1], pulley_type(type)[2]))
|
||||
difference() {
|
||||
printed_pulley_GT2_teeth(type);
|
||||
circle(d = pulley_bore(type));
|
||||
}
|
||||
else
|
||||
difference() {
|
||||
circle(or);
|
||||
printed_pulley_teeth(type);
|
||||
circle(d = pulley_bore(type));
|
||||
}
|
||||
}
|
||||
|
||||
module screw_holes() {
|
||||
if(pulley_screws(type))
|
||||
translate_z(screw_z)
|
||||
for(i = [0 : pulley_screws(type) - 1])
|
||||
rotate([-90, 180, i * -90])
|
||||
if(show_supports())
|
||||
teardrop(r = screw_pilot_hole(pulley_screw(type)), h = pulley_flange_dia(type) / 2 + 1, center = false);
|
||||
else
|
||||
cylinder(r = screw_radius(pulley_screw(type)), h = pulley_flange_dia(type) / 2 + 1);
|
||||
}
|
||||
|
||||
module hub()
|
||||
linear_extrude(hl)
|
||||
difference() {
|
||||
circle(d= pulley_hub_dia(type));
|
||||
circle(d = pulley_bore(type));
|
||||
}
|
||||
|
||||
translate_z(printed_pulley_inverted(type) ? - hl : 0) {
|
||||
// hub
|
||||
if(hl)
|
||||
translate_z(printed_pulley_inverted(type) ? hl + w + 2 * ft : 0)
|
||||
if(screw_z && screw_z < hl)
|
||||
render()
|
||||
difference() {
|
||||
hub();
|
||||
|
||||
screw_holes();
|
||||
}
|
||||
else
|
||||
hub();
|
||||
|
||||
// bottom flange
|
||||
translate_z(hl)
|
||||
linear_extrude(ft)
|
||||
difference() {
|
||||
circle(d = pulley_flange_dia(type));
|
||||
circle(d = pulley_bore(type));
|
||||
}
|
||||
|
||||
// top flange
|
||||
translate_z(hl + ft + w) {
|
||||
// inner part, supported by core
|
||||
linear_extrude(ft)
|
||||
difference() {
|
||||
circle(r = or);
|
||||
circle(d = pulley_bore(type));
|
||||
}
|
||||
// outer part at 45 degrees for printing
|
||||
rotate_extrude()
|
||||
translate([or - eps, ft])
|
||||
vflip()
|
||||
right_triangle(ft, ft);
|
||||
}
|
||||
|
||||
if(screw_z && screw_z > hl)
|
||||
render()
|
||||
difference() { // T5 pulleys have screws through the teeth
|
||||
core();
|
||||
|
||||
translate_z(printed_pulley_inverted(type) ? pulley_height(type) + hl - 2 * screw_z : 0)
|
||||
screw_holes();
|
||||
}
|
||||
else
|
||||
core();
|
||||
}
|
||||
}
|
||||
|
||||
module printed_pulley_assembly(type, colour = pp1_colour) //! Draw a printed pulley with its grub screws in place
|
||||
assembly(str("printed_pulley_", type[0])) {
|
||||
translate_z(pulley_offset(type)) {
|
||||
stl_colour(colour)
|
||||
if(printed_pulley_inverted(type))
|
||||
translate_z(pulley_height(type))
|
||||
hflip()
|
||||
printed_pulley(type);
|
||||
else
|
||||
printed_pulley(type);
|
||||
|
||||
if(pulley_screws(type))
|
||||
translate_z(pulley_screw_z(type))
|
||||
for(i = [0 : pulley_screws(type) - 1])
|
||||
rotate([-90, 0, i * -90])
|
||||
translate_z(pulley_bore(type) / 2 + pulley_screw_length(type))
|
||||
screw(pulley_screw(type), pulley_screw_length(type));
|
||||
}
|
||||
}
|
@@ -156,8 +156,7 @@ assembly(str("PSU_shroud_", name)) {
|
||||
|
||||
module psu_shroud_fastened_assembly(type, cable_d, thickness, name, cables = 1) //! Assembly with screws in place
|
||||
{
|
||||
washer = screw_washer(screw);
|
||||
screw_length = screw_shorter_than(2 * washer_thickness(washer) + thickness + insert_length(insert) + counter_bore);
|
||||
screw_length = screw_length(screw,thickness + counter_bore, 2, true);
|
||||
|
||||
psu_shroud_assembly(type, cable_d, name, cables);
|
||||
|
||||
|
@@ -101,8 +101,7 @@ module ribbon_clamp_fastened_assembly(ways, thickness, screw = screw) { //! Clam
|
||||
|
||||
vitamin(str(": Tape self amalgamating silicone ",tape_l," x 25mm"));
|
||||
|
||||
washer = screw_washer(screw);
|
||||
screw_length = screw_shorter_than(2 * washer_thickness(washer) + thickness + ribbon_clamp_screw_depth(screw));
|
||||
screw_length = screw_length(screw, thickness + ribbon_clamp_screw_depth(screw), 2);
|
||||
|
||||
ribbon_clamp_assembly(ways, screw);
|
||||
|
||||
|
@@ -105,8 +105,7 @@ module socket_box_MKLOGIC_assembly() socket_box_assembly(MKLOGIC);
|
||||
|
||||
module socket_box_fastened_assembly(type, thickness) { //! The socket and backbox on each side of the specified panel thickness
|
||||
screw = mains_socket_screw(type);
|
||||
insert = screw_insert(screw);
|
||||
screw_length = screw_longer_than(mains_socket_height(type) + thickness + insert_length(insert));
|
||||
screw_length = screw_length(screw, mains_socket_height(type) + thickness, 0, true, longer = true);
|
||||
|
||||
explode(-50)
|
||||
translate_z(-height - thickness)
|
||||
|
@@ -119,8 +119,7 @@ assembly(str("SSR_shroud_", name)) {
|
||||
|
||||
module ssr_shroud_fastened_assembly(type, cable_d, thickness, name) //! Assembly with screws in place
|
||||
{
|
||||
washer = screw_washer(screw);
|
||||
screw_length = screw_shorter_than(2 * washer_thickness(washer) + thickness + insert_length(insert) + counter_bore);
|
||||
screw_length = screw_length(screw, thickness + counter_bore, 2, true);
|
||||
|
||||
ssr_shroud_assembly(type, cable_d, name);
|
||||
|
||||
|
@@ -172,11 +172,9 @@ assembly("strap_end") {
|
||||
|
||||
module strap_assembly(length, type = strap) { //! Assembly with screws in place
|
||||
screw = strap_screw(type);
|
||||
washer = screw_washer(screw);
|
||||
penny = penny_washer(washer);
|
||||
insert = strap_insert(type);
|
||||
penny = penny_washer(screw_washer(screw));
|
||||
|
||||
screw_length = screw_shorter_than(washer_thickness(washer) + washer_thickness(penny) + insert_length(insert) + panel_clearance + counterbore);
|
||||
screw_length = screw_length(screw, washer_thickness(penny) + panel_clearance + counterbore, 1, true);
|
||||
|
||||
stl_colour(pp4_colour) strap(length, type);
|
||||
|
||||
|
126
readme.md
@@ -37,12 +37,12 @@ See [usage](docs/usage.md) for requirements, installation instructions and a usa
|
||||
<tr><td> <a href = "#Extrusions">Extrusions</a> </td><td> <a href = "#Opengrab">Opengrab</a> </td><td> <a href = "#Stepper_motors">Stepper_motors</a> </td><td> <a href = "#PSU_shroud">PSU_shroud</a> </td><td> <a href = "#Rounded_right_triangle">Rounded_right_triangle</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#Fans">Fans</a> </td><td> <a href = "#PCB">PCB</a> </td><td> <a href = "#Swiss_clips">Swiss_clips</a> </td><td> <a href = "#Press_fit">Press_fit</a> </td><td> <a href = "#Sector">Sector</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#Fuseholder">Fuseholder</a> </td><td> <a href = "#PCBs">PCBs</a> </td><td> <a href = "#Toggles">Toggles</a> </td><td> <a href = "#Printed_box">Printed_box</a> </td><td> <a href = "#Sweep">Sweep</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#Geared_steppers">Geared_steppers</a> </td><td> <a href = "#PSUs">PSUs</a> </td><td> <a href = "#Transformers">Transformers</a> </td><td> <a href = "#Ribbon_clamp">Ribbon_clamp</a> </td><td> <a href = "#Thread">Thread</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#Green_terminals">Green_terminals</a> </td><td> <a href = "#Panel_meters">Panel_meters</a> </td><td> <a href = "#Tubings">Tubings</a> </td><td> <a href = "#SSR_shroud">SSR_shroud</a> </td><td> <a href = "#Tube">Tube</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#Hot_ends">Hot_ends</a> </td><td> <a href = "#Pillars">Pillars</a> </td><td> <a href = "#Variacs">Variacs</a> </td><td> <a href = "#Screw_knob">Screw_knob</a> </td><td></td><td></td></tr>
|
||||
<tr><td> <a href = "#Hygrometer">Hygrometer</a> </td><td> <a href = "#Pin_headers">Pin_headers</a> </td><td> <a href = "#Veroboard">Veroboard</a> </td><td> <a href = "#Socket_box">Socket_box</a> </td><td></td><td></td></tr>
|
||||
<tr><td> <a href = "#IECs">IECs</a> </td><td> <a href = "#Pulleys">Pulleys</a> </td><td> <a href = "#Washers">Washers</a> </td><td> <a href = "#Strap_handle">Strap_handle</a> </td><td></td><td></td></tr>
|
||||
<tr><td> <a href = "#Inserts">Inserts</a> </td><td></td><td> <a href = "#Wire">Wire</a> </td><td></td><td></td><td></td></tr>
|
||||
<tr><td> <a href = "#Geared_steppers">Geared_steppers</a> </td><td> <a href = "#PSUs">PSUs</a> </td><td> <a href = "#Transformers">Transformers</a> </td><td> <a href = "#Printed_pulleys">Printed_pulleys</a> </td><td> <a href = "#Thread">Thread</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#Green_terminals">Green_terminals</a> </td><td> <a href = "#Panel_meters">Panel_meters</a> </td><td> <a href = "#Tubings">Tubings</a> </td><td> <a href = "#Ribbon_clamp">Ribbon_clamp</a> </td><td> <a href = "#Tube">Tube</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#Hot_ends">Hot_ends</a> </td><td> <a href = "#Pillars">Pillars</a> </td><td> <a href = "#Variacs">Variacs</a> </td><td> <a href = "#SSR_shroud">SSR_shroud</a> </td><td></td><td></td></tr>
|
||||
<tr><td> <a href = "#Hygrometer">Hygrometer</a> </td><td> <a href = "#Pin_headers">Pin_headers</a> </td><td> <a href = "#Veroboard">Veroboard</a> </td><td> <a href = "#Screw_knob">Screw_knob</a> </td><td></td><td></td></tr>
|
||||
<tr><td> <a href = "#IECs">IECs</a> </td><td> <a href = "#Pulleys">Pulleys</a> </td><td> <a href = "#Washers">Washers</a> </td><td> <a href = "#Socket_box">Socket_box</a> </td><td></td><td></td></tr>
|
||||
<tr><td> <a href = "#Inserts">Inserts</a> </td><td></td><td> <a href = "#Wire">Wire</a> </td><td> <a href = "#Strap_handle">Strap_handle</a> </td><td></td><td></td></tr>
|
||||
<tr><td></td><td></td><td> <a href = "#Zipties">Zipties</a> </td><td></td><td></td><td></td></tr>
|
||||
</table>
|
||||
|
||||
@@ -1048,10 +1048,12 @@ Parametric green terminal blocks
|
||||
### Vitamins
|
||||
| Qty | Module call | BOM entry |
|
||||
| ---:|:--- |:---|
|
||||
| 1 | `green_terminal(gt_6p35, 2)` | Terminal block 2 way 0.25" |
|
||||
| 1 | `green_terminal(gt_5p08, 3)` | Terminal block 3 way 0.2" |
|
||||
| 1 | `green_terminal(gt_3p5, 4)` | Terminal block 4 way 3.5mm |
|
||||
| 1 | `green_terminal(gt_2p54, 5)` | Terminal block 5 way 0.1" |
|
||||
| 1 | `green_terminal(gt_5x17, 2)` | Terminal block 2 way 5mm |
|
||||
| 1 | `green_terminal(gt_5x11, 3)` | Terminal block 3 way 5mm |
|
||||
| 1 | `green_terminal(gt_6p35, 4)` | Terminal block 4 way 0.25" |
|
||||
| 1 | `green_terminal(gt_5p08, 5)` | Terminal block 5 way 0.2" |
|
||||
| 1 | `green_terminal(gt_3p5, 6)` | Terminal block 6 way 3.5mm |
|
||||
| 1 | `green_terminal(gt_2p54, 7)` | Terminal block 7 way 0.1" |
|
||||
|
||||
|
||||
<a href="#top">Top</a>
|
||||
@@ -2308,6 +2310,7 @@ PCBs and perfboard with optional components. The shape can be a rectangle with o
|
||||
| 1 | `pcb(DuetE)` | Duet 2 Ethernet electronics |
|
||||
| 1 | `pcb(Duex2)` | Duex2 expansion board |
|
||||
| 1 | `pcb(Duex5)` | Duex5 expansion board |
|
||||
| 1 | `pcb(ESP-01)` | ESP-01 |
|
||||
| 1 | `pcb(EnviroPlus)` | Enviro+ |
|
||||
| 1 | `pcb(ExtruderPCB)` | Extruder connection PCB |
|
||||
| 1 | `pcb(Keyes5p1)` | Keyes5.1 Arduino Uno expansion board |
|
||||
@@ -2337,8 +2340,8 @@ PCBs and perfboard with optional components. The shape can be a rectangle with o
|
||||
| 2 | `screw(M2p5_cap_screw, 20)` | Screw M2.5 cap x 20mm |
|
||||
| 8 | `screw(M2p5_cap_screw, 25)` | Screw M2.5 cap x 25mm |
|
||||
| 8 | `screw(M2p5_cap_screw, 30)` | Screw M2.5 cap x 30mm |
|
||||
| 4 | `screw(M2p5_pan_screw, 20)` | Screw M2.5 pan x 20mm |
|
||||
| 12 | `screw(M2p5_pan_screw, 25)` | Screw M2.5 pan x 25mm |
|
||||
| 4 | `screw(M2p5_pan_screw, 30)` | Screw M2.5 pan x 30mm |
|
||||
| 4 | `screw(M3_cap_screw, 16)` | Screw M3 cap x 16mm |
|
||||
| 8 | `screw(M3_cap_screw, 30)` | Screw M3 cap x 30mm |
|
||||
| 12 | `screw(M4_cap_screw, 35)` | Screw M4 cap x 35mm |
|
||||
@@ -2359,21 +2362,21 @@ PCBs and perfboard with optional components. The shape can be a rectangle with o
|
||||
| 4 | pcb_spacer2070.stl |
|
||||
| 4 | pcb_spacer2080.stl |
|
||||
| 4 | pcb_spacer2090.stl |
|
||||
| 4 | pcb_spacer25110.stl |
|
||||
| 4 | pcb_spacer25120.stl |
|
||||
| 4 | pcb_spacer25130.stl |
|
||||
| 4 | pcb_spacer25140_2.stl |
|
||||
| 4 | pcb_spacer25140.stl |
|
||||
| 4 | pcb_spacer25150_2.stl |
|
||||
| 4 | pcb_spacer25160_2.stl |
|
||||
| 4 | pcb_spacer25190.stl |
|
||||
| 4 | pcb_spacer25170_2.stl |
|
||||
| 4 | pcb_spacer25200.stl |
|
||||
| 2 | pcb_spacer2580.stl |
|
||||
| 4 | pcb_spacer30170.stl |
|
||||
| 4 | pcb_spacer25210.stl |
|
||||
| 2 | pcb_spacer2590.stl |
|
||||
| 4 | pcb_spacer30180.stl |
|
||||
| 4 | pcb_spacer30190.stl |
|
||||
| 4 | pcb_spacer3050.stl |
|
||||
| 4 | pcb_spacer40210.stl |
|
||||
| 4 | pcb_spacer40220.stl |
|
||||
| 4 | pcb_spacer40230.stl |
|
||||
| 4 | pcb_spacer40240.stl |
|
||||
|
||||
|
||||
<a href="#top">Top</a>
|
||||
@@ -2658,6 +2661,8 @@ Linear rails with carriages.
|
||||
| `rail_carriage(type)` | Carriage type |
|
||||
| `rail_end(type)` | Minimum distance screw can be from the end |
|
||||
| `rail_end_screw(type)` | Screw used for ends only (Countersink used for better location) |
|
||||
| `rail_groove_offset(type)` | Offset of centre of groove from top of rail |
|
||||
| `rail_groove_width(type)` | Groove width |
|
||||
| `rail_height(type)` | Height of rail section |
|
||||
| `rail_hole(type)` | Screw hole diameter |
|
||||
| `rail_pitch(type)` | Distance between screws |
|
||||
@@ -2678,7 +2683,7 @@ Linear rails with carriages.
|
||||
|:--- |:--- |
|
||||
| `carriage(type, rail, end_colour = grey(20)` | Draw the specified carriage |
|
||||
| `carriage_hole_positions(type)` | Position children over screw holes |
|
||||
| `rail(type, length)` | Draw the specified rail |
|
||||
| `rail(type, length, colour = grey(90)` | Draw the specified rail |
|
||||
| `rail_assembly(type, length, pos, carriage_end_colour = grey(20)` | Rail and carriage assembly |
|
||||
| `rail_hole_positions(type, length, first = 0, screws = 100, both_ends = true)` | Position children over screw holes |
|
||||
| `rail_screws(type, length, thickness, screws = 100, index_screws = undef)` | Place screws in the rail |
|
||||
@@ -2897,10 +2902,11 @@ For an explanation of `screw_polysink()` see <https://hydraraptor.blogspot.com/2
|
||||
|:--- |:--- |
|
||||
| `screw_boss_diameter(type)` | Boss big enough for nut trap and washer |
|
||||
| `screw_head_depth(type, d = 0)` | How far a counter sink head will go into a straight hole diameter d |
|
||||
| `screw_longer_than(x)` | Returns shortest screw length longer or equal to x |
|
||||
| `screw_length(screw, thickness, washers, insert = false, nyloc = false, nut = false, longer = false)` | Returns the length of the longest or shortest screw that will got through `thickness` and `washers` and possibly an `insert`, `nut` or `nyloc` |
|
||||
| `screw_longer_than(x)` | Returns the length of the shortest screw length longer or equal to x |
|
||||
| `screw_nut_radius(type)` | Radius of matching nut |
|
||||
| `screw_polysink_r(type, z)` | Countersink hole profile corrected for rounded staircase extrusions. |
|
||||
| `screw_shorter_than(x)` | Returns longest screw length shorter than or equal to x |
|
||||
| `screw_shorter_than(x)` | Returns the length of the longest screw shorter than or equal to x |
|
||||
|
||||
### Modules
|
||||
| Module | Description |
|
||||
@@ -5039,6 +5045,73 @@ It can also have printed feet on the base with the screws doubling up to hold th
|
||||
| 1 | box2_assembly |
|
||||
|
||||
|
||||
<a href="#top">Top</a>
|
||||
|
||||
---
|
||||
<a name="Printed_pulleys"></a>
|
||||
## Printed_pulleys
|
||||
Printed pulleys are a remix of droftarts's (see <https://www.thingiverse.com/droftarts/designs>) Parametric Pulleys
|
||||
on Thingiverse (see <https://www.thingiverse.com/thing:16627>) and are licensed under the
|
||||
Creative Commons - Attribution - Share Alike license (see <https://creativecommons.org/licenses/by-sa/3.0/>)
|
||||
|
||||
[printed/printed_pulleys.scad](printed/printed_pulleys.scad) Implementation.
|
||||
|
||||
[tests/printed_pulleys.scad](tests/printed_pulleys.scad) Code for this example.
|
||||
|
||||
### Functions
|
||||
| Function | Description |
|
||||
|:--- |:--- |
|
||||
| `printed_pulley_inverted(type)` | Need to print upside down to prevent overhang |
|
||||
|
||||
### Modules
|
||||
| Module | Description |
|
||||
|:--- |:--- |
|
||||
| `printed_pulley(type)` | Draw a printable pulley |
|
||||
| `printed_pulley_assembly(type, colour = pp1_colour)` | Draw a printed pulley with its grub screws in place |
|
||||
| `printed_pulley_teeth(type)` | Draw the pulley's teeth |
|
||||
|
||||

|
||||
|
||||
### Vitamins
|
||||
| Qty | Module call | BOM entry |
|
||||
| ---:|:--- |:---|
|
||||
| 1 | `screw(M3_grub_screw, 3)` | Screw M3 grub x 3mm |
|
||||
| 2 | `screw(M3_grub_screw, 4.5)` | Screw M3 grub x 4.5mm |
|
||||
| 2 | `screw(M3_grub_screw, 4)` | Screw M3 grub x 4mm |
|
||||
| 4 | `screw(M3_grub_screw, 6)` | Screw M3 grub x 6mm |
|
||||
| 1 | `screw(M4_grub_screw, 6)` | Screw M4 grub x 6mm |
|
||||
|
||||
### Printed
|
||||
| Qty | Filename |
|
||||
| ---:|:--- |
|
||||
| 1 | printed_pulley_GT2x12_pulley.stl |
|
||||
| 1 | printed_pulley_GT2x16_plain_idler.stl |
|
||||
| 1 | printed_pulley_GT2x16_pulley.stl |
|
||||
| 1 | printed_pulley_GT2x16_toothed_idler.stl |
|
||||
| 1 | printed_pulley_GT2x16x7_plain_idler.stl |
|
||||
| 1 | printed_pulley_GT2x20_plain_idler.stl |
|
||||
| 1 | printed_pulley_GT2x20_toothed_idler.stl |
|
||||
| 1 | printed_pulley_GT2x20ob_pulley.stl |
|
||||
| 1 | printed_pulley_GT2x20um_pulley.stl |
|
||||
| 1 | printed_pulley_T2p5x16_pulley.stl |
|
||||
| 1 | printed_pulley_T5x10_pulley.stl |
|
||||
|
||||
### Assemblies
|
||||
| Qty | Name |
|
||||
| ---:|:--- |
|
||||
| 1 | printed_pulley_GT2x12_pulley_assembly |
|
||||
| 1 | printed_pulley_GT2x16_plain_idler_assembly |
|
||||
| 1 | printed_pulley_GT2x16_pulley_assembly |
|
||||
| 1 | printed_pulley_GT2x16_toothed_idler_assembly |
|
||||
| 1 | printed_pulley_GT2x16x7_plain_idler_assembly |
|
||||
| 1 | printed_pulley_GT2x20_plain_idler_assembly |
|
||||
| 1 | printed_pulley_GT2x20_toothed_idler_assembly |
|
||||
| 1 | printed_pulley_GT2x20ob_pulley_assembly |
|
||||
| 1 | printed_pulley_GT2x20um_pulley_assembly |
|
||||
| 1 | printed_pulley_T2p5x16_pulley_assembly |
|
||||
| 1 | printed_pulley_T5x10_pulley_assembly |
|
||||
|
||||
|
||||
<a href="#top">Top</a>
|
||||
|
||||
---
|
||||
@@ -5897,6 +5970,7 @@ Simple tube or ring
|
||||
### Modules
|
||||
| Module | Description |
|
||||
|:--- |:--- |
|
||||
| `rectangular_tube(size, center = true, thickness = 1, fillet = 0.5)` | Create a retangular tube with filleted corners |
|
||||
| `ring(or, ir)` | Create a ring with specified external and internal radii |
|
||||
| `tube(or, ir, h, center = true)` | Create a tube with specified external and internal radii and height `h` |
|
||||
| `woven_tube(or, ir, h, center= true, colour = grey(30)` | Create a woven tube with specified external and internal radii, height `h`, colours, warp and weft |
|
||||
@@ -6183,12 +6257,12 @@ do not intrude into the circle. See <https://hydraraptor.blogspot.com/2020/07/ho
|
||||
### Modules
|
||||
| Module | Description |
|
||||
|:--- |:--- |
|
||||
| `semi_teardrop(h, r, d = undef, center = true, chamfer = 0, plus = false)` | A semi teardrop in the positive Y domain |
|
||||
| `teardrop(h, r, center = true, truncate = true, chamfer = 0, plus = false)` | For making horizontal holes that don't need support material, set `truncate = false` to make traditional RepRap teardrops that don't even need bridging |
|
||||
| `teardrop_chamfer(h, center, chamfer)` | Helper module for adding chamfer to a teardrop |
|
||||
| `teardrop_plus(h, r, center = true, truncate = true, chamfer = 0)` | Slightly elongated teardrop to allow for the 3D printing staircase effect |
|
||||
| `tearslot(h, r, w, center = true, chamfer = 0, plus = false)` | A horizontal slot that doesn't need support material |
|
||||
| `vertical_tearslot(h, r, l, center = true, chamfer = 0, plus = false)` | A vertical slot that doesn't need support material |
|
||||
| `semi_teardrop(h, r, d = undef, center = true, chamfer = 0, chamfer_both_ends = true, plus = false)` | A semi teardrop in the positive Y domain |
|
||||
| `teardrop(h, r, center = true, truncate = true, chamfer = 0, chamfer_both_ends = true, plus = false)` | For making horizontal holes that don't need support material, set `truncate = false` to make traditional RepRap teardrops that don't even need bridging |
|
||||
| `teardrop_chamfer(h, center, chamfer, chamfer_both_ends)` | Helper module for adding chamfer to a teardrop |
|
||||
| `teardrop_plus(h, r, center = true, truncate = true, chamfer = 0, chamfer_both_ends = true)` | Slightly elongated teardrop to allow for the 3D printing staircase effect |
|
||||
| `tearslot(h, r, w, center = true, chamfer = 0, chamfer_both_ends = true, plus = false)` | A horizontal slot that doesn't need support material |
|
||||
| `vertical_tearslot(h, r, l, center = true, chamfer = 0, chamfer_both_ends = true, plus = false)` | A vertical slot that doesn't need support material |
|
||||
|
||||

|
||||
|
||||
|
@@ -249,7 +249,7 @@ def boms(target = None, assembly = None):
|
||||
#
|
||||
# Run openscad
|
||||
#
|
||||
openscad.run("-D", "$bom=2", "-D", "$preview=true", "--hardwarnings", "-o", "openscad.echo", "-d", bom_dir + "/bom.deps", bom_maker_name)
|
||||
openscad.run("-D", "$bom=2", "-D", "$preview=true", "-o", "openscad.echo", "-d", bom_dir + "/bom.deps", bom_maker_name)
|
||||
os.remove(bom_maker_name)
|
||||
print("Generating bom ...", end=" ")
|
||||
|
||||
|
@@ -25,7 +25,7 @@ from __future__ import print_function
|
||||
import subprocess, sys
|
||||
|
||||
def run_list(args, silent = False, verbose = False):
|
||||
cmd = ["openscad"] + args
|
||||
cmd = ["openscad", "--hardwarnings"] + args
|
||||
if not silent:
|
||||
for arg in cmd:
|
||||
print(arg, end=" ")
|
||||
|
@@ -56,7 +56,7 @@ def compare_images(a, b, c):
|
||||
with open(log_name, 'w') as output:
|
||||
do_cmd(("magick compare -metric AE -fuzz %d%% %s %s %s" % (fuzz, a, b, c)).split(), output = output)
|
||||
with open(log_name, 'r') as f:
|
||||
pixels = int(f.read().strip())
|
||||
pixels = int(float(f.read().strip()))
|
||||
os.remove(log_name)
|
||||
return pixels
|
||||
|
||||
|
@@ -30,7 +30,6 @@ sheet = PMMA3;
|
||||
height = 10;
|
||||
|
||||
insert = screw_insert(screw);
|
||||
washer = screw_washer(screw);
|
||||
|
||||
module widget(thickness) {
|
||||
vitamin(str("widget(", thickness, "): Rivit like thing for ", thickness, "mm sheets"));
|
||||
@@ -92,7 +91,7 @@ assembly("wigdit") {
|
||||
|
||||
translate_z(height) {
|
||||
translate_z(sheet_thickness(sheet))
|
||||
screw_and_washer(screw, screw_longer_than(sheet_thickness(sheet) + 2 * washer_thickness(washer) + 3), true);
|
||||
screw_and_washer(screw, screw_length(screw, sheet_thickness(sheet) + 3, 2, longer = true), true);
|
||||
|
||||
explode(5)
|
||||
translate_z(sheet_thickness(sheet) / 2 + eps)
|
||||
|
@@ -24,16 +24,13 @@ include <../vitamins/blowers.scad>
|
||||
module blowers()
|
||||
layout([for(b = blowers) blower_width(b)], 10, true) let(b = blowers[$i]){
|
||||
screw = blower_screw(b);
|
||||
washer = screw_washer(screw);
|
||||
h = blower_lug(b);
|
||||
|
||||
blower(b);
|
||||
|
||||
blower_hole_positions(b)
|
||||
translate_z(h)
|
||||
screw_and_washer(screw, screw_longer_than(h + washer_thickness(washer) + 5));
|
||||
|
||||
|
||||
screw_and_washer(screw, screw_length(screw, h + 5, 1, longer = true));
|
||||
}
|
||||
|
||||
if($preview)
|
||||
|
Before Width: | Height: | Size: 76 KiB After Width: | Height: | Size: 77 KiB |
Before Width: | Height: | Size: 82 KiB After Width: | Height: | Size: 102 KiB |
Before Width: | Height: | Size: 152 KiB After Width: | Height: | Size: 150 KiB |
BIN
tests/png/printed_pulleys.png
Normal file
After Width: | Height: | Size: 116 KiB |
Before Width: | Height: | Size: 43 KiB After Width: | Height: | Size: 45 KiB |
Before Width: | Height: | Size: 129 KiB After Width: | Height: | Size: 154 KiB |
Before Width: | Height: | Size: 45 KiB After Width: | Height: | Size: 43 KiB |
45
tests/printed_pulleys.scad
Normal file
@@ -0,0 +1,45 @@
|
||||
//
|
||||
// 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/>.
|
||||
//
|
||||
|
||||
include <../core.scad>
|
||||
include <../vitamins/pulleys.scad>
|
||||
include <../printed/printed_pulleys.scad>
|
||||
use <../utils/layout.scad>
|
||||
|
||||
|
||||
module printed_pulley_test(show_metal = false) {
|
||||
layout([for (p = pulleys) pulley_flange_dia(p)]) let(p = pulleys[$i]) {
|
||||
rotate(-145)
|
||||
if($preview)
|
||||
printed_pulley_assembly(p);
|
||||
else
|
||||
printed_pulley(p);
|
||||
|
||||
if(show_metal)
|
||||
not_on_bom()
|
||||
translate([0, 20])
|
||||
rotate(-145)
|
||||
pulley_assembly(p);
|
||||
}
|
||||
}
|
||||
|
||||
if($preview)
|
||||
printed_pulley_test(true);
|
||||
else
|
||||
printed_pulley_test();
|
@@ -23,7 +23,7 @@ include <../vitamins/pulleys.scad>
|
||||
|
||||
module pulleys()
|
||||
layout([for(p = pulleys) pulley_flange_dia(p)])
|
||||
rotate(-45)
|
||||
rotate(-145)
|
||||
pulley_assembly(pulleys[$i]);
|
||||
|
||||
if($preview)
|
||||
|
@@ -27,6 +27,9 @@ module tubes() {
|
||||
|
||||
translate([50, 10])
|
||||
tube(10, 8, 30);
|
||||
|
||||
translate([100, 10])
|
||||
rectangular_tube([10, 20, 30]);
|
||||
}
|
||||
|
||||
tubes();
|
||||
|
@@ -24,7 +24,7 @@
|
||||
//! Using teardrop_plus() or setting the plus option on other modules will elongate the teardrop vertically by the layer height, so when sliced the staircase tips
|
||||
//! do not intrude into the circle. See <https://hydraraptor.blogspot.com/2020/07/horiholes-2.html>
|
||||
//
|
||||
module teardrop(h, r, center = true, truncate = true, chamfer = 0, plus = false) { //! For making horizontal holes that don't need support material, set `truncate = false` to make traditional RepRap teardrops that don't even need bridging
|
||||
module teardrop(h, r, center = true, truncate = true, chamfer = 0, chamfer_both_ends = true, plus = false) { //! For making horizontal holes that don't need support material, set `truncate = false` to make traditional RepRap teardrops that don't even need bridging
|
||||
module teardrop_2d(r, truncate) {
|
||||
er = layer_height / 2 - eps; // Extrustion edge radius
|
||||
R = plus ? r + er : r; // Corrected radius
|
||||
@@ -52,7 +52,7 @@ module teardrop(h, r, center = true, truncate = true, chamfer = 0, plus = false)
|
||||
extrude_if(h, center)
|
||||
teardrop_2d(r, truncate);
|
||||
|
||||
teardrop_chamfer(h, center, chamfer) {
|
||||
teardrop_chamfer(h, center, chamfer, chamfer_both_ends) {
|
||||
linear_extrude(eps, center = true)
|
||||
teardrop_2d(r + chamfer / 2, truncate);
|
||||
|
||||
@@ -62,7 +62,7 @@ module teardrop(h, r, center = true, truncate = true, chamfer = 0, plus = false)
|
||||
}
|
||||
}
|
||||
|
||||
module semi_teardrop(h, r, d = undef, center = true, chamfer = 0, plus = false) { //! A semi teardrop in the positive Y domain
|
||||
module semi_teardrop(h, r, d = undef, center = true, chamfer = 0, chamfer_both_ends = true, plus = false) { //! A semi teardrop in the positive Y domain
|
||||
module semi_teardrop_2d(r, d)
|
||||
intersection() {
|
||||
R = is_undef(d) ? r : d / 2;
|
||||
@@ -77,7 +77,7 @@ module semi_teardrop(h, r, d = undef, center = true, chamfer = 0, plus = false)
|
||||
extrude_if(h, center)
|
||||
semi_teardrop_2d(r, d);
|
||||
|
||||
teardrop_chamfer(h, center, chamfer) {
|
||||
teardrop_chamfer(h, center, chamfer, chamfer_both_ends) {
|
||||
linear_extrude(eps, center = true)
|
||||
semi_teardrop_2d(r + chamfer / 2, d);
|
||||
|
||||
@@ -87,10 +87,10 @@ module semi_teardrop(h, r, d = undef, center = true, chamfer = 0, plus = false)
|
||||
}
|
||||
}
|
||||
|
||||
module teardrop_plus(h, r, center = true, truncate = true, chamfer = 0) //! Slightly elongated teardrop to allow for the 3D printing staircase effect
|
||||
teardrop(h, r, center, truncate, chamfer, plus = true);
|
||||
module teardrop_plus(h, r, center = true, truncate = true, chamfer = 0, chamfer_both_ends = true) //! Slightly elongated teardrop to allow for the 3D printing staircase effect
|
||||
teardrop(h, r, center, truncate, chamfer, chamfer_both_ends, plus = true);
|
||||
|
||||
module tearslot(h, r, w, center = true, chamfer = 0, plus = false) { //! A horizontal slot that doesn't need support material
|
||||
module tearslot(h, r, w, center = true, chamfer = 0, chamfer_both_ends = true, plus = false) { //! A horizontal slot that doesn't need support material
|
||||
module tearslot_2d(r, w)
|
||||
hull()
|
||||
for(x = [-1, 1])
|
||||
@@ -99,7 +99,7 @@ module tearslot(h, r, w, center = true, chamfer = 0, plus = false) { //! A horiz
|
||||
extrude_if(h, center)
|
||||
tearslot_2d(r, w);
|
||||
|
||||
teardrop_chamfer(h, center, chamfer) {
|
||||
teardrop_chamfer(h, center, chamfer, chamfer_both_ends) {
|
||||
linear_extrude(eps, center = true)
|
||||
tearslot_2d(r + chamfer / 2, w);
|
||||
|
||||
@@ -109,7 +109,7 @@ module tearslot(h, r, w, center = true, chamfer = 0, plus = false) { //! A horiz
|
||||
}
|
||||
}
|
||||
|
||||
module vertical_tearslot(h, r, l, center = true, chamfer = 0, plus = false) { //! A vertical slot that doesn't need support material
|
||||
module vertical_tearslot(h, r, l, center = true, chamfer = 0, chamfer_both_ends = true, plus = false) { //! A vertical slot that doesn't need support material
|
||||
module vertical_tearslot_2d(r, l)
|
||||
hull()
|
||||
for(y = [-1, 1])
|
||||
@@ -119,7 +119,7 @@ module vertical_tearslot(h, r, l, center = true, chamfer = 0, plus = false) { //
|
||||
extrude_if(h, center)
|
||||
vertical_tearslot_2d(r, l);
|
||||
|
||||
teardrop_chamfer(h, center, chamfer) {
|
||||
teardrop_chamfer(h, center, chamfer, chamfer_both_ends) {
|
||||
linear_extrude(eps, center = true)
|
||||
vertical_tearslot_2d(r + chamfer / 2, l);
|
||||
|
||||
@@ -129,10 +129,10 @@ module vertical_tearslot(h, r, l, center = true, chamfer = 0, plus = false) { //
|
||||
}
|
||||
}
|
||||
|
||||
module teardrop_chamfer(h, center, chamfer) { //! Helper module for adding chamfer to a teardrop
|
||||
module teardrop_chamfer(h, center, chamfer, chamfer_both_ends) { //! Helper module for adding chamfer to a teardrop
|
||||
if(h && chamfer)
|
||||
translate_z(center ? 0 : h / 2)
|
||||
for(m = [0, 1])
|
||||
for(m = chamfer_both_ends ? [0, 1] : [1])
|
||||
mirror([0, 0, m])
|
||||
translate_z((h - eps ) / 2)
|
||||
hull()
|
||||
|
@@ -68,3 +68,11 @@ module woven_tube(or, ir, h, center= true, colour = grey(30), colour2, warp = 2,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
module rectangular_tube(size, center = true, thickness = 1, fillet = 0.5) { //! Create a retangular tube with filleted corners
|
||||
extrude_if(size.z, center = center)
|
||||
difference() {
|
||||
rounded_square([size.x, size.y], fillet);
|
||||
rounded_square([size.x - 2 * thickness, size.y - 2 * thickness], fillet);
|
||||
}
|
||||
}
|
||||
|
@@ -73,39 +73,54 @@ SSD1963_4p3 = ["SSD1963_4p3", "LCD display SSD1963 4.3\"", 105.5, 67.2, 3.4, SSD
|
||||
[[0, -34.5], [12, -31.5]],
|
||||
];
|
||||
|
||||
|
||||
/* Dimensions taken from:
|
||||
https://github.com/bigtreetech/BIGTREETECH-TFT35-V3.0/blob/master/Hardware/TFT35%20V3.0-SIZE-TOP.pdf
|
||||
and
|
||||
https://github.com/bigtreetech/BIGTREETECH-TFT35-V3.0/blob/master/Hardware/TFT35%20V3.0-SIZE-BOT.pdf
|
||||
*/
|
||||
|
||||
BigTreeTech_TFT35v3_0_PCB = ["", "",
|
||||
110, 55.77, 1.6, 0, 3, 0, "green", false,
|
||||
[ [-3.12, 3.17], [-3.12, -3.17], [3.12, -3.17], [3.12, 3.17] ],
|
||||
[
|
||||
[ 10, 7.5, 0, "-button_6mm" ],
|
||||
[ 9, 43, 0, "-buzzer", 5, 9 ],
|
||||
[ 9, 27, 0, "-potentiometer" ],
|
||||
[ 102,28.82, 0, "uSD", [26.5, 16, 3] ],
|
||||
[16.5, 5.9, 0, "2p54boxhdr", 5, 2 ],
|
||||
[36.5, 5.9, 0, "2p54boxhdr", 5, 2 ],
|
||||
[56.5, 5.9, 0, "2p54boxhdr", 5, 2 ],
|
||||
[82.5, 4, 0, "jst_xh", 5 ],
|
||||
[26.5, 52.8, 180, "jst_xh", 2 ],
|
||||
[39.5, 52.8, 180, "jst_xh", 3 ],
|
||||
[52.5, 52.8, 180, "jst_xh", 3 ],
|
||||
[65.5, 52.8, 180, "jst_xh", 3 ],
|
||||
[78.5, 52.8, 180, "jst_xh", 3 ],
|
||||
[94.5, 52.8, 180, "jst_xh", 5 ],
|
||||
[ 8, 43, 180, "usb_A" ],
|
||||
[ 97, 4, 0, "chip", 9, 3.5, 1, grey(20) ],
|
||||
// ESP-8266
|
||||
[ 23, 28, 90, "2p54socket", 4, 2 ],
|
||||
110, 55.77, 1.6, // size
|
||||
0, // corner radius
|
||||
3, // mounting hole diameter
|
||||
0, // pad around mounting hole
|
||||
"green", // color
|
||||
false, // true if parts should be separate BOM items
|
||||
[ // hole positions
|
||||
[-3.12, 3.17], [-3.12, -3.17], [3.12, -3.17], [3.12, 3.17]
|
||||
],
|
||||
[]
|
||||
[ // components
|
||||
[ 9, -( 8.46 + 17.45)/2, 0, "-buzzer", 5, 9 ],
|
||||
[ 9, -(23.76 + 34.94)/2, 0, "-potentiometer" ],
|
||||
[ (6.84 + 12.85)/2, -(45.73 + 51.73)/2, 0, "-button_6mm" ],
|
||||
[ 102, (15.57 + 42.07)/2, 0, "uSD", [26.5, 16, 3] ],
|
||||
[ 8, -( 6.76 + 18.76)/2, 180, "usb_A" ],
|
||||
[ 23, (23.32 + 33.64)/2, 90, "2p54socket", 4, 2 ], // ESP-8266
|
||||
|
||||
[ 16.5, 5.9, 0, "2p54boxhdr", 5, 2 ],
|
||||
[ 36.5, 5.9, 0, "2p54boxhdr", 5, 2 ],
|
||||
[ 56.5, 5.9, 0, "2p54boxhdr", 5, 2 ],
|
||||
[ 82.5, 4, 0, "jst_xh", 5 ],
|
||||
[ 26.5, 52.8, 180, "jst_xh", 2 ],
|
||||
[ 39.5, 52.8, 180, "jst_xh", 3 ],
|
||||
[ 52.5, 52.8, 180, "jst_xh", 3 ],
|
||||
[ 65.5, 52.8, 180, "jst_xh", 3 ],
|
||||
[ 78.5, 52.8, 180, "jst_xh", 3 ],
|
||||
[ 94.5, 52.8, 180, "jst_xh", 5 ],
|
||||
[ 97, 4, 0, "chip", 9, 3.5, 1, grey(20) ],
|
||||
],
|
||||
[] // accessories
|
||||
];
|
||||
|
||||
BigTreeTech_TFT35v3_0 = ["BigTreeTech_TFT35v3_0", "BigTreeTech TFT35 v3.0",
|
||||
84.5, 54.5, 4, BigTreeTech_TFT35v3_0_PCB,
|
||||
[-6, 0, 0], // pcb offset
|
||||
84.5, 54.5, 4, // size
|
||||
BigTreeTech_TFT35v3_0_PCB, // pcb
|
||||
[7 - (110 - 84.5)/2, 0, 0], // pcb offset from center
|
||||
[[-40, -26.5], [41.5, 26.5, 0.5]], // aperture
|
||||
[], // touch screen
|
||||
0, // thread length
|
||||
[], // clearance need for the ts ribbon
|
||||
[], // touch screen position and size
|
||||
0, // length that studs protrude from the PCB holes
|
||||
[], // keep out region for ribbon cable
|
||||
];
|
||||
|
||||
|
||||
|
@@ -151,10 +151,8 @@ function fan_screw_depth(type, full_depth = false) = fan_boss_d(type) || full_de
|
||||
|
||||
function fan_screw_length(type, thickness, full_depth = false) =
|
||||
let(depth = fan_screw_depth(type, full_depth),
|
||||
washers = depth == fan_depth(type) ? 2 : 1,
|
||||
washer = screw_washer(fan_screw(type)),
|
||||
nut = screw_nut(fan_screw(type)))
|
||||
screw_longer_than(thickness + depth + washer_thickness(washer) * washers + nut_thickness(nut, true)); //! Screw length required
|
||||
washers = depth == fan_depth(type) ? 2 : 1)
|
||||
screw_length(fan_screw(type), thickness + depth, washers, nyloc = true); //! Screw length required
|
||||
|
||||
module fan_assembly(type, thickness, include_fan = true, screw = false, full_depth = false) { //! Fan with its fasteners
|
||||
translate_z(-fan_depth(type) / 2) {
|
||||
|
@@ -31,7 +31,9 @@ gt_2p54 = ["gt_2p54", 2.54, 6.6, 10, 3, 6, 0.4, 6.4, 1, 1, 0.2, 2,
|
||||
gt_3p5 = ["gt_3p5", 3.5, 7.3, 8.5, 4, 5, 0.4, 4, 0, 1.35, 0.4, 1.8, 2, 2, 0, 0, 0];
|
||||
gt_5p08 = ["gt_5p08", 5.08, 7.9, 10, 5.0, 7, 0.0, 6.8, 1.45, 1.95, 0.5, 4.0, 5.4, 0.5, 0, 0, 0];
|
||||
gt_6p35 = ["gt_6p35", 6.35, 12.6, 17.4, 6.8, 12, 0.4, 11, 2, 2.7, 0.8, 3.4, 4.2, 2, 1.8, 1.1, 21.4];
|
||||
gt_5x11 = ["gt_5x11", 5, 8, 11, 5, 7, 0.4, 7, 1.5, 1.5, 1, 2.5, 6, 0, 0, 0, 0];
|
||||
gt_5x17 = ["gt_5x17", 5, 10, 17, 5, 11, 0.4, 9, 2, 1.5, 1, 3, 6, 0, 0, 0, 0];
|
||||
|
||||
green_terminals = [gt_2p54, gt_3p5, gt_5p08, gt_6p35];
|
||||
green_terminals = [gt_2p54, gt_3p5, gt_5p08, gt_6p35, gt_5x11, gt_5x17];
|
||||
|
||||
use <green_terminal.scad>
|
||||
|
@@ -247,10 +247,7 @@ module iec_inserts(type) { //! Place the inserts
|
||||
|
||||
module iec_assembly(type, thickness) { //! Assembly with fasteners given panel thickness
|
||||
screw = iec_screw(type);
|
||||
washer = screw_washer(screw);
|
||||
nut = screw_nut(screw);
|
||||
insert = screw_insert(screw);
|
||||
screw_length = thickness ? screw_longer_than(iec_flange_t(type) + thickness + washer_thickness(washer) + nut_thickness(nut, true))
|
||||
screw_length = thickness ? screw_length(screw, iec_flange_t(type) + thickness, 1, nyloc = true)
|
||||
: insert_screw_length;
|
||||
|
||||
iec(type);
|
||||
@@ -262,6 +259,6 @@ module iec_assembly(type, thickness) { //! Assembly with fasteners given panel
|
||||
if(thickness)
|
||||
translate_z(-thickness)
|
||||
vflip()
|
||||
nut_and_washer(nut, true);
|
||||
nut_and_washer(screw_nut(screw), true);
|
||||
}
|
||||
}
|
||||
|
@@ -129,15 +129,13 @@ module mod_screw_positions(type) //! Position children at the screw positions
|
||||
|
||||
module module_assembly(type, thickness) { //! Module with its fasteners in place
|
||||
screw = mod_screw(type);
|
||||
washer = screw_washer(screw);
|
||||
nut = screw_nut(screw);
|
||||
screw_length = screw_longer_than(thickness + mod_screw_z(type) + 2 * washer_thickness(washer) + nut_thickness(nut, true));
|
||||
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(nut, true);
|
||||
nut_and_washer(screw_nut(screw), true);
|
||||
|
||||
translate_z(-thickness)
|
||||
vflip()
|
||||
|
@@ -1121,9 +1121,7 @@ module pcb_assembly(type, height, thickness) { //! Draw PCB assembly with spaces
|
||||
|
||||
screw = pcb_screw(type);
|
||||
if(!is_undef(screw)) {
|
||||
washer = screw_washer(screw);
|
||||
nut = screw_nut(screw);
|
||||
screw_length = screw_longer_than(height + thickness + pcb_thickness(type) + washer_thickness(washer) + nut_thickness(nut, true));
|
||||
screw_length = screw_length(screw, height + thickness + pcb_thickness(type), 1, nyloc = true);
|
||||
|
||||
taper = screw_smaller_than(pcb_hole_d(type)) > 2 * screw_radius(screw); // Arduino?
|
||||
pcb_screw_positions(type) {
|
||||
@@ -1138,7 +1136,7 @@ module pcb_assembly(type, height, thickness) { //! Draw PCB assembly with spaces
|
||||
|
||||
translate_z(-thickness)
|
||||
vflip()
|
||||
nut_and_washer(nut, true);
|
||||
nut_and_washer(screw_nut(screw), true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -414,8 +414,33 @@ RAMPSEndstop = ["RAMPSEndstop", "RAMPS Endstop Switch",
|
||||
],
|
||||
[]];
|
||||
|
||||
ESP_01 = [
|
||||
"ESP-01", "ESP-01",
|
||||
24.8, 14.6, 1, // size
|
||||
0, // corner radius
|
||||
0, // mounting hole diameter
|
||||
0, // pad around mounting hole
|
||||
grey(25), // color
|
||||
false, // true if parts should be separate BOM items
|
||||
[], // hole positions
|
||||
[ // components
|
||||
[ 2.8, -7.25, 0, "-2p54header", 2, 4 ],
|
||||
[ -14.55, -11.3, 0, "chip", 5.25, 5.25, 2.25, grey(15) ],
|
||||
[ -14, -5.2, 0, "chip", 4.5, 4.75, 1.1, grey(15) ],
|
||||
// antenna
|
||||
for (y = [ 2.8 : 2.3 : 7.4 ]) [ -0.7, -y, 0, "block", 0.7, 1.75, 0.1, gold ],
|
||||
for (y = [ 4 : 2.3 : 10.6 ]) [ -4.3, -y, 0, "block", 0.7, 1.75, 0.1, gold ],
|
||||
for (y = [ 3.4 : 2.3 : 10.1 ]) [ -2.5, -y, 0, "block", 4.3, 0.7, 0.1, gold ],
|
||||
for (y = [ 4.55 : 2.3 : 11.2 ]) [ -2.5, -y, 0, "block", 4.3, 0.7, 0.1, gold ],
|
||||
|
||||
pcbs = [MP1584EN, TP4056, MT3608, RAMPSEndstop, ExtruderPCB, PI_IO, ZC_A0591, RPI0, EnviroPlus, ArduinoUno3, ArduinoLeonardo, Keyes5p1, PSU12V1A, WD2002SJ, RPI3, RPI4, DuetE, Duex2, Duex5];
|
||||
[ -0.7, -10.85, 0, "block", 0.7,3.75, 0.1, gold ],
|
||||
[ -6.6, -5.8, 0, "block", 0.7, 7.5, 0.1, gold ],
|
||||
[ -4.8, -2.3, 0, "block", 8.8, 0.7, 0.1, gold ],
|
||||
],
|
||||
[] // accessories
|
||||
];
|
||||
|
||||
pcbs = [MP1584EN, TP4056, ESP_01, MT3608, RAMPSEndstop, ExtruderPCB, PI_IO, ZC_A0591, RPI0, EnviroPlus, ArduinoUno3, ArduinoLeonardo, Keyes5p1, PSU12V1A, WD2002SJ, RPI3, RPI4, DuetE, Duex2, Duex5];
|
||||
|
||||
perfboards = [PERF74x51, PERF70x50, PERF60x40, PERF70x30, PERF80x20];
|
||||
|
||||
|
@@ -33,6 +33,9 @@ function rail_bore_depth(type) = type[7]; //! Counter bore depth
|
||||
function rail_screw(type) = type[8]; //! Screw type
|
||||
function rail_carriage(type) = type[9]; //! Carriage type
|
||||
function rail_end_screw(type) = type[10]; //! Screw used for ends only (Countersink used for better location)
|
||||
function rail_groove_offset(type)=type[11]; //! Offset of centre of groove from top of rail
|
||||
function rail_groove_width(type)=type[12]; //! Groove width
|
||||
|
||||
function rail_screw_height(type, screw) = rail_height(type) - rail_bore_depth(type) + screw_head_depth(screw, rail_hole(type)); //! Position screw taking into account countersink into counterbored hole
|
||||
function rail_travel(type, length) = length - carriage_length(rail_carriage(type)); //! How far the carriage can travel
|
||||
|
||||
@@ -134,43 +137,45 @@ module carriage(type, rail, end_colour = grey(20), wiper_colour = grey(20)) { //
|
||||
carriage_end(type, end_w, end_h, end_l);
|
||||
}
|
||||
|
||||
module rail(type, length) { //! Draw the specified rail
|
||||
module rail(type, length, colour = grey(90), use_polycircles = false) { //! Draw the specified rail
|
||||
width = rail_width(type);
|
||||
height = rail_height(type);
|
||||
|
||||
vitamin(str("rail(", type[0], ", ", length, "): Linear rail ", type[0], " x ", length, "mm"));
|
||||
|
||||
color(grey(90)) {
|
||||
color(colour) {
|
||||
rbr = rail_bore(type) / 2;
|
||||
w = corrected_radius(rbr) * 2 + 2 * eps; // width of core big enough for the holes
|
||||
linear_extrude(height - rail_bore_depth(type)) difference() {
|
||||
square([length, width], center = true);
|
||||
square([length, w], center = true);
|
||||
|
||||
rail_hole_positions(type, length)
|
||||
circle(d = rail_hole(type));
|
||||
if (use_polycircles)
|
||||
poly_circle(rail_hole(type) / 2);
|
||||
else
|
||||
circle(d = rail_hole(type));
|
||||
}
|
||||
translate_z(rail_height(type) - rail_bore_depth(type))
|
||||
linear_extrude(rail_bore_depth(type)) difference() {
|
||||
square([length, w], center = true);
|
||||
|
||||
translate_z(rail_height(type) - rail_bore_depth(type)) {
|
||||
h1 = rail_bore_depth(type) > 2 ? rail_bore_depth(type) / 3 : rail_bore_depth(type) / 2;
|
||||
h0 = rail_bore_depth(type) > 2 ? (rail_bore_depth(type) - h1) / 2 : 0;
|
||||
h2 = rail_bore_depth(type) - h1 - h0;
|
||||
|
||||
linear_extrude(h0) difference() {
|
||||
square([length, width], center = true);
|
||||
rail_hole_positions(type, length)
|
||||
circle(d = rail_bore(type));
|
||||
if (use_polycircles)
|
||||
poly_circle(rbr);
|
||||
else
|
||||
circle(rbr);
|
||||
}
|
||||
translate_z(h0)
|
||||
linear_extrude(h1) difference() {
|
||||
w1 = max(width - 2, rail_bore(type));
|
||||
square([length, w1], center = true);
|
||||
rail_hole_positions(type, length)
|
||||
circle(d = rail_bore(type));
|
||||
}
|
||||
translate_z(h0 + h1)
|
||||
linear_extrude(h2) difference() {
|
||||
square([length, width], center = true);
|
||||
rail_hole_positions(type, length)
|
||||
circle(d = rail_bore(type));
|
||||
}
|
||||
}
|
||||
|
||||
go = height - rail_groove_offset(type);
|
||||
gw = rail_groove_width(type);
|
||||
gd = gw / 2;
|
||||
sw = (width - w) / 2;
|
||||
for (m = [0, 1])
|
||||
mirror([0, m, 0])
|
||||
translate([0, -width / 2])
|
||||
rotate([0, -90, 0])
|
||||
linear_extrude(length, center = true)
|
||||
polygon([ [0, 0], [0, sw], [height, sw], [height, 0], [go + gw/2, 0], [go, gd], [go - gw/2, 0] ]);
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -32,14 +32,14 @@ SSR15_carriage = [ 40.3, 23.3, 34, 24, 4.5, 0, 26, M4_cap_screw ];
|
||||
// Rails
|
||||
//
|
||||
//
|
||||
// Wr Hr E P D d h
|
||||
MGN5 = [ "MGN5", 5, 3.6, 5, 15, 3.6, 2.4, 0.8, M2_cs_cap_screw, MGN5_carriage, M2_cs_cap_screw ]; // Screw holes too small for M2 heads
|
||||
MGN7 = [ "MGN7", 7, 5, 5, 15, 4.3, 2.4, 2.6, M2_cap_screw, MGN7_carriage, M2_cs_cap_screw ];
|
||||
MGN9 = [ "MGN9", 9, 6, 7.5, 20, 6.0, 3.5, 3.5, M3_cap_screw, MGN9_carriage, M3_cs_cap_screw ];
|
||||
MGN12= [ "MGN12", 12, 8, 10, 25, 6.0, 3.5, 4.5, M3_cap_screw, MGN12_carriage, M3_cs_cap_screw ];
|
||||
MGN12H=[ "MGN12H",12, 8, 10, 25, 6.0, 3.5, 4.5, M3_cap_screw, MGN12H_carriage,M3_cs_cap_screw ];
|
||||
MGN15= [ "MGN15", 15, 10, 10, 40, 6.0, 3.5, 5.0, M3_cap_screw, MGN15_carriage, M3_cs_cap_screw ];
|
||||
SSR15= [ "SSR15", 15, 12.5,10, 60, 7.5, 4.5, 5.3, M4_cap_screw, SSR15_carriage, M4_cs_cap_screw ];
|
||||
// Wr Hr E P D d h go gw
|
||||
MGN5 = [ "MGN5", 5, 3.6, 5, 15, 3.6, 2.4, 0.8, M2_cs_cap_screw, MGN5_carriage, M2_cs_cap_screw, 1, 1 ]; // Screw holes too small for M2 heads
|
||||
MGN7 = [ "MGN7", 7, 5, 5, 15, 4.3, 2.4, 2.6, M2_cap_screw, MGN7_carriage, M2_cs_cap_screw, 1.5, 1.5 ];
|
||||
MGN9 = [ "MGN9", 9, 6, 7.5, 20, 6.0, 3.5, 3.5, M3_cap_screw, MGN9_carriage, M3_cs_cap_screw, 1.5, 1.5 ];
|
||||
MGN12= [ "MGN12", 12, 8, 10, 25, 6.0, 3.5, 4.5, M3_cap_screw, MGN12_carriage, M3_cs_cap_screw, 2.25, 2.75 ];
|
||||
MGN12H=[ "MGN12H",12, 8, 10, 25, 6.0, 3.5, 4.5, M3_cap_screw, MGN12H_carriage,M3_cs_cap_screw, 2.25, 2.75];
|
||||
MGN15= [ "MGN15", 15, 10, 10, 40, 6.0, 3.5, 5.0, M3_cap_screw, MGN15_carriage, M3_cs_cap_screw, 2.5, 2.75 ];
|
||||
SSR15= [ "SSR15", 15, 12.5,10, 60, 7.5, 4.5, 5.3, M4_cap_screw, SSR15_carriage, M4_cs_cap_screw, 2.5, 2.75 ];
|
||||
|
||||
rails = [MGN5, MGN7, MGN9, MGN12, MGN12H, MGN15, SSR15];
|
||||
|
||||
|
@@ -128,7 +128,7 @@ module ring_terminal_assembly(type, thickness, top = false) { //! Earthing assem
|
||||
screw = ringterm_screw(type);
|
||||
washer = screw_washer(screw);
|
||||
nut = screw_nut(screw);
|
||||
screw_length = screw_longer_than(thickness + 2 * washer_thickness(washer) + nut_thickness(nut, true) + ringterm_thickness(type));
|
||||
screw_length = screw_length(screw, thickness + ringterm_thickness(type), 2, nyloc = true);
|
||||
|
||||
explode(10, true) star_washer(washer)
|
||||
if(top)
|
||||
|
@@ -48,7 +48,7 @@ function screw_head_depth(type, d = 0) = //! How far a counter sink
|
||||
? 0
|
||||
: let(r = screw_radius(type)) screw_head_radius(type) - max(r, d / 2) + r / 5;
|
||||
|
||||
function screw_longer_than(x) = x <= 5 ? 5 : //! Returns shortest screw length longer or equal to x
|
||||
function screw_longer_than(x) = x <= 5 ? 5 : //! Returns the length of the shortest screw length longer or equal to x
|
||||
x <= 6 ? 6 :
|
||||
x <= 8 ? 8 :
|
||||
x <= 10 ? 10 :
|
||||
@@ -56,7 +56,7 @@ function screw_longer_than(x) = x <= 5 ? 5 : //! Returns shortest screw length
|
||||
x <= 16 ? 16 :
|
||||
ceil(x / 5) * 5;
|
||||
|
||||
function screw_shorter_than(x) = x >= 20 ? floor(x / 5) * 5 : //! Returns longest screw length shorter than or equal to x
|
||||
function screw_shorter_than(x) = x >= 20 ? floor(x / 5) * 5 : //! Returns the length of the longest screw shorter than or equal to x
|
||||
x >= 16 ? 16 :
|
||||
x >= 12 ? 12 :
|
||||
x >= 10 ? 10 :
|
||||
@@ -64,6 +64,14 @@ function screw_shorter_than(x) = x >= 20 ? floor(x / 5) * 5 : //! Returns longes
|
||||
x >= 6 ? 6 :
|
||||
5;
|
||||
|
||||
function screw_length(screw, thickness, washers, insert = false, nyloc = false, nut = false, longer = false) = //! Returns the length of the longest or shortest screw that will got through `thickness` and `washers` and possibly an `insert`, `nut` or `nyloc`
|
||||
let(washer = washers ? washers * washer_thickness(screw_washer(screw)) : 0,
|
||||
insert = insert ? insert_length(screw_insert(screw)) : 0,
|
||||
nut = nut || nyloc ? nut_thickness(screw_nut(screw), nyloc) : 0,
|
||||
total = thickness + washer + insert + nut
|
||||
)
|
||||
longer || nut || nyloc ? screw_longer_than(total) : screw_shorter_than(total);
|
||||
|
||||
function screw_smaller_than(d) = d >= 2.5 && d < 3 ? 2.5 : floor(d); // Largest diameter screw less than or equal to specified diameter
|
||||
|
||||
function screw_insert(screw, i = 0) = let(d = screw_radius(screw) * 2)
|
||||
|
@@ -71,15 +71,13 @@ use <nut.scad>
|
||||
use <washer.scad>
|
||||
|
||||
module ssr_assembly(type, screw, thickness) { //! Assembly with fasteners in place
|
||||
nut = screw_nut(screw);
|
||||
washer = screw_washer(screw);
|
||||
screw_length = screw_longer_than(2 * washer_thickness(washer) + thickness + ssr_base_t(type) + nut_thickness(nut, true));
|
||||
screw_length = screw_length(screw, thickness + ssr_base_t(type), 2, nyloc = true);
|
||||
|
||||
ssr(type);
|
||||
|
||||
ssr_hole_positions(type) {
|
||||
translate_z(ssr_base_t(type))
|
||||
nut_and_washer(nut, true);
|
||||
nut_and_washer(screw_nut(screw), true);
|
||||
|
||||
translate_z(-thickness)
|
||||
vflip()
|
||||
|
@@ -146,9 +146,8 @@ module vero_cutouts(type, angle = undef) vero_components(type, true, angle); //!
|
||||
module veroboard_assembly(type, height, thickness, flip = false) //! Draw the assembly with components and fasteners in place
|
||||
assembly(vero_assembly(type)) {
|
||||
screw = vero_screw(type);
|
||||
washer = screw_washer(screw);
|
||||
nut = screw_nut(screw);
|
||||
screw_length = screw_longer_than(height + thickness + vero_thickness(type) + 2 * washer_thickness(washer) + nut_thickness(nut, true));
|
||||
screw_length = screw_length(screw, height + thickness + vero_thickness(type), 2, nyloc = true);
|
||||
|
||||
translate_z(height) {
|
||||
veroboard(type);
|
||||
|