Fixed duplicated generation of xsled geometry, added clips for belts to xsled, fixed positions of ysled idlers to be based on nominal beltline
This commit is contained in:
8
TODO.md
8
TODO.md
@@ -0,0 +1,8 @@
|
||||
## Mechanical
|
||||
|
||||
* Lengthen rear corner frame holders
|
||||
* Add screw holes for feet in each corner
|
||||
* Add place to mount electronics (likely just an extra part)
|
||||
|
||||
## Electronics
|
||||
|
||||
|
||||
@@ -54,10 +54,10 @@ module xsled() {
|
||||
}
|
||||
|
||||
module moving_parts(xpos = cur_xpos, ypos = cur_ypos) {
|
||||
translate([ yrail_offset, cur_ypos, 0 ]) ysled_slider(spread = sled_ysize);
|
||||
translate([ yrail_offset, cur_ypos, 0 ]) ysled_slider();
|
||||
|
||||
translate([ xsize - yrail_offset, cur_ypos, 0 ]) rotate([ 180, 180, 0 ])
|
||||
ysled_slider(spread = sled_ysize, is_left = false);
|
||||
ysled_slider(is_left = false);
|
||||
|
||||
translate([ yrail_offset, cur_ypos, 0 ]) if ($preview) ysled_rails();
|
||||
|
||||
|
||||
@@ -14,5 +14,5 @@ cur_ypos = 140;
|
||||
|
||||
echo(str("Range = ", [ xsize - xmin * 2, ysize - ymin * 2 ]));
|
||||
|
||||
$fn = 60;
|
||||
$fn = 30;
|
||||
$include_substock = true;
|
||||
|
||||
279
parts.scad
279
parts.scad
@@ -89,12 +89,12 @@ module rail_holder(in_x) {
|
||||
}
|
||||
|
||||
// centered on the rail.
|
||||
module ysled_slider(spread, associated_parts = $preview, is_left=true) {
|
||||
module ysled_slider(associated_parts = $preview, is_left=true) {
|
||||
spread = sled_ysize;
|
||||
bom_item(label = str("ysled_slider(", spread, ")"));
|
||||
sled_len = spread + frame_size;
|
||||
sled_height = frame_size;
|
||||
idler_spacing = spread / 3;
|
||||
|
||||
idler_spacing = spread / 6 + pulley_radius(idler_nteeth);
|
||||
local_idler_xoffset = pulley_sbend_offset - yrail_offset + motor_shaft_xoffset;
|
||||
echo("LIX:", local_idler_xoffset)
|
||||
colorize("green") translate([ 0, -sled_len / 2, 0 ])
|
||||
@@ -110,7 +110,7 @@ module ysled_slider(spread, associated_parts = $preview, is_left=true) {
|
||||
]) cube([ frame_size + 5, frame_size, sled_len ]);
|
||||
}
|
||||
|
||||
for (y = [idler_spacing/2, -idler_spacing/2]) {
|
||||
for (y = [idler_spacing, -idler_spacing]) {
|
||||
rotate([90, 0, 0])
|
||||
translate([local_idler_xoffset, sled_len/2 + y, 0])
|
||||
cylinder(d=3, h = frame_size);
|
||||
@@ -132,10 +132,10 @@ module ysled_slider(spread, associated_parts = $preview, is_left=true) {
|
||||
// color("#f00")
|
||||
translate(
|
||||
[ local_idler_xoffset, 0, frame_size/2 - 1 ]) {
|
||||
translate([ 0, idler_spacing / 2, 0 ]) {
|
||||
translate([ 0, idler_spacing, 0 ]) {
|
||||
idler_post(belt_height = belt_height1 - frame_size/2 + 1, toothed = is_left);
|
||||
}
|
||||
translate([ 0, -idler_spacing / 2, 0 ]) {
|
||||
translate([ 0, -idler_spacing, 0 ]) {
|
||||
rotate([ 0, 0, -90 ]) { idler_post(belt_height = belt_height2 - frame_size/2 + 1, toothed = !is_left); }
|
||||
}
|
||||
}
|
||||
@@ -385,6 +385,90 @@ module xsled_frame() {
|
||||
}
|
||||
}
|
||||
|
||||
gt2_clip_meshing_dist = belt_pitch * 6;
|
||||
gt2_clip_peg_diam = 8; // min 6
|
||||
gt2_clip_ease_in_diam = 6;
|
||||
gt2_clip_narrowing_dist = 12; // distance from center of loop peg to meshing point
|
||||
|
||||
gt2_clip_gap_diam = gt2_clip_peg_diam + belt_thickness * 2 + 1;
|
||||
gt2_clip_thickness = (gt2_clip_peg_diam + gt2_clip_gap_diam)/2;
|
||||
gt2_clip_length = gt2_clip_narrowing_dist + gt2_clip_meshing_dist + gt2_clip_peg_diam / 2 + gt2_clip_gap_diam - belt_thickness;
|
||||
module gt2_clip_cutout(teeth_inside) {
|
||||
dual_width = belt_thickness * 2 - tooth_height;
|
||||
loop_peg_diam = gt2_clip_peg_diam; // min 6mm
|
||||
gap_diam = gt2_clip_gap_diam;
|
||||
narrowing_ease_diam = 6;
|
||||
narrowing_dist = gt2_clip_narrowing_dist;
|
||||
meshing_dist = gt2_clip_meshing_dist;
|
||||
ease_out_rad = gap_diam - belt_thickness ;
|
||||
|
||||
out_off = teeth_inside ? 0 : dual_width - belt_thickness;
|
||||
translate([
|
||||
-(narrowing_dist + meshing_dist + (ease_out_rad - out_off - belt_thickness))
|
||||
-(teeth_inside ? tooth_height - belt_pld : belt_backing)
|
||||
,
|
||||
loop_peg_diam / 2,
|
||||
-1])
|
||||
union() {
|
||||
difference() {
|
||||
hull() {
|
||||
circle(d = gap_diam);
|
||||
polygon([
|
||||
[0, 0],
|
||||
[0, gap_diam / 2],
|
||||
[narrowing_dist, gap_diam / 2],
|
||||
[narrowing_dist, gap_diam / 2 - dual_width]
|
||||
]);
|
||||
}
|
||||
circle(d = loop_peg_diam);
|
||||
translate([narrowing_dist, gap_diam / 2 - dual_width - narrowing_ease_diam / 2])
|
||||
circle(d = narrowing_ease_diam);
|
||||
}
|
||||
translate([narrowing_dist, gap_diam / 2])
|
||||
polygon([
|
||||
[0, 0],
|
||||
[meshing_dist - 1, 0],
|
||||
[meshing_dist, - out_off],
|
||||
[meshing_dist, - belt_thickness - out_off],
|
||||
[meshing_dist - 1, - dual_width],
|
||||
[0, - dual_width]
|
||||
]);
|
||||
translate([narrowing_dist + meshing_dist, gap_diam / 2 - ease_out_rad]) {
|
||||
intersection() {
|
||||
translate([0, -2])
|
||||
square(ease_out_rad + 2);
|
||||
difference() {
|
||||
circle(ease_out_rad - out_off);
|
||||
circle(ease_out_rad - out_off - belt_thickness);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
module gt2_clip(teeth_inside) {
|
||||
out_off = teeth_inside ? 0 : belt_thickness - tooth_height;
|
||||
actual_thickness = gt2_clip_thickness + wall_thickness;
|
||||
translate([0,-actual_thickness, -belt_width/2 - 2])
|
||||
difference() {
|
||||
translate([-gt2_clip_length - belt_thickness + out_off/2, 0]) {
|
||||
cube([gt2_clip_length + belt_thickness * 2, actual_thickness, belt_width + 4]);
|
||||
mirror([0,0,1])
|
||||
translate([0, actual_thickness])
|
||||
linear_extrude(height=actual_thickness * 1.5, scale=[1,0])
|
||||
translate([0, -actual_thickness])
|
||||
|
||||
square([
|
||||
gt2_clip_length + belt_thickness * 2,
|
||||
actual_thickness
|
||||
]);
|
||||
}
|
||||
translate([0,0,0])
|
||||
linear_extrude(belt_width + 6)
|
||||
gt2_clip_cutout(teeth_inside);
|
||||
}
|
||||
}
|
||||
|
||||
module xsled2() {
|
||||
bom_item();
|
||||
|
||||
@@ -406,102 +490,127 @@ module xsled2() {
|
||||
finger_notch_smdepth = 2;
|
||||
|
||||
glass_holder_points = [
|
||||
[0, -tab_thickness/2],
|
||||
[0, film_height + glass_thickness],
|
||||
[wall_thickness, film_height + glass_thickness],
|
||||
[wall_thickness, film_height],
|
||||
[outside_ledge_width, film_height],
|
||||
[outside_ledge_width, film_height - glass_thickness],
|
||||
[ledge_width, film_height - glass_thickness],
|
||||
[wall_thickness * 2, -tab_thickness / 2]
|
||||
];
|
||||
[0, - tab_thickness / 2],
|
||||
[0, film_height + glass_thickness],
|
||||
[wall_thickness, film_height + glass_thickness],
|
||||
[wall_thickness, film_height],
|
||||
[outside_ledge_width, film_height],
|
||||
[outside_ledge_width, film_height - glass_thickness],
|
||||
[ledge_width, film_height - glass_thickness],
|
||||
[wall_thickness * 2, - tab_thickness / 2]
|
||||
];
|
||||
|
||||
echo("Ledge width: ", ledge_width - outside_ledge_width);
|
||||
for (xsign = [ 1, -1 ], ysign = [ 1, -1 ]) {
|
||||
translate([ sled_xsize / 2 * xsign, sled_ysize / 2 * ysign, 0 ])
|
||||
rotate([ 0, -90 * xsign, 0 ]) {
|
||||
difference() {
|
||||
union() {
|
||||
cylinder(d = tab_thickness, h = tab_len);
|
||||
translate(
|
||||
[ -tab_thickness / 2, ysign > 0 ? -tab_thickness / 2 : 0, 0 ])
|
||||
cube([ tab_thickness, tab_thickness / 2 + 1, tab_len ]);
|
||||
// rail attachment points
|
||||
for (xsign = [1, - 1], ysign = [1, - 1]) {
|
||||
translate([sled_xsize / 2 * xsign, sled_ysize / 2 * ysign, 0])
|
||||
rotate([0, - 90 * xsign, 0]) {
|
||||
difference() {
|
||||
union() {
|
||||
cylinder(d = tab_thickness, h = tab_len);
|
||||
translate(
|
||||
[- tab_thickness / 2, ysign > 0 ? - tab_thickness / 2 : 0, 0])
|
||||
cube([tab_thickness, tab_thickness / 2 + 1, tab_len]);
|
||||
}
|
||||
translate([0, 0, - 0.5]) {
|
||||
cylinder(d = bushing_od, h = bushing_len + 0.5);
|
||||
cylinder(d = rail_diam * 1.1, h = tab_len + 1);
|
||||
}
|
||||
}
|
||||
translate([ 0, 0, -0.5 ]) {
|
||||
cylinder(d = bushing_od, h = bushing_len + 0.5);
|
||||
cylinder(d = rail_diam * 1.1, h = tab_len + 1);
|
||||
if ($preview) {
|
||||
bushing();
|
||||
}
|
||||
}
|
||||
if ($preview) {
|
||||
bushing();
|
||||
}
|
||||
}
|
||||
|
||||
// glass holding frame
|
||||
difference() {
|
||||
union() {
|
||||
translate([- sled_xsize / 2, - inner_ysize / 2, 0])
|
||||
rotate([0, 90, 0]) rotate([0, 0, 90]) linear_extrude(sled_xsize)
|
||||
polygon(glass_holder_points);
|
||||
|
||||
translate([sled_xsize / 2, inner_ysize / 2, 0])
|
||||
rotate([0, 90, 180]) rotate([0, 0, 90])
|
||||
linear_extrude(sled_xsize) polygon(glass_holder_points);
|
||||
|
||||
translate([sled_xsize / 2, - inner_ysize / 2, 0])
|
||||
rotate([0, 90, 90]) rotate([0, 0, 90])
|
||||
linear_extrude(inner_ysize) polygon(glass_holder_points);
|
||||
|
||||
translate([- sled_xsize / 2, inner_ysize / 2, 0])
|
||||
rotate([0, 90, - 90]) rotate([0, 0, 90])
|
||||
linear_extrude(inner_ysize) polygon(glass_holder_points);
|
||||
}
|
||||
|
||||
// cube([sled_xsize, inner_ysize, tab_thickness/2], center=true);
|
||||
difference() {
|
||||
union() {
|
||||
translate([ -sled_xsize / 2, -inner_ysize / 2, 0])
|
||||
rotate([ 0, 90, 0 ]) rotate([ 0, 0, 90 ]) linear_extrude(sled_xsize)
|
||||
polygon(glass_holder_points);
|
||||
|
||||
translate([ sled_xsize / 2, inner_ysize / 2, 0 ])
|
||||
rotate([ 0, 90, 180 ]) rotate([ 0, 0, 90 ])
|
||||
linear_extrude(sled_xsize) polygon(glass_holder_points);
|
||||
|
||||
translate([ sled_xsize / 2, -inner_ysize / 2, 0 ])
|
||||
rotate([ 0, 90, 90 ]) rotate([ 0, 0, 90 ])
|
||||
linear_extrude(inner_ysize) polygon(glass_holder_points);
|
||||
|
||||
translate([ -sled_xsize / 2, inner_ysize / 2, 0 ])
|
||||
rotate([ 0, 90, -90 ]) rotate([ 0, 0, 90 ])
|
||||
linear_extrude(inner_ysize) polygon(glass_holder_points);
|
||||
}
|
||||
|
||||
for (x = [ -1, 1],
|
||||
y = [ -1, 1]) {
|
||||
translate([x * (sled_xsize/2 - outside_ledge_width - inside_ledge_width / 2),
|
||||
y * (inner_ysize/2 - outside_ledge_width - inside_ledge_width / 2),
|
||||
film_height])
|
||||
rotate([180,0,0]) {
|
||||
cylinder(d=4, h = 50);
|
||||
cylinder(d=5, h = 4 + glass_thickness );
|
||||
// grub screw points for glass levelling
|
||||
for (x = [- 1, 1],
|
||||
y = [- 1, 1]) {
|
||||
translate([x * (sled_xsize / 2 - outside_ledge_width - inside_ledge_width / 2),
|
||||
y * (inner_ysize / 2 - outside_ledge_width - inside_ledge_width / 2),
|
||||
film_height])
|
||||
rotate([180, 0, 0]) {
|
||||
cylinder(d = 4, h = 50);
|
||||
cylinder(d = 5, h = 4 + glass_thickness);
|
||||
}
|
||||
}
|
||||
translate([
|
||||
-10, -inner_ysize / 2,
|
||||
|
||||
film_height - glass_thickness + 0.5 - finger_notch_smdepth + finger_notch_diam / 2
|
||||
}
|
||||
|
||||
// finger notch
|
||||
translate([
|
||||
- 10, - inner_ysize / 2,
|
||||
|
||||
film_height - glass_thickness + 0.5 - finger_notch_smdepth + finger_notch_diam / 2
|
||||
]) rotate([90, 0, 0])
|
||||
cylinder(d=finger_notch_diam, h = ledge_width * 3, center=true);
|
||||
}
|
||||
cylinder(d = finger_notch_diam, h = ledge_width * 3, center = true);
|
||||
|
||||
}
|
||||
|
||||
// belt attachment points
|
||||
idler_spacing = sled_ysize / 6;
|
||||
for (params = [
|
||||
[true, [-sled_xsize/2, idler_spacing, belt_height1 ]],
|
||||
[false, [-sled_xsize/2, -idler_spacing, belt_height2]],
|
||||
[true, [sled_xsize/2, idler_spacing, belt_height2]],
|
||||
[false, [sled_xsize/2, -idler_spacing, belt_height1]]
|
||||
]) {
|
||||
should_mirror = params[1][0] > 0 ? params[0] : !params[0];
|
||||
translate(params[1])
|
||||
rotate([0,0,params[1][0] > 0 ? 90 : -90]) {
|
||||
if (should_mirror ) {
|
||||
mirror([1,0,0])
|
||||
gt2_clip(params[0]);
|
||||
} else {
|
||||
gt2_clip(params[0]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
color("#fff3") if ($preview) {
|
||||
// draw glass sheets
|
||||
translate(
|
||||
[ 0, 0, film_height - glass_thickness / 2 + 0.5 ])
|
||||
cube(
|
||||
[
|
||||
sled_xsize - outside_ledge_width * 2,
|
||||
inner_ysize - outside_ledge_width * 2,
|
||||
glass_thickness
|
||||
],
|
||||
center = true);
|
||||
[0, 0, film_height - glass_thickness / 2 + 0.5])
|
||||
cube(
|
||||
[
|
||||
sled_xsize - outside_ledge_width * 2,
|
||||
inner_ysize - outside_ledge_width * 2,
|
||||
glass_thickness
|
||||
],
|
||||
center = true);
|
||||
*translate(
|
||||
[ 0, 0, film_height + film_thickness * 2 + glass_thickness / 2 + 0.5 ])
|
||||
cube(
|
||||
[
|
||||
sled_xsize - wall_thickness * 2,
|
||||
inner_ysize - wall_thickness * 2,
|
||||
glass_thickness
|
||||
],
|
||||
center = true);
|
||||
[0, 0, film_height + film_thickness * 2 + glass_thickness / 2 + 0.5])
|
||||
cube(
|
||||
[
|
||||
sled_xsize - wall_thickness * 2,
|
||||
inner_ysize - wall_thickness * 2,
|
||||
glass_thickness
|
||||
],
|
||||
center = true);
|
||||
}
|
||||
if($preview) {
|
||||
if ($preview) {
|
||||
color("#0003")
|
||||
translate([0, 0, film_height + 0.5]) {
|
||||
cube([5*inch, 4*inch, film_thickness], center=true);
|
||||
}
|
||||
translate([0, 0, film_height + 0.5]) {
|
||||
cube([5 * inch, 4 * inch, film_thickness], center = true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
include <MCAD/math.scad>
|
||||
include <lib.scad>
|
||||
|
||||
stock_color = "#aaa";
|
||||
@@ -54,13 +53,14 @@ belt_pitch = 2; // 2mm tooth width for GT2 = 2mm pitch
|
||||
belt_width = 6;
|
||||
belt_thickness = 1.38;
|
||||
belt_pld =
|
||||
0.254; // distance between line of fixed length and tips of gear teeth
|
||||
belt_backing = 0.63 - belt_pld;
|
||||
tooth_height = 0.75;
|
||||
0.254; // distance between pitch line and tips of gear teeth
|
||||
belt_backing = 0.63 - belt_pld; // distance between pitch line and backing
|
||||
tooth_height = 0.75; // distance from tips of belt teeth to tip of gear teeth
|
||||
|
||||
pulley_od = 13;
|
||||
pulley_clearance_rad = pulley_od / 2 + 1.5;
|
||||
|
||||
function pulley_radius(nteeth) = belt_pitch * nteeth / (PI * 2);
|
||||
module pulley(teeth, lrim, urim, belt_width, shaft = 5, toothed = true,
|
||||
od = 0) {
|
||||
bom_item(printable = false,
|
||||
@@ -68,7 +68,7 @@ module pulley(teeth, lrim, urim, belt_width, shaft = 5, toothed = true,
|
||||
"flange1=", min(lrim, urim), "mm, ", "flange2=",
|
||||
max(lrim, urim), "mm, ", "channel=", belt_width, "mm, ",
|
||||
"shaft=", shaft, "mm", ")"));
|
||||
nominal_rad = belt_pitch * teeth / TAU;
|
||||
nominal_rad = pulley_radius(teeth);
|
||||
inner_rad = nominal_rad - belt_pld;
|
||||
outer_rad = (od > 0) ? od / 2 : nominal_rad + belt_backing;
|
||||
minor_rad = inner_rad - tooth_height;
|
||||
@@ -108,6 +108,7 @@ module pulley(teeth, lrim, urim, belt_width, shaft = 5, toothed = true,
|
||||
|
||||
idler_zmargin = [ 6.4 / 2 + 1.05, 6.4 / 2 + 1.05 ];
|
||||
|
||||
idler_nteeth = 16;
|
||||
module idler(height = 0, toothed = false) {
|
||||
// pulley(20, 1.05, 1.05, 6.4, toothed=toothed, od=18);
|
||||
translate([ 0, 0, height - idler_zmargin[0] ])
|
||||
|
||||
Reference in New Issue
Block a user