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,13 +80,18 @@ module drag_chain_link(type) {
linear_extrude(wall, center = true) linear_extrude(wall, center = true)
difference() { difference() {
hull() { hull() {
if(start)
translate([floor_x, 0])
square([eps, os.z]);
else
translate([r, r]) translate([r, r])
rotate(180) rotate(180)
teardrop(r = r, h = 0); 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]);
} }
if(!start)
translate([r, r]) translate([r, r])
horihole(pin_r, r); horihole(pin_r, r);
} }
@ -93,52 +101,61 @@ module drag_chain_link(type) {
difference() { difference() {
union() { union() {
hull() { hull() {
if(!end) {
translate([s.x + r, r]) translate([s.x + r, r])
rotate(180) rotate(180)
teardrop(r = r, h = 0); 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
if(!end)
intersection() { intersection() {
translate([s.x, 0]) translate([s.x, 0])
square([3 * r, twall]); // When straight 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
if(!end)
translate([s.x + r, r, side * (s.y / 2 + wall + clearance)]) translate([s.x + r, r, side * (s.y / 2 + wall + clearance)])
horicylinder(r = pin_r, z = r, h = 2 * wall); 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