First pass on worm-gear Z lifter design.

This commit is contained in:
Revar Desmera
2017-03-28 22:25:13 -07:00
parent 50c1bc99b4
commit 2311527e6b
10 changed files with 322 additions and 87885 deletions

View File

File diff suppressed because it is too large Load Diff

View File

File diff suppressed because it is too large Load Diff

View File

File diff suppressed because it is too large Load Diff

View File

@@ -12,11 +12,11 @@ platform_width = 150.0; // mm
platform_height = 40.0; // mm
platform_thick = 7.0; // mm
rail_length = 133.3; // mm
rail_length = 136.0; // mm Must be a multiple of lifter_gear_pitch
rail_height = 50.0; // mm
rail_thick = 7.0; // mm
motor_rail_length = 133.3; // mm
motor_rail_length = 128.0; // mm
groove_angle = 30; // degrees
groove_height = 12; // mm
@@ -36,9 +36,10 @@ motor_shaft_length = 20; // mm length of exposed NEMA17 motor shaft.
motor_shaft_flatted = true; // Is motor shaft keyed? (RECOMMENDED)
// Currently configured for 3/8" ACME threaded rod.
lifter_rod_diam = 9.5; // mm
lifter_rod_length = 300.0; // mm
lifter_rod_pitch = 3.175; // mm lift per revolution
lifter_gear_diam = 60.0; // mm
lifter_gear_thick = 16.0; // mm
lifter_gear_pitch = 8.0; // mm lift per revolution
lifter_gear_angle = 50.0; // degrees tooth face angle
// Mechanical endstop bare microswitch.
endstop_hole_spacing = 9.5; // mm

View File

@@ -1,41 +0,0 @@
include <config.scad>
use <GDMUtils.scad>
use <acme_screw.scad>
$fa = 2;
$fs = 2;
module lifter_lock_nut()
{
height = 10;
diam = ceil(lifter_rod_diam/5+2)*5;
color("SpringGreen")
difference () {
cylinder(h=height, d=diam, center=true, $fn=6);
acme_threaded_rod(
d=lifter_rod_diam+2*printer_slop,
l=height+0.1,
pitch=lifter_rod_pitch,
thread_depth=lifter_rod_pitch/4
);
zflip_copy() {
down(10/2-1/2) {
cylinder(h=1.05, d1=lifter_rod_diam+1, d2=lifter_rod_diam-lifter_rod_pitch/4, center=true);
}
}
}
}
//!lifter_lock_nut();
module lifter_lock_nut_parts() { // make me
yspread(30) up(10/2) lifter_lock_nut();
}
lifter_lock_nut_parts();
// vim: noexpandtab tabstop=4 shiftwidth=4 softtabstop=4 nowrap

View File

@@ -1,77 +0,0 @@
include <config.scad>
use <GDMUtils.scad>
use <acme_screw.scad>
$fa = 2;
$fs = 2;
module lifter_rod_coupler()
{
diam = 30;
height = 30;
color("SpringGreen")
difference () {
cylinder(h=height, d=diam, center=true);
down(height/4) {
difference() {
cylinder(h=height/2+0.1, d=motor_shaft_size, center=true, $fn=24);
if (motor_shaft_flatted) {
left(motor_shaft_size-0.5) {
cube(size=[motor_shaft_size, motor_shaft_size, height/2], center=true);
}
}
}
}
up(height/2-2/2) {
cylinder(h=2+0.05, d1=lifter_rod_diam-lifter_rod_pitch/4, d2=lifter_rod_diam+2, center=true);
}
down(height/2-2/2) {
cylinder(h=2+0.05, d1=motor_shaft_size+2, d2=motor_shaft_size, center=true);
}
up(height/4) {
acme_threaded_rod(
d=lifter_rod_diam+2*printer_slop,
l=height/2+0.1,
pitch=lifter_rod_pitch,
thread_depth=lifter_rod_pitch/4,
$fn=32
);
}
right(diam/4)
cube(size=[diam/2+0.1, 2, height+0.1], center=true);
right((diam+lifter_rod_diam)/2/2-1) {
mirror_copy([0,0,1]) {
up(height/2-set_screw_size-2) {
xrot(90) cylinder(h=diam+0.1, d=set_screw_size*1.1, center=true, $fn=24);
fwd(diam/4+4)
xrot(90) cylinder(d=set_screw_size*2, h=diam/2, center=true, $fn=24);
translate([0, 6, height/8]) {
hull() {
zspread(height/4) {
xrot(90) zrot(90) {
scale([1.05,1.05,1.05]) {
metric_nut(size=set_screw_size, hole=false);
}
}
}
}
}
}
}
}
}
}
//!lifter_rod_coupler();
module lifter_rod_coupler_parts() { // make me
yspread(50) up(30/2) lifter_rod_coupler();
}
lifter_rod_coupler_parts();
// vim: noexpandtab tabstop=4 shiftwidth=4 softtabstop=4 nowrap

View File

@@ -5,68 +5,18 @@ use <acme_screw.scad>
$fa=2;
$fs=2;
// Constructs a sine-wave threaded screw rod. This method makes much
// smoother threads than the naive linear_extrude method.
module wave_threaded_rod(
d=10.5,
l=100,
pitch=3.175,
thread_depth=1,
vsteps=12
) {
asteps = segs(d/2);
zsteps = ceil(l/(pitch/vsteps)+1);
poly_points = concat(
[
for (
z = [0 : zsteps-1],
astep = [0 : asteps-1]
) let (
va = (360 * z / vsteps) % 360,
ra = 360 * astep / asteps,
rx = 0.5 * d * cos(ra) + 0.5 * thread_depth * cos(va),
ry = 0.5 * d * sin(ra) + 0.5 * thread_depth * sin(va),
vz = z * pitch / vsteps - l / 2
) [rx, ry, vz]
],
[[0, 0, -l/2], [0, 0, l/2]]
);
point_count = len(poly_points);
pt_cnt = asteps * zsteps;
poly_faces = concat(
[for (astep = [0 : asteps-1]) [astep, (astep+1)%asteps, pt_cnt]],
[for (astep = [0 : asteps-1]) [pt_cnt-astep-1, pt_cnt-(astep+1)%asteps-1, pt_cnt+1]],
[
for (
v = [0 : zsteps-2],
astep = [0 : asteps-1],
i = [0 : 1]
) let (
p0 = v*asteps + astep,
p1 = (v+1)*asteps + astep,
p2 = (v+1)*asteps + ((astep+1) % asteps),
p3 = v*asteps + ((astep+1) % asteps),
tri = (i==0? [p0, p1, p2] : [p0, p2, p3])
) tri
]
);
intersection() {
polyhedron(points=poly_points, faces=poly_faces, convexity=10);
cube([d+2*thread_depth, d+2*thread_depth, l], center=true);
}
}
//!wave_threaded_rod(d=60, l=10, pitch=5, thread_depth=2);
module lifter_screw(d=50, h=10, thread_depth=3, pitch=10, hole=30) {
up (h/2) {
module lifter_screw(d=50, h=10, thread_depth=3, pitch=10, hole=30, pa=50) {
up(h/2) {
difference() {
zrot(130) acme_threaded_rod(d=d, l=h, thread_depth=thread_depth, pitch=pitch, thread_angle=45);
union() {
acme_threaded_rod(d=d, l=h, thread_depth=thread_depth, pitch=pitch, thread_angle=pa);
up(2/2) cylinder(h=h+2, d=motor_shaft_size+15, center=true);
}
difference() {
cylinder(h=h+0.1, d=motor_shaft_size+printer_slop, center=true, $fn=24);
cylinder(h=h+10, d=motor_shaft_size+2*printer_slop, center=true, $fn=24);
if (motor_shaft_flatted) {
left(motor_shaft_size-0.5) {
cube(size=[motor_shaft_size, motor_shaft_size, h], center=true);
cube(size=[motor_shaft_size, motor_shaft_size, h+10.05], center=true);
}
}
}
@@ -79,7 +29,7 @@ module lifter_screw(d=50, h=10, thread_depth=3, pitch=10, hole=30) {
down(h/2-2/2) {
cylinder(h=2+0.05, d1=motor_shaft_size+2, d2=motor_shaft_size, center=true);
}
up(h/2-3) {
up(h/2-1) {
left(motor_shaft_size/2+2) {
hull() {
up(h/4/2) {
@@ -99,7 +49,13 @@ module lifter_screw(d=50, h=10, thread_depth=3, pitch=10, hole=30) {
//!lifter_screw(d=20, h=20, thread_depth=3, pitch=8);
module lifter_screw_parts() { // make me
lifter_screw(d=60, h=16, thread_depth=3, pitch=8);
lifter_screw(
d=lifter_gear_diam,
h=lifter_gear_thick,
thread_depth=lifter_gear_pitch/3.2,
pitch=lifter_gear_pitch,
pa=lifter_gear_angle
);
}
lifter_screw_parts();

View File

@@ -1,168 +0,0 @@
include <config.scad>
use <GDMUtils.scad>
use <joiners.scad>
use <NEMA.scad>
module rail_z_motor_segment()
{
joiner_length = 10;
side_joiner_len = 10;
xlen = motor_rail_length/2-25;
ylen = (rail_width-motor_mount_spacing)/2;
hlen = sqrt(xlen*xlen+ylen*ylen);
ang = atan2(ylen,hlen);
motor_width = nema_motor_width(17);
color("SpringGreen")
prerender(convexity=20)
union() {
difference() {
union() {
// Bottom.
up(rail_thick/2) {
union() {
yrot(90) sparse_strut(h=rail_width, l=motor_rail_length, thick=rail_thick, maxang=75, strut=10, max_bridge=500);
xspread(motor_mount_spacing) {
cube(size=[joiner_width, motor_rail_length, rail_thick], center=true);
}
}
}
// Walls.
zring(r=0, n=2) {
up((rail_height+3)/2) {
right((rail_spacing+joiner_width)/2) {
if (wall_style == "crossbeams")
sparse_strut(h=rail_height+3, l=motor_rail_length-joiner_length, thick=joiner_width, strut=5);
if (wall_style == "thinwall")
thinning_wall(h=rail_height+3, l=motor_rail_length-joiner_length, thick=joiner_width, strut=5, bracing=false);
if (wall_style == "corrugated")
corrugated_wall(h=rail_height+3, l=motor_rail_length-joiner_length, thick=joiner_width, strut=5);
}
}
}
// Rail backing.
xspread(rail_spacing+joiner_width)
up(rail_height+groove_height/2)
chamfer(size=[joiner_width, motor_rail_length, groove_height], chamfer=1, edges=[[1,1,0,0], [1,1,0,0], [0,0,0,0]])
cube(size=[joiner_width, motor_rail_length, groove_height], center=true);
// Side supports
up((rail_height/2+groove_height/2)/2) {
yspread(motor_rail_length-18) {
difference() {
cube([rail_width, 5, rail_height/2+groove_height/2], center=true);
xspread(rail_width/3, n=3) {
down(3) cube([16, 11, 11], center=true);
}
}
}
}
// Motor mount joiners.
up(rail_height+groove_height/2) {
joiner_pair(spacing=motor_mount_spacing, h=rail_height, w=joiner_width, l=motor_length/2, a=joiner_angle);
}
xspread(motor_mount_spacing) {
up(rail_height/4+groove_height/4) {
fwd(motor_length/2/2) {
cube(size=[joiner_width, motor_length/2, rail_height/2+groove_height/2], center=true);
}
}
}
difference() {
up((rail_height+groove_height/2)/2) {
up(rail_height/2/2) {
fwd(motor_length/2) {
xspread((motor_mount_spacing+motor_width)/2) {
cube([motor_mount_spacing-motor_width, 10, rail_height+groove_height/2+rail_height/2], center=true);
}
}
}
}
up(rail_height+groove_height/2) {
cube(size=[motor_width, motor_length, motor_width], center=true);
up(motor_width/2) cube(size=[motor_width, motor_length, motor_width], center=true);
}
}
// Motor mount supports.
xflip_copy() {
up((rail_height+groove_height)/2) {
fwd(motor_rail_length/4) {
right((rail_width+motor_mount_spacing)/4-2) {
zrot(ang) {
sparse_strut(h=rail_height+groove_height, l=hlen, thick=7.5, strut=5);
down((rail_height+groove_height-rail_thick)/2) {
cube(size=[7.5, hlen, rail_thick], center=true);
}
}
}
}
}
}
// Side wiring access hole frame
if (wall_style == "corrugated") {
up(10/2+rail_thick) {
xspread(rail_width-joiner_width) {
back((motor_rail_length-2*28)/2) {
cube(size=[joiner_width, 16+4, 10+4], center=true);
}
}
}
}
}
// Clear space for joiners.
up(rail_height/2) {
joiner_quad_clear(xspacing=rail_spacing+joiner_width, yspacing=motor_rail_length, h=rail_height, w=joiner_width, clearance=5, a=joiner_angle);
}
// Side wiring access hole
if (wall_style != "crossbeams") {
up(10/2+rail_thick) {
xspread(rail_width-joiner_width) {
back((motor_rail_length-2*28)/2) {
cube(size=[joiner_width+1, 16, 10], center=true);
}
}
}
}
// Shrinkage stress relief
up(rail_thick/2) {
yspread(25, n=5) {
cube(size=[rail_width+1, 1, rail_thick-2], center=true);
}
xspread(20, n=5) {
yspread(motor_rail_length-10) {
cube(size=[1, 60, rail_thick-2], center=true);
}
}
}
}
// Snap-tab joiners.
up(rail_height/2) {
joiner_quad(xspacing=rail_spacing+joiner_width, yspacing=motor_rail_length+0.05, h=rail_height, w=joiner_width, l=13, a=joiner_angle);
}
}
}
//!rail_z_motor_segment();
module rail_z_motor_segment_parts() { // make me
zrot(-90) rail_z_motor_segment();
}
rail_z_motor_segment_parts();
// vim: noexpandtab tabstop=4 shiftwidth=4 softtabstop=4 nowrap

203
z_rail_parts.scad Normal file
View File

@@ -0,0 +1,203 @@
include <config.scad>
use <GDMUtils.scad>
use <sliders.scad>
use <joiners.scad>
use <acme_screw.scad>
$fa=5;
$fs=3;
// connectby valid options: "", "fwd", "back"
module z_rail(explode=0, connectby="")
{
side_joiner_len = 2;
up(
(connectby=="fwd")? -rail_height/2 :
(connectby=="back")? -rail_height/2 :
0
) back(
(connectby=="back")? -rail_length/2 :
(connectby=="fwd")? rail_length/2 :
0
) {
color([0.9, 0.7, 1.0])
prerender(convexity=20)
union() {
difference() {
union() {
// Bottom.
up(rail_thick/2) yrot(90)
sparse_strut(h=rail_width, l=rail_length, thick=rail_thick, maxang=45, strut=10, max_bridge=500);
// Walls.
zrot_copies([0, 180]) {
up(rail_height/2) {
right((rail_spacing+joiner_width)/2) {
if (wall_style == "crossbeams")
sparse_strut(h=rail_height, l=rail_length-10, thick=joiner_width, strut=5);
if (wall_style == "thinwall")
thinning_wall(h=rail_height, l=rail_length-10, thick=joiner_width, strut=5, bracing=false);
if (wall_style == "corrugated")
corrugated_wall(h=rail_height, l=rail_length-10, thick=joiner_width, strut=5);
}
}
}
// Rails.
xspread(rail_spacing+joiner_width) {
up(rail_height+groove_height/2-0.05) {
rail(l=rail_length, w=joiner_width, h=groove_height);
}
}
// Screw rack
teeth_d = lifter_gear_pitch / 3.2;
ang = acos(1 - 2*teeth_d/lifter_gear_diam);
teeth_h = sin(ang) * lifter_gear_diam + 6;
render(convexity=10)
difference() {
xspread(lifter_gear_diam) {
up(rail_height/2) {
sparse_strut(h=rail_height, l=rail_length, thick=2.0*teeth_d, strut=platform_thick);
}
up(rail_height+groove_height/2) {
cube(size=[2*teeth_d, rail_length, teeth_h], center=true);
}
}
xspread(2*printer_slop) {
up(rail_height+groove_height/2) {
xrot(90) {
acme_threaded_rod(
d=lifter_gear_diam,
l=rail_length+0.1,
thread_depth=lifter_gear_pitch/3.2,
pitch=lifter_gear_pitch,
thread_angle=lifter_gear_angle
);
}
}
}
}
// Side Supports
up(rail_height/4) {
yspread(rail_length-2*5-5) {
difference() {
cube(size=[rail_width-joiner_width, 4, rail_height/2], center=true);
xspread(rail_width/3, n=3) {
cube(size=[16, 11, 12], center=true);
}
}
}
}
// Side wiring access hole frame
if (wall_style == "corrugated") {
up(10/2+rail_thick) {
xspread(rail_width-joiner_width) {
yspread(motor_rail_length-2*28) {
cube(size=[joiner_width, 16+4, 10+4], center=true);
}
}
}
}
}
// Clear space for joiners.
up(rail_height/2) {
joiner_quad_clear(xspacing=rail_spacing+joiner_width, yspacing=rail_length-0.05, h=rail_height, w=joiner_width, clearance=5, a=joiner_angle);
}
// Clear space for Side half joiners
up(rail_height/2/2) {
yspread(rail_length-20) {
zring(r=rail_spacing/2+joiner_width+side_joiner_len-0.05, n=2) {
zrot(-90) {
chamfer(chamfer=3, size=[joiner_width, 2*(side_joiner_len+joiner_width/2), rail_height/2], edges=[[0,0,0,0], [1,1,0,0], [0,0,0,0]]) {
half_joiner_clear(h=rail_height/2, w=joiner_width, a=joiner_angle);
}
}
}
}
}
// Side wiring access hole
if (wall_style != "crossbeams") {
up(10/2+rail_thick) {
xspread(rail_width-joiner_width) {
yspread(motor_rail_length-2*28) {
cube(size=[joiner_width+1, 16, 10], center=true);
}
}
}
}
// Shrinkage stress relief
up(rail_thick/2) {
yspread(17.5, n=7) {
cube(size=[rail_width+1, 1, rail_thick-2], center=true);
}
xspread(22, n=5) {
yspread(rail_length-10) {
cube(size=[1, 17.5*2, rail_thick-2], center=true);
}
}
}
}
// Side half joiners
up(rail_height/2/2) {
yspread(rail_length-20) {
zring(r=rail_spacing/2+joiner_width+side_joiner_len, n=2) {
zrot(-90) {
chamfer(chamfer=3, size=[joiner_width, 2*(side_joiner_len+joiner_width/2), rail_height/2], edges=[[0,0,0,0], [1,1,0,0], [0,0,0,0]]) {
half_joiner2(h=rail_height/2, w=joiner_width, l=side_joiner_len+joiner_width/2, a=joiner_angle);
}
}
}
}
}
// Snap-tab joiners.
up(rail_height/2) {
joiner_quad(xspacing=rail_spacing+joiner_width, yspacing=rail_length, h=rail_height, w=joiner_width, l=6, a=joiner_angle);
}
}
up(rail_height/2) {
fwd(rail_length/2+explode) {
if ($children > 0) children(0);
}
back(rail_length/2+explode) {
if ($children > 1) children(1);
}
}
up(rail_height/2/2) {
back(rail_length/2-10) {
left(rail_spacing/2+joiner_width+side_joiner_len) {
if ($children > 2) children(2);
}
right(rail_spacing/2+joiner_width+side_joiner_len) {
if ($children > 3) children(3);
}
}
}
}
}
//!z_rail();
module z_rail_parts() { // make me
z_rail();
}
z_rail_parts();
// vim: noexpandtab tabstop=4 shiftwidth=4 softtabstop=4 nowrap

View File

@@ -1,7 +1,7 @@
include <config.scad>
use <GDMUtils.scad>
use <NEMA.scad>
use <joiners.scad>
use <acme_screw.scad>
use <sliders.scad>
@@ -11,145 +11,133 @@ $fs = 2;
module z_sled(explode=0, arrows=false)
{
offcenter = platform_thick;
cantlen = cantilever_length - platform_thick - groove_height/2;
slider_len = 20;
lifter_block_size = 20;
slider_wall = 5;
cantlen = cantilever_length - slider_wall - groove_height/2;
motor_width = nema_motor_width(17);
plinth_diam = nema_motor_plinth_diam(17);
motor_joiner_h = motor_length * 0.75;
motor_joiner_x = motor_width - joiner_width;
color("MediumSlateBlue")
prerender(convexity=10)
yrot(90)
zrot(90)
down(offcenter+groove_height/2)
union() {
back(platform_length/2) {
difference() {
union() {
// Back
up(platform_thick/2)
zrot(90) yrot(90)
sparse_strut(l=rail_spacing-joiner_width+5, h=platform_length, thick=platform_thick, strut=8, maxang=45, max_bridge=999);
difference() {
union() {
// Back
up((rail_height+groove_height)/2) {
right(cantilever_length - platform_thick/2 ) {
sparse_strut(l=rail_spacing+1, h=rail_height+groove_height, thick=platform_thick, strut=8, maxang=45, max_bridge=999);
}
}
// Lifter clamp support
up(5/2) {
cube(size=[lifter_rod_diam+2*3, platform_length, 5], center=true);
difference() {
// Motor Cage
up((rail_height+groove_height)/2) {
cube(size=[motor_width+6, motor_width+6, rail_height+groove_height], center=true);
}
// Side supports
yspread(platform_length-platform_thick) {
up((offcenter+groove_height+5)/2) {
cube(size=[rail_spacing-joiner_width+5, platform_thick, offcenter+groove_height+5], center=true);
up((motor_length+1+printer_slop)/2) {
difference() {
// Clear motor volume
cube(size=[motor_width+2*printer_slop, motor_width+2*printer_slop, motor_length+1+printer_slop+0.1], center=true);
// Snap tabs to hold motor in
down(motor_length/2) {
yspread(motor_width+2*printer_slop) {
cube(size=[5, 2, 2], center=true);
}
}
}
}
// sliders
xspread(rail_spacing+joiner_width) {
up((groove_height+offcenter)/2) {
// Clear motor cage wiring access
up(groove_height/2) {
right(motor_width/2+printer_slop) {
cube(size=[10, motor_width*0.5, groove_height+1], center=true);
}
}
// Motor tray cooling holes
up((rail_height+groove_height)/2) {
zrot_copies([0,90]) {
cube(size=[motor_width+10, motor_width*0.5, rail_height], center=true);
}
cylinder(d=plinth_diam, h=rail_height+groove_height+1, center=true);
}
}
// Motor cage supports
support_len = cantilever_length - motor_length/2 - 2 - printer_slop;
yspread(motor_width+2*3-5) {
up((rail_height+groove_height)/2) {
right(cantilever_length-support_len/2) {
cube(size=[support_len, 5, rail_height+groove_height], center=true);
}
}
}
// sliders
up(rail_height+groove_height-platform_length/2) {
yflip_copy() {
fwd((rail_spacing+joiner_width)/2) {
difference() {
// Slider block
up(7.5/2) {
chamfcube(chamfer=2, size=[joiner_width+2*7.5+2, platform_length, groove_height+offcenter+7.5], chamfaxes=[0, 1, 0], center=true);
right(slider_wall/2) {
chamfcube(chamfer=2, size=[groove_height+2+slider_wall, joiner_width+2+2*slider_wall, platform_length], chamfaxes=[0, 0, 1], center=true);
}
// Slider groove
up(2/2-0.05) {
cube(size=[joiner_width+2, platform_length+1, groove_height+offcenter+2], center=true);
left(slider_wall) {
cube(size=[groove_height+2+2*slider_wall, joiner_width+2, platform_length+1], center=true);
}
}
// Slider ridges
zspread(platform_length-slider_len, n=2) {
zrot(90) xrot(90) {
down(groove_height/2) {
left_half() slider(l=slider_len, base=0, slop=2*printer_slop);
}
}
}
}
// Slider ridges
up(groove_height+offcenter) {
yspread(platform_length-slider_len-20, n=2) {
xrot(180) slider(l=slider_len, base=0, slop=2*printer_slop);
}
}
}
// Lifter block
up((offcenter+lifter_rod_diam+4)/2) {
chamfcube(chamfer=3, size=[lifter_rod_diam+2*3, lifter_block_size, offcenter+lifter_rod_diam+4], chamfaxes=[0, 1, 0], center=true);
}
}
}
// Split Lifter block
up((offcenter+2*lifter_rod_diam+4)/2) {
up(5) cube(size=[lifter_rod_diam*0.65, lifter_block_size+1, offcenter+lifter_rod_diam+0.05], center=true);
}
// Lifter threading
up(offcenter+groove_height/2) {
yspread(printer_slop*1.5) {
xrot(90) zrot(90) {
acme_threaded_rod(
d=lifter_rod_diam+2*printer_slop,
l=lifter_block_size+2*lifter_rod_pitch+0.5,
pitch=lifter_rod_pitch,
thread_depth=lifter_rod_pitch/3,
$fn=32
);
}
}
fwd(lifter_block_size/2-2/2) {
xrot(90) cylinder(h=2.05, d1=lifter_rod_diam-2*lifter_rod_pitch/3, d2=lifter_rod_diam+2, center=true);
}
back(lifter_block_size/2-2/2) {
xrot(90) cylinder(h=2.05, d1=lifter_rod_diam+2, d2=lifter_rod_diam-2*lifter_rod_pitch/3, center=true);
}
}
// Lifter rod access
yspread(platform_length-platform_thick) {
up(offcenter+groove_height/2) {
xrot(90) cylinder(d=lifter_rod_diam+4, h=platform_thick+10, center=true, $fn=32);
}
// Clear space for front joiners.
right(cantilever_length+0.05) {
up(rail_height/2) {
zrot(-90) joiner_pair_clear(spacing=rail_spacing+joiner_width, h=rail_height+0.001, w=joiner_width, clearance=5, a=joiner_angle);
}
}
}
up(offcenter+groove_height+platform_thick-2) {
difference() {
union() {
// Bottom.
up(cantlen/2-5/2) {
back(platform_thick/2) {
zrot(90) sparse_strut(l=rail_width, h=cantlen-1, thick=platform_thick, strut=4);
right(cantilever_length) {
up(rail_height/2) {
// Snap-tab front joiners.
zrot(-90) joiner_pair(spacing=rail_spacing+joiner_width, h=rail_height, w=joiner_width, l=cantlen+0.1, a=joiner_angle);
// Rail top corners
left(cantlen/2) {
up(rail_height/2+groove_height/2) {
yspread(rail_spacing+joiner_width) {
cube([cantlen+0.05, joiner_width, groove_height+0.05], center=true);
}
}
// Rail top corners
up(cantlen+2) {
back(rail_height+groove_height/2-0.05) {
down((cantlen+3)/2+0.05) {
xspread(rail_spacing+joiner_width) {
cube([joiner_width, groove_height, cantlen+3], center=true);
}
}
}
}
}
// Clear space for joiners.
up(cantlen+2.05) {
back(rail_height/2) {
xrot(90) joiner_pair_clear(spacing=rail_spacing+joiner_width, h=rail_height+0.001, w=joiner_width, clearance=5, a=joiner_angle);
}
}
}
// Snap-tab joiners.
up(cantlen+2) {
back(rail_height/2) {
xrot(90) joiner_pair(spacing=rail_spacing+joiner_width, h=rail_height, w=joiner_width, l=cantlen+3, a=joiner_angle);
}
}
}
}
right(offcenter+groove_height/2) {
right(cantlen+explode) {
up(rail_height/2) {
zrot(-90) children();
}
// Placeholder lifter screw
//#up(rail_height+groove_height/2) cylinder(d=lifter_gear_diam, h=16, center=true);
// Children
right(cantilever_length+explode) {
up(rail_height/2) {
children();
}
}
}
@@ -158,10 +146,7 @@ module z_sled(explode=0, arrows=false)
module z_sled_parts() { // make me
offcenter = platform_thick;
left(platform_length/2)
up(offcenter+groove_height/2)
zrot(180) yrot(-90) z_sled();
xrot(180) down(rail_height+groove_height) z_sled();
}