diff --git a/assembly.scad b/assembly.scad index 1e67aac..eb55899 100644 --- a/assembly.scad +++ b/assembly.scad @@ -67,7 +67,7 @@ module moving_parts(xpos = cur_xpos, ypos = cur_ypos) { ysled_slider(spread = sled_ysize); translate([xsize - yrail_offset, cur_ypos, 0]) - rotate([0, 180, 0]) + rotate([180, 180, 0]) ysled_slider(spread = sled_ysize); translate([yrail_offset, cur_ypos, 0]) diff --git a/parts.scad b/parts.scad index d07f735..31942c2 100644 --- a/parts.scad +++ b/parts.scad @@ -13,14 +13,18 @@ corner_size=30; corner_offset = frame_size / 2 + wall_thickness; rail_diam = 8; // distance between centerline of rail and centerline of frame Y tube. -yrail_offset = (frame_size + corner_size / 2) / 2; +yrail_offset = (frame_size + corner_size) / 2; ysled_extralen = frame_size; // on each end +// Both of these are distance from frame centerline +belt_height1 = frame_size / 2 + wall_thickness + belt_width / 2 + 2; +belt_height2 = belt_height1 + belt_width + 2; + // calculated ysled_rail_spacing = (sled_ysize); - +motor_shaft_xoffset = (corner_size - wall_thickness) / 2; @@ -83,11 +87,12 @@ module rail_holder(in_x) { } } -// centered on +// centered on the rail. module ysled_slider(spread, associated_parts = $preview) { bom_item(label = str("ysled_slider(", spread, ")")); sled_len = spread + frame_size; sled_height = frame_size; + idler_spacing = spread / 3; colorize("green") render() @@ -95,8 +100,11 @@ module ysled_slider(spread, associated_parts = $preview) { rotate([-90, 0, 0]) { difference() { union() { - translate([-frame_size/2, -frame_size/2, 0]) - cube([frame_size + 5, frame_size, sled_len]); + translate([-frame_size/2, -frame_size/2, 0]) + cube([frame_size + 5, frame_size, sled_len]); + translate([pulley_sbend_offset - yrail_offset + motor_shaft_xoffset - pulley_clearance_rad - 4, + -frame_size / 2, 0]) + cube([frame_size + 5, frame_size, sled_len]); } cylinder(d = bushing_id * 1.1, h = sled_len); @@ -116,6 +124,23 @@ module ysled_slider(spread, associated_parts = $preview) { } // TODO: add posts for the idlers + //color("#f00") + translate([pulley_sbend_offset - yrail_offset + motor_shaft_xoffset, 0, 0]) { + translate([0, idler_spacing / 2, 0]) { + idler_post(belt_height = belt_height1); + } + translate([0, -idler_spacing / 2, 0]) { + *cylinder(d=3, h=30, $fs=1); + *idler(belt_height2); + rotate([0, 0, -90]) { + idler_post(belt_height = belt_height2); + } + + } + + + } + translate([0, -sled_len/2, 0]) rotate([-90, 0, 0]) if (associated_parts) { @@ -153,6 +178,43 @@ module nema17_housing() { } } +// belt height is the center of the belt. +// Roration is in Z axis, from +x/+y +module idler_post(belt_height, toothed=true) { + gap=0.5; + + post_radius = pulley_clearance_rad + 4; + top_shelf_thickness = 4; + total_height = idler_zmargin.y + belt_height + top_shelf_thickness + gap; + slot_radius = pulley_clearance_rad; + slot_height = idler_zmargin.x + idler_zmargin.y + gap * 2; + + difference() { + union() { + // outer shell + cylinder(h = total_height, r = post_radius); + translate([0, -post_radius, 0]) + cube([post_radius, post_radius, total_height]); + translate([-post_radius,0, 0]) + cube([post_radius, post_radius, total_height]); + } + + translate([0,0,belt_height - idler_zmargin.x - gap]) { + cylinder(r = slot_radius, slot_height); + translate([-slot_radius, 0, 0]) + cube([post_radius*2, post_radius * 2, slot_height]); + translate([0, -slot_radius, 0]) + cube([post_radius * 2, post_radius * 2, slot_height]); + } + + cylinder(d = 3, h=total_height + 1, $fn=60); + translate([0, 0, total_height - 2]) + cylinder(r = 3, h = 3); + } + + idler(height = belt_height); +} + module flcorner() { bom_item(); rotate([0, 0, 0]) { @@ -167,8 +229,8 @@ module flcorner() { -nema17_face/2 - frame_size/2 - wall_thickness, frame_size/2]) { nema17(); - translate([0, 0, 2]) { - pulley(16,6,1,7); + translate([0, 0, -frame_size/2 + belt_height2]) { + active_pulley(); } } @@ -188,8 +250,9 @@ module frcorner() { -nema17_face/2 - frame_size/2 - wall_thickness, frame_size/2]) { nema17(); - translate([0,0,2]) { - pulley(16, 1, 6, 7); + translate([0,0,belt_height1 - frame_size / 2]) { + rotate([180,0,0]) + active_pulley(); } } } @@ -393,6 +456,9 @@ module xsled2() { } } + + + // render() // xsled2(); diff --git a/stock_parts.scad b/stock_parts.scad index 35fd58a..f06d705 100644 --- a/stock_parts.scad +++ b/stock_parts.scad @@ -60,10 +60,15 @@ module nema17(depth = 23.5) { // belts and pulleys belt_pitch = 2; // 2mm tooth width for GT2 = 2mm pitch belt_width = 6; -belt_thickness = 3; -tooth_height = 2; +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; -module pulley(teeth, lrim, urim, belt_width, shaft=5, toothed=true) { +pulley_od = 13; +pulley_clearance_rad = pulley_od / 2 + 2.5; + +module pulley(teeth, lrim, urim, belt_width, shaft=5, toothed=true, od = 0) { bom_item(printable=false, label=str( toothed ? "pulley(" : "idler(", "teeth=", teeth, ", ", @@ -73,10 +78,12 @@ module pulley(teeth, lrim, urim, belt_width, shaft=5, toothed=true) { "shaft=", shaft, "mm", ")" )); - inner_rad = belt_pitch * teeth / TAU; - outer_rad = inner_rad + belt_thickness; + nominal_rad = belt_pitch * teeth / TAU; + inner_rad = nominal_rad - belt_pld; + outer_rad = (od > 0) ? od / 2 : nominal_rad + belt_backing; minor_rad = inner_rad - tooth_height; mid_rad = inner_rad - tooth_height / 2; + idler_rad = nominal_rad - belt_backing; dtheta = 180 / teeth; @@ -105,7 +112,7 @@ module pulley(teeth, lrim, urim, belt_width, shaft=5, toothed=true) { linear_extrude(belt_width) polygon(tooth_points, convexity = teeth * 2 + 4); } else { - cylinder(r = minor_rad, h = belt_width); + cylinder(r = idler_rad, h = belt_width); } translate([0,0,lrim + belt_width]) @@ -117,4 +124,22 @@ module pulley(teeth, lrim, urim, belt_width, shaft=5, toothed=true) { } } +idler_zmargin = [ 6.4 / 2 + 1.05, 6.4 / 2 + 1.05 ]; + +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]]) + pulley(16, 1.05, 1.05, 6.4, shaft=3, toothed=toothed, od=13); +} + +active_pulley_zmargin = [ 9.5, 4.5 ]; + +module active_pulley(height=0) { + translate([0,0,-active_pulley_zmargin[0] + height]) + pulley(16,6,1,7, od=13); +} + +// required distance between centers of pulley and idler for an S-bend with right angles. +pulley_sbend_offset = (9.5 + 9.7) / 2 + 0.63; + //!pulley(12, 6, 2, toothed=false); \ No newline at end of file