diff --git a/TODO.md b/TODO.md index e69de29..078ec1b 100644 --- a/TODO.md +++ b/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 + diff --git a/assembly.scad b/assembly.scad index 98de3c0..a506b4c 100644 --- a/assembly.scad +++ b/assembly.scad @@ -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(); diff --git a/constants.scad b/constants.scad index 84444df..188d3ee 100644 --- a/constants.scad +++ b/constants.scad @@ -14,5 +14,5 @@ cur_ypos = 140; echo(str("Range = ", [ xsize - xmin * 2, ysize - ymin * 2 ])); -$fn = 60; +$fn = 30; $include_substock = true; diff --git a/parts.scad b/parts.scad index 821ecb5..1507fc0 100644 --- a/parts.scad +++ b/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); + } } } diff --git a/stock_parts.scad b/stock_parts.scad index 90889b6..050e399 100644 --- a/stock_parts.scad +++ b/stock_parts.scad @@ -1,4 +1,3 @@ -include include 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] ])