Improved Z axis with much less wobble.

This commit is contained in:
Revar Desmera
2015-06-18 00:59:48 -07:00
parent a16ef888ad
commit d72530a5d0
43 changed files with 724520 additions and 813515 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

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

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

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

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

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

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

File diff suppressed because it is too large Load Diff

24922
STLs/yz_top_joiner_parts.stl Normal file
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

@@ -1,149 +0,0 @@
include <config.scad>
use <GDMUtils.scad>
use <joiners.scad>
module cantilever_arm()
{
l = cantilever_length;
w = platform_width;
h = rail_height;
color([0.9, 0.7, 1.0])
prerender(convexity=20)
difference() {
union() {
difference() {
union() {
// Bottom.
translate([0,0,rail_thick/2]) yrot(90)
sparse_strut(h=w, l=l, thick=rail_thick, maxang=45, strut=10, max_bridge=500);
mirror_copy([1, 0, 0]) {
// Walls.
translate([(w-joiner_width)/2, 0, h/2]) {
if (wall_style == "crossbeams")
sparse_strut(h=h, l=l-10, thick=joiner_width, strut=5);
if (wall_style == "thinwall")
thinning_wall(h=h, l=l-10, thick=joiner_width, strut=rail_thick, bracing=false);
if (wall_style == "corrugated")
corrugated_wall(h=h, l=l-10, thick=joiner_width, strut=rail_thick);
}
//Back ends
translate([(w-joiner_width)/2, l/2-2.5, h/2]) {
cube(size=[joiner_width, 5, h], center=true);
}
}
zrot_copies([0, 180]) {
translate([0, l/2-20, h/4]) {
difference() {
// Side supports.
cube(size=[w, 5, h/2], center=true);
// Wiring access holes.
grid_of(count=3, spacing=w/3) {
cube(size=[25,11,8], center=true);
}
}
}
}
// Endstop standoff backing
translate([0, l/2-10, rail_thick/2]) {
cube(size=[endstop_hole_spacing + endstop_screw_size*2 + 6, 20, rail_thick], center=true);
}
// Endstop standoffs
translate([0, l/2-endstop_hole_inset, (rail_thick+endstop_standoff)/2]) {
grid_of(count=2, spacing=endstop_hole_spacing) {
cylinder(h=rail_thick+endstop_standoff, r=2+endstop_screw_size*1.2/2, center=true, $fn=16);
}
}
}
// Clear space for joiners.
translate([0, -l/2, h/2]) {
zrot(180) joiner_pair_clear(spacing=w-joiner_width, h=h+0.001, w=joiner_width, a=joiner_angle, clearance=5);
}
// Endstop screw holes.
translate([0, l/2-endstop_hole_inset, (rail_thick+endstop_standoff)/2]) {
grid_of(count=2, spacing=endstop_hole_spacing) {
cylinder(h=rail_thick+endstop_standoff+1, r=endstop_screw_size*1.2/2, center=true, $fn=8);
}
}
// Trim corners behind pivot.
translate([0, l/2, h]) {
grid_of(count=2, spacing=w-joiner_width) {
xrot(45) cube(size=[joiner_width+1, 6*sqrt(2), 6*sqrt(2)], center=true);
}
}
// Shrinkage stress relief
translate([0, 0, rail_thick/2]) {
grid_of(count=[1, 9], spacing=[0, 12]) {
cube(size=[w+1, 1, rail_thick-2], center=true);
}
grid_of(count=[11, 2], spacing=[12.7, l-10]) {
cube(size=[1, 36, rail_thick-2], center=true);
}
}
}
// Snap-tab joiners.
translate([0, -l/2, h]) {
grid_of(count=[1,1,2], spacing=h) {
zrot(180) joiner_pair(spacing=w-joiner_width, h=h, w=joiner_width, l=10, a=joiner_angle);
}
}
translate([0, -l/2+10+h/2, h*3/2]) {
grid_of(count=2, spacing=w-joiner_width) {
thinning_triangle(h=h, l=h, thick=joiner_width, diagonly=true);
}
}
// Pivot backing
mirror_copy([1, 0, 0]) {
translate([(w-joiner_width)/2, l/2-6, h-6]) {
yrot(90) cylinder(h=joiner_width, r=7.5, center=true, $fn=32);
}
}
}
// Pivot
mirror_copy([1, 0, 0]) {
translate([w/2-joiner_width, l/2-6, h-6]) {
translate([2/2-0.05, 0, 0]) {
yrot(90) {
cylinder(h=2, r1=6, r2=4, center=true, $fn=32);
cylinder(h=20, r=set_screw_size*1.1/2, center=true, $fn=12);
translate([0,0,0.75]) {
zrot(90) scale([1.1, 1.1, 1.2]) {
metric_nut(size=set_screw_size, hole=false);
}
}
}
}
}
}
}
}
//!cantilever_arm();
module cantilever_arm_parts() { // make me
zrot(90) cantilever_arm();
}
cantilever_arm_parts();
// vim: noexpandtab tabstop=4 shiftwidth=4 softtabstop=4 nowrap

View File

@@ -1,79 +0,0 @@
include <config.scad>
use <GDMUtils.scad>
use <joiners.scad>
module cantilever_joint()
{
joiner_length = 20;
hanger_strut = rail_height*2;
color("Chocolate")
prerender(convexity=10)
union() {
difference() {
union() {
// Top hanger joiners.
translate([0, -platform_height/2+0.001, 0]) {
xrot(-90) joiner_pair(spacing=platform_width-joiner_width, h=platform_height, w=joiner_width, l=joiner_length, a=joiner_angle);
}
// Bottom strut
translate([0, joiner_length/2, joiner_length/2])
cube(size=[platform_width, joiner_length, joiner_length], center=true);
// Front struts
grid_of(
xa=[-(platform_width-joiner_width)/2, (platform_width-joiner_width)/2],
ya=[joiner_length/2],
za=[-(hanger_strut-2*rail_height)/2]
) {
cube(size=[joiner_width, joiner_length, (hanger_strut-2*rail_height)], center=true);
}
// Front joiners.
translate([0, joiner_length, -(hanger_strut-rail_height)]) {
grid_of(count=[1,1,2], spacing=[1,1,rail_height]) {
joiner_pair(spacing=platform_width-joiner_width, h=rail_height, w=joiner_width, l=joiner_length, a=joiner_angle);
}
}
}
// Clear for side joiners
translate([0, joiner_width/2, joiner_length-rail_height/4-rail_height]) {
circle_of(n=2, r=platform_width/2, rot=true) {
zrot(-90) {
half_joiner_clear(h=rail_height/2, w=joiner_width, l=10, a=joiner_angle);
}
}
}
}
// Side joiners
translate([0, joiner_width/2, joiner_length-rail_height/4-rail_height]) {
circle_of(n=2, r=platform_width/2, rot=true) {
zrot(-90) {
half_joiner2(h=rail_height/2, w=joiner_width, l=10, a=joiner_angle);
}
}
}
}
}
//!cantilever_joint();
module cantilever_joint_parts() { // make me
translate([0, 0, 15]) zrot(90) xrot(180) {
cantilever_joint();
}
}
cantilever_joint_parts();
// vim: noexpandtab tabstop=4 shiftwidth=4 softtabstop=4 nowrap

View File

@@ -4,7 +4,7 @@ snappy_version = 0.91;
// 0 = Thinning Walls (Thin in the middle, thick at edges. Prettier smooth walls.)
// 1 = Corrugated walls. (Zig-zagged walls. Less shrinkage stress. Closed walls.)
// 2 = Crossbeam walls. (Open sparse struts. Far less shrinkage stress. Recommended.)
wall_styling = 2;
wall_styling = 0;
platform_length = 100; // mm. Must be a multiple of rack_tooth_size.
@@ -18,7 +18,7 @@ rail_thick = 7; // mm
rail_offset = 12; // mm
motor_rail_length = 100; // mm
cantilever_length = 125; // mm
cantilever_length = 180; // mm
groove_angle = 30; // degrees
groove_height = 12; // mm
@@ -94,6 +94,7 @@ rail_spacing = platform_width - joiner_width*4 - 10;
rail_width = rail_spacing + joiner_width*2;
motor_mount_spacing=43+joiner_width+10;
side_mount_spacing = platform_length-25;
extruder_length = motor_rail_length+2*platform_length-2*rail_height+2*rail_length-2*cantilever_length;
wall_styles = ["thinwall", "corrugated", "crossbeams"];
wall_style = wall_styles[wall_styling];

View File

@@ -71,10 +71,7 @@ module drive_gear() {
module drive_gear_parts() { // make me
zrot(30)
translate([0, 0, 5+7])
circle_of(r=25, n=3)
drive_gear();
drive_gear();
}

View File

@@ -6,79 +6,26 @@ use <joiners.scad>
module extruder_platform()
{
platform_vert_off = rail_height+groove_height+rail_offset;
l = motor_rail_length*0.5+cantilever_length-platform_vert_off-20;
w = platform_width;
l = extruder_length;
w = rail_width;
h = rail_height;
color("LightSteelBlue")
prerender(convexity=10)
translate([0, l, 0])
union() {
difference() {
union() {
// Bottom.
translate([0, -(0.4*l), rail_thick/2])
rrect(r=joiner_width, size=[w, 1.2*l, rail_thick], center=true);
up(rail_thick/2)
cube(size=[w, l, rail_thick], center=true);
// Walls.
grid_of(
xa=[-(w-joiner_width)/2, (w-joiner_width)/2],
ya=[-(l-l*0.75/2-9)],
za=[(h-12)/2]
) {
thinning_triangle(h=h-12, l=l*0.75, thick=joiner_width, strut=rail_thick, diagonly=true);
}
// Triangle Backing
mirror_copy([1,0,0]) {
translate([(w-joiner_width-10)/2, -l+10/2, (h-12)/2]) {
cube(size=[joiner_width+10, 10, h-12], center=true);
}
}
// Pivot backings
mirror_copy([1,0,0]) {
translate([(w-joiner_width-9.5)/2-5.5, -l-6, h-6]) {
difference() {
xrot(joiner_angle) {
translate([0, 0, -12/sin(joiner_angle)/2]) {
cube(size=[9.5, 12, 12/sin(joiner_angle)], center=true);
}
}
translate([0, 12+10, -12*2*sin(joiner_angle)])
cube(size=[10, 12, 12/sin(joiner_angle)], center=true);
}
}
translate([(w-joiner_width-9.5)/2-5.5, -l-6, h-6]) {
yrot(90) cylinder(h=9.5, r=6, center=true, $fn=32);
}
}
// Pivot
mirror_copy([1,0,0]) {
translate([w/2-joiner_width, -l-6, h-6]) {
translate([2/2-0.5, 0, 0]) {
yrot(90) intersection() {
cylinder(h=2, r1=6, r2=4, center=true, $fn=32);
cylinder(h=30, r=6, center=true, $fn=32);
}
}
}
}
translate([0, -l+10/2+2, (rail_thick+endstop_click_voff+set_screw_size+endstop_standoff)/2]) {
difference() {
// Z endstop block.
cube(size=[w-joiner_width, 10, (rail_thick+endstop_click_voff+set_screw_size+endstop_standoff)], center=true);
// Z endstop adjustment screw nut slot.
translate([0, 0, (rail_thick+endstop_click_voff-set_screw_size+endstop_standoff)/2]) {
xrot(90) {
cylinder(h=11, r=set_screw_size*1.1/2, center=true, $fn=12);
hull() {
grid_of(ya=[0, 5]) {
zrot(90) metric_nut(size=set_screw_size, hole=false, center=true);
}
zring(n=2) {
xflip_copy() {
up(h/2) {
fwd(l/2-l/6-5) {
right((rail_spacing+joiner_width)/2) {
thinning_triangle(h=h, l=l/3, thick=joiner_width, strut=5, bracing=false);
}
}
}
@@ -86,10 +33,6 @@ module extruder_platform()
}
}
// Blunt off end of platform.
translate([0, l+rail_thick*2, 0])
cube(size=[w+1, l, h*3], center=true);
// Extruder mount holes.
circle_of(r=25, n=2) {
cylinder(r=4.5/2, h=20, center=true);
@@ -98,46 +41,30 @@ module extruder_platform()
// Extruder hole.
rrect(r=10, size=[40, 60, 20], center=true);
// Chamfer extruder hole corners.
translate([0, l*0.2, h/2]) {
grid_of(xa=[-40/2, 40/2]) {
zrot(45) cube(size=[10/sqrt(2), 10/sqrt(2), h+1], center=true);
// Clear space for joiners.
up(rail_height/2) {
joiner_quad_clear(xspacing=rail_spacing+joiner_width, yspacing=l+0.05, h=h+0.001, w=joiner_width, clearance=5, a=joiner_angle);
}
// Shrinkage stress relief
up(rail_thick/2) {
yspread(13, n=12) {
cube(size=[w+1, 1, rail_thick-2], center=true);
}
}
// Chamfer back corners.
translate([0, -l, h/2]) {
grid_of(xa=[-w/2, w/2]) {
zrot(45) cube(size=[10/sqrt(2), 10/sqrt(2), h+1], center=true);
}
}
// Wiring acess holes.
grid_of(
xa=[-w/4, w/4],
ya=[-l*0.6]
) {
cylinder(h=20, r=w/8, center=true);
}
// Pivot screw hole.
mirror_copy([1,0,0]) {
translate([w/2-joiner_width, -l-6, h-6]) {
yrot(90) {
cylinder(h=30, r=set_screw_size*1.1/2, center=true, $fn=12);
xspread(13, n=8) {
yspread(l-10) {
cube(size=[1, 60, rail_thick-2], center=true);
}
}
}
// Shrinkage stress relief
translate([0, -l/2+12, rail_thick/2]) {
grid_of(count=9, spacing=15) {
cube(size=[1, l+41, rail_thick-2], center=true);
}
grid_of(count=[1,6], spacing=15) {
cube(size=[w+1, 1, rail_thick-2], center=true);
// Wiring acess holes.
xspread(w-35-joiner_width*2) {
yspread(80) {
cylinder(h=20, r=w/8, center=true);
}
}
}
// Fan shroud mounts
@@ -161,9 +88,12 @@ module extruder_platform()
}
}
}
// Snap-tab joiners.
up(rail_height/2) {
joiner_quad(xspacing=rail_spacing+joiner_width, yspacing=l, h=h, w=joiner_width, l=5, a=joiner_angle);
}
}
}
//!extruder_platform();

View File

@@ -7,54 +7,45 @@ use <NEMA.scad>
use <platform_support_parts.scad>
use <cable_chain_link_parts.scad>
use <cable_chain_mount_parts.scad>
use <cantilever_joint_parts.scad>
use <cantilever_arm_parts.scad>
use <drive_gear_parts.scad>
use <fan_shroud_parts.scad>
use <extruder_platform_parts.scad>
use <lifter_rod_coupler_parts.scad>
use <motor_mount_plate_parts.scad>
use <rail_endcap_parts.scad>
use <rail_motor_segment_parts.scad>
use <rail_lifter_segment_parts.scad>
use <rail_segment_parts.scad>
use <rail_x_motor_segment_parts.scad>
use <rail_y_motor_segment_parts.scad>
use <sled_endcap_parts.scad>
use <xy_sled_parts.scad>
use <support_leg_parts.scad>
use <xy_joiner_parts.scad>
use <yz_joiner_parts.scad>
use <yz_bottom_joiner_parts.scad>
use <yz_top_joiner_parts.scad>
use <z_sled_parts.scad>
// Set default camera position.
$vpd = 700;
$vpt = [0, 0, 255];
$vpr = [65, 0, 120];
module axis_slider_assembly(slidepos=0)
module x_axis_slider_assembly(slidepos=0)
{
platform_vert_off = rail_height+groove_height+rail_offset;
translate([0, -motor_rail_length/2, 0]) {
translate([0, -rail_length/2, 0]) {
rail_segment();
}
}
rail_motor_segment();
translate([0, motor_rail_length/2, 0]) {
translate([0, rail_length/2, 0]) {
rail_segment();
zring(n=2) {
fwd(motor_rail_length/2) {
translate([0, -rail_length/2, 0]) {
rail_segment();
}
}
}
rail_x_motor_segment();
// Stepper Motor
translate([0, 0, rail_height-5-20]) {
up(rail_height-5-20) {
motor_mount_plate();
translate([0, 0, 20-4-0.2]) {
up(20-4-0.2) {
nema17_stepper(h=34, shaft_len=20.05);
translate([0, 0, 19]) {
up(19) {
drive_gear();
}
}
@@ -62,7 +53,56 @@ module axis_slider_assembly(slidepos=0)
// Sleds
translate([0, slidepos, platform_vert_off]) {
grid_of(count=[1,2], spacing=platform_length) {
yspread(platform_length) {
yrot(180) {
xy_sled();
}
}
children();
}
}
module y_axis_slider_assembly(slidepos=0)
{
platform_vert_off = rail_height+groove_height+rail_offset;
zring(n=2) {
fwd(motor_rail_length/2) {
fwd(rail_length/2) {
rail_segment();
fwd(rail_length/2+platform_length) {
// Bottom Y-axis to Z-axis corner joiner.
yz_bottom_joiner();
// Support legs.
back(platform_length/2) {
zring(n=2) {
right(rail_width/2+2*7) {
zrot(-90) support_leg();
}
}
}
}
}
}
}
rail_y_motor_segment();
// Stepper Motor
up(rail_height-5-20) {
motor_mount_plate();
up(20-4-0.2) {
nema17_stepper(h=34, shaft_len=20.05);
up(19) {
drive_gear();
}
}
}
// Sleds
translate([0, slidepos, platform_vert_off]) {
yspread(platform_length) {
yrot(180) {
xy_sled();
}
@@ -76,41 +116,71 @@ module z_axis_slider_assembly(slidepos=0)
{
platform_vert_off = rail_height+groove_height+rail_offset;
translate([0, -motor_rail_length, 0]) {
grid_of(count=[1,2], spacing=rail_length) {
fwd(motor_rail_length) {
yspread(rail_length) {
rail_segment();
}
}
translate([0, motor_rail_length, 0]) {
back(motor_rail_length) {
zrot(180) rail_lifter_segment();
}
translate([0, rail_length-motor_rail_length/2, rail_height+groove_height/2]) {
// Stepper Motor
xrot(90) {
motor_mount_plate();
translate([0, 0, 20-4-0.2]) {
nema17_stepper(h=34, shaft_len=20.05);
translate([0, 0, 5]) {
color("darkgrey") {
zrot(slidepos/lifter_thread_size*360.0) {
lifter_rod_coupler();
up(rail_height+groove_height/2) {
back(rail_length-motor_rail_length/2) {
// Stepper Motor
xrot(90) {
motor_mount_plate();
up(20-4-0.2) {
nema17_stepper(h=34, shaft_len=20.05);
up(5) {
color("darkgrey") {
zrot(slidepos/lifter_thread_size*360.0) {
lifter_rod_coupler();
}
}
up(lifter_rod_length/2+16) {
color("silver") cylinder(d=lifter_rod_diam, h=lifter_rod_length, center=true);
}
}
translate([0, 0, lifter_rod_length/2+16]) {
color("silver") cylinder(d=lifter_rod_diam, h=lifter_rod_length, center=true);
}
}
}
}
}
}
// Sleds
translate([0, slidepos-motor_rail_length, platform_vert_off]) {
yrot(180) {
z_sled();
module bridge_assembly()
{
zring(n=2) {
fwd(motor_rail_length/2) {
fwd(rail_length/2) {
rail_segment();
fwd(rail_length/2+platform_length) {
yz_top_joiner();
}
}
}
}
rail_y_motor_segment();
}
module extruder_assembly(slidepos=0)
{
platform_vert_off = groove_height+rail_offset;
down(platform_length/2-slidepos) {
zring(n=2) {
fwd(extruder_length/2) {
fwd(cantilever_length) {
zrot(90) z_sled();
}
}
}
extruder_platform();
translate([rail_width/2+5, 0, 5]) {
yrot(30) fan_shroud();
}
children();
}
}
@@ -120,112 +190,78 @@ module full_assembly(hide_endcaps=false)
joiner_length=20;
xpos = 100*cos(360*$t);
ypos = 100*sin(360*$t);
zpos = 100*cos(240+360*$t);
zpos = 80*cos(240+360*$t)+10;
// Y-axis to Z-axis corner joiner.
yz_joiner();
// Support legs.
translate([0, platform_length/2, 0]) {
zrot_copies([0,180]) {
translate([rail_width/2+2*7, 0, 0]) {
zrot(-90) support_leg();
}
}
// Top bridge
up(2*rail_height+motor_rail_length+2*rail_length+2*groove_height) {
xrot(180) bridge_assembly();
}
translate([0, platform_length + rail_length + motor_rail_length/2, 0]) {
// Y-axis rail endcaps.
if (hide_endcaps == false) {
translate([0, motor_rail_length/2 + rail_length, 0]) {
zrot(180) rail_endcap();
}
}
// Extruder bridge
up(rail_height+motor_rail_length+rail_length+groove_height) {
extruder_assembly(zpos);
}
// Y-axis rails.
axis_slider_assembly(ypos) {
// X-axis to Y-axis joiners.
zrot_copies([0, 180]) {
translate([0, -platform_length, 0]) {
xy_joiner();
}
}
translate([(platform_width-joiner_width)/2, -platform_length, 0]) {
zrot(180) cable_chain_xy_mount();
}
zrot(90) {
// X-axis rail endcaps.
if (hide_endcaps == false) {
zrot_copies([0, 180]) {
translate([0, -(rail_length + motor_rail_length/2), 0]) {
rail_endcap();
}
}
}
// X-axis rails.
axis_slider_assembly(xpos) {
zrot_copies([0, 180]) {
translate([0, -platform_length, 0]) {
sled_endcap();
translate([0, -(20-joiner_width/2), 0]) {
translate([platform_width/2, 0, 0]) {
zrot(90) platform_support2();
}
translate([-platform_width/2, 0, 0]) {
zrot(270) platform_support1();
}
}
}
}
translate([0, 0, 3+glass_thick/2]) {
// Borosilicate Glass
color([0.75, 1.0, 1.0, 0.5]) {
cube(size=[glass_length, glass_width, glass_thick], center=true);
}
}
zring(n=2) {
fwd(platform_length + rail_length + motor_rail_length/2) {
up(rail_height + groove_height + rail_length) {
xrot(-90) {
// Z-axis rails.
z_axis_slider_assembly(zpos);
}
}
}
}
translate([0, 0, platform_length + rail_length]) {
xrot(-90) {
// Z-axis rail endcaps.
// Y-axis rails.
y_axis_slider_assembly(ypos) {
// X-axis to Y-axis joiners.
zrot_copies([0, 180]) {
fwd(platform_length) {
xy_joiner();
}
}
translate([(platform_width-joiner_width)/2, -platform_length, 0]) {
zrot(180) cable_chain_xy_mount();
}
zrot(90) {
// X-axis rail endcaps.
if (hide_endcaps == false) {
translate([0, -(motor_rail_length+rail_length+0.1), 0]) {
rail_endcap();
zrot_copies([0, 180]) {
fwd(rail_length + motor_rail_length/2) {
rail_endcap();
}
}
}
// Z-axis rails.
z_axis_slider_assembly(zpos) {
translate([0, -platform_length/2, 0]) {
xrot(90) {
// Z-axis platform to extruder cantilever joint.
cantilever_joint();
// Extruder cantilever.
translate([0, joiner_length, -platform_length]) {
translate([0, cantilever_length/2, 0]) {
cantilever_arm();
translate([0, cantilever_length/2, 0]) {
extruder_platform();
translate([platform_width/2+5, 81, 5]) {
yrot(30) fan_shroud();
}
}
// X-axis rails.
x_axis_slider_assembly(xpos) {
zrot_copies([0, 180]) {
fwd(platform_length) {
sled_endcap();
fwd(20-joiner_width/2) {
right(platform_width/2) {
zrot(90) platform_support2();
}
left(platform_width/2) {
zrot(270) platform_support1();
}
}
}
}
up(3+glass_thick/2) {
// Borosilicate Glass. Render last to allow transparency to work.
color([0.75, 1.0, 1.0, 0.5]) {
cube(size=[glass_length, glass_width, glass_thick], center=true);
}
}
}
}
}
}
translate([0,-1.5*rail_length,0])
full_assembly(hide_endcaps=false);
full_assembly(hide_endcaps=false);

View File

@@ -72,7 +72,7 @@ module motor_mount_plate(thick=4, l=20)
module motor_mount_plate_parts() { // make me
grid_of(count=[1,1], spacing=65) {
yspread(65, n=1) {
yrot(180) motor_mount_plate();
}
}

View File

@@ -70,31 +70,30 @@ module gear (
clearance = 0.0, //gap between top of a tooth on one gear and bottom of valley on a meshing gear (in millimeters)
backlash = 0.0 //gap between two meshing teeth, in the direction along the circumference of the pitch circle
) {
assign(pi = 3.1415926)
assign(p = mm_per_tooth * number_of_teeth / pi / 2) //radius of pitch circle
assign(c = p + mm_per_tooth / pi - clearance) //radius of outer circle
assign(b = p*cos(pressure_angle)) //radius of base circle
assign(r = p-(c-p)-clearance) //radius of root circle
assign(t = mm_per_tooth/2-backlash/2) //tooth thickness at pitch circle
assign(k = -iang(b, p) - t/2/p/pi*180) { //angle to where involute meets base circle on each side of tooth
difference() {
for (i = [0:number_of_teeth-teeth_to_hide-1] )
rotate([0,0,i*360/number_of_teeth])
linear_extrude(height = thickness, center = true, convexity = 10, twist = twist)
polygon(
points=[
[0, -hole_diameter/10],
polar(r, -181/number_of_teeth),
polar(r, r<b ? k : -180/number_of_teeth),
q7(0/5,r,b,c,k, 1),q7(1/5,r,b,c,k, 1),q7(2/5,r,b,c,k, 1),q7(3/5,r,b,c,k, 1),q7(4/5,r,b,c,k, 1),q7(5/5,r,b,c,k, 1),
q7(5/5,r,b,c,k,-1),q7(4/5,r,b,c,k,-1),q7(3/5,r,b,c,k,-1),q7(2/5,r,b,c,k,-1),q7(1/5,r,b,c,k,-1),q7(0/5,r,b,c,k,-1),
polar(r, r<b ? -k : 180/number_of_teeth),
polar(r, 181/number_of_teeth)
],
paths=[[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]]
);
cylinder(h=2*thickness+1, r=hole_diameter/2, center=true, $fn=20);
}
pi = 3.1415926;
p = mm_per_tooth * number_of_teeth / pi / 2; //radius of pitch circle
c = p + mm_per_tooth / pi - clearance; //radius of outer circle
b = p*cos(pressure_angle); //radius of base circle
r = p-(c-p)-clearance; //radius of root circle
t = mm_per_tooth/2-backlash/2; //tooth thickness at pitch circle
k = -iang(b, p) - t/2/p/pi*180; //angle to where involute meets base circle on each side of tooth
difference() {
for (i = [0:number_of_teeth-teeth_to_hide-1] )
rotate([0,0,i*360/number_of_teeth])
linear_extrude(height = thickness, center = true, convexity = 10, twist = twist)
polygon(
points=[
[0, -hole_diameter/10],
polar(r, -181/number_of_teeth),
polar(r, r<b ? k : -180/number_of_teeth),
q7(0/5,r,b,c,k, 1),q7(1/5,r,b,c,k, 1),q7(2/5,r,b,c,k, 1),q7(3/5,r,b,c,k, 1),q7(4/5,r,b,c,k, 1),q7(5/5,r,b,c,k, 1),
q7(5/5,r,b,c,k,-1),q7(4/5,r,b,c,k,-1),q7(3/5,r,b,c,k,-1),q7(2/5,r,b,c,k,-1),q7(1/5,r,b,c,k,-1),q7(0/5,r,b,c,k,-1),
polar(r, r<b ? -k : 180/number_of_teeth),
polar(r, 181/number_of_teeth)
],
paths=[[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]]
);
cylinder(h=2*thickness+1, r=hole_diameter/2, center=true, $fn=20);
}
};
//these 4 functions are used by gear
@@ -113,25 +112,25 @@ module rack (
pressure_angle = 28, //Controls how straight or bulged the tooth sides are. In degrees.
backlash = 0.0 //gap between two meshing teeth, in the direction along the circumference of the pitch circle
) {
assign(pi = 3.1415926)
assign(a = mm_per_tooth / pi) //addendum
assign(t = a*cos(pressure_angle)-1) //tooth side is tilted so top/bottom corners move this amount
for (i = [0:number_of_teeth-1] )
translate([i*mm_per_tooth,0,0])
linear_extrude(height = thickness, center = true, convexity = 10)
polygon(
points=[
[-mm_per_tooth * 3/4, a-height],
[-mm_per_tooth * 3/4 - backlash, -a],
[-mm_per_tooth * 1/4 + backlash - t, -a],
[-mm_per_tooth * 1/4 + backlash + t, a],
[ mm_per_tooth * 1/4 - backlash - t, a],
[ mm_per_tooth * 1/4 - backlash + t, -a],
[ mm_per_tooth * 3/4 + backlash, -a],
[ mm_per_tooth * 3/4, a-height],
],
paths=[[0,1,2,3,4,5,6,7]]
);
pi = 3.1415926;
a = mm_per_tooth / pi; //addendum
t = a*cos(pressure_angle)-1; //tooth side is tilted so top/bottom corners move this amount
for (i = [0:number_of_teeth-1] )
translate([i*mm_per_tooth,0,0])
linear_extrude(height = thickness, center = true, convexity = 10)
polygon(
points=[
[-mm_per_tooth * 3/4, a-height],
[-mm_per_tooth * 3/4 - backlash, -a],
[-mm_per_tooth * 1/4 + backlash - t, -a],
[-mm_per_tooth * 1/4 + backlash + t, a],
[ mm_per_tooth * 1/4 - backlash - t, a],
[ mm_per_tooth * 1/4 - backlash + t, -a],
[ mm_per_tooth * 3/4 + backlash, -a],
[ mm_per_tooth * 3/4, a-height],
],
paths=[[0,1,2,3,4,5,6,7]]
);
};
//These 5 functions let the user find the derived dimensions of the gear.

View File

@@ -19,66 +19,68 @@ module rail_lifter_segment()
difference() {
union() {
// Bottom.
translate([0,0,rail_thick/2]) {
up(rail_thick/2) {
union() {
yrot(90) sparse_strut(h=rail_width, l=motor_rail_length, thick=rail_thick, maxang=45, strut=10, max_bridge=500);
grid_of(count=2, spacing=motor_mount_spacing) {
xspread(motor_mount_spacing) {
cube(size=[joiner_width, motor_rail_length, rail_thick], center=true);
}
}
}
// Walls.
zrot_copies([0, 180]) {
translate([(rail_spacing/2+joiner_width/2), 0, (rail_height+3)/2]) {
if (wall_style == "crossbeams")
sparse_strut(h=rail_height+3, l=motor_rail_length-2*joiner_length, thick=joiner_width, strut=5);
if (wall_style == "thinwall")
thinning_wall(h=rail_height+3, l=motor_rail_length-2*joiner_length, thick=joiner_width, strut=5, bracing=false);
if (wall_style == "corrugated")
corrugated_wall(h=rail_height+3, l=motor_rail_length-2*joiner_length, thick=joiner_width, strut=5);
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-2*joiner_length, thick=joiner_width, strut=5);
if (wall_style == "thinwall")
thinning_wall(h=rail_height+3, l=motor_rail_length-2*joiner_length, thick=joiner_width, strut=5, bracing=false);
if (wall_style == "corrugated")
corrugated_wall(h=rail_height+3, l=motor_rail_length-2*joiner_length, thick=joiner_width, strut=5);
}
}
}
// Rail backing.
grid_of(count=2, spacing=rail_spacing+joiner_width)
translate([0,0,rail_height+groove_height/2])
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);
// Top side support
translate([0, (motor_rail_length-18)/2, (rail_height-15)/2]) {
zrot(90) sparse_strut(h=rail_height-15, l=rail_width, thick=5, strut=5);
translate([0, 0, -(rail_height-15-rail_thick)/2]) {
cube(size=[rail_width, 5, rail_thick], center=true);
}
}
// Bottom side support
translate([0, -(motor_rail_length-18)/2, (rail_height+groove_height)/2]) {
zrot(90) sparse_strut(h=rail_height+groove_height, l=rail_width-joiner_width, thick=5, strut=6);
translate([0, 0, -(rail_height+groove_height-rail_thick)/2]) {
cube(size=[rail_width, 5, rail_thick], center=true);
up((rail_height-15)/2) {
yspread(motor_rail_length-18) {
zrot(90) sparse_strut(h=rail_height-15, l=rail_width, thick=5, strut=5);
down((rail_height-15-rail_thick)/2) {
cube(size=[rail_width, 5, rail_thick], center=true);
}
}
}
// Motor mount joiners.
translate([0, 0, rail_height+groove_height/2]) {
up(rail_height+groove_height/2) {
joiner_pair(spacing=motor_mount_spacing, h=rail_height, w=joiner_width, l=15, a=joiner_angle);
}
grid_of(count=2, spacing=motor_mount_spacing) {
translate([0, -15/2, rail_height/4+groove_height/4]) {
cube(size=[joiner_width, 15, rail_height/2+groove_height/2], center=true);
xspread(motor_mount_spacing) {
up(rail_height/4+groove_height/4) {
fwd(15/2) {
cube(size=[joiner_width, 15, rail_height/2+groove_height/2], center=true);
}
}
}
// Motor mount supports.
mirror_copy([1, 0, 0]) {
translate([(rail_width+motor_mount_spacing)/4-2, -motor_rail_length/4, (rail_height+groove_height)/2]) {
zrot(ang) {
sparse_strut(h=rail_height+groove_height, l=hlen, thick=7.5, strut=5);
translate([0, 0, -(rail_height+groove_height-rail_thick)/2]) {
cube(size=[7.5, hlen, rail_thick], center=true);
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);
}
}
}
}
}
@@ -86,58 +88,39 @@ module rail_lifter_segment()
}
// Clear space for joiners.
translate([0,0,rail_height/2]) {
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);
}
// Shrinkage stress relief
translate([0, 0, rail_thick/2]) {
grid_of(count=[1, 5], spacing=[0, 16]) {
up(rail_thick/2) {
yspread(16, n=5) {
cube(size=[rail_width+1, 1, rail_thick-2], center=true);
}
grid_of(count=[7, 2], spacing=[15, motor_rail_length-10]) {
cube(size=[1, 60, rail_thick-2], center=true);
}
}
// Clear space for side mount joiners.
zrot_copies([0,180]) {
translate([rail_width/2-5, 0, 0]) {
translate([side_joiner_len+joiner_width/2, 0, rail_height/2/2]) {
translate([0, -platform_length/4, 0]) {
zrot(-90) half_joiner_clear(h=rail_height/2, w=joiner_width, l=side_joiner_len, a=joiner_angle);
}
translate([0, platform_length/4, 0]) {
zrot(-90) half_joiner_clear(h=rail_height/2, w=joiner_width, l=side_joiner_len, a=joiner_angle, slop=printer_slop);
}
xspread(15, n=7) {
yspread(motor_rail_length-10) {
cube(size=[1, 60, rail_thick-2], center=true);
}
}
}
}
// Snap-tab joiners.
translate([0,0,rail_height/2]) {
up(rail_height/2) {
joiner_quad(xspacing=rail_spacing+joiner_width, yspacing=motor_rail_length, h=rail_height, w=joiner_width, l=13, a=joiner_angle);
}
// Side mount joiners.
zrot_copies([0,180]) {
translate([rail_width/2-5, 0, 0]) {
translate([side_joiner_len+joiner_width/2, 0, rail_height/2/2]) {
translate([0, -side_mount_spacing/2, 0]) {
up(rail_height/2/2) {
back(side_mount_spacing/2) {
zring(n=2,r=0) {
right(side_joiner_len+joiner_width/2+rail_width/2-5) {
zrot(-90) {
chamfer(chamfer=joiner_width/3, size=[joiner_width, side_joiner_len*2, rail_height/2], edges=[[0,0,0,0], [1,1,0,0], [0,0,0,0]]) {
half_joiner(h=rail_height/2, w=joiner_width, l=side_joiner_len, a=joiner_angle);
}
}
}
translate([0, side_mount_spacing/2, 0]) {
zrot(-90) {
chamfer(chamfer=joiner_width/3, size=[joiner_width, side_joiner_len*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, a=joiner_angle, slop=printer_slop);
}
}
}
}
}
}

View File

@@ -1,167 +0,0 @@
include <config.scad>
use <GDMUtils.scad>
use <joiners.scad>
module rail_motor_segment()
{
joiner_length = 10;
side_joiner_len = 10;
color("SpringGreen")
prerender(convexity=20)
union() {
difference() {
union() {
// Bottom.
translate([0,0,rail_thick/2]) {
difference() {
union() {
yrot(90)
sparse_strut(h=rail_width, l=motor_rail_length, thick=rail_thick, maxang=45, strut=10, max_bridge=500);
cube(size=[motor_mount_spacing+joiner_width, 45+20, rail_thick], center=true);
}
cube(size=[motor_mount_spacing-joiner_width, 45, rail_thick+1], center=true);
}
}
// Walls.
zrot_copies([0, 180]) {
translate([(rail_spacing/2+joiner_width/2), 0, (rail_height+3)/2]) {
if (wall_style == "crossbeams")
sparse_strut(h=rail_height+3, l=motor_rail_length-2*joiner_length, thick=joiner_width, strut=5);
if (wall_style == "thinwall")
thinning_wall(h=rail_height+3, l=motor_rail_length-2*joiner_length, thick=joiner_width, strut=5, bracing=false);
if (wall_style == "corrugated")
corrugated_wall(h=rail_height+3, l=motor_rail_length-2*joiner_length, thick=joiner_width, strut=5);
}
}
// Rail backing.
grid_of(count=2, spacing=rail_spacing+joiner_width)
translate([0,0,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
translate([0, 0, rail_height/4]) {
grid_of(count=[1,2], spacing=[0, motor_rail_length-20]) {
cube(size=[rail_width, 5, rail_height/2], center=true);
}
}
// Motor mount joiners.
translate([0, 0, rail_height-5-20]) {
xrot(90) joiner_pair(spacing=motor_mount_spacing, h=rail_height, w=joiner_width, l=rail_height-5-20, a=joiner_angle);
}
}
// Rail grooves.
translate([0,0,rail_height+groove_height/2]) {
mirror_copy([1,0,0]) {
translate([-(rail_width/2-joiner_width/2), 0, 0]) {
mirror_copy([1,0,0]) {
translate([(joiner_width/2), 0, 0]) {
// main groove
scale([tan(groove_angle),1,1]) yrot(45) {
cube(size=[groove_height*sqrt(2)/2,motor_rail_length+1,groove_height*sqrt(2)/2], center=true);
}
// chamfers
mirror_copy([0,1,0]) {
translate([0, motor_rail_length/2, 0]) {
hull() {
grid_of(count=[1,2], spacing=2) {
zrot(45) scale([tan(groove_angle)*sin(45),1,1]) yrot(45) {
cube(size=[groove_height*sqrt(2)/2,10,groove_height*sqrt(2)/2], center=true);
}
}
}
}
}
}
}
}
}
}
// Wiring access holes.
translate([0, 0, rail_height/4]) {
grid_of(count=[3,2], spacing=[rail_width/3, motor_rail_length-20]) {
cube(size=[16, 11, 10], center=true);
}
}
// Clear space for joiners.
translate([0,0,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);
}
// Shrinkage stress relief
translate([0, 0, rail_thick/2]) {
grid_of(count=[1, 5], spacing=[0, 16]) {
cube(size=[rail_width+1, 1, rail_thick-2], center=true);
}
grid_of(count=[7, 2], spacing=[15, motor_rail_length-10]) {
cube(size=[1, 60, rail_thick-2], center=true);
}
}
// Clear space for side mount joiners.
zrot_copies([0,180]) {
translate([rail_width/2-5, 0, 0]) {
translate([side_joiner_len+joiner_width/2, 0, rail_height/2/2]) {
translate([0, -platform_length/4, 0]) {
zrot(-90) half_joiner_clear(h=rail_height/2, w=joiner_width, l=side_joiner_len, a=joiner_angle);
}
translate([0, platform_length/4, 0]) {
zrot(-90) half_joiner_clear(h=rail_height/2, w=joiner_width, l=side_joiner_len, a=joiner_angle, slop=printer_slop);
}
}
}
}
}
// Snap-tab joiners.
translate([0,0,rail_height/2]) {
joiner_quad(xspacing=rail_spacing+joiner_width, yspacing=motor_rail_length, h=rail_height, w=joiner_width, l=13, a=joiner_angle);
}
// Side mount joiners.
zrot_copies([0,180]) {
translate([rail_width/2-5, 0, 0]) {
translate([side_joiner_len+joiner_width/2, 0, rail_height/2/2]) {
translate([0, -side_mount_spacing/2, 0]) {
zrot(-90) {
chamfer(chamfer=joiner_width/3, size=[joiner_width, side_joiner_len*2, rail_height/2], edges=[[0,0,0,0], [1,1,0,0], [0,0,0,0]]) {
half_joiner(h=rail_height/2, w=joiner_width, l=side_joiner_len, a=joiner_angle);
}
}
}
translate([0, side_mount_spacing/2, 0]) {
zrot(-90) {
chamfer(chamfer=joiner_width/3, size=[joiner_width, side_joiner_len*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, a=joiner_angle, slop=printer_slop);
}
}
}
}
}
}
}
}
//!rail_motor_segment();
module rail_motor_segment_parts() { // make me
zrot(90) rail_motor_segment();
}
rail_motor_segment_parts();
// vim: noexpandtab tabstop=4 shiftwidth=4 softtabstop=4 nowrap

View File

@@ -11,41 +11,48 @@ module rail_segment()
difference() {
union() {
// Bottom.
translate([0,0,rail_thick/2]) yrot(90)
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]) {
translate([(rail_spacing+joiner_width)/2, 0, (rail_height+3)/2]) {
if (wall_style == "crossbeams")
sparse_strut(h=rail_height+3, l=rail_length-10, thick=joiner_width, strut=5);
if (wall_style == "thinwall")
thinning_wall(h=rail_height+3, l=rail_length-10, thick=joiner_width, strut=5, bracing=false);
if (wall_style == "corrugated")
corrugated_wall(h=rail_height+3, l=rail_length-10, thick=joiner_width, strut=5);
up((rail_height+3)/2) {
right((rail_spacing+joiner_width)/2) {
if (wall_style == "crossbeams")
sparse_strut(h=rail_height+3, l=rail_length-10, thick=joiner_width, strut=5);
if (wall_style == "thinwall")
thinning_wall(h=rail_height+3, l=rail_length-10, thick=joiner_width, strut=5, bracing=false);
if (wall_style == "corrugated")
corrugated_wall(h=rail_height+3, l=rail_length-10, thick=joiner_width, strut=5);
}
}
}
// Rail backing.
grid_of(count=2, spacing=rail_spacing+joiner_width)
translate([0,0,rail_height+groove_height/2])
xspread(rail_spacing+joiner_width)
up(rail_height+groove_height/2)
chamfer(size=[joiner_width, rail_length, groove_height], chamfer=1, edges=[[1,1,0,0], [1,1,0,0], [0,0,0,0]])
cube(size=[joiner_width, rail_length, groove_height], center=true);
// Side Supports
translate([0, 0, rail_height/4]) {
grid_of(count=[1,2], spacing=[0, rail_length-38]) {
cube(size=[rail_width, 5, rail_height/2], center=true);
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);
}
}
}
}
}
// Rail grooves.
translate([0,0,rail_height+groove_height/2]) {
up(rail_height+groove_height/2) {
mirror_copy([1,0,0]) {
translate([-(rail_width/2-joiner_width/2), 0, 0]) {
left((rail_width-joiner_width)/2) {
mirror_copy([1,0,0]) {
translate([(joiner_width/2), 0, 0]) {
right(joiner_width/2) {
// main groove
scale([tan(groove_angle),1,1]) yrot(45) {
cube(size=[groove_height*sqrt(2)/2,rail_length+1,groove_height*sqrt(2)/2], center=true);
@@ -53,9 +60,9 @@ module rail_segment()
// chamfers
mirror_copy([0,1,0]) {
translate([0, rail_length/2, 0]) {
back(rail_length/2) {
hull() {
grid_of(count=[1,2], spacing=2) {
yspread(2) {
zrot(45) scale([tan(groove_angle)*sin(45),1.01,1.01]) yrot(45) {
cube(size=[groove_height*sqrt(2)/2, 10, groove_height*sqrt(2)/2], center=true);
}
@@ -69,31 +76,26 @@ module rail_segment()
}
}
// Wiring access holes.
translate([0, 0, rail_height/4]) {
grid_of(count=[3,2], spacing=[rail_width/3, rail_length-38]) {
cube(size=[16, 11, 10], center=true);
}
}
// Clear space for joiners.
translate([0,0,rail_height/2]) {
up(rail_height/2) {
joiner_quad_clear(xspacing=rail_spacing+joiner_width, yspacing=rail_length, h=rail_height+0.001, w=joiner_width, clearance=5, a=joiner_angle);
}
// Shrinkage stress relief
translate([0, 0, rail_thick/2]) {
grid_of(count=[1, 13], spacing=[0, 15]) {
up(rail_thick/2) {
yspread(13, n=12) {
cube(size=[rail_width+1, 1, rail_thick-2], center=true);
}
grid_of(count=[9, 2], spacing=[12, rail_length-10]) {
cube(size=[1, 60, rail_thick-2], center=true);
xspread(13, n=8) {
yspread(rail_length-10) {
cube(size=[1, 60, rail_thick-2], center=true);
}
}
}
}
// Snap-tab joiners.
translate([0,0,rail_height/2]) {
up(rail_height/2) {
joiner_quad(xspacing=rail_spacing+joiner_width, yspacing=rail_length, h=rail_height, w=joiner_width, l=5, a=joiner_angle);
}
}

View File

@@ -0,0 +1,177 @@
include <config.scad>
use <GDMUtils.scad>
use <joiners.scad>
module rail_x_motor_segment()
{
joiner_length = 10;
side_joiner_len = 10;
color("SpringGreen")
prerender(convexity=20)
union() {
difference() {
union() {
// Bottom.
up(rail_thick/2) {
difference() {
union() {
yrot(90)
sparse_strut(h=rail_width, l=motor_rail_length, thick=rail_thick, maxang=45, strut=10, max_bridge=500);
cube(size=[motor_mount_spacing+joiner_width, 45+20, rail_thick], center=true);
}
cube(size=[motor_mount_spacing-joiner_width, 45, rail_thick+1], 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-2*joiner_length, thick=joiner_width, strut=5);
if (wall_style == "thinwall")
thinning_wall(h=rail_height+3, l=motor_rail_length-2*joiner_length, thick=joiner_width, strut=5, bracing=false);
if (wall_style == "corrugated")
corrugated_wall(h=rail_height+3, l=motor_rail_length-2*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/4) {
yspread(motor_rail_length-20) {
cube(size=[rail_width, 5, rail_height/2], center=true);
}
}
// Motor mount joiners.
up(rail_height-5-20) {
xrot(90) joiner_pair(spacing=motor_mount_spacing, h=rail_height, w=joiner_width, l=rail_height-5-20, a=joiner_angle);
}
}
// Rail grooves.
up(rail_height+groove_height/2) {
xflip_copy() {
left((rail_width-joiner_width)/2) {
xflip_copy() {
right(joiner_width/2) {
// main groove
scale([tan(groove_angle),1,1]) yrot(45) {
cube(size=[groove_height*sqrt(2)/2,motor_rail_length+1,groove_height*sqrt(2)/2], center=true);
}
// chamfers
mirror_copy([0,1,0]) {
back(motor_rail_length/2) {
hull() {
yspread(2) {
zrot(45) scale([tan(groove_angle)*sin(45),1,1]) yrot(45) {
cube(size=[groove_height*sqrt(2)/2,10,groove_height*sqrt(2)/2], center=true);
}
}
}
}
}
}
}
}
}
}
// Wiring access holes.
up(rail_height/4) {
xspread(rail_width/3, n=3) {
yspread(motor_rail_length-20) {
cube(size=[16, 11, 10], 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);
}
// Shrinkage stress relief
up(rail_thick/2) {
yspread(16, n=5) {
cube(size=[rail_width+1, 1, rail_thick-2], center=true);
}
xspread(15, n=7) {
yspread(motor_rail_length-10) {
cube(size=[1, 60, rail_thick-2], center=true);
}
}
}
// Clear space for side mount joiners.
zring(r=0,n=2) {
right(rail_width/2-5) {
up(rail_height/2/2) {
right(side_joiner_len+joiner_width/2) {
left(platform_length/4) {
zrot(-90) half_joiner_clear(h=rail_height/2, w=joiner_width, l=side_joiner_len, a=joiner_angle);
}
right(platform_length/4) {
zrot(-90) half_joiner_clear(h=rail_height/2, w=joiner_width, l=side_joiner_len, a=joiner_angle, slop=printer_slop);
}
}
}
}
}
}
// Snap-tab joiners.
up(rail_height/2) {
joiner_quad(xspacing=rail_spacing+joiner_width, yspacing=motor_rail_length, h=rail_height, w=joiner_width, l=13, a=joiner_angle);
}
// Side mount joiners.
zring(r=0,n=2) {
right(rail_width/2-5) {
up(rail_height/2/2) {
right(side_joiner_len+joiner_width/2) {
fwd(side_mount_spacing/2) {
zrot(-90) {
chamfer(chamfer=joiner_width/3, size=[joiner_width, side_joiner_len*2, rail_height/2], edges=[[0,0,0,0], [1,1,0,0], [0,0,0,0]]) {
half_joiner(h=rail_height/2, w=joiner_width, l=side_joiner_len, a=joiner_angle);
}
}
}
back(side_mount_spacing/2) {
zrot(-90) {
chamfer(chamfer=joiner_width/3, size=[joiner_width, side_joiner_len*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, a=joiner_angle, slop=printer_slop);
}
}
}
}
}
}
}
}
}
//!rail_x_motor_segment();
module rail_x_motor_segment_parts() { // make me
zrot(90) rail_x_motor_segment();
}
rail_x_motor_segment_parts();
// vim: noexpandtab tabstop=4 shiftwidth=4 softtabstop=4 nowrap

View File

@@ -0,0 +1,130 @@
include <config.scad>
use <GDMUtils.scad>
use <joiners.scad>
module rail_y_motor_segment()
{
joiner_length = 10;
side_joiner_len = 10;
color("SpringGreen")
prerender(convexity=20)
union() {
difference() {
union() {
// Bottom.
up(rail_thick/2) {
difference() {
union() {
yrot(90)
sparse_strut(h=rail_width, l=motor_rail_length, thick=rail_thick, maxang=45, strut=10, max_bridge=500);
cube(size=[motor_mount_spacing+joiner_width, 45+20, rail_thick], center=true);
}
cube(size=[motor_mount_spacing-joiner_width, 45, rail_thick+1], 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-2*joiner_length, thick=joiner_width, strut=5);
if (wall_style == "thinwall")
thinning_wall(h=rail_height+3, l=motor_rail_length-2*joiner_length, thick=joiner_width, strut=5, bracing=false);
if (wall_style == "corrugated")
corrugated_wall(h=rail_height+3, l=motor_rail_length-2*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);
// Motor mount joiners.
up(rail_height-5-20) {
xrot(90) joiner_pair(spacing=motor_mount_spacing, h=rail_height, w=joiner_width, l=rail_height-5-20, a=joiner_angle);
}
}
// Rail grooves.
up(rail_height+groove_height/2) {
xflip_copy() {
left((rail_width-joiner_width)/2) {
xflip_copy() {
right(joiner_width/2) {
// main groove
scale([tan(groove_angle),1,1]) yrot(45) {
cube(size=[groove_height*sqrt(2)/2,motor_rail_length+1,groove_height*sqrt(2)/2], center=true);
}
// chamfers
mirror_copy([0,1,0]) {
back(motor_rail_length/2) {
hull() {
yspread(2) {
zrot(45) scale([tan(groove_angle)*sin(45),1,1]) yrot(45) {
cube(size=[groove_height*sqrt(2)/2,10,groove_height*sqrt(2)/2], center=true);
}
}
}
}
}
}
}
}
}
}
// Wiring access holes.
up(rail_height/4) {
xspread(rail_width/3, n=3) {
yspread(motor_rail_length-20) {
cube(size=[16, 11, 10], 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);
}
// Shrinkage stress relief
up(rail_thick/2) {
yspread(16, n=5) {
cube(size=[rail_width+1, 1, rail_thick-2], center=true);
}
xspread(15, n=7) {
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, h=rail_height, w=joiner_width, l=13, a=joiner_angle);
}
}
}
//!rail_y_motor_segment();
module rail_y_motor_segment_parts() { // make me
zrot(90) rail_y_motor_segment();
}
rail_y_motor_segment_parts();
// vim: noexpandtab tabstop=4 shiftwidth=4 softtabstop=4 nowrap

View File

@@ -40,13 +40,12 @@ module float_seven_segment(val=0.0, decim=2, size=10, h=1, suppress=false)
}
for (p = [mag:-1:-decim]) {
translate([-0.8*size*(p+0.5), 0, 0]) {
assign(d = floor(abs(val)/pow(10, p)+0.000001) % 10) {
if (p == -1) {
translate([-0.8*size/2, -size/2, 0])
cube(size=[size*0.1, size*0.1, h], center=true);
}
digit_seven_segment(digit=d, size=size, h=h);
d = floor(abs(val)/pow(10, p)+0.000001) % 10;
if (p == -1) {
translate([-0.8*size/2, -size/2, 0])
cube(size=[size*0.1, size*0.1, h], center=true);
}
digit_seven_segment(digit=d, size=size, h=h);
}
}
}
@@ -66,12 +65,11 @@ module slop_calibrator_parts() { // make me
difference() {
cube(size=[spacing, rows*spacing, h], center=true);
for (row = [0:rows-1]) {
assign(slop = (step*rows*col)+step*row) {
translate([0, spacing*row-(rows-1)*spacing/2, 0]) {
cube(size=[(r+slop)*2, (r+slop)*2, h+1], center=true);
translate([spacing/2, -7, 0]) {
zrot(90) xrot(90) float_seven_segment(val=slop, decim=2, size=8, h=1, suppress=true);
}
slop = (step*rows*col)+step*row;
translate([0, spacing*row-(rows-1)*spacing/2, 0]) {
cube(size=[(r+slop)*2, (r+slop)*2, h+1], center=true);
translate([spacing/2, -7, 0]) {
zrot(90) xrot(90) float_seven_segment(val=slop, decim=2, size=8, h=1, suppress=true);
}
}
}

2
wiki

Submodule wiki updated: 3cc416d522...79335096f8

View File

@@ -8,7 +8,7 @@ module herringbone_rack(l=100, h=10, w=10, tooth_size=5, CA=30)
{
translate([-(rack_tooth_size/2), 0, 0]) {
mirror_copy([0,0,1]) {
skew_along_z(xang=CA) {
skew_xy(xang=CA) {
intersection() {
translate([-(l/2-rack_tooth_size/2), 0, h/4]) {
rack(

View File

@@ -3,7 +3,7 @@ use <GDMUtils.scad>
use <joiners.scad>
module yz_joiner()
module yz_bottom_joiner()
{
joiner_length=10;
base_height = rail_height+groove_height;
@@ -17,61 +17,48 @@ module yz_joiner()
difference() {
union() {
// Bottom.
translate([0, platform_length/2, rail_thick/2]) {
yrot(90)
sparse_strut(h=rail_width, l=platform_length, thick=rail_thick, maxang=45, strut=10, max_bridge=500);
up(rail_thick/2) {
back(platform_length/2) {
yrot(90) sparse_strut(h=rail_width, l=platform_length, thick=rail_thick, maxang=45, strut=10, max_bridge=500);
}
}
// Back.
translate([0, rail_thick/2, platform_length/2]) zrot(90) {
if (wall_style == "crossbeams")
sparse_strut(h=platform_length, l=rail_width-joiner_width, thick=rail_thick, strut=5);
if (wall_style == "thinwall")
thinning_wall(h=platform_length, l=rail_width-joiner_width, thick=rail_thick, strut=rail_thick, bracing=true);
if (wall_style == "corrugated")
corrugated_wall(h=platform_length, l=rail_width-joiner_width, thick=rail_thick, strut=rail_thick, wall=3);
up((rail_height+groove_height)/2) {
back(rail_thick/2) {
zrot(90) {
if (wall_style == "crossbeams")
sparse_strut(h=rail_height+groove_height, l=rail_width-joiner_width, thick=rail_thick, strut=5);
if (wall_style == "thinwall")
thinning_wall(h=rail_height+groove_height, l=rail_width-joiner_width, thick=rail_thick, strut=rail_thick, bracing=true);
if (wall_style == "corrugated")
corrugated_wall(h=rail_height+groove_height, l=rail_width-joiner_width, thick=rail_thick, strut=rail_thick, wall=3);
}
}
}
// Side Walls
mirror_copy([1, 0, 0]) {
translate([(rail_spacing+joiner_width)/2, 0, 0]) {
// Upper Wall.
grid_of(
ya=[(rail_height+5)/2],
za=[rail_height+groove_height]
) {
if (wall_style == "crossbeams")
translate([0, 0, (platform_length-rail_height)/2-groove_height])
sparse_strut(h=platform_length-rail_height, l=rail_height+5, thick=joiner_width, strut=5);
if (wall_style == "thinwall")
translate([0, 0, (platform_length-rail_height)/2-groove_height])
thinning_wall(h=platform_length-rail_height, l=rail_height+5, thick=joiner_width, strut=rail_thick, bracing=false);
if (wall_style == "corrugated")
translate([0, 0, (platform_length-rail_height)/2-groove_height])
corrugated_wall(h=platform_length-rail_height, l=rail_height+5, thick=joiner_width, strut=rail_thick, wall=3);
}
xflip_copy() {
right((rail_spacing+joiner_width)/2) {
// Lower Wall.
grid_of(
ya=[(platform_length-joiner_length+1)/2]
) {
if (wall_style == "crossbeams")
translate([0, 0, (rail_height+rail_thick)/2])
up((rail_height+rail_thick)/2)
sparse_strut(l=platform_length-joiner_length+1, h=rail_height+rail_thick, thick=joiner_width, strut=5);
if (wall_style == "thinwall")
translate([0, 0, (rail_height+rail_thick)/2])
up((rail_height+rail_thick)/2)
thinning_wall(l=platform_length-joiner_length+1, h=rail_height+rail_thick, thick=joiner_width, strut=rail_thick, bracing=true);
if (wall_style == "corrugated")
translate([0, 0, (rail_height)/2])
up(rail_height/2)
corrugated_wall(l=platform_length-joiner_length+1, h=rail_height, thick=joiner_width, strut=rail_thick, wall=3);
}
// Rail tops.
translate([0, rail_height, rail_height]) {
translate([0, rail_height, rail_height-0.05]) {
translate([0, (platform_length-rail_height)/2, groove_height/2])
cube(size=[joiner_width, platform_length-rail_height, groove_height], center=true);
translate([0, groove_height/2, (platform_length-rail_height)/2])
cube(size=[joiner_width, groove_height, platform_length-rail_height], center=true);
}
}
}
@@ -79,31 +66,33 @@ module yz_joiner()
// Shrinkage stress relief
translate([0, platform_length/2, rail_thick/2]) {
grid_of(count=[1, 7], spacing=[0, 12]) {
yspread(12, n=7) {
cube(size=[rail_width+1, 1, rail_thick-2], center=true);
}
grid_of(count=[9, 2], spacing=[12, platform_length-10]) {
cube(size=[1, 20, rail_thick-2], center=true);
xspread(12, n=9) {
yspread(platform_length-10) {
cube(size=[1, 20, rail_thick-2], center=true);
}
}
}
// Clear space for front joiners.
translate([0, platform_length, rail_height/2]) {
translate([0, platform_length+0.05, rail_height/2]) {
joiner_pair_clear(spacing=rail_spacing+joiner_width, h=rail_height+0.001, w=joiner_width, clearance=5, a=joiner_angle);
}
// Clear space for back joiners.
translate([0, -6, rail_height/2]) {
translate([0, -6.05, rail_height/2]) {
zrot(180) joiner_pair_clear(spacing=rail_spacing+joiner_width, h=rail_height+0.001, w=joiner_width, a=joiner_angle);
}
// Clear space for side joiners.
translate([0, platform_length/2, rail_height/2]) {
translate([0, platform_length/2+0.05, rail_height/2]) {
zrot(90) joiner_quad_clear(xspacing=platform_length/2, yspacing=rail_width+2*6, h=rail_height+0.001, w=joiner_width, a=joiner_angle);
}
// Clear space for top joiners.
translate([0, rail_height/2, platform_length]) {
translate([0, rail_height/2, rail_height+groove_height+0.05]) {
xrot(90) joiner_pair_clear(spacing=rail_spacing+joiner_width, h=rail_height, w=joiner_width+0.001, clearance=5, a=joiner_angle);
}
}
@@ -124,7 +113,7 @@ module yz_joiner()
}
// Top joiners.
translate([0, rail_height/2, platform_length]) {
translate([0, rail_height/2, rail_height+groove_height]) {
xrot(90) joiner_pair(spacing=rail_spacing+joiner_width, h=rail_height, w=joiner_width, l=joiner_length, a=joiner_angle);
}
@@ -134,7 +123,7 @@ module yz_joiner()
cube(size=[rail_width, 5, rail_height/2], center=true);
// Wiring access holes.
grid_of(count=3, spacing=rail_width/3) {
xspread(rail_width/3, n=3) {
cube(size=[16, 11, 10], center=true);
}
}
@@ -142,17 +131,17 @@ module yz_joiner()
}
}
}
//yz_joiner();
//yz_bottom_joiner();
module yz_joiner_parts() { // make me
translate([0, -platform_length/2, 0]) yz_joiner();
module yz_bottom_joiner_parts() { // make me
fwd(platform_length/2) yz_bottom_joiner();
}
yz_joiner_parts();
yz_bottom_joiner_parts();

129
yz_top_joiner_parts.scad Normal file
View File

@@ -0,0 +1,129 @@
include <config.scad>
use <GDMUtils.scad>
use <joiners.scad>
module yz_top_joiner()
{
joiner_length=10;
base_height = rail_height+groove_height;
endstop_delta = platform_length - base_height;
motor_mount_spacing=43+joiner_width+10;
color("Turquoise")
prerender(convexity=10)
difference() {
union() {
difference() {
union() {
// Bottom.
up(rail_thick/2) {
back(platform_length/2) {
yrot(90) sparse_strut(h=rail_width, l=platform_length, thick=rail_thick, maxang=45, strut=10, max_bridge=500);
}
}
// Back.
up((rail_height+groove_height)/2) {
back(rail_thick/2) {
zrot(90) {
if (wall_style == "crossbeams")
sparse_strut(h=rail_height+groove_height, l=rail_width-joiner_width, thick=rail_thick, strut=5);
if (wall_style == "thinwall")
thinning_wall(h=rail_height+groove_height, l=rail_width-joiner_width, thick=rail_thick, strut=rail_thick, bracing=true);
if (wall_style == "corrugated")
corrugated_wall(h=rail_height+groove_height, l=rail_width-joiner_width, thick=rail_thick, strut=rail_thick, wall=3);
}
}
}
// Side Walls
xflip_copy() {
right((rail_spacing+joiner_width)/2) {
// Lower Wall.
grid_of(
ya=[(platform_length-joiner_length+1)/2]
) {
if (wall_style == "crossbeams")
up((rail_height+rail_thick)/2)
sparse_strut(l=platform_length-joiner_length+1, h=rail_height+rail_thick, thick=joiner_width, strut=5);
if (wall_style == "thinwall")
up((rail_height+rail_thick)/2)
thinning_wall(l=platform_length-joiner_length+1, h=rail_height+rail_thick, thick=joiner_width, strut=rail_thick, bracing=true);
if (wall_style == "corrugated")
up(rail_height/2)
corrugated_wall(l=platform_length-joiner_length+1, h=rail_height, thick=joiner_width, strut=rail_thick, wall=3);
}
// Rail tops.
translate([0, rail_height, rail_height-0.05]) {
translate([0, (platform_length-rail_height)/2, groove_height/2])
cube(size=[joiner_width, platform_length-rail_height, groove_height], center=true);
}
}
}
}
// Shrinkage stress relief
translate([0, platform_length/2, rail_thick/2]) {
yspread(12, n=7) {
cube(size=[rail_width+1, 1, rail_thick-2], center=true);
}
xspread(12, n=9) {
yspread(platform_length-10) {
cube(size=[1, 20, rail_thick-2], center=true);
}
}
}
// Clear space for front joiners.
translate([0, platform_length+0.05, rail_height/2]) {
joiner_pair_clear(spacing=rail_spacing+joiner_width, h=rail_height+0.001, w=joiner_width, clearance=5, a=joiner_angle);
}
// Clear space for top joiners.
translate([0, rail_height/2, rail_height+groove_height+0.05]) {
xrot(90) joiner_pair_clear(spacing=rail_spacing+joiner_width, h=rail_height, w=joiner_width+0.001, clearance=5, a=joiner_angle);
}
}
// Front joiners.
translate([0, platform_length, rail_height/2]) {
joiner_pair(spacing=rail_spacing+joiner_width, h=rail_height, w=joiner_width, l=joiner_length, a=joiner_angle);
}
// Top joiners.
translate([0, rail_height/2, rail_height+groove_height]) {
xrot(90) joiner_pair(spacing=rail_spacing+joiner_width, h=rail_height, w=joiner_width, l=joiner_length, a=joiner_angle);
}
translate([0, platform_length-joiner_length, rail_height/4]) {
difference() {
// Side supports.
cube(size=[rail_width, 5, rail_height/2], center=true);
// Wiring access holes.
xspread(rail_width/3, n=3) {
cube(size=[16, 11, 10], center=true);
}
}
}
}
}
}
//yz_top_joiner();
module yz_top_joiner_parts() { // make me
fwd(platform_length/2) yz_top_joiner();
}
yz_top_joiner_parts();
// vim: noexpandtab tabstop=4 shiftwidth=4 softtabstop=4 nowrap

View File

@@ -4,87 +4,115 @@ use <joiners.scad>
use <acme_screw.scad>
$fa = 2;
$fs = 2;
module z_sled()
{
color("MediumSlateBlue")
prerender(convexity=10)
zrot(-90)
back(rail_offset+groove_height/2)
union() {
difference() {
union() {
// Bottom
translate([0,0,platform_thick/2])
yrot(90) sparse_strut(h=platform_width, l=platform_length, thick=platform_thick, maxang=45, strut=12, max_bridge=999);
xrot(90) {
back(platform_length/2) {
// Bottom
up(platform_thick/2)
zrot(90) yrot(90)
thinning_wall(l=rail_spacing+joiner_width, h=platform_length, thick=platform_thick, strut=8, bracing=true);
// Walls.
zrot_copies([0, 180]) {
translate([(platform_width-joiner_width)/2, 0, platform_height/2]) {
if (wall_style == "crossbeams")
sparse_strut(h=platform_height, l=platform_length-10, thick=joiner_width, strut=5);
if (wall_style == "thinwall")
thinning_wall(h=platform_height, l=platform_length-10, thick=joiner_width, strut=platform_thick, wall=3, bracing=false);
if (wall_style == "corrugated")
corrugated_wall(h=platform_height, l=platform_length-10, thick=joiner_width, strut=platform_thick, wall=3);
// Length-wise bracing.
translate([0,0,platform_thick/2]) {
cube(size=[lifter_rod_diam+2*3, platform_length, platform_thick], center=true);
}
}
// Length-wise bracing.
translate([0,0,platform_thick/2]) {
cube(size=[lifter_rod_diam+2*3, platform_length, platform_thick], center=true);
}
back(25/2)
yspread(floor((platform_length*7/8-25)/lifter_thread_size)*lifter_thread_size) {
difference() {
// Lifter block
up(platform_thick) {
up((lifter_rod_diam+2*4)/2) {
cube(size=[lifter_rod_diam+2*3, platform_length/8, lifter_rod_diam+2*4], center=true);
}
}
// Lifter blocks
translate([0, 0, platform_thick]) {
grid_of(count=[1,2], spacing=floor(platform_length*0.75/lifter_thread_size)*lifter_thread_size) {
translate([0, 0, (lifter_rod_diam+2*4)/2]) {
cube(size=[lifter_rod_diam+2*3, 15, lifter_rod_diam+2*4], center=true);
}
}
}
// sliders
mirror_copy([1,0,0]) {
translate([-(rail_spacing)/2, 0, 0]) {
// bottom strut
translate([6/2+printer_slop,0,platform_thick/2]) {
cube(size=[6, platform_length, platform_thick], center=true);
// Lifter threading
up(rail_offset+groove_height/2) {
union() {
yspread(printer_slop) {
xrot(90) zrot(90) {
acme_threaded_rod(
d=lifter_rod_diam+2*printer_slop,
l=platform_length/8+0.5,
threading=lifter_thread_size,
thread_depth=1.5
);
}
}
}
}
}
grid_of(
ya=[-platform_length*6/16, 0, platform_length*6/16],
za=[rail_offset+groove_height/2]
) {
translate([-joiner_width/2, 0, 0]) {
circle_of(n=2, r=joiner_width/2+printer_slop, rot=true) {
// Slider base
translate([15/2-9, 0, -groove_height-printer_slop]) {
difference() {
cube(size=[15, platform_length/8, groove_height-printer_slop*2], center=true);
grid_of(
ya=[-(platform_length/8/2), (platform_length/8/2)],
za=[groove_height/2]
) {
xrot(45) cube(size=[16, 2*sqrt(2), 2*sqrt(2)], center=true);
// lifter block ramp.
fwd((lifter_rod_diam+2*4+platform_length/8)/2) {
up((lifter_rod_diam+2*4)/2) {
difference() {
up(platform_thick) {
cube(size=[lifter_rod_diam+2*3, lifter_rod_diam+2*4, lifter_rod_diam+2*4], center=true);
}
back((lifter_rod_diam+2*4)/2) {
up(platform_thick+(lifter_rod_diam+2*4)/2) {
xrot(45) {
up((lifter_rod_diam+2*4)/2) {
cube(size=[lifter_rod_diam+2*3+0.05, platform_length, lifter_rod_diam+2*4], center=true);
}
}
}
}
// Slider backing
translate([6/2, 0, -4/2]) {
difference() {
cube(size=[6, platform_length/8, groove_height+4], center=true);
grid_of(
ya=[-(platform_length/8/2), (platform_length/8/2)],
za=[(groove_height+4)/2]
) {
xrot(45) cube(size=[11, 2*sqrt(2), 2*sqrt(2)], center=true);
}
down((lifter_rod_diam+2*4)/2) {
up(rail_offset+groove_height/2) {
xrot(90) cylinder(h=platform_length, d=lifter_rod_diam+2*printer_slop, center=true);
}
}
}
}
}
}
// Slider ridge
scale([tan(groove_angle),1,1]) {
yrot(45) {
chamfcube(size=[groove_height/sqrt(2), platform_length/8, groove_height/sqrt(2)], chamfer=2, chamfaxes=[1,0,1], center=true);
// sliders
xflip_copy() {
translate([-(rail_spacing)/2, 0, 0]) {
// bottom strut
translate([6/2+printer_slop,0,platform_thick/2]) {
cube(size=[6, platform_length, platform_thick], center=true);
}
up(rail_offset+groove_height/2) {
left(joiner_width/2) {
circle_of(n=2, r=joiner_width/2+printer_slop, rot=true) {
// Slider base
translate([15/2-9, 0, -groove_height-printer_slop]) {
cube(size=[15, platform_length, groove_height-printer_slop*2], center=true);
}
// Slider backing
translate([6/2, 0, -4/2]) {
difference() {
cube(size=[6, platform_length, groove_height+4], center=true);
up((groove_height+4)/2) {
yspread(platform_length) {
xrot(45) cube(size=[11, 2*sqrt(2), 2*sqrt(2)], center=true);
}
}
}
}
// Slider ridge
scale([tan(groove_angle),1,1]) {
yrot(45) {
chamfcube(size=[groove_height/sqrt(2), platform_length, groove_height/sqrt(2)], chamfer=2, chamfaxes=[1,0,1], center=true);
}
}
}
}
@@ -93,57 +121,93 @@ module z_sled()
}
}
}
// Clear space for joiners.
translate([0,0,platform_height/2]) {
joiner_quad_clear(xspacing=platform_width-joiner_width, yspacing=platform_length, h=platform_height, w=joiner_width, clearance=5, a=joiner_angle);
}
// Shrinkage stress relief
translate([0, 0, platform_thick/2]) {
grid_of(count=[1, 9], spacing=[0,9]) {
cube(size=[platform_width+1, 1, platform_thick-2], center=true);
}
grid_of(count=[9, 2], spacing=[14, platform_length-10]) {
cube(size=[1, 20, platform_thick-2], center=true);
}
}
// Lifter threading
grid_of(count=[1,2], spacing=floor(platform_length*0.75/lifter_thread_size)*lifter_thread_size) {
translate([0, 0, rail_offset+groove_height/2]) {
union() {
grid_of(ya=[-printer_slop/2,printer_slop/2]) {
xrot(90) zrot(90) {
acme_threaded_rod(
d=lifter_rod_diam+2*printer_slop,
l=16,
threading=lifter_thread_size,
thread_depth=1.5
);
}
}
teardrop(r=(lifter_rod_diam+2*printer_slop-3)/2, h=16, ang=30);
translate([0, 0, (lifter_rod_diam+3)/2]) {
cube(size=[4, 16, lifter_rod_diam], center=true);
xflip_copy() {
up(rail_height/2/2) {
fwd(joiner_width/2) {
right((platform_width-5)/2) {
#zrot(-90) half_joiner2(h=rail_height/2+0.001, w=joiner_width, clearance=5, a=joiner_angle, slop=printer_slop);
}
}
}
}
}
// Snap-tab joiners.
translate([0,0,platform_height/2]) {
joiner_quad(xspacing=platform_width-joiner_width, yspacing=platform_length, h=platform_height, w=joiner_width, l=5, a=joiner_angle);
back(cantilever_length/2-(rail_offset+groove_height/2)) {
difference() {
union() {
// Bottom.
back(groove_height/2) {
up(rail_thick/2) {
yrot(90) {
sparse_strut(h=rail_width, l=cantilever_length-groove_height, thick=rail_thick, maxang=45, strut=10, max_bridge=500);
}
}
}
// Walls.
back(groove_height/2) {
xflip_copy() {
up(rail_height/2) {
right((rail_spacing+joiner_width)/2) {
if (wall_style == "crossbeams")
sparse_strut(h=rail_height, l=cantilever_length-10-groove_height/2, thick=joiner_width, strut=5);
if (wall_style == "thinwall")
thinning_wall(h=rail_height, l=cantilever_length-10-groove_height/2, thick=joiner_width, strut=5, bracing=false);
if (wall_style == "corrugated")
corrugated_wall(h=rail_height, l=cantilever_length-10-groove_height/2, thick=joiner_width, strut=5);
}
}
}
}
// Side Supports
up(rail_height/4) {
back((cantilever_length-2*5-5)/2) {
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);
}
}
}
}
}
// Clear space for joiners.
up(rail_height/2) {
back(cantilever_length/2) {
joiner_pair_clear(spacing=rail_spacing+joiner_width, h=rail_height+0.001, w=joiner_width, clearance=5, a=joiner_angle);
}
}
// Shrinkage stress relief
up(rail_thick/2) {
yspread(13, n=12) {
cube(size=[rail_width+1, 1, rail_thick-2], center=true);
}
xspread(13, n=8) {
yspread(cantilever_length-10) {
cube(size=[1, 60, rail_thick-2], center=true);
}
}
}
}
// Snap-tab joiners.
up(rail_height/2) {
back(cantilever_length/2) {
joiner_pair(spacing=rail_spacing+joiner_width, h=rail_height, w=joiner_width, l=5, a=joiner_angle);
}
}
}
}
}
//!z_sled();
!z_sled();
module z_sled_parts() { // make me
zrot(90) z_sled();
z_sled();
}