// PRUSA iteration3 // X end prototype // GNU GPL v3 // Josef Průša and contributors // http://www.reprap.org/wiki/Prusa_Mendel // http://prusamendel.org // Also includes code from Wilson and Wilson2, (c) Marty Rice // https://github.com/mjrice/wilson // major issues with rev 3 // - motor side screw hole conflicts with switch / other rear mount is // inaccessible without removing the leadscrew from the nut use include pushfit_d = bushing_xy[0] * 2 + 0.2; thinwall = single_wall_width * 6; // 3 perimeters vertical_bushing_base_size = bushing_z[1]*2 + 2 * thinwall; x_box_length = 45; // TODO: auto-adjust based on bearing size? // z position of rotor shaft motor_shaft_z = 30.25; // todo: add ghost bearing model to make it easier to spot check if // everything is aligned module vertical_bushing_base(){ translate(v=[-2-vertical_bushing_base_size/4,0,x_box_height/2]) cube(size = [4+vertical_bushing_base_size/2,vertical_bushing_base_size,x_box_height], center = true); cylinder(h = x_box_height, r=vertical_bushing_base_size/2, $fn = 90); } module vertical_bushing_holes(){ // FIXME: is extra cut necessary? check conf_bushing bushing_cut_extra = 0.2; // padding so it's not too tight translate(v=[0,0,-4]) cylinder(h = x_box_height + 3, r=bushing_z[1] + bushing_cut_extra, $fn = 60); translate(v=[0,0,x_box_height-4]) cylinder(h=x_box_height,r=bushing_z[1]-1,$fn=60); // TODO: is slit too wide or too low? Wilson increased width from 1 // -> 2 mm, slit also might need to end 1-2mm before the base #rotate(a=[0,0,-50]) translate(v=[thinwall*2 + 1,0,x_box_height/2 - 2]) cube(size = [bushing_z[2]/2, 2 ,x_box_height], center = true); translate([0,0,-1]) cylinder(h=9,r1=bushing_z[1]+thinwall/2+1,r2=4,$fn=60); } module nut_trap_base () { // TODO: cube doesn't line up with edge of base, cylinder is slightly asymmetrical // adapt newer nut trap from prusa i3 mk3 instead of wilson2 cube(size=[16,21,8],center=true); translate ([2,0,0]) cylinder(h=8,r=12.5,$fn=50,center=true); } module nut_trap () { union() { // center post of brass nut cylinder(h=12,r=5.45,$fn=50,center=true); // holes for m3 screws in brass nut translate(v=[8,0,0]) cylinder(h=12,r=1.8,$fn=20,center=true); #rotate([0,0,90]) translate(v=[8,0,0]) cylinder(h=12,r=1.8,$fn=20,center=true); rotate([0,0,180]) translate(v=[8,0,0]) cylinder(h=12,r=1.8,$fn=20,center=true); #rotate([0,0,270]) translate(v=[8,0,0]) cylinder(h=12,r=1.8,$fn=20,center=true); } } // x position of edge of main block (facing frame), for attaching objects to it function x_base_back() = -10 - bushing_xy[0] - x_box_width/2; // y position of edge of main block facing away from x-axis function x_base_outside() = vertical_bushing_base_size/2; // y position of edge of main block facing toward the x-axis function x_base_inside() = -x_box_length/2 - vertical_bushing_base_size/2; // z position of motor shaft (for aligning idler pulley) function x_motor_shaft_z() = motor_shaft_z; // TODO: if it's straightforward, return vector [x,y,z]. x = x_base_inside() module x_end_base(){ // Main block translate(v=[-10 - bushing_xy[0], -x_box_length/2 + vertical_bushing_base_size/2,x_box_height/2]) cube(size = [x_box_width,x_box_length,x_box_height], center = true); // Bearing holder vertical_bushing_base(); //Nut trap translate(v=[-4+zmotor_delta_x,-17-zmotor_delta_y,4]) nut_trap_base (); } // TODO: x translation of belt and smooth rods needs to adapt to // x_end_width and motor/idler pulley position. module x_end_holes(){ vertical_bushing_holes(); // Belt hole translate(v=[-1,0,0]){ // Stress relief translate(v=[-5.5-10+1.5,-bushing_z[1]-4,30]) cube(size = [20,1,28], center = true); // Cut out for belt (this is NOT centered because the motor isn't centered) x_box_offset = -x_box_length/2 + vertical_bushing_base_size/2; difference(){ translate(v=[-5.5-10+1.5, x_box_offset ,30]) cube(size = [10, x_box_length + 1,28], center = true); // Nice edges translate(v=[-5.5-10+1.5,x_box_offset,30+23]) rotate([0,45,0]) cube(size = [10,x_box_length + 1,28], center = true); translate(v=[-5.5-10+1.5,x_box_offset,30+23]) rotate([0,-45,0]) cube(size = [10,x_box_length + 1,28], center = true); translate(v=[-5.5-10+1.5,x_box_offset,30-23]) rotate([0,45,0]) cube(size = [10,x_box_length + 1,28], center = true); translate(v=[-5.5-10+1.5,x_box_offset,30-23]) rotate([0,-45,0]) cube(size = [10,x_box_length + 1,28], center = true); } } // FIXME: confirm length of smooth rod doesn't change when x_box_length or bearing size changes // should also make sure this is long enough if x-ends somehow end up larger than 50mm // TODO: needs to shift top rod as diameter increases, wall is very // thing for 10mm, and fails entirely for 12mm translate([-10 - bushing_xy[0], 0, 0]) { // Top pushfit rod #translate([0, -41.5, 6]) rotate([-90, 0, 0]) pushfit_rod(pushfit_d, 50); // Bottom pushfit rod translate([0, -41.5, xaxis_rod_distance+6]) rotate([-90, 0, 0]) pushfit_rod(pushfit_d, 50); } // Nut trap translate(v=[zmotor_delta_x,-17-zmotor_delta_y,3]) rotate ([0, 0, 45]) nut_trap (); } // Final prototype module x_end_plain(){ difference(){ x_end_base(); x_end_holes(); } } x_end_plain(); module pushfit_rod(diameter,length){ translate([0,-0.3,0]) cylinder(h = length, r=diameter/2, $fn=30); translate([0,0.3,0]) cylinder(h = length, r=diameter/2, $fn=30); // TODO: reintroduce teardrop holes? // difference(){ // translate(v=[0,-diameter/2.85,length/2]) rotate([0,0,45]) cube(size = [diameter/2,diameter/2,length], center = true); // translate(v=[0,-diameter/4-diameter/2-0.4,length/2]) rotate([0,0,0]) cube(size = [diameter,diameter/2,length], center = true); // } }