mirror of
https://github.com/revarbat/snappy-reprap.git
synced 2025-11-03 08:06:45 -08:00
First pass on worm-gear Z lifter design.
This commit is contained in:
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
11
config.scad
11
config.scad
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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();
|
||||
|
||||
|
||||
@@ -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
203
z_rail_parts.scad
Normal 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
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user