1
0
mirror of https://github.com/nophead/NopSCADlib.git synced 2025-09-03 12:22:46 +02:00

Compare commits

...

6 Commits

Author SHA1 Message Date
Chris Palmer
07766d8cf0 Added printed press_fit.scad. 2020-11-27 18:13:01 +00:00
Chris Palmer
ceac5cdb27 Fixed bug in rail screw placement when putting screws in the middle.
Rail test can now move the carriages with customiser.
2020-11-26 14:24:46 +00:00
Chris Palmer
c5b35daeac Added rail_holes() function. 2020-11-24 23:38:12 +00:00
Chris Palmer
ffb4512523 Drag chain ends can now be customised by adding children to the assembly. 2020-11-23 12:07:34 +00:00
Chris Palmer
35ffbad74c Drag chain ends now pp3_colour and explode. 2020-11-22 12:47:30 +00:00
Chris Palmer
fb685a0f42 Fixed missing screw default for ribbon_clamp_assembly(). 2020-11-22 12:04:55 +00:00
11 changed files with 223 additions and 37 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 848 KiB

After

Width:  |  Height:  |  Size: 851 KiB

View File

@@ -78,6 +78,7 @@ use <tests/opengrab.scad>
use <tests/panel_meters.scad>
use <tests/PCBs.scad>
use <tests/pillars.scad>
use <tests/press_fit.scad>
use <tests/PSUs.scad>
use <tests/pulleys.scad>
use <tests/rails.scad>
@@ -137,9 +138,12 @@ cable_grommets_y = 0;
translate([x5, cable_grommets_y])
cable_grommets();
translate([x5 + 80, cable_grommets_y])
translate([x5 + 50, cable_grommets_y])
ribbon_clamps();
translate([x5 + 95, cable_grommets_y])
press_fits();
translate([x5, cable_grommets_y + 60])
fixing_blocks();
@@ -427,7 +431,7 @@ translate([x4 + 175, belts_y, -20])
translate([x4, rails_y + 130])
rails();
translate([800, fans_y + 50])
translate([770, fans_y + 50])
cable_strips();
translate([x4, kp_pillow_blocks_y])

View File

@@ -23,12 +23,20 @@
//! Each link has a maximum bend angle of 45&deg;, so the mininium radius is proportional to the link length.
//!
//! The travel property is how far it can move in each direction, i.e. half the maximum travel if the chain is mounted in the middle of the travel.
//!
//! The ends can have screw lugs with four screw positions to choose from, specified by a list of two arrays of four bools.
//! If none are enabled then a child object is expected to customise the end and this gets unioned with the blank end.
//! If both ends are customised then two children are expected.
//! Each child is called twice, once with ```$fasteners``` set to 0 to augment the STL and again with ```$fasteners``` set to 1 to add
//! to the assembly, for example to add inserts.
//
include <../core.scad>
use <../utils/horiholes.scad>
use <../utils/maths.scad>
clearance = 0.1;
function drag_chain_name(type) = type[0]; //! The name to allow more than one in a project
function drag_chain_size(type) = type[1]; //! The internal size and link length
function drag_chain_travel(type) = type[2]; //! X travel
@@ -38,6 +46,8 @@ function drag_chain_twall(type) = type[5]; //! Top wall
function drag_chain_screw(type) = type[6]; //! Mounting screw for the ends
function drag_chain_screw_lists(type) = type[7]; //! Two lists of four bools to say which screws positions are used
function drag_chain_clearance() = clearance; //! Clearance around joints.
function drag_chain_radius(type) = //! The bend radius at the pivot centres
let(s = drag_chain_size(type))
s.x / 2 / sin(360 / 16);
@@ -49,8 +59,6 @@ function drag_chain_z(type) = //! Outside dimension of a 180 bend
function drag_chain(name, size, travel, wall = 1.6, bwall = 1.5, twall = 1.5, screw = M2_cap_screw, screw_lists = [[1,0,0,1],[1,0,0,1]]) = //! Constructor
[name, size, travel, wall, bwall, twall, screw, screw_lists];
clearance = 0.1;
function drag_chain_outer_size(type) = //! Link outer dimensions
let(s = drag_chain_size(type), z = s.z + drag_chain_bwall(type) + drag_chain_twall(type))
[s.x + z, s.y + 4 * drag_chain_wall(type) + 2 * clearance, z];
@@ -210,9 +218,12 @@ module drag_chain_link(type, start = false, end = false) { //! One link of the c
translate([floor_x, -os.y / 2 + 0.5, os.z - bwall])
cube([s.x - floor_x - clearance, os.y -1, bwall]);
if(start || end)
if(start || end) {
drag_chain_screw_positions(type, end)
screw_lug(drag_chain_screw(type), os.z);
children();
}
}
if(start || end)
translate_z(-eps)
@@ -243,7 +254,8 @@ module drag_chain_link(type, start = false, end = false) { //! One link of the c
//! 1. Clip the links together with the special ones at the ends.
module drag_chain_assembly(type, pos = 0) { //! Drag chain assembly
s = drag_chain_size(type);
r = drag_chain_radius(type);
x = (1 + exploded()) * s.x;
r = drag_chain_radius(type) * x / s.x;
travel = drag_chain_travel(type);
links = ceil(travel / s.x);
actual_travel = links * s.x;
@@ -255,31 +267,42 @@ module drag_chain_assembly(type, pos = 0) { //! Drag chain assembly
points = [ // Calculate list of hinge points
for(i = 0, p = [0, 0, z / 2 + 2 * r]; i < links + 5;
i = i + 1,
dx = p.z > c.z ? s.x : -s.x,
dx = p.z > c.z ? x : -x,
p = max(p.x + dx, p.x) <= c.x ? p + [dx, 0, 0] // Straight sections
: let(q = circle_intersect(p, s.x, c, r))
q.x <= c.x ? [p.x - sqrt(sqr(s.x) - sqr(p.z - zb)), 0, zb] // Transition back to straight
: let(q = circle_intersect(p, x, c, r))
q.x <= c.x ? [p.x - sqrt(sqr(x) - sqr(p.z - zb)), 0, zb] // Transition back to straight
: q) // Circular section
p
];
npoints = len(points);
module link(n) // Position and colour link with origin at the hinge hole
translate([-z / 2, 0, -z / 2])
stl_colour(n % 2 ? pp1_colour : pp2_colour)
drag_chain_link(type, start = n == -1, end = n == npoints - 1);
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)
let($fasteners = 0) children();
let($fasteners = 1) children();
}
screws = drag_chain_screw_lists(type);
custom_start = screws[0] == [0, 0, 0, 0];
custom_end = screws[1] == [0, 0, 0, 0];
assert($children == bool2int(custom_start) + bool2int(custom_end), "wrong number of children for end customisation");
assembly(str(drag_chain_name(type), "_drag_chain")) {
for(i = [0 : npoints - 2]) let(v = points[i+1] - points[i])
translate(points[i])
rotate([0, -atan2(v.z, v.x), 0])
link(i);
translate(points[0] - [s.x, 0, 0])
link(-1);
translate(points[0] - [x, 0, 0])
link(-1)
if(custom_start)
children(0);
translate(points[npoints - 1])
hflip()
link(npoints - 1);
link(npoints - 1)
if(custom_end)
children(custom_start ? 1 : 0);
}
}

50
printed/press_fit.scad Normal file
View File

@@ -0,0 +1,50 @@
//
// 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/>.
//
//
//! Utility for making printed press fit connectors to join printed parts.
//!
//! Add solvent or glue to make a permanent fixture.
//
include <../core.scad>
interference = 0.0;
bridge_droop = layer_height; //sqrt(4 * layer_height * filament_width / PI) - layer_height;
module press_fit_socket(w = 5, h = 50, horizontal = false) { //! Make a square hole to accept a peg
h = horizontal ? h : h + bridge_droop;
cube([w, w, 2 * h], center = true);
}
module press_fit_peg(h, w = 5, horizontal = false) { //! Make a rounded chamfered peg for easy insertion
module chamfered_square(w, horizontal) {
h = horizontal ? w - bridge_droop : w;
rounded_square([w, h], 1);
}
translate_z(-eps)
linear_extrude(height = h + eps - layer_height)
chamfered_square(w + interference, horizontal);
translate_z(h - layer_height - eps)
linear_extrude(height = layer_height + eps)
chamfered_square(w - layer_height, horizontal);
}

View File

@@ -81,7 +81,7 @@ module ribbon_clamp(ways, screw = screw) { //! Generate STL for given number of
}
}
module ribbon_clamp_assembly(ways, screw) pose([55, 180, 25]) //! Printed part with inserts in place
module ribbon_clamp_assembly(ways, screw = screw) pose([55, 180, 25]) //! Printed part with inserts in place
assembly(let(screw_d = screw_radius(screw) * 2)str("ribbon_clamp_", ways, screw_d != 3 ? str("_", screw_d) : "")) {
h = ribbon_clamp_height(screw);
insert = screw_insert(screw);

View File

@@ -36,13 +36,13 @@ See [usage](docs/usage.md) for requirements, installation instructions and a usa
<tr><td> <a href = "#Displays">Displays</a> </td><td> <a href = "#Nuts">Nuts</a> </td><td> <a href = "#Spools">Spools</a> </td><td> <a href = "#Handle">Handle</a> </td><td> <a href = "#Rounded_cylinder">Rounded_cylinder</a> </td><td></td></tr>
<tr><td> <a href = "#Extrusion_brackets">Extrusion_brackets</a> </td><td> <a href = "#O_ring">O_ring</a> </td><td> <a href = "#Springs">Springs</a> </td><td> <a href = "#PCB_mount">PCB_mount</a> </td><td> <a href = "#Rounded_polygon">Rounded_polygon</a> </td><td></td></tr>
<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 = "#Sector">Sector</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 = "#Printed_box">Printed_box</a> </td><td> <a href = "#Sweep">Sweep</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 = "#Ribbon_clamp">Ribbon_clamp</a> </td><td> <a href = "#Thread">Thread</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 = "#SSR_shroud">SSR_shroud</a> </td><td> <a href = "#Tube">Tube</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 = "#Screw_knob">Screw_knob</a> </td><td></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 = "#Socket_box">Socket_box</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 = "#Strap_handle">Strap_handle</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></td><td></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 = "#Sweep">Sweep</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 = "#Thread">Thread</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 = "#Tube">Tube</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></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></td><td></td><td> <a href = "#Zipties">Zipties</a> </td><td></td><td></td><td></td></tr>
</table>
@@ -2707,6 +2707,7 @@ Linear rails with carriages.
| Function | Description |
|:--- |:--- |
| ```carriage_screw_depth(type)``` | Carriage thread depth |
| ```rail_holes(type, length)``` | Number of holes in a rail given its ```length``` |
| ```rail_screw_height(type, screw)``` | Position screw taking into account countersink into counterbored hole |
| ```rail_travel(type, length)``` | How far the carriage can travel |
@@ -4560,6 +4561,12 @@ Each link has a maximum bend angle of 45&deg;, so the mininium radius is proport
The travel property is how far it can move in each direction, i.e. half the maximum travel if the chain is mounted in the middle of the travel.
The ends can have screw lugs with four screw positions to choose from, specified by a list of two arrays of four bools.
If none are enabled then a child object is expected to customise the end and this gets unioned with the blank end.
If both ends are customised then two children are expected.
Each child is called twice, once with ```$fasteners``` set to 0 to augment the STL and again with ```$fasteners``` set to 1 to add
to the assembly, for example to add inserts.
[printed/drag_chain.scad](printed/drag_chain.scad) Implementation.
@@ -4581,6 +4588,7 @@ The travel property is how far it can move in each direction, i.e. half the maxi
| Function | Description |
|:--- |:--- |
| ```drag_chain(name, size, travel, wall = 1.6, bwall = 1.5, twall = 1.5, screw = M2_cap_screw, screw_lists = [[1,0,0,1],[1,0,0,1]])``` | Constructor |
| ```drag_chain_clearance()``` | Clearance around joints. |
| ```drag_chain_outer_size(type)``` | Link outer dimensions |
| ```drag_chain_radius(type)``` | The bend radius at the pivot centres |
| ```drag_chain_z(type)``` | Outside dimension of a 180 bend |
@@ -4970,6 +4978,29 @@ The stl must be given a parameterless wrapper in the project that uses it.
| 1 | pcb_mount_PI_IO_5.stl |
<a href="#top">Top</a>
---
<a name="Press_fit"></a>
## Press_fit
Utility for making printed press fit connectors to join printed parts.
Add solvent or glue to make a permanent fixture.
[printed/press_fit.scad](printed/press_fit.scad) Implementation.
[tests/press_fit.scad](tests/press_fit.scad) Code for this example.
### Modules
| Module | Description |
|:--- |:--- |
| ```press_fit_peg(h, w = 5, horizontal = false)``` | Make a rounded chamfered peg for easy insertion |
| ```press_fit_socket(w = 5, h = 50, horizontal = false)``` | Make a square hole to accept a peg |
![press_fit](tests/png/press_fit.png)
<a href="#top">Top</a>
---
@@ -5137,7 +5168,7 @@ Clamp for ribbon cable and polypropylene strip.
| Module | Description |
|:--- |:--- |
| ```ribbon_clamp(ways, screw = screw)``` | Generate STL for given number of ways |
| ```ribbon_clamp_assembly(ways, screw)``` | Printed part with inserts in place |
| ```ribbon_clamp_assembly(ways, screw = screw)``` | Printed part with inserts in place |
| ```ribbon_clamp_fastened_assembly(ways, thickness, screw = screw)``` | Clamp with fasteners in place |
| ```ribbon_clamp_hole_positions(ways, screw = screw, side = undef)``` | Place children at hole positions |
| ```ribbon_clamp_holes(ways, h = 20, screw = screw)``` | Drill screw holes |

Binary file not shown.

Before

Width:  |  Height:  |  Size: 132 KiB

After

Width:  |  Height:  |  Size: 133 KiB

BIN
tests/png/press_fit.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 85 KiB

71
tests/press_fit.scad Normal file
View File

@@ -0,0 +1,71 @@
//
// 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 <../printed/press_fit.scad>
module press_fits()
{
thickness = 2;
width = 20;
vthickness = 4;
translate([0, width + 2])
difference() {
cube([width, width, thickness]);
for(x = [0.25, 0.75])
for(y = [0.25, 0.75])
translate([x * width, y * width])
press_fit_socket();
}
union() {
cube([width, width, thickness]);
for(x = [0.25, 0.75])
for(y = [0.25, 0.75])
translate([x * width, y * width, thickness])
press_fit_peg(h = thickness);
}
translate([width + 2, width + 2])
difference() {
cube([width, vthickness, width]);
for(x = [0.25, 0.75])
for(y = [0.25, 0.75])
translate([x, 0, y] * width)
rotate([90, 0, 0])
press_fit_socket();
}
translate([width + 2, 0])
union() {
cube([width, width, thickness]);
for(x = [0.25, 0.75])
for(y = [0.25, 0.75])
translate([x * width, y * width, thickness])
press_fit_peg(h = vthickness, horizontal = true);
}
}
press_fits();

View File

@@ -23,6 +23,7 @@ use <../utils/layout.scad>
use <../vitamins/nut.scad>
sheet = 3;
pos = 1; //[-1 : 0.1 : 1]
module rails()
layout([for(l = rails) carriage_width(rail_carriage(l))], 20)
@@ -33,7 +34,7 @@ module rails()
nut = screw_nut(screw);
washer = screw_washer(screw);
rail_assembly(rail, length, rail_travel(rail, length) / 2, $i<2 ? grey(20) : "green", $i<2 ? grey(20) : "red");
rail_assembly(rail, length, pos * rail_travel(rail, length) / 2, $i<2 ? grey(20) : "green", $i<2 ? grey(20) : "red");
rail_screws(rail, length, sheet + nut_thickness(nut, true) + washer_thickness(washer));

View File

@@ -46,12 +46,16 @@ function carriage_pitch_y(type) = type[6]; //! Screw hole y pitch
function carriage_screw(type) = type[7]; //! Carriage screw type
function carriage_screw_depth(type) = 2 * screw_radius(carriage_screw(type)); //! Carriage thread depth
function rail_holes(type, length) = //! Number of holes in a rail given its ```length```
floor((length - 2 * rail_end(type)) / rail_pitch(type)) + 1;
module rail_hole_positions(type, length, first = 0, screws = 100, both_ends = true) { //! Position children over screw holes
pitch = rail_pitch(type);
holes = floor((length - 2 * rail_end(type)) / pitch) + 1;
for(i = [first : holes - 1 - first])
if(i < screws || (holes - i <= screws && both_ends))
translate([i * pitch - length / 2 + (length - (holes -1) * pitch) / 2, 0, 0])
holes = rail_holes(type, length);
last = first + screws;
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])
children();
}
@@ -104,24 +108,27 @@ module carriage(type, rail, end_colour = grey(20), wiper_colour = grey(20)) { //
module carriage_end(type, end_w, end_h, end_l) {
wiper_length = 0.5;
color(wiper_colour) translate_z(-end_l/2) linear_extrude(wiper_length)
color(wiper_colour) translate_z(-end_l / 2) linear_extrude(wiper_length)
difference() {
translate([-end_w/2, carriage_clearance(type)])
translate([-end_w / 2, carriage_clearance(type)])
square([end_w, end_h]);
cutout();
}
color(end_colour) translate_z(wiper_length-end_l/2) linear_extrude(end_l-wiper_length)
color(end_colour) translate_z(wiper_length-end_l / 2) linear_extrude(end_l - wiper_length)
difference() {
translate([-end_w/2, carriage_clearance(type)])
translate([-end_w / 2, carriage_clearance(type)])
square([end_w, end_h]);
cutout();
}
}
translate([-(block_l+end_l)/2,0,0])
translate([-(block_l + end_l) / 2, 0])
rotate([90, 0, 90])
carriage_end(type, end_w, end_h, end_l);
translate([(block_l+end_l)/2,0,0])
translate([(block_l + end_l) / 2, 0])
rotate([90, 0, -90])
carriage_end(type, end_w, end_h, end_l);
}
@@ -171,7 +178,6 @@ module rail_assembly(type, length, pos, carriage_end_colour = grey(20), carriage
translate([pos, 0])
carriage(rail_carriage(type), type, carriage_end_colour, carriage_wiper_colour);
}
module rail_screws(type, length, thickness, screws = 100) { //! Place screws in the rail
@@ -187,6 +193,6 @@ module rail_screws(type, length, thickness, screws = 100) { //! Place screws in
screw(end_screw, end_screw_len);
translate_z(rail_screw_height(type, screw))
rail_hole_positions(type, length, index_screws, screws)
rail_hole_positions(type, length, index_screws, min(screws, rail_holes(type, length)) - 2 * index_screws)
screw(screw, screw_len);
}