1
0
mirror of https://github.com/nophead/NopSCADlib.git synced 2025-09-03 20:32:35 +02:00

Compare commits

...

79 Commits

Author SHA1 Message Date
Chris Palmer
5a1b06fbb9 Merge branch 'martinbudden-BTT_SKR_MINI_E3_V2_0' 2021-01-24 11:20:37 +00:00
Chris Palmer
fd174bbfb4 Updated readme and images. 2021-01-24 11:20:01 +00:00
Chris Palmer
186f31bb09 Merge branch 'BTT_SKR_MINI_E3_V2_0' of https://github.com/martinbudden/NopSCADlib into martinbudden-BTT_SKR_MINI_E3_V2_0 2021-01-24 10:59:03 +00:00
Martin Budden
80f0490d58 Added BTT_SKR_MINI_E3_V2_0 pcb. 2021-01-24 10:55:49 +00:00
Chris Palmer
c9e9942070 Fixed some paths that used NopSCADlib instead of .. 2021-01-23 21:15:00 +00:00
Chris Palmer
e41366e20c Added explicit error message when tmp.png is not generated as expected.
Prints a newline after test runs rather than before.
2021-01-21 12:49:48 +00:00
Chris Palmer
0595fb5a92 Merge branch 'martinbudden-btt_skr_1_4' 2021-01-18 15:57:04 +00:00
Chris Palmer
abb676b75c Updated readme and cover picture for BTT_SKR_V1_4_TURBO PCB.
Added list of hidden pcbs to hide the boring ones.
Smaller PCBs closer together to make space.
2021-01-18 15:56:09 +00:00
Chris Palmer
19bae20e24 Merge branch 'btt_skr_1_4' of https://github.com/martinbudden/NopSCADlib into martinbudden-btt_skr_1_4 2021-01-18 12:54:03 +00:00
Chris Palmer
a7d181ffc4 Merge branch 'martinbudden-rectangular_tube' 2021-01-18 12:52:53 +00:00
Chris Palmer
6b2f8d282b Updated readme and images. 2021-01-18 12:52:41 +00:00
Chris Palmer
5bb95b2406 Merge branch 'rectangular_tube' of https://github.com/martinbudden/NopSCADlib into martinbudden-rectangular_tube 2021-01-18 10:34:51 +00:00
Chris Palmer
dc3905b284 Removed redundant longer = true with nyloc = true. 2021-01-18 10:33:17 +00:00
Martin Budden
bd2ea3f284 Added a rectangular tube. 2021-01-17 16:34:09 +00:00
Martin Budden
62183bcadc Added BTT SKR V1.4 Turbo pcb. 2021-01-17 16:29:42 +00:00
Chris Palmer
7f9122ae66 Added --hardwarnings to openscad.py 2021-01-15 18:13:20 +00:00
Chris Palmer
93b260b7b9 Added screw_length() to calculuate screw lengths includin washers, inserts and nuts. 2021-01-15 18:12:37 +00:00
Chris Palmer
c33876530e Merge branch 'martinbudden-green_terminals' 2021-01-13 21:31:25 +00:00
Chris Palmer
8fea8f437b Updated images and readme for green terminals. 2021-01-13 21:31:14 +00:00
Chris Palmer
bc3ef607af Merge branch 'green_terminals' of https://github.com/martinbudden/NopSCADlib into martinbudden-green_terminals 2021-01-13 21:17:08 +00:00
Chris Palmer
6bcdc24cd3 Updated readme an images for ESP-01. 2021-01-13 21:12:29 +00:00
Chris Palmer
b8b4232882 Merge branch 'ESP8266' of https://github.com/martinbudden/NopSCADlib 2021-01-13 20:21:43 +00:00
Chris Palmer
0394d9981f Merge branch 'martinbudden-tft35' 2021-01-13 20:20:24 +00:00
Chris Palmer
e4e7096e3c Merge branch 'martinbudden-ESP8266' 2021-01-13 20:18:13 +00:00
Chris Palmer
d71bb4bdfa Remove commented out code. 2021-01-13 20:17:43 +00:00
Chris Palmer
89c3767f21 Update image. 2021-01-13 20:09:16 +00:00
Martin Budden
c837de721d Renamed ESP8266 to ESP_01 and rotated. 2021-01-13 18:52:14 +00:00
Martin Budden
f8c87bd8e3 Added ESP8266. 2021-01-13 17:22:46 +00:00
Martin Budden
ef58fe5818 Minor corrections to positions on BigTreeTech_TFT35v3_0_PCB. 2021-01-13 15:57:27 +00:00
Martin Budden
9c0c0c0acf Added green terminals gt_5x11 and gt_5x17. 2021-01-13 15:51:41 +00:00
Chris Palmer
ac6e8e040a Fix for image magick returning non-integer pixels. 2021-01-12 14:51:55 +00:00
Chris Palmer
accf4f7bc1 Added printed pulleys to the big picture. 2021-01-10 22:31:14 +00:00
Chris Palmer
6bd4638e7d Fixed screw hole position of inverted printed_pulley.
Unexploded assembly view shows round screw holes to represent the tapped state.
2021-01-10 21:28:31 +00:00
Chris Palmer
4cca9d5285 Merge branch 'martinbudden-printed_pulleys' 2021-01-10 12:11:29 +00:00
Chris Palmer
c3fc352288 Fixed orientation of inverted pulley.
Added stl and assembly calls.
Same render handling as pulleys.
Updated pics and readme.
2021-01-10 12:11:03 +00:00
Chris Palmer
a8b634de39 Better pose for pulley test so screws can be seen. 2021-01-10 11:49:32 +00:00
Chris Palmer
1a55a08c59 Merge branch 'printed_pulleys' of https://github.com/martinbudden/NopSCADlib into martinbudden-printed_pulleys 2021-01-09 23:38:48 +00:00
Chris Palmer
8ca4bb5adc Merge branch 'martinbudden-linear_rails' 2021-01-09 23:37:26 +00:00
Chris Palmer
53e3378efe Updated images and readme 2021-01-09 23:37:06 +00:00
Chris Palmer
888199f698 Merge branch 'linear_rails' of https://github.com/martinbudden/NopSCADlib into martinbudden-linear_rails 2021-01-09 20:54:28 +00:00
Chris Palmer
f51e93969d Merge branch 'martinbudden-teardrop_chamfer' 2021-01-09 19:55:45 +00:00
Chris Palmer
757b808f07 Updated readme for teardrops chamfer one side. 2021-01-09 19:55:31 +00:00
Chris Palmer
eca8f2eccc Merge branch 'teardrop_chamfer' of https://github.com/martinbudden/NopSCADlib into martinbudden-teardrop_chamfer 2021-01-09 19:26:36 +00:00
Chris Palmer
450224ec39 Merge branch 'martinbudden-fan_rename' 2021-01-09 19:24:53 +00:00
Chris Palmer
dcd2624a12 Updated readme for blower(BL40x10). 2021-01-09 19:24:06 +00:00
Chris Palmer
83e8502ecb Merge branch 'fan_rename' of https://github.com/martinbudden/NopSCADlib into martinbudden-fan_rename 2021-01-09 19:22:51 +00:00
Chris Palmer
a722df0b2b J-head heater components now hidden when taped. 2021-01-09 19:21:49 +00:00
Chris Palmer
6d223c8d1f Added render to countersink. 2021-01-09 19:11:20 +00:00
Chris Palmer
6d59ea2bc8 Added render option to drag_chain_assembly(). 2021-01-09 18:43:43 +00:00
Martin Budden
b74cbee151 Rendering changes to match pulleys. 2021-01-09 18:15:19 +00:00
Martin Budden
9f7efd50fb Replaced poly_circle bores with circular bores. 2021-01-09 17:52:24 +00:00
Martin Budden
0b14d3fbc4 Added printable pulleys. 2021-01-09 17:52:24 +00:00
Martin Budden
8243b244af Clarified name of BL40x10 blower. 2021-01-09 13:02:57 +00:00
Martin Budden
1a2e04367d Added option to chamfer only one end of a teardrop. 2021-01-09 12:59:01 +00:00
Martin Budden
abc38f2744 Changed linear rails to use a v-slot rather than a square slot. 2021-01-09 12:08:45 +00:00
Chris Palmer
f97070099e Merge branch 'martinbudden-pulley_drawing_efficiency' 2021-01-09 11:15:08 +00:00
Chris Palmer
729891b675 Improved pulley.scad speed. 2021-01-09 11:13:14 +00:00
Chris Palmer
4b533cffd2 Merge branch 'pulley_drawing_efficiency' of https://github.com/martinbudden/NopSCADlib into martinbudden-pulley_drawing_efficiency 2021-01-08 22:06:31 +00:00
Chris Palmer
a40a2190dc Merge branch 'martinbudden-vero_size' 2021-01-08 21:26:32 +00:00
Chris Palmer
6556d14a11 Updated readme for veroboard_size(). 2021-01-08 21:26:18 +00:00
Chris Palmer
c7d12b20c9 Merge branch 'vero_size' of https://github.com/martinbudden/NopSCADlib into martinbudden-vero_size 2021-01-08 21:24:58 +00:00
Chris Palmer
545329b875 Bug fix hygrometer_hole() when h > 0. 2021-01-08 21:24:06 +00:00
Martin Budden
760e3a890d Added vero_size function. 2021-01-08 11:47:34 +00:00
Martin Budden
bd4f7b155b Conditionally rendered pulleys to speed up drawing. 2021-01-08 11:33:17 +00:00
Chris Palmer
16c1eeef27 Documented circle_tangent() and simplified it. 2021-01-06 10:54:21 +00:00
Chris Palmer
800bb89921 Added microswitch_size(). 2021-01-06 09:36:13 +00:00
Chris Palmer
41a0723362 Can now control the number of index_screws in rail_screws() 2021-01-04 15:26:29 +00:00
Chris Palmer
6b8ea9685e Fixed rail_hole_positions() bug. 2021-01-04 14:46:54 +00:00
Chris Palmer
0cf8cb7d28 Added missing vitamin() call in magnet.scad. 2021-01-04 01:04:04 +00:00
Chris Palmer
7c439a687f Fixed openscad.py on Linux. 2021-01-03 09:51:20 +00:00
Chris Palmer
4a95ce528e Merge branch 'martinbudden-pancake_stepper' 2021-01-02 11:02:27 +00:00
Chris Palmer
138f45730b Updated images and readme. 2021-01-02 11:02:06 +00:00
Chris Palmer
8d1ff3584c Merge branch 'pancake_stepper' of https://github.com/martinbudden/NopSCADlib into martinbudden-pancake_stepper 2021-01-02 10:38:27 +00:00
Chris Palmer
26b2b63b6e Merge branch 'martinbudden-rocker' 2021-01-02 10:13:23 +00:00
Chris Palmer
611772d960 Updated readme for rocker. 2021-01-02 10:12:54 +00:00
Chris Palmer
b6e648b485 Merge branch 'rocker' of https://github.com/martinbudden/NopSCADlib into martinbudden-rocker 2021-01-02 10:10:03 +00:00
Martin Budden
3e4eedc25f Added JST connector to NEMA17P in tests. 2020-12-31 12:30:06 +00:00
Martin Budden
7449857ab7 Added NEMA17P pancake stepper motor. 2020-12-31 12:20:11 +00:00
Martin Budden
49f6da767a Added size and slot convenience functions. Added non-rounded hole. 2020-12-31 11:59:41 +00:00
67 changed files with 915 additions and 290 deletions

View File

@@ -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();

View File

@@ -35,7 +35,6 @@ include <vitamins/displays.scad>
include <vitamins/extrusions.scad>
include <vitamins/extrusion_brackets.scad>
include <vitamins/geared_steppers.scad>
include <vitamins/green_terminals.scad>
include <vitamins/hot_ends.scad>
include <vitamins/inserts.scad>
include <vitamins/kp_pillow_blocks.scad>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 860 KiB

After

Width:  |  Height:  |  Size: 875 KiB

View File

@@ -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();
@@ -351,7 +355,7 @@ modules_y = iecs_y + 60;
ssrs_y = modules_y + 80;
blowers_y = ssrs_y + 60;
batteries_y = blowers_y + 100;
steppers_y = batteries_y + 70;
steppers_y = batteries_y + 55;
panel_meters_y = steppers_y + 70;
extrusions_y = panel_meters_y + 80;

View File

@@ -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

View File

@@ -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);

View File

@@ -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();

View File

@@ -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);
}
}
}

View File

@@ -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]) {

View File

@@ -251,7 +251,7 @@ module drag_chain_link(type, start = false, end = false, check_kids = true) { //
}
// Need to use a wrapper because can't define nested modules in an assembly
module _drag_chain_assembly(type, pos = 0) {
module _drag_chain_assembly(type, pos = 0, render = false) {
s = drag_chain_size(type);
x = (1 + exploded()) * s.x;
r = drag_chain_radius(type) * x / s.x;
@@ -278,8 +278,11 @@ module _drag_chain_assembly(type, pos = 0) {
module link(n) // Position and colour link with origin at the hinge hole
translate([-z / 2, 0, -z / 2]) {
stl_colour(n < 0 || n == npoints - 1 ? pp3_colour : n % 2 ? pp1_colour : pp2_colour)
drag_chain_link(type, start = n == -1, end = n == npoints - 1, check_kids = false)
let($fasteners = 0) children();
render_if(render)
drag_chain_link(type, start = n == -1, end = n == npoints - 1, check_kids = false)
let($fasteners = 0)
children();
let($fasteners = 1) children();
}
@@ -307,15 +310,15 @@ module _drag_chain_assembly(type, pos = 0) {
//! 1. Remove the support material from the links with side cutters.
//! 1. Clip the links together with the special ones at the ends.
module drag_chain_assembly(type, pos = 0) //! Drag chain assembly
module drag_chain_assembly(type, pos = 0, render = false) //! Drag chain assembly
assembly(str(drag_chain_name(type), "_drag_chain"), big = true)
if($children == 2)
_drag_chain_assembly(type, pos) {
_drag_chain_assembly(type, pos, render) {
children(0);
children(1);
}
else if($children == 1)
_drag_chain_assembly(type, pos)
_drag_chain_assembly(type, pos, render)
children(0);
else
_drag_chain_assembly(type, pos);
_drag_chain_assembly(type, pos, render);

View File

@@ -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)

View File

@@ -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()

View File

@@ -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);

View File

@@ -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();

View File

@@ -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) {

View File

@@ -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

View 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 <../core.scad>
include <../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));
}
}

View File

@@ -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);

View File

@@ -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);

View File

@@ -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)

View File

@@ -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);

View File

@@ -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);

190
readme.md
View File

@@ -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>
@@ -313,7 +313,7 @@ Models of radial blowers.
| 4 | `screw(M2_cap_screw, 8)` | Screw M2 cap x 8mm |
| 3 | `screw(M3_cap_screw, 20)` | Screw M3 cap x 20mm |
| 2 | `screw(M4_cap_screw, 25)` | Screw M4 cap x 25mm |
| 1 | `blower(BL40x10)` | Square radial 4010 |
| 1 | `blower(BL40x10)` | Square radial fan 4010 |
| 4 | `washer(M2_washer)` | Washer M2 x 5mm x 0.3mm |
| 3 | `washer(M3_washer)` | Washer M3 x 7mm x 0.5mm |
| 2 | `washer(M4_washer)` | Washer M4 x 9mm x 0.8mm |
@@ -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>
@@ -1102,17 +1104,17 @@ Needs updating as mostly obsolete versions.
### Vitamins
| Qty | Module call | BOM entry |
| ---:|:--- |:---|
| 2 | `tubing(HSHRNK16)` | Heatshrink sleeving ID 1.6mm x 15mm |
| 2 | `tubing(HSHRNK16)` | Heatshrink sleeving ID 1.6mm x 15mm - not shown |
| 4 | `tubing(HSHRNK64, 60)` | Heatshrink sleeving ID 6.4mm x 60mm |
| 1 | `e3d_hot_end(E3Dv5, 3)` | Hot end E3D V5 direct 3mm |
| 1 | `e3d_hot_end(E3Dv6, 3)` | Hot end E3D V6 direct 3mm |
| 1 | `e3d_hot_end(E3D_clone, 3)` | Hot end E3D clone aliexpress 3mm |
| 1 | `jhead_hot_end(JHeadMk5, 3)` | Hot end JHead MK5 3mm |
| 2 | `tubing(PTFE07, 62)` | PTFE sleeving OD 1.2mm ID 0.71mm x 62mm |
| 2 | `tubing(PTFE20, 45)` | PTFE sleeving OD 2.6mm ID 2mm x 45mm |
| 1 | `resistor(RIE1212UB5C5R6)` | Resistor UB5C 5R6F 5R6 3W vitreous enamel |
| 2 | `tubing(PTFE07, 62)` | PTFE sleeving OD 1.2mm ID 0.71mm x 62mm - not shown |
| 2 | `tubing(PTFE20, 45)` | PTFE sleeving OD 2.6mm ID 2mm x 45mm - not shown |
| 1 | `resistor(RIE1212UB5C5R6)` | Resistor UB5C 5R6F 5R6 3W vitreous enamel - not shown |
| 1 | | Tape self amalgamating silicone 110mm x 25mm |
| 1 | `resistor(Epcos)` | Thermistor Epcos B57560G104F 100K 1% |
| 1 | `resistor(Epcos)` | Thermistor Epcos B57560G104F 100K 1% - not shown |
| 2 | | Wire Red PTFE 16/0.2mm strands, length 170mm |
| 4 | `ziptie(small_ziptie, 8)` | Ziptie 2.5mm x 100mm min length |
@@ -1687,6 +1689,13 @@ Cylindrical and ring magnets.
![magnets](tests/png/magnets.png)
### Vitamins
| Qty | Module call | BOM entry |
| ---:|:--- |:---|
| 1 | `magnet(MAG484)` | Magnet 6.35mm diameter, 6.35mm high, 3.175mm bore |
| 1 | `magnet(MAG8x4x4p2)` | Magnet 8mm diameter, 4mm high, 4.2mm bore |
| 1 | `magnet(MAG5x8)` | Magnet 8mm diameter, 5mm high |
<a href="#top">Top</a>
@@ -1771,6 +1780,7 @@ Used for limit switches.
|:--- |:--- |
| `microswitch_lower_extent(type)` | How far legs extend downwards |
| `microswitch_right_extent(type)` | How far legs extend right |
| `microswitch_size(type)` | Body size |
### Modules
| Module | Description |
@@ -2295,25 +2305,30 @@ PCBs and perfboard with optional components. The shape can be a rectangle with o
| ---:|:--- |:---|
| 1 | `pcb(ArduinoLeonardo)` | Arduino Leonardo |
| 1 | `pcb(ArduinoUno3)` | Arduino Uno R3 |
| 1 | `pcb(BTT_SKR_MINI_E3_V2_0)` | BigTreeTech SKR Mini E3 v2.0 |
| 1 | `pcb(BTT_SKR_V1_4_TURBO)` | BigTreeTech SKR v1.4 Turbo |
| 1 | | Cat 5 patch cable 300mm |
| 1 | `d_plug(DCONN15, pcb = true)` | D-type 15 way PCB mount plug |
| 1 | `pcb(DuetE)` | Duet 2 Ethernet electronics |
| 1 | `pcb(Duex2)` | Duex2 expansion board |
| 1 | `pcb(Duex2)` | Duex2 expansion board - not shown |
| 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 |
| 1 | `pcb(MP1584EN)` | MP1584EN 3A buck converter |
| 1 | `pcb(MT3608)` | MT3608 boost converter module |
| 1 | `pcb(Melzi)` | Melzi electronics - not shown |
| 4 | | Micro SD card |
| 1 | | Micro SD card - not shown |
| 1 | `molex_254(2)` | Molex KK header 2 way |
| 1 | `molex_254(3)` | Molex KK header 3 way |
| 16 | `nut(M2_nut, nyloc = true)` | Nut M2 x 1.6mm nyloc |
| 34 | `nut(M2p5_nut, nyloc = true)` | Nut M2.5 x 2.2mm nyloc |
| 12 | `nut(M3_nut, nyloc = true)` | Nut M3 x 2.4mm nyloc |
| 12 | `nut(M4_nut, nyloc = true)` | Nut M4 x 3.2mm nyloc |
| 17 | `nut(M3_nut, nyloc = true)` | Nut M3 x 2.4mm nyloc |
| 8 | `nut(M4_nut, nyloc = true)` | Nut M4 x 3.2mm nyloc |
| 1 | `pcb(PI_IO)` | PI_IO V2 |
| 1 | `pcb(PSU12V1A)` | PSU 12V 1A |
| 1 | `pcb(PSU12V1A)` | PSU 12V 1A - not shown |
| 1 | `pcb(PERF60x40)` | Perfboard 60 x 40mm |
| 1 | `pcb(PERF70x30)` | Perfboard 70 x 30mm |
| 1 | `pcb(PERF70x50)` | Perfboard 70 x 50mm |
@@ -2329,19 +2344,21 @@ 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 |
| 4 | `screw(M3_cap_screw, 30)` | Screw M3 cap x 30mm |
| 9 | `screw(M3_cap_screw, 35)` | Screw M3 cap x 35mm |
| 8 | `screw(M4_cap_screw, 35)` | Screw M4 cap x 35mm |
| 1 | `pcb(TP4056)` | TP4056 Li-lon Battery charger module |
| 3 | `terminal_35(2)` | Terminal block 2 way 3.5mm |
| 2 | `green_terminal(gt_2p54, 4)` | Terminal block 4 way 0.1" |
| 1 | | USB A to Mini B lead - not shown |
| 1 | `pcb(WD2002SJ)` | WD2002SJ Buck Boost DC-DC converter |
| 16 | `washer(M2_washer)` | Washer M2 x 5mm x 0.3mm |
| 34 | `washer(M2p5_washer)` | Washer M2.5 x 5.9mm x 0.5mm |
| 12 | `washer(M3_washer)` | Washer M3 x 7mm x 0.5mm |
| 12 | `washer(M4_washer)` | Washer M4 x 9mm x 0.8mm |
| 17 | `washer(M3_washer)` | Washer M3 x 7mm x 0.5mm |
| 8 | `washer(M4_washer)` | Washer M4 x 9mm x 0.8mm |
| 1 | `pcb(ZC_A0591)` | ZC-A0591 ULN2003 driver PCB |
### Printed
@@ -2351,21 +2368,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_spacer25170_2.stl |
| 4 | pcb_spacer25190.stl |
| 4 | pcb_spacer25200.stl |
| 2 | pcb_spacer2580.stl |
| 4 | pcb_spacer30170.stl |
| 4 | pcb_spacer30180.stl |
| 5 | pcb_spacer30210.stl |
| 4 | pcb_spacer30220.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>
@@ -2650,6 +2667,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 |
@@ -2670,10 +2689,10 @@ 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)` | Place screws in the rail |
| `rail_screws(type, length, thickness, screws = 100, index_screws = undef)` | Place screws in the rail |
![rails](tests/png/rails.png)
@@ -2785,11 +2804,17 @@ Rocker switch. Also used for neon indicator in the same form factor.
| `rocker_spades(type)` | Spade types and positions |
| `rocker_width(type)` | Body width |
### Functions
| Function | Description |
|:--- |:--- |
| `rocker_size(type)` | Width, height, and depth in a vector |
| `rocker_slot(type)` | Rocker slot in a vector |
### Modules
| Module | Description |
|:--- |:--- |
| `rocker(type, colour)` | Draw the specified rocker switch |
| `rocker_hole(type, h = 0)` | Make a hole to accept a rocker switch, by default 2D, set h for 3D |
| `rocker_hole(type, h = 0, rounded = true)` | Make a hole to accept a rocker switch, by default 2D, set h for 3D |
![rockers](tests/png/rockers.png)
@@ -2883,10 +2908,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 |
@@ -3455,15 +3481,16 @@ NEMA stepper motor model.
| Qty | Module call | BOM entry |
| ---:|:--- |:---|
| 4 | `ring_terminal(M3_ringterm)` | Ring terminal 3mm |
| 15 | `screw(M3_pan_screw, 8)` | Screw M3 pan x 8mm |
| 20 | `screw(M3_pan_screw, 8)` | Screw M3 pan x 8mm |
| 1 | `NEMA(NEMA14)` | Stepper motor NEMA14 x 36mm |
| 1 | `NEMA(NEMA16)` | Stepper motor NEMA16 x 19.2mm |
| 1 | `NEMA(NEMA17P)` | Stepper motor NEMA17 x 26.5mm |
| 1 | `NEMA(NEMA17S)` | Stepper motor NEMA17 x 34mm |
| 1 | `NEMA(NEMA17M)` | Stepper motor NEMA17 x 40mm |
| 1 | `NEMA(NEMA17)` | Stepper motor NEMA17 x 47mm |
| 1 | `NEMA(NEMA23)` | Stepper motor NEMA22 x 51.2mm |
| 11 | `washer(M3_washer)` | Washer M3 x 7mm x 0.5mm |
| 15 | `star_washer(M3_washer)` | Washer star M3 x 0.5mm |
| 16 | `washer(M3_washer)` | Washer M3 x 7mm x 0.5mm |
| 20 | `star_washer(M3_washer)` | Washer star M3 x 0.5mm |
<a href="#top">Top</a>
@@ -3761,6 +3788,7 @@ Veroboard with mounting holes, track breaks, removed tracks, solder points and c
| Function | Description |
|:--- |:--- |
| `vero_length(type)` | Length of the board |
| `vero_size(type)` | Board size |
| `vero_thickness(type)` | Thickness of the substrate |
| `vero_track_thickness(type)` | Thickness of the tracks |
| `vero_track_width(type)` | The width of the tracks |
@@ -4543,7 +4571,7 @@ to the assembly, for example to add inserts.
### Modules
| Module | Description |
|:--- |:--- |
| `drag_chain_assembly(type, pos = 0)` | Drag chain assembly |
| `drag_chain_assembly(type, pos = 0, render = false)` | Drag chain assembly |
| `drag_chain_link(type, start = false, end = false, check_kids = true)` | One link of the chain, special case for start and end |
| `drag_chain_screw_positions(type, end)` | Place children at the screw positions, end = 0 for the start, 1 for the end |
| `screw_lug(screw, h = 0)` | Create a D shaped lug for a screw |
@@ -5023,6 +5051,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 |
![printed_pulleys](tests/png/printed_pulleys.png)
### 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>
---
@@ -5721,7 +5816,8 @@ Cylinder with a rounded end.
---
<a name="Rounded_polygon"></a>
## Rounded_polygon
Draw a polygon with rounded corners. Each element of the vector is the XY coordinate and a radius. Radius can be negative for a concave corner.
Draw a polygon with rounded corners. Each element of the vector is the XY coordinate and a radius in clockwise order.
Radius can be negative for a concave corner.
Because the tangents need to be calculated to find the length these can be calculated separately and re-used when drawing to save calculating them twice.
@@ -5732,6 +5828,7 @@ Because the tangents need to be calculated to find the length these can be calcu
### Functions
| Function | Description |
|:--- |:--- |
| `circle_tangent(p1, p2)` | Compute the clockwise tangent between two circles represented as [x,y,r] |
| `rounded_polygon_length(points, tangents)` | Calculate the length given the point list and the list of tangents computed by ` rounded_polygon_tangents` |
| `rounded_polygon_tangents(points)` | Compute the straight sections needed to draw and to compute the lengths |
@@ -5879,6 +5976,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 |
@@ -6165,12 +6263,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 |
![teardrops](tests/png/teardrops.png)

View File

@@ -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=" ")

View File

@@ -25,7 +25,7 @@ from __future__ import print_function
import subprocess, sys
def run_list(args, silent = False, verbose = False):
cmd = ["openscad.exe"] + args
cmd = ["openscad", "--hardwarnings"] + args
if not silent:
for arg in cmd:
print(arg, end=" ")

View File

@@ -50,13 +50,16 @@ def do_cmd(cmd, output = sys.stdout):
return subprocess.call(cmd, stdout = output, stderr = output)
def compare_images(a, b, c):
if not os.path.isfile(b):
print(Fore.MAGENTA + "Failed to generate %s while making %s" % (b, a), Fore.WHITE)
sys.exit(1)
if not os.path.isfile(a):
return -1
log_name = 'magick.log'
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
@@ -126,14 +129,13 @@ def tests(tests):
#
# List of individual part files
#
scads = [i for i in sorted(os.listdir(scad_dir), key = lambda s: s.lower()) if i[-5:] == ".scad"]
types = []
for scad in scads:
base_name = scad[:-5]
if not tests or base_name in tests:
done.append(base_name)
print('\n'+base_name)
print(base_name)
cap_name = base_name[0].capitalize() + base_name[1:]
base_name = base_name.lower()
scad_name = scad_dir + '/' + scad
@@ -240,6 +242,7 @@ def tests(tests):
BOM = bom.parse_bom()
with open(bom_name, 'wt') as outfile:
json.dump(BOM.flat_data(), outfile, indent = 4)
print()
with open(bom_name, "rt") as bom_file:
BOM = json.load(bom_file)

View File

@@ -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)

View File

@@ -21,8 +21,10 @@ include <../vitamins/pcbs.scad>
use <../utils/layout.scad>
function spacing(p) = let(w = pcb_width(p)) w < 22 ? w + 3 : w + 10;
module pcbs() {
layout([for(p = pcbs) pcb_width(p)], 10)
layout([for(p = pcbs) spacing(p)], 0)
translate([0, pcb_length(pcbs[$i]) / 2])
rotate(90)
pcb_assembly(pcbs[$i], 5 + $i, 3);
@@ -31,6 +33,10 @@ module pcbs() {
layout([for(p = perfboards) pcb_length(p)], 10)
translate([0, -pcb_width(perfboards[$i]) / 2])
pcb_assembly(perfboards[$i], 5 + $i, 3);
for(p = pcbs_not_shown)
hidden()
pcb(p);
}
if($preview)
pcbs();

View File

@@ -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)

Binary file not shown.

Before

Width:  |  Height:  |  Size: 76 KiB

After

Width:  |  Height:  |  Size: 77 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 82 KiB

After

Width:  |  Height:  |  Size: 102 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 152 KiB

After

Width:  |  Height:  |  Size: 153 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 116 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 43 KiB

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 129 KiB

After

Width:  |  Height:  |  Size: 154 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 104 KiB

After

Width:  |  Height:  |  Size: 107 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 45 KiB

After

Width:  |  Height:  |  Size: 43 KiB

View 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();

View File

@@ -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)

View File

@@ -22,9 +22,9 @@ include <../vitamins/stepper_motors.scad>
use <../utils/layout.scad>
module stepper_motors()
layout([for(s = stepper_motors) NEMA_width(s)], 5) let(m = stepper_motors[$i]) {
layout([for(s = stepper_motors) NEMA_width(s)], 5, no_offset = true) let(m = stepper_motors[$i]) {
rotate(180)
NEMA(m, 0, m == NEMA17M || m == NEMA17M8);
NEMA(m, 0, m == NEMA17P || m == NEMA17M || m == NEMA17M8);
translate_z(4)
NEMA_screws(m, M3_pan_screw, n = $i, earth = $i > 4 ? undef : $i - 1);

View File

@@ -27,6 +27,9 @@ module tubes() {
translate([50, 10])
tube(10, 8, 30);
translate([100, 10])
rectangular_tube([10, 20, 30]);
}
tubes();

View File

@@ -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()

View File

@@ -18,13 +18,14 @@
//
//
//! Draw a polygon with rounded corners. Each element of the vector is the XY coordinate and a radius. Radius can be negative for a concave corner.
//! Draw a polygon with rounded corners. Each element of the vector is the XY coordinate and a radius in clockwise order.
//! Radius can be negative for a concave corner.
//!
//! Because the tangents need to be calculated to find the length these can be calculated separately and re-used when drawing to save calculating them twice.
//
include <../utils/core/core.scad>
function circle_tangent(p1, p2) =
function circle_tangent(p1, p2) = //! Compute the clockwise tangent between two circles represented as [x,y,r]
let(
r1 = p1[2],
r2 = p2[2],
@@ -32,11 +33,8 @@ function circle_tangent(p1, p2) =
dy = p2.y - p1.y,
d = sqrt(dx * dx + dy * dy),
theta = atan2(dy, dx) + acos((r1 - r2) / d),
xa = p1.x +(cos(theta) * r1),
ya = p1.y +(sin(theta) * r1),
xb = p2.x +(cos(theta) * r2),
yb = p2.y +(sin(theta) * r2)
)[ [xa, ya], [xb, yb] ];
v = [cos(theta), sin(theta)]
)[ p1 + r1 * v, p2 + r2 * v ];
function rounded_polygon_tangents(points) = //! Compute the straight sections needed to draw and to compute the lengths
let(len = len(points))

View File

@@ -21,7 +21,7 @@
//! Draw a 3D right triangle with rounded edges. Intended to be embedded in other parts. Can be optionally offset by the filleted amount.
//
include <../utils/core/core.scad>
include <NopSCADlib/utils/core/rounded_rectangle.scad>
include <..//utils/core/rounded_rectangle.scad>
module rounded_right_triangle(x, y, z, fillet, center = true, offset = false) { //! Draw a 3D right triangle with rounded edges.
fillet = max(fillet, eps);
@@ -43,4 +43,3 @@ module rounded_right_triangle(x, y, z, fillet, center = true, offset = false) {
rounded_rectangle([size.z, 2 * fillet, eps], fillet - eps, center = false, xy_center = false);
}
}

View File

@@ -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);
}
}

View File

@@ -24,7 +24,7 @@
// h h s t t
RB5015 = ["RB5015", "Blower Runda RB5015", 51.3, 51, 15, 31.5, M4_cap_screw, 26, [27.3, 25.4], 4.5, [[4.3, 45.4], [47.3,7.4]], 20, 14, 1.5, 1.3, 1.2, 15];
PE4020 = ["PE4020", "Blower Pengda Technology 4020", 40, 40, 20, 27.5, M3_cap_screw, 22, [21.5, 20 ], 3.2, [[37,3],[3,37],[37,37]], 29.3, 17, 1.7, 1.2, 1.3, 13];
BL40x10 =["BL40x10","Square radial 4010", 40, 40,9.5, 27, M2_cap_screw, 16, [24, 20 ], 2.4, [[2,2],[38,2],[2,38],[38,38]], 30 , 9.5, 1.5, 1.5, 1.1, 1.5];
BL40x10 =["BL40x10","Square radial fan 4010", 40, 40,9.5, 27, M2_cap_screw, 16, [24, 20 ], 2.4, [[2,2],[38,2],[2,38],[38,38]], 30 , 9.5, 1.5, 1.5, 1.1, 1.5];
blowers = [BL40x10, PE4020, RB5015];

View File

@@ -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
];

View File

@@ -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) {

View File

@@ -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>

View File

@@ -34,15 +34,16 @@ hygrometer_hole_r = 21.3;
slot_w = 5.5;
module hygrometer_hole(h = 0) { //! Drill the hole for a hygrometer
round(cnc_bit_r) {
intersection() {
drill(hygrometer_hole_r, h);
extrude_if(h)
round(cnc_bit_r) {
intersection() {
drill(hygrometer_hole_r, 0);
rotate(30)
square([slot_w + 2 * cnc_bit_r, 100], center = true);
rotate(30)
square([slot_w + 2 * cnc_bit_r, 100], center = true);
}
drill((od + 0.2) / 2, 0);
}
drill((od + 0.2) / 2, h);
}
}
function hygrometer_or() = flange_d / 2; //! The outside radius of a hygrometer
@@ -54,13 +55,13 @@ module hygrometer() { //! Draw a hygrometer
color(grey(30))
rotate_extrude()
polygon([
[0, 0],
[aperture_d / 2, 0],
[aperture_d / 2, flange_t],
[flange_d2 / 2, flange_t2],
[flange_d / 2, flange_t],
[flange_d / 2, 0],
[od / 2, 0],
[0, 0],
[aperture_d / 2, 0],
[aperture_d / 2, flange_t],
[flange_d2 / 2, flange_t2],
[flange_d / 2, flange_t],
[flange_d / 2, 0],
[od / 2, 0],
[od / 2, -h],
[0, -h]
]);

View File

@@ -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);
}
}

View File

@@ -194,12 +194,14 @@ module jhead_hot_end_assembly(type, filament, naked = false) { //! Assembly with
if(exploded())
heater_components();
else
intersection() {
heater_components();
if(naked) // hide the wires when not exploded
intersection() {
heater_components();
if(naked)
color("grey") cylinder(r = 12, h = 100, center = true);
else
cube(1, true); // hide the wires when not exploded
}
color("grey")
cylinder(r = 12, h = 100, center = true);
}
else
hidden() // hidden by the tape
heater_components();
}

View File

@@ -33,7 +33,7 @@ module magnet(type) { //! Draw specified magnet
h = magnet_h(type);
r = magnet_r(type);
//vitamin(str("magnet(", type[0], "): Magnet ", od, "mm diameter, ", h, "mm high", id ? str(", ", id, "mm bore") : "" ));
vitamin(str("magnet(", type[0], "): Magnet ", od, "mm diameter, ", h, "mm high", id ? str(", ", id, "mm bore") : "" ));
or = od / 2;
ir = id / 2;

View File

@@ -23,7 +23,7 @@
// od, id, h, r
MAG8x4x4p2 = ["MAG8x4x4p2", 8, 4.2, 4, 0.5];
MAG484 = ["MAG484", inch(1/4), inch(1/8), inch(1/4), 0.5];
MAG5x8 = ["MAG484", 8, 0, 5, 0.5];
MAG5x8 = ["MAG5x8", 8, 0, 5, 0.5];
magnets = [MAG8x4x4p2, MAG484, MAG5x8];

View File

@@ -41,6 +41,8 @@ function microswitch_button_clr(type)= type[14]; //! Button colour
function microswitch_lower_extent(type) = let(leg = microswitch_leg(type)) min([for(pos = microswitch_legs(type)) pos.y - leg.y / 2]); //! How far legs extend downwards
function microswitch_right_extent(type) = let(leg = microswitch_leg(type)) max([microswitch_length(type) / 2, for(pos = microswitch_legs(type)) pos.x + leg.x / 2]); //! How far legs extend right
function microswitch_size(type) = [microswitch_length(type), microswitch_width(type), microswitch_thickness(type)]; //! Body size
module microswitch_hole_positions(type) //! Place children at the hole positions
{
for(hole = microswitch_holes(type))

View File

@@ -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()

View File

@@ -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);
}
}
}

View File

@@ -21,6 +21,7 @@ include <d_connectors.scad>
include <leds.scad>
include <axials.scad>
include <smds.scad>
include <green_terminals.scad>
//
// l w t r h l c b h
@@ -195,6 +196,222 @@ Duex5 = ["Duex5", "Duex5 expansion board",
]),
[]];
BTT_SKR_MINI_E3_V2_0 = [
"BTT_SKR_MINI_E3_V2_0", "BigTreeTech SKR Mini E3 v2.0",
100.75, 70.25, 1.6, // size
1, // corner radius
3, // mounting hole diameter
5, // pad around mounting hole
grey(30), // color
false, // true if parts should be separate BOM items
[ // hole positions
[ 19.3, -2.89 ],
[ 19.3 + 62.15, -2.89 ],
[ 2.535, -2.89 - 34.98 ],
[ 2.535 + 31.80, -2.89 - 37.63 ],
[ 2.535 + 95.68, -2.89 - 64.47 ]
],
[ // components
// cpu
[ 55, 33, 0, "chip", 10, 10, 1, grey(15) ],
// hotend and heated bed
[ 26, 16, 0, "chip", 9.5, 8.5, 4, grey(15) ],
[ 37, 14, 0, "chip", 6, 6, 2.5, grey(15) ],
// driver chips
[ 10.5,-17.5, 0, "chip", 5, 5, 1, grey(15) ],
[ 30.5,-17.5, 0, "chip", 5, 5, 1, grey(15) ],
[ 50.5,-17.5, 0, "chip", 5, 5, 1, grey(15) ],
[ 70.5,-17.5, 0, "chip", 5, 5, 1, grey(15) ],
// heat dissipation under board
[ 43, -17.5, 0, "-block", 85, 8, 0.1, gold ],
[ 40, 16, 0, "-block", 10, 8, 0.1, gold ],
[ 27, 19, 0, "-block", 13,14, 0.1, gold ],
[ 12, 28.5, 0, "-block", 11, 7, 0.1, gold ],
// mock up heat sinks over the chips
[ 10.5, -17.5, 0, "chip", 9, 8.5, 2, "DeepSkyBlue" ],
for(x = [10.5], y = [-4,-2,0,2,4]) [ x, -17.5 + y, 0, "chip", 9, 0.75, 11, "DeepSkyBlue" ],
[ 30.5, -17.5, 0, "chip", 9, 8.5, 2, "DeepSkyBlue" ],
for(x = [30.5], y = [-4,-2,0,2,4]) [ x, -17.5 + y, 0, "chip", 9, 0.75, 11, "DeepSkyBlue" ],
[ 50.5, -17.5, 0, "chip", 9, 8.5, 2, "DeepSkyBlue" ],
for(x = [50.5], y = [-4,-2,0,2,4]) [ x, -17.5 + y, 0, "chip", 9, 0.75, 11, "DeepSkyBlue" ],
[ 70.5, -17.5, 0, "chip", 9, 8.5, 2, "DeepSkyBlue" ],
for(x = [70.5], y = [-4,-2,0,2,4]) [ x, -17.5 + y, 0, "chip", 9, 0.75, 11, "DeepSkyBlue" ],
// terminals
[ 5.25, 5.3, 180, "gterm", gt_5x17, 2, undef, grey(20) ],
[ 18.1, 5.1, -90, "gterm", gt_5x17, 2, undef, grey(20) ],
[ 29.3, 5.1, -90, "gterm", gt_5x17, 2, undef, grey(20) ],
[ 40.5, 5.1, -90, "gterm", gt_5x11, 2, undef, grey(20) ],
// SD and USB
[ -3, -(22.27 + 29.92)/2, 0, "usb_uA" ],
[ -8, -( 2.13 + 17.17)/2, 0, "uSD", [17.17 - 2.13, 16, 2] ],
// EXP
[ -4.5, 17, -90, "2p54boxhdr", 5, 2 ],
// TFT
[ 66.1, 21.7, 0, "2p54header", 5, 1 ],
// FAN0
[ 50.25, 3.8, 0, "jst_xh", 2, false, grey(20) ],
// FAN1
[ 49.9, 16.1, 0, "jst_xh", 2, false, grey(20) ],
// PS-ON
[ 58.1, 16.1, 0, "jst_xh", 2, false, grey(20) ],
// PWR-DET
[ 67.5, 16.0, 0, "jst_xh", 3, false, grey(20) ],
// E0-STOP
[ 78.2, 16.0, 0, "jst_xh", 3, false, grey(20) ],
// Z-PROBE
[ 87.2, 20.5, -90,"jst_xh", 5, false, grey(20) ],
// NEO Pixel
[ 78.2, 27.1, 0, "jst_xh", 3, false, grey(20) ],
// end stops
[ 58.60, 3.8, 0, "jst_xh", 2, false, grey(20) ],
[ 66.70, 3.8, 0, "jst_xh", 2, false, grey(20) ],
[ 74.90, 3.8, 0, "jst_xh", 2, false, grey(20) ],
// thermistors
[ 83.00, 3.8, 0, "jst_xh", 2, false, grey(20) ],
[ 91.10, 3.8, 0, "jst_xh", 2, false, grey(20) ],
// motor connections
[ 10.15, -4.2, 0, "jst_xh", 4, false, grey(20) ],
[ 30.35, -4.2, 0, "jst_xh", 4, false, grey(20) ],
[ 43.90, -4.2, 0, "jst_xh", 4, false, grey(20) ],
[ 57.25, -4.2, 0, "jst_xh", 4, false, grey(20) ],
[ 70.75, -4.2, 0, "jst_xh", 4, false, grey(20) ],
// motor jumpers
[ 20.6, 44.1, 0, "2p54header", 2, 1 ],
[ 39.6, 44.2, 0, "2p54header", 2, 1 ],
[ 60.1, 44.1, 0, "2p54header", 2, 1 ],
[ 80.3, 44.1, 0, "2p54header", 2, 1 ],
// SWD
[ 43.9, 39.2, 0, "2p54header", 1, 5 ],
// SPI
[ -3.1, 31.9, 0, "2p54header", 2, 3 ],
// PWR-1
[ -12.8, 30.3, 0, "2p54header", 3, 1 ],
// VOUT
[ -14.0, 34.4, 0, "2p54header", 2, 2 ],
// VIN
[ 17.3, 19.6, 0, "2p54header", 2, 2 ],
],
[] // accessories
];
TMC2130 = [
"TMC2130", "TMC2130",
20, 14, 1.6, // size
0, 0, 0, // corner radius, mounting hole diameter, pad around mounting hole
grey(95), // colour
false, // true if parts should be separate BOM items
[], // hole positions
[
[ 10, 1, 0, "-2p54header", 8, 1 ],
[ 10, 13, 0, "-2p54header", 8, 1 ],
[ 12, 7, 0, "-chip", 6, 4, 1, grey(20) ],
// mock up a heat sink
[ 10, 7, 0, "block", 9, 8.5, 2, "DeepSkyBlue" ],
for (y = [-4,-2,0,2,4]) [ 10, 7 + y, 0, "block", 9, 0.75, 11, "DeepSkyBlue" ],
],
[]
];
BTT_SKR_V1_4_TURBO = [
"BTT_SKR_V1_4_TURBO", "BigTreeTech SKR v1.4 Turbo",
110, 85, 1.6, // size
1, // corner radius
3, // mounting hole diameter
4, // pad around mounting hole
grey(30), // colour
false, // true if parts should be separate BOM items
[ // hole positions
[-4, 4], [-4, -4], [4, -4], [4, 4]
],
[ // components
[ (29.15+31.5)/2, 8, -90, "usb_B" ],
[ (46.9+51.55)/2, 7, -90, "uSD", [14, 14, 2] ],
[ 105, 13, 0, "button_6mm" ],
[ 58, 43, 0, "chip", 15, 15, 1, grey(20) ],
// ESP-01 socket
[ 69.8, 4, 0, "2p54socket", 4, 2 ],
// terminals
[ 5.3, 13.2, 180, "gterm", gt_5x17, 2, undef, grey(20)],
[ 5.3, 25.8, 180, "gterm", gt_5x17, 2, undef, grey(20)],
[ 5.3, 37.2, 180, "gterm", gt_5x11, 2, undef, grey(20)],
[ 5.3, 47.2, 180, "gterm", gt_5x11, 2, undef, grey(20)],
[ 2.8, 56.7, -90, "jst_xh", 2, false, grey(20) ],
[ 10.9, 56.7, 90, "jst_xh", 2, false, grey(20) ],
[ 82, 4, 0, "jst_xh", 2, false, grey(20) ],
[ 90, 4, 0, "jst_xh", 2, false, grey(20) ],
[ 98, 4, 0, "jst_xh", 2, false, grey(20) ],
[ 87.7, 29.0, -90, "jst_xh", 3, false, grey(20) ],
[ 87.7, 39.5, -90, "jst_xh", 3, false, grey(20) ],
[ 87.7, 50.1, -90, "jst_xh", 3, false, grey(20) ],
[ 95.3, 29.0, -90, "jst_xh", 3, false, grey(20) ],
[ 95.3, 39.5, -90, "jst_xh", 3, false, grey(20) ],
[ 95.3, 50.1, -90, "jst_xh", 3, false, grey(20) ],
[ 85.7, 18.2, 180, "jst_xh", 3, false, grey(20) ],
[ 94.9, 18.2, 180, "jst_xh", 2, false, grey(20) ],
[ 77.2, 19.6, -90, "jst_xh", 3, false, grey(20) ],
[ 69.8, 11.0, 0, "jst_xh", 5, false, grey(20) ],
[ 69.0, 19.2, 0, "2p54header", 4, 1 ],
[ 57.8, 18.0, 0, "2p54header", 3, 2 ],
[ 28.0, 19.7, 0, "2p54header", 2, 2 ],
[ 37.6, 28.8, 0, "2p54header", 1, 3, undef, "red" ],
[ 77.8, 27.5, 0, "2p54header", 2, 2 ],
[ 81.8, 26.4, 0, "2p54header", 1, 3, undef, "red" ],
[ 43.8, 42.8, 0, "2p54header", 1, 5 ],
// EXP1 & EXP2
[ -6.6, 29.4, 90, "2p54boxhdr", 5, 2 ],
[ -6.6, 50.4, 90, "2p54boxhdr", 5, 2 ],
// motor axes connections
[ 11.2, -3.75, 180, "jst_xh", 2, false, grey(20) ],
[ 21.8, -3.75, 180, "jst_xh", 4, false, grey(20) ],
[ 35.0, -3.75, 180, "jst_xh", 4, false, grey(20) ],
[ 48.2, -3.75, 180, "jst_xh", 4, false, grey(20) ],
[ 61.4, -3.75, 180, "jst_xh", 4, false, grey(20) ],
[ 74.7, -3.75, 180, "jst_xh", 4, false, grey(20) ],
[ 87.9, -3.75, 180, "jst_xh", 4, false, grey(20) ],
[ 98.5, -3.75, 180, "jst_xh", 2, false, grey(20) ],
// stepper drivers
[ 11.5, 62.5, 0, "2p54socket", 8, 1, undef, undef, undef, "red" ],
[ 11.5, 75.2, 0, "2p54socket", 8, 1 ],
[ 2.6, 66.3, 90, "2p54socket", 2, 1, undef, undef, undef, "red" ],
[ 11.5, 68.85, 0, "pcb", 11, TMC2130 ],
[ 33.1, 62.5, 0, "2p54socket", 8, 1, undef, undef, undef, "red" ],
[ 33.1, 75.2, 0, "2p54socket", 8, 1 ],
[ 24.2, 66.3, 90, "2p54socket", 2, 1, undef, undef, undef, "red" ],
[ 33.1, 68.85, 0, "pcb", 11, TMC2130 ],
[ 54.8, 62.5, 0, "2p54socket", 8, 1, undef, undef, undef, "red" ],
[ 54.8, 75.2, 0, "2p54socket", 8, 1 ],
[ 45.9, 66.3, 90, "2p54socket", 2, 1, undef, undef, undef, "red" ],
[ 54.8, 68.85, 0, "pcb", 11, TMC2130 ],
[ 76.4, 62.5, 0, "2p54socket", 8, 1, undef, undef, undef, "red" ],
[ 76.4, 75.2, 0, "2p54socket", 8, 1 ],
[ 67.5, 66.3, 90, "2p54socket", 2, 1, undef, undef, undef, "red" ],
[ 76.4, 68.85, 0, "pcb", 11, TMC2130 ],
[ 98.1, 62.5, 0, "2p54socket", 8, 1, undef, undef, undef, "red" ],
[ 98.1, 75.2, 0, "2p54socket", 8, 1 ],
[ 89.2, 66.3, 90, "2p54socket", 2, 1, undef, undef, undef, "red" ],
// closed loop pins
[ 24.4, 57.5, 0, "2p54header", 6, 1 ],
[ 40.6, 57.5, 0, "2p54header", 6, 1 ],
[ 56.7, 57.5, 0, "2p54header", 6, 1 ],
[ 72.9, 57.5, 0, "2p54header", 6, 1 ],
[ 89.1, 57.5, 0, "2p54header", 6, 1 ],
],
[] // accessories
];
Melzi = ["Melzi", "Melzi electronics", 203.2, 49.53, 1.6, 3.81, 3.1, 6, "green", false, [[3.81, 3.81], [-3.81, 3.81], [-3.81, -3.81], [3.81, -3.81]],
[],
@@ -414,8 +631,35 @@ 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, RAMPSEndstop, MT3608, PI_IO, ExtruderPCB, ZC_A0591, RPI0, EnviroPlus, ArduinoUno3, ArduinoLeonardo, Keyes5p1, WD2002SJ, RPI3, RPI4, BTT_SKR_MINI_E3_V2_0, BTT_SKR_V1_4_TURBO, DuetE, Duex5];
pcbs_not_shown = [Melzi, Duex2, PSU12V1A];
perfboards = [PERF74x51, PERF70x50, PERF60x40, PERF70x30, PERF80x20];

View File

@@ -64,6 +64,7 @@ module pulley(type) { //! Draw a pulley
hl = pulley_hub_length(type);
w = pulley_width(type);
r1 = pulley_bore(type) / 2;
screw_z = pulley_screw_z(type);
or = od / 2;
ir = pulley_ir(type);
@@ -100,33 +101,42 @@ module pulley(type) { //! Draw a pulley
}
}
module screw_holes() {
if(pulley_screws(type))
translate_z(pulley_screw_z(type))
for(i = [0 : pulley_screws(type) - 1])
rotate([-90, 0, i * -90])
cylinder(r = screw_radius(pulley_screw(type)), h = 100);
}
module hub()
rotate_extrude() translate([r1, 0]) {
if(hl)
square([pulley_hub_dia(type) / 2 - r1, hl]);
color("silver") {
render() difference() {
rotate_extrude() translate([r1, 0]) {
if(hl)
square([pulley_hub_dia(type) / 2 - r1, hl]);
for(z = [pulley_hub_length(type), hl + ft + w])
translate([0, z])
square([pulley_flange_dia(type) / 2 - r1, ft]);
}
if(pulley_screw_z(type) < hl)
screw_holes();
for(z = [pulley_hub_length(type), hl + ft + w])
translate([0, z])
square([pulley_flange_dia(type) / 2 - r1, ft]);
}
render() difference() { // T5 pulleys have screw through the teeth
module screw_holes()
translate_z(screw_z)
for(i = [0 : pulley_screws(type) - 1])
rotate([-90, 0, i * -90])
cylinder(r = screw_radius(pulley_screw(type)), h = 100);
color(silver) {
if(screw_z && screw_z < hl)
render()
difference() {
hub();
screw_holes();
}
else
hub();
if(screw_z && screw_z > hl) // T5 pulleys have screw through the teeth
render()
difference() {
core();
screw_holes();
}
else
core();
if(pulley_screw_z(type) > hl)
screw_holes();
}
}
}

View File

@@ -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
@@ -53,7 +56,7 @@ function rail_holes(type, length) = //! Number of holes in a rail given its `len
module rail_hole_positions(type, length, first = 0, screws = 100, both_ends = true) { //! Position children over screw holes
pitch = rail_pitch(type);
holes = rail_holes(type, length);
last = first + screws;
last = first + min(screws, both_ends ? ceil(holes / 2) : holes);
for(i = [first : holes - 1], j = holes - 1 - i)
if(i < last || both_ends && (j >= first && j < last))
translate([i * pitch - length / 2 + (length - (holes - 1) * pitch) / 2, 0])
@@ -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] ]);
}
}
@@ -181,19 +186,19 @@ module rail_assembly(type, length, pos, carriage_end_colour = grey(20), carriage
carriage(rail_carriage(type), type, carriage_end_colour, carriage_wiper_colour);
}
module rail_screws(type, length, thickness, screws = 100) { //! Place screws in the rail
module rail_screws(type, length, thickness, screws = 100, index_screws = undef) { //! Place screws in the rail
screw = rail_screw(type);
end_screw = rail_end_screw(type);
screw_len = screw_longer_than(rail_screw_height(type, screw) + thickness);
end_screw_len = screw_longer_than(rail_screw_height(type, end_screw) + thickness);
index_screws = screws > 2 ? 1 : 2;
index_screws = is_undef(index_screws) ? screws > 2 ? 1 : 2 : index_screws;
translate_z(rail_screw_height(type, end_screw))
rail_hole_positions(type, length, 0, index_screws)
screw(end_screw, end_screw_len);
translate_z(rail_screw_height(type, screw))
rail_hole_positions(type, length, index_screws, min(screws, rail_holes(type, length)) - 2 * index_screws)
rail_hole_positions(type, length, index_screws, screws - index_screws)
screw(screw, screw_len);
}

View File

@@ -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];

View File

@@ -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)

View File

@@ -36,6 +36,8 @@ function rocker_bezel(type) = type[10]; //! Bezel width
function rocker_pivot(type) = type[11]; //! Pivot distance from the back of the flange
function rocker_button(type) = type[12]; //! How far the button extends from the bezel
function rocker_spades(type) = type[13]; //! Spade types and positions
function rocker_size(type) = [rocker_width(type), rocker_height(type), rocker_depth(type)]; //! Width, height, and depth in a vector
function rocker_slot(type) = [rocker_slot_w(type), rocker_slot_h(type)]; //! Rocker slot in a vector
module rocker(type, colour) { //! Draw the specified rocker switch
vitamin(str("rocker(", type[0], "): ", rocker_part(type)));
@@ -87,6 +89,6 @@ module rocker(type, colour) { //! Draw the specified rocker switch
}
}
module rocker_hole(type, h = 0) //! Make a hole to accept a rocker switch, by default 2D, set h for 3D
module rocker_hole(type, h = 0, rounded = true) //! Make a hole to accept a rocker switch, by default 2D, set h for 3D
extrude_if(h)
rounded_square([rocker_slot_w(type), rocker_slot_h(type)], 1, center = true);
rounded_square([rocker_slot_w(type), rocker_slot_h(type)], rounded ? 1 : 0, center = true);

View File

@@ -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)
@@ -262,7 +270,7 @@ module screw_countersink(type, drilled = true) { //! Countersink shape
if(drilled)
cylinder(h = head_height + eps, r1 = 0, r2 = head_rad + head_t);
else
intersection() {
render() intersection() {
cylinder(h = head_height + eps, r1 = 0, r2 = head_rad + head_t);
cylinder(h = head_height + eps, r = head_rad + eps);

View File

@@ -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()

View File

@@ -27,10 +27,11 @@ NEMA17 = ["NEMA17", 42.3, 47, 53.6/2, 25, 11, 2, 5, 24,
NEMA17M = ["NEMA17M", 42.3, 40, 53.6/2, 25, 11, 2, 5, 20, 31, [12.5, 11]];
NEMA17M8= ["NEMA17M8", 42.3, 40, 53.6/2, 25, 11, 2, 8, [280, 8, 4], 31, [12.5, 11]];
NEMA17S = ["NEMA17S", 42.3, 34, 53.6/2, 25, 11, 2, 5, 24, 31, [8, 8]];
NEMA17P = ["NEMA17P", 42.3, 26.5, 53.6/2, 25, 11, 2, 5, 26.5, 31, [10, 8]];
NEMA16 = ["NEMA16", 39.5, 19.2, 50.6/2, 50.6/2, 11, 2, 5, 12, 31, [8, 8]];
NEMA14 = ["NEMA14", 35.2, 36, 46.4/2, 21, 11, 2, 5, 21, 26, [8, 8]];
NEMA23 = ["NEMA23", 56.4, 51.2, 75.7/2, 35, 38.1/2, 1.6, 6.35, 24, 47.1, [8, 8]];
stepper_motors = [NEMA14, NEMA16, NEMA17S, NEMA17M, NEMA17, NEMA23];
stepper_motors = [NEMA14, NEMA16, NEMA17P, NEMA17S, NEMA17M, NEMA17, NEMA23];
use <stepper_motor.scad>

View File

@@ -41,6 +41,8 @@ function vero_track_width(type) = vero_pitch(type) * 0.8; //! The width of th
function vero_length(type) = vero_holes(type) * vero_pitch(type); //! Length of the board
function vero_width(type) = vero_strips(type) * vero_pitch(type); //! Width of the board
function vero_size(type) = [vero_length(type), vero_width(type), vero_thickness(type)]; //! Board size
module solder_meniscus(type) {
h = 1;
r = vero_track_width(type) / 2;
@@ -144,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);