Added ends

This commit is contained in:
Chris Palmer 2020-11-15 16:27:53 +00:00
parent e38d9abfa0
commit ff5e8c0372
4 changed files with 149 additions and 63 deletions

View File

@ -54,8 +54,8 @@ function drag_chain_outer_size(type) = //! Link outer dimensions
[s.x + z, s.y + 4 * drag_chain_wall(type) + 2 * clearance, z]; [s.x + z, s.y + 4 * drag_chain_wall(type) + 2 * clearance, z];
module drag_chain_link(type) { module drag_chain_link(type, start = false, end = false) {
stl(str(drag_chain_name(type), "_drag_chain_link")); stl(str(drag_chain_name(type), "_drag_chain_link", start ? "_start" : end ? "_end" : ""));
s = drag_chain_size(type); s = drag_chain_size(type);
wall = drag_chain_wall(type); wall = drag_chain_wall(type);
@ -64,11 +64,14 @@ module drag_chain_link(type) {
os = drag_chain_outer_size(type); os = drag_chain_outer_size(type);
r = os.z / 2; r = os.z / 2;
pin_r = r / 2; pin_r = r / 2;
inner_x = s.x - wall; inner_x_normal = s.x - wall;
roof_x = 2 * r - twall; inner_x = start ? 0 : s.x - inner_x_normal;
floor_x = 2 * r; roof_x_normal = 2 * r - twall;
cam_r = inner_x - clearance - r; roof_x = start ? 0 : roof_x_normal;
floor_x = start ? 0 : 2 * r;
cam_r = inner_x_normal - clearance - r;
cam_x = min(sqrt(max(sqr(cam_r) - sqr(r - twall), 0)), r); cam_x = min(sqrt(max(sqr(cam_r) - sqr(r - twall), 0)), r);
outer_end_x = end ? os.x : s.x - clearance;
for(side = [-1, 1]) for(side = [-1, 1])
rotate([90, 0, 0]) { rotate([90, 0, 0]) {
@ -77,15 +80,20 @@ module drag_chain_link(type) {
linear_extrude(wall, center = true) linear_extrude(wall, center = true)
difference() { difference() {
hull() { hull() {
translate([r, r]) if(start)
rotate(180) translate([floor_x, 0])
teardrop(r = r, h = 0); square([eps, os.z]);
else
translate([r, r])
rotate(180)
teardrop(r = r, h = 0);
translate([s.x - clearance - eps, 0]) translate([outer_end_x - eps, 0])
square([eps, os.z]); square([eps, os.z]);
} }
translate([r, r]) if(!start)
horihole(pin_r, r); translate([r, r])
horihole(pin_r, r);
} }
// Inner cheeks // Inner cheeks
translate_z(side * (s.y / 2 + wall / 2)) translate_z(side * (s.y / 2 + wall / 2))
@ -93,52 +101,61 @@ module drag_chain_link(type) {
difference() { difference() {
union() { union() {
hull() { hull() {
translate([s.x + r, r]) if(!end) {
rotate(180) translate([s.x + r, r])
teardrop(r = r, h = 0); rotate(180)
teardrop(r = r, h = 0);
translate([s.x + r, twall]) translate([s.x + r, twall])
square([cam_x, eps]); square([cam_x, eps]);
}
else
translate([s.x + 2 * r - eps, 0])
square([eps, os.z]);
translate([inner_x, 0]) translate([inner_x, 0])
square([eps, os.z]); square([eps, os.z]);
} }
} }
// Cutout for top wall // Cutout for top wall
intersection() { if(!end)
translate([s.x, 0]) intersection() {
square([3 * r, twall]); // When straight translate([s.x, 0])
square([3 * r, twall]); // When straight
translate([s.x + r, r]) translate([s.x + r, r])
rotate(-45) rotate(-45)
translate([-r + roof_x, -r - twall]) // When bent fully translate([-r + roof_x_normal, -r - twall]) // When bent fully
square(os.z); square(os.z);
} }
} }
// Pin // Pin
translate([s.x + r, r, side * (s.y / 2 + wall + clearance)]) if(!end)
horicylinder(r = pin_r, z = r, h = 2 * wall); translate([s.x + r, r, side * (s.y / 2 + wall + clearance)])
horicylinder(r = pin_r, z = r, h = 2 * wall);
// Cheek joint // Cheek joint
translate([inner_x, 0, side * (s.y / 2 + wall) - 0.5]) translate([inner_x, 0, side * (s.y / 2 + wall) - 0.5])
cube([s.x - clearance - inner_x, os.z, 1]); cube([outer_end_x - inner_x, os.z, 1]);
} }
// Roof // Roof, actually the floor when printed
translate([roof_x, -s.y / 2 - 0.5]) roof_end = end ? s.x + 2 * r : s.x + r - twall - clearance;
cube([s.x + r - roof_x - twall - clearance, s.y + 1, twall]); translate([roof_x, -s.y / 2 - wall])
cube([roof_end - roof_x , s.y + 2 * wall, twall]);
translate([roof_x, -os.y / 2 + 0.5]) translate([roof_x, -os.y / 2 + 0.5])
cube([s.x - roof_x - clearance, os.y - 1, twall]); cube([s.x - clearance - roof_x, os.y - 1, twall]);
// Base // Base, actually the roof when printed
translate([floor_x, -s.y / 2 - 0.5, os.z - bwall]) floor_end = end ? s.x + 2 * r : s.x + r;
cube([s.x + r - floor_x, s.y + 1, bwall]); translate([floor_x, -s.y / 2 - wall, os.z - bwall])
cube([floor_end - floor_x, s.y + 2 * wall, bwall]);
translate([floor_x, -os.y / 2 + 0.5, os.z - bwall]) translate([floor_x, -os.y / 2 + 0.5, os.z - bwall])
cube([s.x - floor_x - clearance, os.y -1, bwall]); cube([s.x - floor_x - clearance, os.y -1, bwall]);
if(show_supports()) { if(show_supports() && !end) {
for(side = [-1, 1]) { for(side = [-1, 1]) {
w = 2.1 * extrusion_width; w = 2.1 * extrusion_width;
translate([s.x + r + cam_x - w / 2, side * (s.y / 2 + wall / 2), twall / 2]) translate([s.x + r + cam_x - w / 2, side * (s.y / 2 + wall / 2), twall / 2])
@ -167,13 +184,7 @@ module drag_chain_assembly(type, pos = 0) { //! Drag chain assembly
zb = z / 2; // z of bottom track zb = z / 2; // z of bottom track
c = [actual_travel / 2 + pos / 2, 0, r + zb]; // centre of bend c = [actual_travel / 2 + pos / 2, 0, r + zb]; // centre of bend
module link(n) // Position and colour link with origin at the hinge hole points = [ // Calculate list of hinge points
translate([-z / 2, 0, -z / 2])
stl_colour(n % 2 ? pp1_colour : pp2_colour)
drag_chain_link(type);
points = [ // Calculate lits of hinge points
for(i = 0, p = [0, 0, z / 2 + 2 * r]; i < links + 5; for(i = 0, p = [0, 0, z / 2 + 2 * r]; i < links + 5;
i = i + 1, i = i + 1,
dx = p.z > c.z ? s.x : -s.x, dx = p.z > c.z ? s.x : -s.x,
@ -183,10 +194,24 @@ module drag_chain_assembly(type, pos = 0) { //! Drag chain assembly
: q) // Circular section : q) // Circular section
p p
]; ];
npoints = len(points);
assembly(str(drag_chain_name(type), "_drag_chain")) module link(n) // Position and colour link with origin at the hinge hole
for(i = [0 : len(points) - 2]) let(v = points[i+1] - points[i]) 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);
assembly(str(drag_chain_name(type), "_drag_chain")) {
for(i = [0 : npoints - 2]) let(v = points[i+1] - points[i])
translate(points[i]) translate(points[i])
rotate([0, -atan2(v.z, v.x), 0]) rotate([0, -atan2(v.z, v.x), 0])
link(i); link(i);
translate(points[0] - [s.x, 0, 0])
link(-1);
translate(points[npoints - 1])
hflip()
link(npoints - 1);
}
} }

View File

@ -28,20 +28,20 @@ See [usage](docs/usage.md) for requirements, installation instructions and a usa
<tr><td> <a href = "#Bulldogs">Bulldogs</a> </td><td> <a href = "#Leadnuts">Leadnuts</a> </td><td> <a href = "#SK_brackets">SK_brackets</a> </td><td> <a href = "#Corner_block">Corner_block</a> </td><td> <a href = "#Gears">Gears</a> </td><td> <a href = "#Sphere">Sphere</a> </td></tr> <tr><td> <a href = "#Bulldogs">Bulldogs</a> </td><td> <a href = "#Leadnuts">Leadnuts</a> </td><td> <a href = "#SK_brackets">SK_brackets</a> </td><td> <a href = "#Corner_block">Corner_block</a> </td><td> <a href = "#Gears">Gears</a> </td><td> <a href = "#Sphere">Sphere</a> </td></tr>
<tr><td> <a href = "#Buttons">Buttons</a> </td><td> <a href = "#Light_strips">Light_strips</a> </td><td> <a href = "#SMDs">SMDs</a> </td><td> <a href = "#Door_hinge">Door_hinge</a> </td><td> <a href = "#Hanging_hole">Hanging_hole</a> </td><td> <a href = "#Teardrops">Teardrops</a> </td></tr> <tr><td> <a href = "#Buttons">Buttons</a> </td><td> <a href = "#Light_strips">Light_strips</a> </td><td> <a href = "#SMDs">SMDs</a> </td><td> <a href = "#Door_hinge">Door_hinge</a> </td><td> <a href = "#Hanging_hole">Hanging_hole</a> </td><td> <a href = "#Teardrops">Teardrops</a> </td></tr>
<tr><td> <a href = "#Cable_strips">Cable_strips</a> </td><td> <a href = "#Linear_bearings">Linear_bearings</a> </td><td> <a href = "#SSRs">SSRs</a> </td><td> <a href = "#Door_latch">Door_latch</a> </td><td> <a href = "#Horiholes">Horiholes</a> </td><td></td></tr> <tr><td> <a href = "#Cable_strips">Cable_strips</a> </td><td> <a href = "#Linear_bearings">Linear_bearings</a> </td><td> <a href = "#SSRs">SSRs</a> </td><td> <a href = "#Door_latch">Door_latch</a> </td><td> <a href = "#Horiholes">Horiholes</a> </td><td></td></tr>
<tr><td> <a href = "#Cameras">Cameras</a> </td><td> <a href = "#Magnets">Magnets</a> </td><td> <a href = "#Screws">Screws</a> </td><td> <a href = "#Fan_guard">Fan_guard</a> </td><td> <a href = "#Layout">Layout</a> </td><td></td></tr> <tr><td> <a href = "#Cameras">Cameras</a> </td><td> <a href = "#Magnets">Magnets</a> </td><td> <a href = "#Screws">Screws</a> </td><td> <a href = "#Drag_chain">Drag_chain</a> </td><td> <a href = "#Layout">Layout</a> </td><td></td></tr>
<tr><td> <a href = "#Circlips">Circlips</a> </td><td> <a href = "#Mains_sockets">Mains_sockets</a> </td><td> <a href = "#Sealing_strip">Sealing_strip</a> </td><td> <a href = "#Fixing_block">Fixing_block</a> </td><td> <a href = "#Maths">Maths</a> </td><td></td></tr> <tr><td> <a href = "#Circlips">Circlips</a> </td><td> <a href = "#Mains_sockets">Mains_sockets</a> </td><td> <a href = "#Sealing_strip">Sealing_strip</a> </td><td> <a href = "#Fan_guard">Fan_guard</a> </td><td> <a href = "#Maths">Maths</a> </td><td></td></tr>
<tr><td> <a href = "#Components">Components</a> </td><td> <a href = "#Microswitches">Microswitches</a> </td><td> <a href = "#Shaft_couplings">Shaft_couplings</a> </td><td> <a href = "#Flat_hinge">Flat_hinge</a> </td><td> <a href = "#Offset">Offset</a> </td><td></td></tr> <tr><td> <a href = "#Components">Components</a> </td><td> <a href = "#Microswitches">Microswitches</a> </td><td> <a href = "#Shaft_couplings">Shaft_couplings</a> </td><td> <a href = "#Fixing_block">Fixing_block</a> </td><td> <a href = "#Offset">Offset</a> </td><td></td></tr>
<tr><td> <a href = "#DIP">DIP</a> </td><td> <a href = "#Microview">Microview</a> </td><td> <a href = "#Sheets">Sheets</a> </td><td> <a href = "#Foot">Foot</a> </td><td> <a href = "#Quadrant">Quadrant</a> </td><td></td></tr> <tr><td> <a href = "#DIP">DIP</a> </td><td> <a href = "#Microview">Microview</a> </td><td> <a href = "#Sheets">Sheets</a> </td><td> <a href = "#Flat_hinge">Flat_hinge</a> </td><td> <a href = "#Quadrant">Quadrant</a> </td><td></td></tr>
<tr><td> <a href = "#D_connectors">D_connectors</a> </td><td> <a href = "#Modules">Modules</a> </td><td> <a href = "#Spades">Spades</a> </td><td> <a href = "#Handle">Handle</a> </td><td> <a href = "#Round">Round</a> </td><td></td></tr> <tr><td> <a href = "#D_connectors">D_connectors</a> </td><td> <a href = "#Modules">Modules</a> </td><td> <a href = "#Spades">Spades</a> </td><td> <a href = "#Foot">Foot</a> </td><td> <a href = "#Round">Round</a> </td><td></td></tr>
<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 = "#PCB_mount">PCB_mount</a> </td><td> <a href = "#Rounded_cylinder">Rounded_cylinder</a> </td><td></td></tr> <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 = "#PSU_shroud">PSU_shroud</a> </td><td> <a href = "#Rounded_polygon">Rounded_polygon</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 = "#Printed_box">Printed_box</a> </td><td> <a href = "#Sector">Sector</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 = "#Ribbon_clamp">Ribbon_clamp</a> </td><td> <a href = "#Sweep">Sweep</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 = "#SSR_shroud">SSR_shroud</a> </td><td> <a href = "#Thread">Thread</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 = "#Screw_knob">Screw_knob</a> </td><td> <a href = "#Tube">Tube</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 = "#Socket_box">Socket_box</a> </td><td></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 = "#Strap_handle">Strap_handle</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></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 = "#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 = "#Inserts">Inserts</a> </td><td></td><td> <a href = "#Wire">Wire</a> </td><td></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> <tr><td></td><td></td><td> <a href = "#Zipties">Zipties</a> </td><td></td><td></td><td></td></tr>
@ -4539,6 +4539,60 @@ Door latch for 6mm acrylic door for 3D printer. See [door_hinge](#door_hinge).
| 1 | door_latch.stl | | 1 | door_latch.stl |
<a href="#top">Top</a>
---
<a name="Drag_chain"></a>
## Drag_chain
Parametric cable drag chain to limit the bend radius of a cable run.
Each link has a maximum bend angle, so the mininium radius is proportional to the link length.
The travel prpoery 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.
[printed/drag_chain.scad](printed/drag_chain.scad) Implementation.
[tests/drag_chain.scad](tests/drag_chain.scad) Code for this example.
### Properties
| Function | Description |
|:--- |:--- |
| ```drag_chain_bwall(type)``` | Bottom wall |
| ```drag_chain_name(type)``` | The name to allow more than one in a project |
| ```drag_chain_size(type)``` | The internal size and link length |
| ```drag_chain_travel(type)``` | X travel |
| ```drag_chain_twall(type)``` | Top wall |
| ```drag_chain_wall(type)``` | Side wall thickness |
### Functions
| Function | Description |
|:--- |:--- |
| ```drag_chain(name, size, travel, wall = 1.6, bwall = 1.5, twall = 1.5)``` | Constructor |
| ```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 |
### Modules
| Module | Description |
|:--- |:--- |
| ```drag_chain_assembly(type, pos = 0)``` | Drag chain assembly |
![drag_chain](tests/png/drag_chain.png)
### Printed
| Qty | Filename |
| ---:|:--- |
| 14 | x_drag_chain_link.stl |
| 1 | x_drag_chain_link_end.stl |
| 1 | x_drag_chain_link_start.stl |
### Assemblies
| Qty | Name |
| ---:|:--- |
| 1 | x_drag_chain_assembly |
<a href="#top">Top</a> <a href="#top">Top</a>
--- ---

View File

@ -48,5 +48,12 @@ module drag_chains()
if($preview) if($preview)
drag_chains(); drag_chains();
else else {
drag_chain_link(drag_chain); drag_chain_link(drag_chain);
translate([-x * 2, 0])
drag_chain_link(drag_chain, start = true);
translate([x * 2, 0])
drag_chain_link(drag_chain, end = true);
}

BIN
tests/png/drag_chain.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 128 KiB