/***************************************** Z-Axis Motor Holder replacement for the original aluminium holder. Inspired by a post of "edirol" in the Velleman Support forum. Recreated in OpenSCAD by Matthias Stolt (mstolt), 2013 The exchange of the holder improves greatly the print quality in z-axis. Before there where regular wiggles in z-axis structures that corresponds to the height of the z-axis screw. The wiggles where very regular. To assemble the construction use M3x20mm bolts with M3 nuts. To screw on the motor use M3x10mm with washer. To screw the whole assembly to the aluminium frame of the printer use M5x10mm with washer and the square nuts for the frame. I needed to enlarge the screw hole a bit, because of the z wiggles. For the german reader: Es ist ein Henne/Ei-Problem. Feel free to modify and improve this construction. Print long and prosper. ******************************************/ include printerShaftSize = 5.4; // M5 screws to connect to the printer connectorNutSize = 6.5; connectorNutHeight = 5; connectorShaftSize = 3.4; connectorShaftLength = 8; extraBreakoutHeight = 12; extraBreakoutWidth = 10; switchShaftSize = 3.4; switchShaftDistance = 10; switchMountTop = 8; switchMountLeft = 5; baseWidth = 80; baseHeight = 100; baseDeepth = 6; roundedCorner = 3; motorPlateThickness = 8; motorPlateWidth = 43; motorMountTolerance = 5; motorWingThickness = 8; motorWingHeight = 53; motorWingWidth = motorPlateWidth; motorBreakoutWidth = motorPlateWidth; motorBreakoutHeight = motorPlateWidth+10; aluProfileDeepth = 2.5; // actual deepth is 3 aluProfileMid = 12.4; // actual width is 12.4 aluProfileWidth = 8; // ******************************* // module to be printable // ******************************* Print(); translate([0,0,baseDeepth]){ rotate([0,180,0]){ // Holder(); //Plate(); } } // ******************************* // modules to show the whole construction // ******************************* // assembly(); // explosion(); // uncomment this to display the z-Stepper-Motor // showMotor=true; // ******************************* // module that are the parts of other modules //motorWing(); //motorPlate(); $fn=20; module Print(){ assign(showMotor = false){ translate([0,baseHeight/2,0]){ translate([5,0,baseDeepth]){ rotate([180,0,0]){ Plate(); } } translate([-motorPlateWidth/2 - 15,-motorPlateWidth,motorPlateThickness]){ rotate([0,180,0]){ Holder(); } } } } } module assembly(){ assign(showMotor = true){ Plate(); translate([baseWidth/2,baseHeight-motorBreakoutHeight,motorPlateWidth/2+baseDeepth]){ rotate([90,0,0]){ Holder(); } } } color("gray"){ aluFrame(); translate([baseWidth/2,20,aluProfileDeepth+4+19.5]){ // axis(); } // Axis distance block (not a real part, only to show the axis clearence) translate([baseWidth/2-10,0,aluProfileDeepth]){ // cube([20,20,20]); } // Maximal Length (to show the length beetween the lower profile and the maximum of the baseplate) translate([baseWidth/2-10,0,-10]){ // cube([20,100,9]); } } } module explosion(){ assign(showMotor = true){ Plate(); translate([baseWidth/2,baseHeight-motorBreakoutHeight,motorPlateWidth/2+baseDeepth+10]){ rotate([90,0,0]){ Holder(); } } } } module Plate(){ difference(){ // the base frame union(){ translate([roundedCorner,roundedCorner,0]){ plateWing(); translate([baseWidth/2 + motorBreakoutWidth/2,0,0]){ plateWing(); } } translate([baseWidth/2 - motorBreakoutWidth/2 - roundedCorner - 0.5 ,0,0]){ cube([motorBreakoutWidth+roundedCorner*2+1,baseHeight-motorBreakoutHeight,baseDeepth]); } } // extra cutout for the motor plate translate([baseWidth/2 - motorBreakoutWidth/2 ,baseHeight-motorBreakoutHeight-motorPlateThickness-0.5,-0.5]){ cube([motorBreakoutWidth,motorPlateThickness+1,baseDeepth+1]); } // extra cutout for the motor screwheads translate([0,baseHeight - motorBreakoutHeight - motorPlateThickness - extraBreakoutHeight,-0.5]){ translate([baseWidth/2 + motorBreakoutWidth/2 - extraBreakoutWidth, 0,0]){ cube([extraBreakoutWidth,extraBreakoutHeight+1,baseDeepth+1]); } translate([baseWidth/2 - motorBreakoutWidth/2, 0,0]){ cube([extraBreakoutWidth,extraBreakoutHeight+1,baseDeepth+1]); } } // the holes for connecting to the printer translate([baseWidth/2,8,-0.5]){ cylinder(r=printerShaftSize/2, h=baseDeepth+1); } translate([baseWidth/2,20,-0.5]){ cylinder(r=printerShaftSize/2, h=baseDeepth+1); } translate([baseWidth-(baseWidth-motorPlateWidth)/4,baseHeight-aluProfileMid/2,-0.5]){ cylinder(r=printerShaftSize/2, h=baseDeepth+1); } translate([(baseWidth-motorPlateWidth)/4,baseHeight-aluProfileMid/2,-0.5]){ cylinder(r=printerShaftSize/2, h=baseDeepth+1); } // the holes for connecting to the motor holder translate([0,motorWingWidth-18,0]){ translate([baseWidth/2-(motorPlateWidth/2)-motorWingThickness/2,baseHeight-motorBreakoutHeight,-0.5]){ cylinder(r=connectorShaftSize/2, h=baseDeepth+1,$fn=20); } translate([baseWidth/2+(motorPlateWidth/2)+motorWingThickness/2,baseHeight-motorBreakoutHeight,-0.5]){ cylinder(r=connectorShaftSize/2, h=baseDeepth+1,$fn=20); } } translate([0,0,0]){ translate([baseWidth/2-(motorPlateWidth/2)-motorWingThickness/2,baseHeight-motorBreakoutHeight+1,-0.5]){ cylinder(r=connectorShaftSize/2, h=baseDeepth+1,$fn=20); } translate([baseWidth/2+(motorPlateWidth/2)+motorWingThickness/2,baseHeight-motorBreakoutHeight+1,-0.5]){ cylinder(r=connectorShaftSize/2, h=baseDeepth+1,$fn=20); } } // holes for mounting the switch translate([switchMountLeft,switchMountTop,-0.5]){ cylinder(r=switchShaftSize/2, h=baseDeepth+1,$fn=20); } translate([switchMountLeft+switchShaftDistance,switchMountTop,-0.5]){ cylinder(r=switchShaftSize/2, h=baseDeepth+1,$fn=20); } // the alu frame passform union(){ // the vertical translate([baseWidth/2+aluProfileMid/2,-1,-1]){ cube([aluProfileWidth, baseHeight, aluProfileDeepth+1]); } translate([baseWidth/2-aluProfileWidth-aluProfileMid/2,-1,-1]){ cube([aluProfileWidth, baseHeight, aluProfileDeepth+1]); } // the horizontal translate([-1, baseHeight-aluProfileMid-aluProfileWidth,-1]){ cube([baseWidth+2 ,aluProfileWidth, aluProfileDeepth+1]); } } } } module plateWing(){ hull(){ cylinder(r=roundedCorner, h=baseDeepth, center=false, $fn=20); translate([baseWidth/2 - motorBreakoutWidth/2 - 2*roundedCorner, baseHeight - roundedCorner*2 , 0]){ cylinder(r=roundedCorner, h=baseDeepth, center=false, $fn=20); } translate([baseWidth/2 - motorBreakoutWidth/2 - 2*roundedCorner, 0, 0]){ cylinder(r=roundedCorner, h=baseDeepth, center=false, $fn=20); } translate([0, baseHeight - roundedCorner*2, 0]){ cylinder(r=roundedCorner, h=baseDeepth, center=false, $fn=20); } } } module Holder(){ motorPlate(); motorWing(); translate([-(motorPlateWidth+motorWingThickness),0,0]){ motorWing(); } } module motorPlate(){ difference(){ translate([0,0,motorPlateThickness/2]){ cube([motorPlateWidth+1,motorPlateWidth,motorPlateThickness], center=true); translate([0,-baseDeepth+aluProfileDeepth,0]){ cube([motorPlateWidth-1,motorPlateWidth,motorPlateThickness], center=true); } } translate([0,-baseDeepth/2,-1]){ linear_extrude(motorPlateThickness+2){ stepper_motor_mount(17,motorMountTolerance,showMotor); } } } } module motorWing(){ translate([motorPlateWidth/2,-motorWingWidth/2,motorPlateThickness]){ rotate([0,90,0]){ difference(){ cube([motorWingHeight-aluProfileMid,motorWingWidth,motorWingThickness]); translate([30,30,0]){ rotate([0,0,60]){ translate([0,-20,-0.5]){ cube([aluProfileMid*2,motorWingWidth*2,motorWingThickness+1]); } } } // holes for mounting translate([motorWingWidth-10,connectorShaftLength+0.5,motorWingThickness/2]){ rotate([90,0,0]){ cylinder(r=connectorShaftSize/2, h=connectorShaftLength+1,$fn=20); } } translate([connectorShaftSize+2.5+connectorNutSize/2,connectorShaftLength+0.5,motorWingThickness/2]){ rotate([90,0,0]){ cylinder(r=connectorShaftSize/2, h=connectorShaftLength+1,$fn=20); } } translate([motorWingWidth-10-connectorNutSize/2, connectorShaftLength+connectorNutHeight,-0.5]){ rotate([90,0,0]){ cube([connectorNutSize,motorWingThickness+1,connectorNutHeight]); } } translate([2.5+connectorNutSize/2, connectorShaftLength+connectorNutHeight,-0.5]){ rotate([90,0,0]){ cube([connectorNutSize,motorWingThickness+1,connectorNutHeight]); } } } } } } module aluFrame(){ } module axis(){ rotate([90,0,0]){ cylinder(r=4, h=30); } }