You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
289 lines
10 KiB
289 lines
10 KiB
9 years ago
|
// Wilson II X Ends
|
||
|
// By M. Rice
|
||
|
// GNU GPL v3
|
||
|
// Adapted from design by Josef Průša <iam@josefprusa.cz> and contributors
|
||
|
// http://www.reprap.org/wiki/Prusa_Mendel
|
||
|
// http://prusamendel.org
|
||
|
|
||
|
include <configuration.scad>
|
||
|
|
||
|
rod_distance = 50; // vertical distance between X axis smooth rods (was 45mm on original prusa i3 xends)
|
||
|
pushfit_d = 10.3; // slightly larger than the rods themselves to accomodate extrusion
|
||
|
bearing_diameter = 19; // 19=LM10UU 15=LM8UU
|
||
|
bearing_cut_extra = 0.4; // extra cut for linear bearings so they are not too tight.
|
||
|
thinwall = 3; // thickness of the wall that holds in the linear bearings
|
||
|
height = rod_distance+15;// height of the x ends
|
||
|
|
||
|
center_z = 30.25 -1;
|
||
|
tensioner_size_z = 12;
|
||
|
|
||
|
bearing_size = bearing_diameter + 2 * thinwall;
|
||
|
|
||
|
// MODULE -------------------------------------
|
||
|
module vertical_bearing_base(){
|
||
|
translate(v=[-2-bearing_size/4,0,height/2]) cube(size = [4+bearing_size/2,bearing_size,height], center = true);
|
||
|
cylinder(h = height, r=bearing_size/2, $fn = 90);
|
||
|
}
|
||
|
|
||
|
// MODULE -------------------------------------
|
||
|
module vertical_bearing_holes(){
|
||
|
#translate(v=[0,0,-4]) cylinder(h = height+3, r=bearing_diameter/2 + bearing_cut_extra, $fn = 60);
|
||
|
translate(v=[0,0,height-4]) cylinder(h=10,r=bearing_diameter/2-1,$fn=60);
|
||
|
|
||
|
// the slit cut along the vertical bearing holder for some flex
|
||
|
rotate(a=[0,0,80]) translate(v=[8,0,27]) cube(size = [10,5 ,height+13], center = true);
|
||
|
|
||
|
translate([0,0,-1]) cylinder(h=9,r1=bearing_diameter/2+thinwall/2+1,r2=4,$fn=60);
|
||
|
|
||
|
}
|
||
|
|
||
|
// MODULE -------------------------------------
|
||
|
module x_end_base(){
|
||
|
// Main block
|
||
|
height = rod_distance + 15;
|
||
|
translate(v=[-15,-10,height/2]) cube(size = [17,45,height], center = true);
|
||
|
|
||
|
// Bearing holder
|
||
|
vertical_bearing_base();
|
||
|
|
||
|
// thing to hold the brass nut
|
||
|
translate(v=[-3.5,-22,4]) cube(size=[7.8,20,8],center=true);
|
||
|
|
||
|
translate(v=[5.5,-24,4]) cylinder(h=8,r=12.5,$fn=50,center=true);
|
||
|
|
||
|
|
||
|
}
|
||
|
|
||
|
// MODULE -------------------------------------
|
||
|
module x_end_holes(){
|
||
|
vertical_bearing_holes();
|
||
|
// Belt hole
|
||
|
translate(v=[-1,0,0]){
|
||
|
// Stress relief
|
||
|
translate(v=[-5.5-10+1.5,-10-1,30]) cube(size = [20,1,28], center = true);
|
||
|
difference(){
|
||
|
translate(v=[-5.5-10+1.5,-10,30]) cube(size = [10,46,28], center = true);
|
||
|
// Nice edges
|
||
|
translate(v=[-5.5-10+1.5,-10,30+23]) rotate([0,45,0]) cube(size = [10,46,28], center = true);
|
||
|
translate(v=[-5.5-10+1.5,-10,30+23]) rotate([0,-45,0]) cube(size = [10,46,28], center = true);
|
||
|
translate(v=[-5.5-10+1.5,-10,30-23]) rotate([0,45,0]) cube(size = [10,46,28], center = true);
|
||
|
translate(v=[-5.5-10+1.5,-10,30-23]) rotate([0,-45,0]) cube(size = [10,46,28], center = true);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Bottom pushfit rod
|
||
|
translate(v=[-15,-41.5,7.5]) rotate(a=[-90,0,0]) pushfit_rod(pushfit_d,50);
|
||
|
// Top pushfit rod
|
||
|
translate(v=[-15,-41.5,rod_distance+7.5]) rotate(a=[-90,0,0]) pushfit_rod(pushfit_d,50);
|
||
|
|
||
|
// the holes for the brass nut
|
||
|
translate(v=[5.5,-24,4]) // <-- This is the offset from the smooth rod to the threaded rod (5.5,-24)
|
||
|
union() {
|
||
|
// center post of brass nut
|
||
|
cylinder(h=10,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);
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
// MODULE -------------------------------------
|
||
|
module pushfit_rod(diameter,length){
|
||
|
// intentionally making the holes oblong in the Z direction to help with binding of the X axis
|
||
|
translate([0,-0.2,0]) cylinder(h = length, r=diameter/2, $fn=30);
|
||
|
translate([0,0.2,0]) cylinder(h = length, r=diameter/2, $fn=30);
|
||
|
}
|
||
|
|
||
|
// X END IDLER -----------------------------------------------------------
|
||
|
idler_offs_z = -1; // negative here means "up" when installed
|
||
|
idler_offs_y = 7;
|
||
|
M4_head_d = 8;
|
||
|
|
||
|
module x_end_idler_base(){
|
||
|
x_end_base();
|
||
|
}
|
||
|
|
||
|
module x_end_idler_holes(){
|
||
|
x_end_holes();
|
||
|
translate([0,idler_offs_y,idler_offs_z]) {
|
||
|
translate(v=[0,-22,30.25]) {
|
||
|
translate(v=[0,0,0]) rotate(a=[0,-90,0]) cylinder(h = 80, r=idler_bearing_inner_d/2+.3, $fn=30);
|
||
|
translate(v=[6,0,0]) rotate(a=[0,-90,0]) cylinder(h = 12.5, r=M4_head_d/2+.1, $fn=30);
|
||
|
translate(v=[-22,0,0]) rotate(a=[0,-90,0]) rotate(a=[0,0,30]) cylinder(h = 80, r=idler_bearing_inner_d, $fn=6);
|
||
|
|
||
|
// create a notch for the X tensioner, to improve the length of travel available
|
||
|
translate(v=[-10,-20,1]) #difference() { rotate(a=[45,0,0]) cube(size=[30,22,22],center=true);
|
||
|
translate(v=[0,14,0]) cube(size=[31,4,8],center=true); }
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Final part
|
||
|
module x_end_idler(){
|
||
|
mirror([0,1,0]) union() {
|
||
|
difference(){
|
||
|
x_end_idler_base();
|
||
|
x_end_idler_holes();
|
||
|
}
|
||
|
|
||
|
difference() {
|
||
|
union() {
|
||
|
// added ridges to keep the tensioner from pitching
|
||
|
translate(v=[-10,1,center_z-tensioner_size_z/2 - .5]) rotate([0,0,90]) rotate([45,0,0]) cube(size=[20,1.25,1.25],center=true);
|
||
|
translate(v=[-10,1,center_z+tensioner_size_z/2 + .5]) rotate([0,0,90]) rotate([45,0,0]) cube(size=[20,1.25,1.25],center=true);
|
||
|
translate(v=[-20,1,center_z-tensioner_size_z/2 - .5]) rotate([0,0,90]) rotate([45,0,0]) cube(size=[20,1.25,1.25],center=true);
|
||
|
translate(v=[-20,1,center_z+tensioner_size_z/2 + .5]) rotate([0,0,90]) rotate([45,0,0]) cube(size=[20,1.25,1.25],center=true);
|
||
|
}
|
||
|
#translate(v=[0,0,-4]) cylinder(h = height+3, r=bearing_diameter/2 + bearing_cut_extra, $fn = 60);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// X END MOTOR ------------------------------------------------------------
|
||
|
offs_adjuster_y = 5.5;
|
||
|
adj_block_x = 12;
|
||
|
adj_block_y = 10;
|
||
|
adj_block_z = 32;
|
||
|
motor_offs_z = 0;
|
||
|
screw_head_r = 3.5;
|
||
|
|
||
|
module adjustomatic() { // small holder for a M3 screw pointing down toward the Z endstop
|
||
|
|
||
|
difference() {
|
||
|
translate(v=[-(15+17/2+adj_block_x/2),offs_adjuster_y,height-adj_block_z/2])
|
||
|
cube(size=[adj_block_x,adj_block_y,adj_block_z],center=true);
|
||
|
|
||
|
translate(v=[-(15+17/2+adj_block_x/2)-5,offs_adjuster_y,height-adj_block_z/2-8])
|
||
|
rotate([0,-30,0]) cube(size=[adj_block_x,adj_block_y+2,adj_block_z],center=true);
|
||
|
|
||
|
translate(v=[-(15+17/2+adj_block_x/2-1),offs_adjuster_y,height-adj_block_z/2-3])
|
||
|
cube(size=[adj_block_x,adj_block_y-2,adj_block_z-2],center=true);
|
||
|
|
||
|
translate(v=[-(15+17/2+adj_block_x/2),offs_adjuster_y,height-adj_block_z/2+14])
|
||
|
{
|
||
|
rotate([0,0,30]) #cylinder(h = 4, r = 7.5/2 , $fn = 6);
|
||
|
translate([0,0,-20]) #cylinder(h=30,r=2,$fn=16);
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
// the endstop mount will be translated by this much (negative values mean it moves away
|
||
|
// from the motor and toward the X carriage, giving more room for leads and also extra space
|
||
|
// for the auto bedleveling servo housing which is on this side of the extruder):
|
||
|
endstop_sw_offs_adjust = -5;
|
||
|
|
||
|
module pocket_endstop() // endstop holder grafted onto the side toward the rods
|
||
|
{
|
||
|
translate([-7,-50,0])
|
||
|
union() {
|
||
|
// angled wall that attaches to the endstop holder
|
||
|
translate([-1,18,0]) rotate([0,0,-30]) cube(size=[8.5,2,22]);
|
||
|
// little bit of extra support at the bottom corner
|
||
|
translate([-1.5,15.,2]) rotate([0,90,0]) cube(size=[2,3,10]);
|
||
|
|
||
|
difference() {
|
||
|
translate([-1.5,endstop_sw_offs_adjust,0]) cube(size=[9,20.5,22]);
|
||
|
|
||
|
translate([-2,endstop_sw_offs_adjust,1]) cube(size=[7,21,22]);
|
||
|
#translate([0,15.5,8]) cube(size=[10,5,20]);
|
||
|
|
||
|
// screw holes for endstop switch
|
||
|
translate([-2,7+endstop_sw_offs_adjust,1.5+5.5]) rotate([0,90,0]) cylinder(r=1.5,h=15);
|
||
|
translate([-2,7+endstop_sw_offs_adjust,1.5+5.5+9.5]) rotate([0,90,0]) cylinder(r=1.5,h=15);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
module x_end_motor_base(){
|
||
|
x_end_base();
|
||
|
// motor arm
|
||
|
translate(v=[-15,31,26.5+motor_offs_z]) cube(size = [17,44,53], center = true);
|
||
|
// z stop adjuster
|
||
|
adjustomatic();
|
||
|
// x endstop holder
|
||
|
pocket_endstop();
|
||
|
|
||
|
}
|
||
|
|
||
|
module x_end_motor_holes(){
|
||
|
x_end_holes();
|
||
|
// Position to place
|
||
|
translate(v=[-1,32,30.25+motor_offs_z]){
|
||
|
// Belt hole
|
||
|
translate(v=[-14,1,0]) cube(size = [10,46,22], center = true);
|
||
|
// Motor mounting holes
|
||
|
translate(v=[20,-15.5,-15.5]) rotate(a=[0,-90,0]) rotate(a=[0,0,90]) cylinder(h = 70, r=1.8, $fn=30);
|
||
|
translate(v=[1,-15.5,-15.5]) rotate(a=[0,-90,0]) rotate(a=[0,0,90]) cylinder(h = 12, r=screw_head_r, $fn=30);
|
||
|
|
||
|
|
||
|
translate(v=[20,-15.5,15.5]) rotate(a=[0,-90,0]) rotate(a=[0,0,90]) cylinder(h = 70, r=1.8, $fn=30);
|
||
|
translate(v=[1,-15.5,15.5]) rotate(a=[0,-90,0]) rotate(a=[0,0,90]) cylinder(h = 12, r=screw_head_r, $fn=30);
|
||
|
|
||
|
|
||
|
translate(v=[20,15.5,-15.5]) rotate(a=[0,-90,0]) rotate(a=[0,0,90]) cylinder(h = 70, r=1.8, $fn=30);
|
||
|
translate(v=[1,15.5,-15.5]) rotate(a=[0,-90,0]) rotate(a=[0,0,90]) cylinder(h = 12, r=screw_head_r, $fn=30);
|
||
|
|
||
|
|
||
|
translate(v=[20,15.5,15.5]) rotate(a=[0,-90,0]) rotate(a=[0,0,90]) cylinder(h = 70, r=1.8, $fn=30);
|
||
|
translate(v=[1,15.5,15.5]) rotate(a=[0,-90,0]) rotate(a=[0,0,90]) cylinder(h = 12, r=screw_head_r, $fn=30);
|
||
|
|
||
|
// Material saving cutout
|
||
|
translate(v=[-10,12,10]) cube(size = [60,42,42], center = true);
|
||
|
|
||
|
// Material saving cutout
|
||
|
translate(v=[-10,40,-30]) rotate(a=[45,0,0]) cube(size = [60,42,42], center = true);
|
||
|
// Motor shaft cutout
|
||
|
translate(v=[0,0,0]) rotate(a=[0,-90,0]) rotate(a=[0,0,90]) cylinder(h = 70, r=17, $fn=6);
|
||
|
|
||
|
// zip tie retainer for securing end stop wiring
|
||
|
translate([-5,-63,16]) difference() { cylinder(r=4.5,h=4,$fn=16);
|
||
|
translate([0,0,-1]) cylinder(r=2.5,h=7,$fn=16);
|
||
|
}
|
||
|
|
||
|
#translate([-5,-48,34]) rotate([90,0,0]) difference() { cylinder(r=4.5,h=4,$fn=16,center=true);
|
||
|
translate([0,0,-1]) cylinder(r=2.5,h=7,$fn=16,center=true);
|
||
|
}
|
||
|
|
||
|
|
||
|
}
|
||
|
}
|
||
|
|
||
|
module x_end_motor_sr() {
|
||
|
difference() {
|
||
|
cube(size=[8,12,10]);
|
||
|
#translate([4,11.5,9]) rotate([0,90,0])
|
||
|
difference() { cylinder(r=4.5,h=4,$fn=16,center=true);
|
||
|
translate([0,0,-1]) cylinder(r=2.5,h=7,$fn=16,center=true);
|
||
|
}
|
||
|
|
||
|
#translate([9,10.6,10]) rotate([0,45,90]) cube(size=[2,11,2]);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Final part
|
||
|
module x_end_motor(){
|
||
|
difference(){
|
||
|
x_end_motor_base();
|
||
|
x_end_motor_holes();
|
||
|
}
|
||
|
// strain relief (zip tie point) below the motor
|
||
|
translate([-23.5,9,53]) x_end_motor_sr();
|
||
|
|
||
|
}
|
||
|
|
||
|
// Make parts
|
||
|
//x_end_idler();
|
||
|
translate([40,0,0]) rotate([0,0,180]) x_end_motor();
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|