pull/26/merge
Arne Durr 2014-12-08 12:41:02 +00:00
commit 6c2e0b8582
12 changed files with 32778 additions and 484 deletions

View File

@ -7,33 +7,30 @@
use <libs/linear_bearing.scad>
module Cyclone_X_carriage() {
linearBearingModel = "LM8UU";
linearBearingLength = linearBearing_L(linearBearingModel);
linearBearingDiameter = linearBearing_D(linearBearingModel);
linearBearingLength = linearBearing_L(X_linearBearingModel);
linearBearingDiameter = linearBearing_D(X_linearBearingModel);
// Correction is needed to account for 3D printer tolerances
axes_effective_Xsmooth_separation = axes_Xsmooth_separation-0.5;
linearBearingSeparation = 0;
axes_effective_Xsmooth_separation = axes_Xsmooth_separation-axes_Xsmooth_separation_tolerance;
sideExtensions = linearBearingDiameter/3+2;
ZrodHolderLength = 30;
screwSize = 3; // M3, M4, etc (integers only)
screwSize = X_carriage_screwSize;
screwLength = linearBearingDiameter+sideExtensions;
screwAditionalLength = 2;
screwExtension = screwSize*1.2;
linearBearingLengthExtension = 6+max(axes_Zsmooth_rodD+axes_Zsmooth_separation-2*linearBearingLength-linearBearingSeparation, linearBearingSeparation);
linearBearingLengthExtension = 6+max(axes_Zsmooth_rodD+axes_Zsmooth_separation-2*linearBearingLength-X_linearBearingSeparation, X_linearBearingSeparation);
dimX = 2*linearBearingLength+linearBearingLengthExtension;
module Cyclone_XsubPart_ZnutHolder(holes=false) {
rod_nut_len = 0.8*axes_Zthreaded_rodD;
rodTolerance = 0.5;
rodSize = 8; // M3, M4, etc (integers only)
rodTolerance = X_threaded_rod_Tolerance;
rodSize = Z_threaded_rodNutSize; // M3, M4, etc (integers only)
dimZ = rod_nut_len+3; // Nut holder thickness
if(!holes) {
@ -55,21 +52,18 @@ module Cyclone_X_carriage() {
module Cyclone_XsubPart_XnutHolder(holes=false) {
rod_nut_len = 0.8*axes_Xthreaded_rodD;
rodTolerance = 0.5;
rodSize = 8; // M3, M4, etc (integers only)
washer_D = 15.8-0.5;
washer_thickness = 1.6-0.9;
rodSize = X_threaded_rodNutSize; // M3, M4, etc (integers only)
washer_D = X_backlash_washer_D;
washer_thickness = X_backlash_washer_thickness;
holderExtension = 10;
armWidth = axes_Xthreaded_rodD*2+6;
armThickness = 30;
if(!holes) {
// Main shape
translate([armThickness/2,0,-axes_effective_Xsmooth_separation/2+holderExtension])
rotate([0,90,0]) bcube([axes_effective_Xsmooth_separation,armWidth,armThickness], cr=3,cres=10);
translate([X_backlash_armThickness/2,0,-axes_effective_Xsmooth_separation/2+holderExtension])
rotate([0,90,0]) bcube([axes_effective_Xsmooth_separation,armWidth,X_backlash_armThickness], cr=3,cres=10);
*translate([32/2,0,0])
rotate([180,0,0]) rotate([0,0,90]) Cyclone_YsubPart_nutHolder();
} else {
@ -89,12 +83,12 @@ module Cyclone_X_carriage() {
}
// Hole for the sliding nut
translate([0,-rod_nut_len-3-washer_thickness/2,0]) hull() {
rotate([0,180,0]) hole_for_nut(size=rodSize,nutAddedLen=armThickness,captiveLen=axes_Xthreaded_rodD*3,rot=90,tolerance=0.3);
rotate([0,180,0]) hole_for_nut(size=rodSize,nutAddedLen=X_backlash_armThickness,captiveLen=axes_Xthreaded_rodD*3,rot=90,tolerance=0.3);
translate([0,-2.25,0])
rotate([0,180,0]) hole_for_nut(size=rodSize,nutAddedLen=armThickness,captiveLen=axes_Xthreaded_rodD*3,rot=90,tolerance=0.3);
rotate([0,180,0]) hole_for_nut(size=rodSize,nutAddedLen=X_backlash_armThickness,captiveLen=axes_Xthreaded_rodD*3,rot=90,tolerance=0.3);
}
// Hole for the rod
rotate([0,180,0])hole_for_nut(size=rodSize-2,nutAddedLen=armThickness,captiveLen=axes_Xthreaded_rodD*3,rot=90,tolerance=0.1);
rotate([0,180,0])hole_for_nut(size=rodSize-2,nutAddedLen=X_backlash_armThickness,captiveLen=axes_Xthreaded_rodD*3,rot=90,tolerance=0.1);
}
// Hole for the washer
translate([rod_nut_len/2+3+1,0,0]) rotate([0,0,-90]) rotate([180,0,0])
@ -116,25 +110,23 @@ module Cyclone_X_carriage() {
translate([2,0,0])
rotate([0,0,-90]) hole_for_nut(size=rodSize-2,nutAddedLen=0,captiveLen=axes_Xthreaded_rodD*3,rot=90,tolerance=0.1);
}
*translate([armThickness+0.01,0,0])
rotate([0,0,-90]) hole_for_nut(size=rodSize-2,nutAddedLen=armThickness,captiveLen=axes_Xthreaded_rodD*3,rot=90,tolerance=0.1);
*translate([X_backlash_armThickness+0.01,0,0])
rotate([0,0,-90]) hole_for_nut(size=rodSize-2,nutAddedLen=X_backlash_armThickness,captiveLen=axes_Xthreaded_rodD*3,rot=90,tolerance=0.1);
}
}
module Cyclone_XsubPart_XnutHolder_SINGLE_NUT(holes=false) {
rod_nut_len = 0.8*axes_Xthreaded_rodD;
rodTolerance = 0.5;
rodSize = 8; // M3, M4, etc (integers only)
washer_D = 15.8;
washer_thickness = 1.6;
rodSize = X_threaded_rodNutSize; // M3, M4, etc (integers only)
washer_D = X_backlash_washer_D;
armWidth = axes_Xthreaded_rodD*2+5;
armThickness = rod_nut_len*2;
X_backlash_armThickness = rod_nut_len*2;
if(!holes) {
translate([armThickness/2,0,-axes_effective_Xsmooth_separation/2+washer_D/2])
rotate([0,90,0]) bcube([axes_effective_Xsmooth_separation,armWidth,armThickness], cr=3,cres=10);
translate([X_backlash_armThickness/2,0,-axes_effective_Xsmooth_separation/2+washer_D/2])
rotate([0,90,0]) bcube([axes_effective_Xsmooth_separation,armWidth,X_backlash_armThickness], cr=3,cres=10);
} else {
if(draw_references) %frame();
translate([-0.01+rod_nut_len/2+6,0,0])
@ -143,8 +135,8 @@ module Cyclone_X_carriage() {
translate([2,0,0])
rotate([0,0,-90]) hole_for_nut(size=6,nutAddedLen=0,captiveLen=axes_Xthreaded_rodD*3,rot=90,tolerance=0.1);
}
translate([armThickness+0.01,0,0])
rotate([0,0,-90]) hole_for_nut(size=6,nutAddedLen=armThickness,captiveLen=axes_Xthreaded_rodD*3,rot=90,tolerance=0.1);
translate([X_backlash_armThickness+0.01,0,0])
rotate([0,0,-90]) hole_for_nut(size=6,nutAddedLen=X_backlash_armThickness,captiveLen=axes_Xthreaded_rodD*3,rot=90,tolerance=0.1);
}
}
@ -178,10 +170,10 @@ module Cyclone_X_carriage() {
rotate([0,90,0])
bcube([linearBearingDiameter+sideExtensions,linearBearingDiameter+screwExtension, dimX], cr=3, cres=5);
// Bottom right screw
translate([-linearBearingLength/2-linearBearingSeparation/2,0,-linearBearingDiameter/2-screwExtension/2])
translate([-linearBearingLength/2-X_linearBearingSeparation/2,0,-linearBearingDiameter/2-screwExtension/2])
rotate([90,0,0]) cylinder(r=screwSize*2,h=screwLength, center=true, $fn=6);
// Bottom left screw
translate([linearBearingLength/2+linearBearingSeparation/2,0,-linearBearingDiameter/2-screwExtension/2])
translate([linearBearingLength/2+X_linearBearingSeparation/2,0,-linearBearingDiameter/2-screwExtension/2])
rotate([90,0,0]) cylinder(r=screwSize*2,h=screwLength, center=true, $fn=6);
// Top screw
translate([0,axes_effective_Xsmooth_separation+screwExtension/2+linearBearingDiameter/2,axes_effective_Xsmooth_separation])
@ -211,25 +203,25 @@ module Cyclone_X_carriage() {
// ----- Holes for the linear bearings ------
// Bottom right linear bearing
translate([-linearBearingLength/2-linearBearingSeparation/2,0,0])
rotate([0,0,90]) linearBearingHole(model=linearBearingModel, lateralExtension=sideExtensions*2+screwExtension*2, lengthExtension=linearBearingLengthExtension);
translate([-linearBearingLength/2-X_linearBearingSeparation/2,0,0])
rotate([0,0,90]) linearBearingHole(model=X_linearBearingModel, lateralExtension=sideExtensions*2+screwExtension*2, pressureFitTolerance=LinearBearingPressureFitTolerance, lengthExtension=linearBearingLengthExtension);
// Bottom left linear bearing
translate([linearBearingLength/2+linearBearingSeparation/2,0,0])
rotate([0,0,90]) linearBearingHole(model=linearBearingModel, lateralExtension=sideExtensions*2+screwExtension*2, lengthExtension=linearBearingLengthExtension);
translate([linearBearingLength/2+X_linearBearingSeparation/2,0,0])
rotate([0,0,90]) linearBearingHole(model=X_linearBearingModel, lateralExtension=sideExtensions*2+screwExtension*2, pressureFitTolerance=LinearBearingPressureFitTolerance, lengthExtension=linearBearingLengthExtension);
// Top linear bearing
translate([0,axes_effective_Xsmooth_separation,axes_effective_Xsmooth_separation])
rotate([90,0,0]) rotate([0,0,90]) linearBearingHole(model=linearBearingModel, lateralExtension=sideExtensions*2+screwExtension*2, lengthExtension=linearBearingLength+linearBearingLengthExtension+linearBearingSeparation);
rotate([90,0,0]) rotate([0,0,90]) linearBearingHole(model=X_linearBearingModel, lateralExtension=sideExtensions*2+screwExtension*2, pressureFitTolerance=LinearBearingPressureFitTolerance, lengthExtension=linearBearingLength+linearBearingLengthExtension+X_linearBearingSeparation);
// ----- Holes for the screws ------
// Bottom right screw
translate([-linearBearingLength/2-linearBearingSeparation/2,-screwLength/2-screwAditionalLength/2,-linearBearingDiameter/2-screwExtension/2])
rotate([0,0,180]) hole_for_screw(size=screwSize,length=screwLength+screwAditionalLength,nutDepth=0,nutAddedLen=0,captiveLen=0);
translate([-linearBearingLength/2-X_linearBearingSeparation/2,-screwLength/2-screwAditionalLength/2,-linearBearingDiameter/2-screwExtension/2])
rotate([0,0,180]) hole_for_screw(size=screwSize,length=screwLength+screwAditionalLength,nutDepth=0,nutAddedLen=0,captiveLen=0,tolerance=screwHoleTolerance);
// Bottom left screw
translate([linearBearingLength/2+linearBearingSeparation/2,-screwLength/2-screwAditionalLength/2,-linearBearingDiameter/2-screwExtension/2])
rotate([0,0,180]) hole_for_screw(size=screwSize,length=screwLength+screwAditionalLength,nutDepth=0,nutAddedLen=0,captiveLen=0);
translate([linearBearingLength/2+X_linearBearingSeparation/2,-screwLength/2-screwAditionalLength/2,-linearBearingDiameter/2-screwExtension/2])
rotate([0,0,180]) hole_for_screw(size=screwSize,length=screwLength+screwAditionalLength,nutDepth=0,nutAddedLen=0,captiveLen=0,tolerance=screwHoleTolerance);
// Top screw
translate([0,axes_effective_Xsmooth_separation+screwExtension/2+linearBearingDiameter/2,axes_effective_Xsmooth_separation+screwLength/2+screwAditionalLength/2])
rotate([90,0,0]) hole_for_screw(size=screwSize,length=screwLength+screwAditionalLength,nutDepth=0,nutAddedLen=0,captiveLen=0);
rotate([90,0,0]) hole_for_screw(size=screwSize,length=screwLength+screwAditionalLength,nutDepth=0,nutAddedLen=0,captiveLen=0,tolerance=screwHoleTolerance);
// ----- Hole for the Z nut ------
translate([0,axes_Zreference_posY+axes_ZthreadedReference_posY,axes_effective_Xsmooth_separation+(linearBearingDiameter+sideExtensions)/2])
@ -250,9 +242,8 @@ module Cyclone_X_carriage() {
}
}
// Draw linear bearings
rotate([0,90,0]) linearBearing_single(model=linearBearingModel, echoPart=true);
rotate([0,-90,0]) linearBearing_single(model=linearBearingModel, echoPart=true);
rotate([0,90,0]) linearBearing_single(model=X_linearBearingModel, echoPart=true);
rotate([0,-90,0]) linearBearing_single(model=X_linearBearingModel, echoPart=true);
translate([linearBearingLength/2,axes_effective_Xsmooth_separation,axes_effective_Xsmooth_separation])
rotate([0,-90,0]) linearBearing_single(model=linearBearingModel, echoPart=true);
rotate([0,-90,0]) linearBearing_single(model=X_linearBearingModel, echoPart=true);
}

View File

@ -4,80 +4,75 @@
// License: CC BY-SA 4.0 (Attribution-ShareAlike 4.0 International, http://creativecommons.org/licenses/by-sa/4.0/)
// Designed with http://www.openscad.org/
X_motorModel = Nema17;
Xmotor_sideLen = lookup(NemaSideSize, X_motorModel); //42.20;
axes_XgearRatio = X_motorGearRatio/X_rodGearRatio; // Number of tooth (motor/rod)
Xmotor_sideLen = 42.20;
axes_XgearSeparation = 37;
axes_XgearRatio = 21/21; // Number of tooth (motor/rod)
axes_XgearThickness = 10;
X_frames_additional_thickness = 5;
module Cyclone_X_rightFrame() {
scale([-1,1,1]) Cyclone_X_leftFrame(isLeft=false);
module Cyclone_X_leftFrame() {
scale([-1,1,1]) Cyclone_X_rightFrame(isLeft=true);
}
include <libs/MCAD/stepper.scad>
module Cyclone_X_leftFrame(isLeft=true) {
module Cyclone_X_rightFrame(isLeft=false) {
footThickness = X_frame_footThickness;
corner_radius = X_frame_corner_radius;
frameFrontalThickness = X_frame_FrontalThickness;
screwSize = 3; // M3, M4, etc (integers only)
footScrewSize = X_Frame_footScrewSize;
rodScrewSize = X_Frame_rodScrewSize;
motorWallSeparation = 5;
motorRotatedOffset = 5;
gearWallSeparation = 5;
motorWallSeparation = X_motorWallSeparation;
motorRotatedOffset = X_motorRotatedOffset;
gearWallSeparation = X_gearWallSeparation;
partThickness = X_frames_additional_thickness+screwSize*2;
partThickness = X_frames_additional_thickness+rodScrewSize*2;
dimX = partThickness;
dimY = max(-axes_Xreference_posY,axes_Xsmooth_separation+axes_XgearSeparation*cos(motorRotatedOffset)+Xmotor_sideLen/2+1.6);
dimZ = axes_Yreference_height+axes_Xreference_height+axes_Xsmooth_separation;
footSeparation = screwSize*3;
footThickness = 10;
footSeparation = footScrewSize*3;
footWidth = dimX+2*footSeparation;
bearingDepth = 3;
corner_radius = 10;
rod_nut_len = 0.8*axes_Xthreaded_rodD;
module Cyclone_XsubPart_gearCover() {
margin = 4;
rodGearAddedMargin = 0;
margin = gearCover_margin;
rodGearAddedMargin = rodGearAddedgearCover_margin;
effectiveXgearSeparation = axes_XgearSeparation+0.5;
wallThickness = 0.4*4;
screwHeadSpaceHeight = 4;
screwHeadSpaceDiam = 6;
coverHeight = 16;
coverExtraHeight = 5;
coverExtraRadius = -7;
nema_screw_separation = lookup(NemaDistanceBetweenMountingHoles, Nema17);
truncationAngle = 10;
motorGearRadius = axes_XgearSeparation/(1+axes_XgearRatio)+margin;
rodGearRadius = axes_XgearSeparation/(1+1/axes_XgearRatio)+margin+rodGearAddedMargin;
wallThickness = gearCover_wallThickness;
screwHeadSpaceHeight = gearCover_screwHeadSpaceHeight;
screwHeadSpaceDiam = gearCover_screwHeadSpaceDiam;
coverHeight = gearCoverHeight;
coverExtraHeight = gearCoverExtraHeight;
coverExtraRadius = gearCoverExtraRadius;
nema_screw_separation = lookup(NemaDistanceBetweenMountingHoles, X_motorModel);
truncationAngle = gearCover_truncationAngle;
motorGearRadius = axes_XgearSeparation/(1+axes_XgearRatio)+gearCover_margin;
rodGearRadius = axes_XgearSeparation/(1+1/axes_XgearRatio)+gearCover_margin+rodGearAddedgearCover_margin;
difference() {
union() {
// Cover for the rod gear
rotate([0,90,0])
cylinder(r=rodGearRadius+wallThickness, h=coverHeight);
cylinder(r=rodGearRadius+gearCover_wallThickness, h=coverHeight);
translate([coverHeight,0,0])
rotate([0,90,0])
cylinder(r1=rodGearRadius+wallThickness, r2=rodGearRadius+wallThickness+coverExtraRadius, h=coverExtraHeight+wallThickness);
cylinder(r1=rodGearRadius+gearCover_wallThickness, r2=rodGearRadius+gearCover_wallThickness+coverExtraRadius, h=coverExtraHeight+gearCover_wallThickness);
// Translate to motor position
rotate([motorRotatedOffset,0,0]) {
translate([0,effectiveXgearSeparation,0])
rotate([-motorRotatedOffset,0,0]) {
// Cover for the motor gear
rotate([0,90,0]) cylinder(r=motorGearRadius+wallThickness, h=coverHeight);
rotate([0,90,0]) cylinder(r=motorGearRadius+gearCover_wallThickness, h=coverHeight);
translate([coverHeight,0,0])
rotate([0,90,0]) cylinder(r1=motorGearRadius+wallThickness, r2=motorGearRadius+wallThickness+coverExtraRadius, h=coverExtraHeight+wallThickness);
rotate([0,90,0]) cylinder(r1=motorGearRadius+gearCover_wallThickness, r2=motorGearRadius+gearCover_wallThickness+coverExtraRadius, h=coverExtraHeight+gearCover_wallThickness);
// Cylinder for the support screw
translate([0,-nema_screw_separation/2,nema_screw_separation/2])
rotate([0,90,0]) cylinder(r=screwHeadSpaceDiam/2+wallThickness, h=coverHeight);
rotate([0,90,0]) cylinder(r=gearCover_screwHeadSpaceDiam/2+gearCover_wallThickness, h=coverHeight);
}
}
}
@ -85,7 +80,7 @@ module Cyclone_X_leftFrame(isLeft=true) {
union() {
// Truncation for avoiding collisions with Y carriage (needed for the Y gear cover)
translate([0,-rodGearRadius/2,-rodGearRadius-0.5])
rotate([0,90+truncationAngle,0]) cube(rodGearRadius);
rotate([0,90+gearCover_truncationAngle,0]) cube(rodGearRadius);
// Hole for the rod gear
rotate([0,90,0])
cylinder(r=rodGearRadius, h=coverHeight);
@ -93,7 +88,7 @@ module Cyclone_X_leftFrame(isLeft=true) {
rotate([0,90,0])
cylinder(r1=rodGearRadius, r2=rodGearRadius+coverExtraRadius, h=coverExtraHeight);
rotate([0,90,0])
cylinder(r=rodGearRadius+coverExtraRadius, h=coverHeight+coverExtraHeight+wallThickness+0.1);
cylinder(r=rodGearRadius+coverExtraRadius, h=coverHeight+coverExtraHeight+gearCover_wallThickness+0.1);
// Translate to motor position
rotate([motorRotatedOffset,0,0]) {
translate([0,effectiveXgearSeparation,0])
@ -104,40 +99,39 @@ module Cyclone_X_leftFrame(isLeft=true) {
rotate([0,90,0]) cylinder(r=motorGearRadius, h=coverHeight);
translate([coverHeight-0.02,0,0])
rotate([0,90,0]) cylinder(r1=motorGearRadius, r2=motorGearRadius+coverExtraRadius, h=coverExtraHeight);
rotate([0,90,0]) cylinder(r=motorGearRadius+coverExtraRadius, h=coverHeight+coverExtraHeight+wallThickness+0.1);
rotate([0,90,0]) cylinder(r=motorGearRadius+coverExtraRadius, h=coverHeight+coverExtraHeight+gearCover_wallThickness+0.1);
// Outer hole for the support screw
translate([0,-nema_screw_separation/2,nema_screw_separation/2])
rotate([0,90,0]) cylinder(r=screwHeadSpaceDiam/2, h=coverHeight+coverExtraHeight*2);
rotate([0,90,0]) cylinder(r=gearCover_screwHeadSpaceDiam/2, h=coverHeight+coverExtraHeight*2);
}
// Support screw holder
translate([0,-nema_screw_separation/2,nema_screw_separation/2])
rotate([0,90,0]) cylinder(r=screwHeadSpaceDiam/2+wallThickness, h=wallThickness);
rotate([0,90,0]) cylinder(r=gearCover_screwHeadSpaceDiam/2+gearCover_wallThickness, h=gearCover_wallThickness);
}
// Inner hole for the support screw
translate([0,-nema_screw_separation/2,nema_screw_separation/2])
rotate([0,90,0]) cylinder(r=(screwSize+1)/2, h=coverHeight+0.1);
rotate([0,90,0]) cylinder(r=(gearCover_screwHeadSpaceDiam+1)/2, h=coverHeight+0.1);
// Holes for the other three screws
translate([0,nema_screw_separation/2,nema_screw_separation/2])
rotate([0,90,0]) cylinder(r=screwHeadSpaceDiam/2, h=screwHeadSpaceHeight/2);
translate([screwHeadSpaceHeight/2,nema_screw_separation/2,nema_screw_separation/2])
rotate([0,90,0]) sphere(r=screwHeadSpaceDiam/2);
rotate([0,90,0]) cylinder(r=gearCover_screwHeadSpaceDiam/2, h=gearCover_screwHeadSpaceHeight/2);
translate([gearCover_screwHeadSpaceHeight/2,nema_screw_separation/2,nema_screw_separation/2])
rotate([0,90,0]) sphere(r=gearCover_screwHeadSpaceDiam/2);
translate([0,nema_screw_separation/2,-nema_screw_separation/2])
rotate([0,90,0]) cylinder(r=screwHeadSpaceDiam/2, h=screwHeadSpaceHeight/2);
translate([screwHeadSpaceHeight/2,nema_screw_separation/2,-nema_screw_separation/2])
rotate([0,90,0]) sphere(r=screwHeadSpaceDiam/2);
rotate([0,90,0]) cylinder(r=gearCover_screwHeadSpaceDiam/2, h=gearCover_screwHeadSpaceHeight/2);
translate([gearCover_screwHeadSpaceHeight/2,nema_screw_separation/2,-nema_screw_separation/2])
rotate([0,90,0]) sphere(r=gearCover_screwHeadSpaceDiam/2);
translate([0,-nema_screw_separation/2,-nema_screw_separation/2])
rotate([0,90,0]) cylinder(r=screwHeadSpaceDiam/2, h=screwHeadSpaceHeight/2);
translate([screwHeadSpaceHeight/2,-nema_screw_separation/2,-nema_screw_separation/2])
rotate([0,90,0]) sphere(r=screwHeadSpaceDiam/2);
rotate([0,90,0]) cylinder(r=gearCover_screwHeadSpaceDiam/2, h=gearCover_screwHeadSpaceHeight/2);
translate([gearCover_screwHeadSpaceHeight/2,-nema_screw_separation/2,-nema_screw_separation/2])
rotate([0,90,0]) sphere(r=gearCover_screwHeadSpaceDiam/2);
}
}
}
}
}
module Cyclone_X_endstopHolder(holes=false) {
// Endstop holder
translate([-partThickness-0.04,19,-5+axes_Xsmooth_separation])
@ -151,7 +145,6 @@ module Cyclone_X_leftFrame(isLeft=true) {
// Crocodile clip holders and wire guide
module Cyclone_X_frameHoles() {
frameFrontalThickness = 15;
holeWidth = dimY/2;
holeHeight = dimZ-footThickness-axes_Xsmooth_separation-27;
@ -190,7 +183,7 @@ module Cyclone_X_leftFrame(isLeft=true) {
SingleCrocodileClipHolder();
}
}
if(!isLeft) {
if(isLeft) {
// Wire slot
translate([wireSlotDepth-dimX, dimY-frameFrontalThickness-wireSlotSeparation-wireSlotThicknessSlim/2, dimZ/2+0.01]) {
translate([-wireSlotDepth,0,0])
@ -206,7 +199,6 @@ module Cyclone_X_leftFrame(isLeft=true) {
}
}
difference() {
// Main block
union() {
@ -214,14 +206,14 @@ module Cyclone_X_leftFrame(isLeft=true) {
cube([dimX,dimY,dimZ-axes_Xsmooth_separation]);
translate([-footWidth/2+dimX,dimY/2,footThickness/2]) bcube([footWidth,dimY,footThickness], cr=corner_radius, cres=10);
}
rodHolder(rodD=axes_Ysmooth_rodD, screwSize=screwSize, height=axes_Yreference_height, sideLen=-axes_Xreference_posX-1);
rodHolder(rodD=axes_Ysmooth_rodD, screwSize=rodScrewSize, height=axes_Yreference_height, sideLen=-axes_Xreference_posX-1);
// TRANSLATE REFERENCE POSITION to the left frame, X lower smooth rod end
translate([-axes_Xreference_posX,axes_Xreference_posY,axes_Xreference_height]) {
// TRANSLATE REFERENCE POSITION to the threaded rod
translate([-0.01,axes_Xsmooth_separation,0]) {
rotate([0,-90,0])
color(color_stillPart) cylinder(r=axes_Xsmooth_separation,h=partThickness);
if(!isLeft)
if(isLeft)
Cyclone_X_endstopHolder(holes=false);
}
}
@ -232,7 +224,7 @@ module Cyclone_X_leftFrame(isLeft=true) {
rotate([0,0,90]) standard_rod(diam=axes_Xsmooth_rodD, length=partThickness*4, threaded=false, renderPart=true, center=true);
rotate([0,0,-90])
rotate([0,90,0])
rodHolder(rodD=axes_Xsmooth_rodD, screwSize=screwSize, negative=true);
rodHolder(rodD=axes_Xsmooth_rodD, screwSize=rodScrewSize, negative=true);
// Crocodile clip holders and wire guide
Cyclone_X_frameHoles();
@ -240,23 +232,23 @@ module Cyclone_X_leftFrame(isLeft=true) {
translate([+0.01,axes_Xsmooth_separation,0]) {
// Rod radial bearing hole
rotate([0,-90,0]) bearingHole(depth=bearingDepth, thickness=partThickness);
rotate([0,-90,0]) bearingHole(depth=X_threaded_rod_bearingDepth, thickness=partThickness);
// Translate to motor position
if(isLeft)
if(!isLeft)
translate([-motorWallSeparation,0,0])
rotate([motorRotatedOffset,0,0])
translate([0,axes_XgearSeparation,0])
rotate([-motorRotatedOffset,0,0])
rotate([0,90,0]) stepperMotor_mount(motorWallSeparation, sideLen=Xmotor_sideLen, slideOut=true);
// Endstop holder
if(!isLeft)
if(isLeft)
Cyclone_X_endstopHolder(holes=true);
translate([0,0,axes_Xsmooth_separation]) {
rotate([0,0,90]) standard_rod(diam=axes_Xsmooth_rodD, length=partThickness*4, threaded=false, renderPart=true, center=true);
rotate([0,0,-90])
rodHolder(rodD=axes_Xsmooth_rodD, screwSize=screwSize, negative=true);
rodHolder(rodD=axes_Xsmooth_rodD, screwSize=rodScrewSize, negative=true);
}
}
}
@ -264,15 +256,15 @@ module Cyclone_X_leftFrame(isLeft=true) {
translate([-axes_Xreference_posX-dimX-footSeparation,axes_Xreference_posY+footSeparation,-axes_Yreference_height+footThickness]) {
rotate([0,90,0])
rotate([0,0,90])
hole_for_screw(size=screwSize,length=footThickness+base_thickness,nutDepth=0,nutAddedLen=0,captiveLen=0, invert=true);
hole_for_screw(size=footScrewSize,length=footThickness+base_thickness,nutDepth=0,nutAddedLen=0,captiveLen=0,tolerance=screwHoleTolerance, invert=true);
translate([0,dimY/2,0])
rotate([0,90,0])
rotate([0,0,90])
hole_for_screw(size=screwSize,length=footThickness+base_thickness,nutDepth=0,nutAddedLen=0,captiveLen=0, invert=true);
hole_for_screw(size=footScrewSize,length=footThickness+base_thickness,nutDepth=0,nutAddedLen=0,captiveLen=0,tolerance=screwHoleTolerance, invert=true);
translate([0,dimY-2*footSeparation,0])
rotate([0,90,0])
rotate([0,0,90])
hole_for_screw(size=screwSize,length=footThickness+base_thickness,nutDepth=0,nutAddedLen=0,captiveLen=0, invert=true);
hole_for_screw(size=footScrewSize,length=footThickness+base_thickness,nutDepth=0,nutAddedLen=0,captiveLen=0,tolerance=screwHoleTolerance, invert=true);
}
}
@ -282,52 +274,64 @@ module Cyclone_X_leftFrame(isLeft=true) {
if(draw_references) color("red") %frame(20);
rotate([0,0,-90])
rotate([0,90,0])
rodHolder(rodD=axes_Ysmooth_rodD, screwSize=screwSize);
rodHolder(rodD=axes_Ysmooth_rodD, screwSize=rodScrewSize);
// TRANSLATE REFERENCE POSITION to the threaded rod
translate([0,axes_Xsmooth_separation,0]) {
if(draw_references) color("green") %frame(20);
translate([-bearingDepth,0,0]) rotate([0,90,0])
translate([-X_threaded_rod_bearingDepth,0,0]) rotate([0,90,0])
radialBearing(echoPart=true);
if(isLeft) {
translate([gearWallSeparation,0,0]) rotate([0,90,0]) color(color_movingPart)
rodGear(r=axes_XgearSeparation/(1+1/axes_XgearRatio), h=axes_XgearThickness, echoPart=true);
if(!isLeft) {
translate([X_gear_thickness*2+axes_Xthreaded_rodD-7,0,0])
rotate([0,-90,0])
rotate([0,0,45]) nut(size=axes_Xthreaded_rodD, chamfer=true, echoPart=true);
translate([axes_Xthreaded_rodD,0,0]){
rotate([0,-90,0])
nut(size=axes_Xthreaded_rodD, echoPart=true);
if(Render_X_rodGear) {
translate([axes_Xthreaded_rodD-7,0,0])
rotate([0,-90,0]) color(color_movingPart)
cyclone_rod_gear(Gear_N_Teeth=X_rodGearRatio,gearHeight=X_gear_thickness,nutSize=8,tolerance=0);
}
}
// Translate to motor position
rotate([motorRotatedOffset,0,0]) {
rotate([motorRotatedOffset,0,0]) {
translate([0,axes_XgearSeparation,0])
rotate([-motorRotatedOffset,0,0]) {
translate([-motorWallSeparation,0,0]) rotate([0,90,0]) stepperMotor(screwHeight=motorWallSeparation, echoPart=true);
translate([gearWallSeparation,0,0]) rotate([0,90,0])
color(color_movingPart) motorGear(r=axes_XgearSeparation/(1+axes_XgearRatio), h=axes_XgearThickness, echoPart=true);
translate([-motorWallSeparation,0,0]) rotate([0,90,0])
stepperMotor(screwHeight=motorWallSeparation, echoPart=true);
if(Render_X_motorGear) {
translate([axes_Xthreaded_rodD+1.5,0,0])
rotate([0,-90,0]) color(color_movingPart)
cyclone_motor_gear(Gear_N_Teeth=X_motorGearRatio,gearHeight=X_gear_thickness,tolerance=0);
}
}
}
if(Render_Y_gearCover) {
// Draw the X gear cover
translate([0.1,0,0])
color(color_stillPart) Cyclone_XsubPart_gearCover();
}
}
translate([0,0,axes_Xsmooth_separation])
rotate([0,0,-90])
rodHolder(rodD=axes_Ysmooth_rodD, screwSize=screwSize);
rodHolder(rodD=axes_Ysmooth_rodD, screwSize=rodScrewSize);
}
}
translate([-axes_Xreference_posX-dimX-footSeparation,axes_Xreference_posY+footSeparation,-axes_Yreference_height+footThickness]) {
rotate([0,90,0])
rotate([0,0,90])
screw_and_nut(size=screwSize,length=footThickness+base_thickness,nutDepth=0,nutAddedLen=0,captiveLen=0, invert=true, autoNutOffset=true, echoPart=true);
screw_and_nut(size=footScrewSize,length=footThickness+base_thickness,nutDepth=0,nutAddedLen=0,captiveLen=0,tolerance=screwHoleTolerance, invert=true, autoNutOffset=true, echoPart=true);
translate([0,dimY/2,0])
rotate([0,90,0])
rotate([0,0,90])
screw_and_nut(size=screwSize,length=footThickness+base_thickness,nutDepth=0,nutAddedLen=0,captiveLen=0, invert=true, autoNutOffset=true, echoPart=true);
screw_and_nut(size=footScrewSize,length=footThickness+base_thickness,nutDepth=0,nutAddedLen=0,captiveLen=0,tolerance=screwHoleTolerance, invert=true, autoNutOffset=true, echoPart=true);
translate([0,dimY-2*footSeparation,0])
rotate([0,90,0])
rotate([0,0,90])
screw_and_nut(size=screwSize,length=footThickness+base_thickness,nutDepth=0,nutAddedLen=0,captiveLen=0, invert=true, autoNutOffset=true, echoPart=true);
screw_and_nut(size=footScrewSize,length=footThickness+base_thickness,nutDepth=0,nutAddedLen=0,captiveLen=0,tolerance=screwHoleTolerance, invert=true, autoNutOffset=true, echoPart=true);
}
}
module rodHolder(rodD=8.5, screwSize=3, height=0, sideLen=0, thickness=5, space=2, negative=false) {
screwAditionalDistance = rodD/2;
dimX = rodD+4*screwSize+screwAditionalDistance;
@ -339,14 +343,16 @@ module rodHolder(rodD=8.5, screwSize=3, height=0, sideLen=0, thickness=5, space=
if(negative) {
translate([screwSize+screwAditionalDistance,-dimY/2,dimZ])
rotate([90,0,0])
hole_for_screw(size=screwSize,length=dimZ+15,nutDepth=5,nutAddedLen=0,captiveLen=10, rot=90);
hole_for_screw(size=screwSize,length=dimZ+15,nutDepth=5,nutAddedLen=0,captiveLen=10,tolerance=screwHoleTolerance, rot=90);
translate([-screwSize-screwAditionalDistance,-dimY/2,dimZ])
rotate([90,0,0])
hole_for_screw(size=screwSize,length=dimZ+15,nutDepth=5,nutAddedLen=0,captiveLen=10, rot=90);
hole_for_screw(size=screwSize,length=dimZ+15,nutDepth=5,nutAddedLen=0,captiveLen=10,tolerance=screwHoleTolerance, rot=90);
} else {
difference() {
union() {
color(color_movingPart) translate([0,-dimY/2,dimZ/2+space/4]) bcube([dimX,dimY,dimZ-space/2],cr=corner_radius,cres=10);
//if(Render_rodHolder) {
color(color_movingPart) translate([0,-dimY/2,dimZ/2+space/4]) bcube([dimX,dimY,dimZ-space/2],cr=corner_radius,cres=10);
//}
color(color_stillPart)
if(sideLen>dimX/2)
translate([sideLen/2-dimX/4,-dimY/2,-height/2-space/4]) bcube([dimX/2+sideLen,dimY,height-space/2],cr=corner_radius,cres=10);
@ -355,23 +361,19 @@ module rodHolder(rodD=8.5, screwSize=3, height=0, sideLen=0, thickness=5, space=
}
translate([screwSize+screwAditionalDistance,-dimY/2,dimZ])
rotate([90,0,0])
hole_for_screw(size=screwSize,length=dimZ+15,nutDepth=5,nutAddedLen=0,captiveLen=10, rot=90);
hole_for_screw(size=screwSize,length=dimZ+15,nutDepth=5,nutAddedLen=0,captiveLen=10,tolerance=screwHoleTolerance, rot=90);
translate([-screwSize-screwAditionalDistance,-dimY/2,dimZ])
rotate([90,0,0])
hole_for_screw(size=screwSize,length=dimZ+15,nutDepth=5,nutAddedLen=0,captiveLen=10, rot=90);
hole_for_screw(size=screwSize,length=dimZ+15,nutDepth=5,nutAddedLen=0,captiveLen=10,tolerance=screwHoleTolerance, rot=90);
standard_rod(diam=rodD, length=dimY*4, threaded=false, renderPart=true, center=true);
rodHolder(rodD=rodD, screwSize=screwSize, negative=true);
//rodHolder(rodD=rodD, screwSize=screwSize, negative=true);
}
// Draw screws
translate([screwSize+screwAditionalDistance,-dimY/2,dimZ+0.01])
rotate([90,0,0])
screw_and_nut(size=screwSize,length=dimZ+15,nutDepth=5,nutAddedLen=0,captiveLen=0, rot=90, echoPart=true);
screw_and_nut(size=screwSize,length=dimZ+15,nutDepth=5,nutAddedLen=0,captiveLen=0,tolerance=screwHoleTolerance, rot=90, echoPart=true);
translate([-screwSize-screwAditionalDistance,-dimY/2,dimZ+0.01])
rotate([90,0,0])
screw_and_nut(size=screwSize,length=dimZ+15,nutDepth=5,nutAddedLen=0,captiveLen=0, rot=90, echoPart=true);
screw_and_nut(size=screwSize,length=dimZ+15,nutDepth=5,nutAddedLen=0,captiveLen=0,tolerance=screwHoleTolerance, rot=90, echoPart=true);
}
}

View File

@ -9,8 +9,6 @@ include <libs/MCAD/nuts_and_bolts.scad>
workbed_separation_from_Y_threaded_rod = axes_Y_smoothThreaded_verticalSeparation+workbed_separation_from_Y_smooth_rod+axes_Ysmooth_rodD/2;
PCBholder_height = 10;
module Cyclone_YsubPart_nutHolder() {
footThickness = 10;
screwSeparation = 10;
@ -19,11 +17,10 @@ module Cyclone_YsubPart_nutHolder() {
dimY = screwSeparation+22;
dimZ = workbed_separation_from_Y_threaded_rod;
holderExtension = 10;
rodTolerance = 0.5;
rodSize = 8; // M3, M4, etc (integers only)
washer_D = 15.8;
washer_thickness = 1.6;
screwSize = 3; // M3, M4, etc (integers only)
rodNutSize = Y_threaded_rodNutSize;
washer_D = Y_backlash_washer_D;
washer_thickness = Y_backlash_washer_thickness;
screwSize = Y_nutHolder_screwSize;
difference() {
// Main shape
@ -31,23 +28,23 @@ module Cyclone_YsubPart_nutHolder() {
color(color_movingPart) bcube([dimX,dimY,dimZ+holderExtension],cr=2,cres=10);
// Hole for the rod
hull() {
standard_rod(diam=axes_Ythreaded_rodD+rodTolerance, length=dimY*4, threaded=true, renderPart=true, center=true);
standard_rod(diam=axes_Ythreaded_rodD+Y_threaded_rod_Tolerance, length=dimY*4, threaded=true, renderPart=true, center=true);
translate([0,0,-holderExtension*2])
standard_rod(diam=axes_Ythreaded_rodD+rodTolerance, length=dimY*4, threaded=true, renderPart=true, center=true);
standard_rod(diam=axes_Ythreaded_rodD+Y_threaded_rod_Tolerance, length=dimY*4, threaded=true, renderPart=true, center=true);
}
// Hole for the main nut
translate([0,dimY/2+0.01+rod_nut_len/2,0])
hull() {
rotate([0,90,0]) hole_for_nut(size=rodSize,nutAddedLen=0,captiveLen=0,tolerance=0.1);
rotate([0,90,0]) hole_for_nut(size=rodNutSize,nutAddedLen=0,captiveLen=0,tolerance=0.1);
translate([0,0,-holderExtension*2])
rotate([0,90,0]) hole_for_nut(size=rodSize,nutAddedLen=0,captiveLen=0,tolerance=0.1);
rotate([0,90,0]) hole_for_nut(size=rodNutSize,nutAddedLen=0,captiveLen=0,tolerance=0.1);
}
translate([0,dimY/2+0.01-rod_nut_len/2-3,0]) {
// Hole for the sliding nut
hull() {
rotate([0,90,0]) hole_for_nut(size=rodSize,nutAddedLen=dimY,captiveLen=0,tolerance=0.3);
rotate([0,90,0]) hole_for_nut(size=rodNutSize,nutAddedLen=dimY,captiveLen=0,tolerance=0.3);
translate([0,0,-holderExtension*2])
rotate([0,90,0]) hole_for_nut(size=rodSize,nutAddedLen=dimY,captiveLen=0,tolerance=0.3);
rotate([0,90,0]) hole_for_nut(size=rodNutSize,nutAddedLen=dimY,captiveLen=0,tolerance=0.3);
}
// Hole for the washer
hull() {
@ -59,10 +56,10 @@ module Cyclone_YsubPart_nutHolder() {
// Holes for the supporting screws
translate([0,-screwSeparation/2,workbed_separation_from_Y_threaded_rod+workbed_thickness])
rotate([90,0,0])
hole_for_screw(size=screwSize,length=workbed_thickness+footThickness,nutDepth=-dimZ,nutAddedLen=dimZ,captiveLen=0);
hole_for_screw(size=screwSize,length=workbed_thickness+footThickness,nutDepth=-dimZ,nutAddedLen=dimZ,captiveLen=0,tolerance=screwHoleTolerance);
translate([0,+screwSeparation/2,workbed_separation_from_Y_threaded_rod+workbed_thickness])
rotate([90,0,0])
hole_for_screw(size=screwSize,length=workbed_thickness+footThickness,nutDepth=-dimZ,nutAddedLen=dimZ,captiveLen=0);
hole_for_screw(size=screwSize,length=workbed_thickness+footThickness,nutDepth=-dimZ,nutAddedLen=dimZ,captiveLen=0,tolerance=screwHoleTolerance);
}
translate([0,dimY/2+rod_nut_len/2,0])
rotate([0,90,0]) rotate([90,0,0]) nut(size=8, echoPart=true);
@ -72,12 +69,10 @@ module Cyclone_YsubPart_nutHolder() {
washer_single(diam=washer_D, thickness=washer_thickness, echoPart=true);
}
use <libs/linear_bearing.scad>
module Cyclone_YsubPart_singleLinearBearingHolder(onlyScrews=false) {
linearBearingModel = "LM8UU";
linearBearingLength = linearBearing_L(linearBearingModel);
linearBearingDiameter = linearBearing_D(linearBearingModel);
linearBearingLength = linearBearing_L(Y_linearBearingModel);
linearBearingDiameter = linearBearing_D(Y_linearBearingModel);
plasticHolderLength = 3;
@ -87,19 +82,17 @@ module Cyclone_YsubPart_singleLinearBearingHolder(onlyScrews=false) {
holderExtension = linearBearingDiameter/3;
screwSize = 3; // M3, M4, etc (integers only)
screwSize = Y_singleLinearBearingHolder_screwSize;
footSeparation = screwSize*2;
footThickness = 7;
workbed_screws_aditional_length = PCBholder_height;
linearBearing_pressureFitTolerance = 0.5;
if(onlyScrews) {
// Hole for the screw and nut
translate([dimX/2+footSeparation,0,dimZ+workbed_thickness+workbed_screws_aditional_length])
rotate([90,0,0]) hole_for_screw(size=screwSize,length=workbed_screws_aditional_length+footThickness+workbed_thickness,nutDepth=0,nutAddedLen=0,captiveLen=0);
rotate([90,0,0]) hole_for_screw(size=screwSize,length=workbed_screws_aditional_length+footThickness+workbed_thickness,nutDepth=0,nutAddedLen=0,captiveLen=0,tolerance=screwHoleTolerance);
} else {
difference() {
// Main part
@ -117,15 +110,15 @@ module Cyclone_YsubPart_singleLinearBearingHolder(onlyScrews=false) {
bcube([dimX,dimY,holderExtension], cr=3, cres=0);
}
// Hole for linear bearing
linearBearingHole(model=linearBearingModel, lateralExtension=holderExtension, lengthExtension=2*plasticHolderLength, holderLength=plasticHolderLength/2);
//linearBearingHole(model=linearBearingModel);
linearBearingHole(model=Y_linearBearingModel, lateralExtension=holderExtension, pressureFitTolerance=LinearBearingPressureFitTolerance, lengthExtension=2*plasticHolderLength, holderLength=plasticHolderLength/2);
// Hole for the screw and nut
translate([dimX/2+footSeparation,0,dimZ+workbed_thickness+workbed_screws_aditional_length])
rotate([90,0,0]) hole_for_screw(size=screwSize,length=workbed_screws_aditional_length+footThickness+workbed_thickness,nutDepth=0,nutAddedLen=0,captiveLen=0);
rotate([90,0,0]) hole_for_screw(size=screwSize,length=workbed_screws_aditional_length+footThickness+workbed_thickness,nutDepth=0,nutAddedLen=0,captiveLen=0,tolerance=screwHoleTolerance);
}
translate([0,linearBearingLength/2,0])
rotate([90,0,0]) linearBearing_single(model=linearBearingModel, echoPart=true);
rotate([90,0,0]) linearBearing_single(model=Y_linearBearingModel, echoPart=true);
}
}
@ -140,17 +133,7 @@ module Cyclone_YsubPart_linearBearingHolders(onlyScrews=false) {
Cyclone_YsubPart_singleLinearBearingHolder(onlyScrews=onlyScrews);
}
module Cyclone_YsubPart_PCBholder() {
PCB_dimX = 160;
PCB_dimY = 100;
PCB_dimZ = 1.6;
PCB_holder_edge_length = 3;
PCB_holder_tolerance = 1;
holderArmLength = 30;
holderL_thickness = 2;
@ -158,7 +141,7 @@ module Cyclone_YsubPart_PCBholder() {
holderL_width = workbed_size_Y-PCB_dimY-PCB_holder_tolerance*2;
holderL_innerWidth = holderL_width/2;
screwSize = 3; // M3, M4, etc (integers only)
screwSize = Y_PCBholder_screwSize;
screwSeparation = screwSize*0.84;
// Draw the PCB (transparent)
@ -167,67 +150,70 @@ module Cyclone_YsubPart_PCBholder() {
%translate([0,0,PCBholder_height+PCB_dimZ/2])
color([0.8,0.5,0, 1]) cube([PCB_dimX+PCB_holder_tolerance*2,PCB_dimY+PCB_holder_tolerance*2,PCB_dimZ/10], center=true);
difference() {
color(color_stillPart) translate([0,0,PCBholder_height/2])
bcube([workbed_size_X,workbed_size_Y,PCBholder_height], cr=25, cres=0);
// Hole for the PCB
translate([0,0,PCBholder_height])
cube([PCB_dimX+PCB_holder_tolerance*2,PCB_dimY+PCB_holder_tolerance*2,PCB_dimZ], center=true);
// Holes to split the part in two pieces
translate([0,0,PCBholder_height/2])
cube([PCB_dimX-PCB_holder_edge_length*2,PCB_dimY-PCB_holder_edge_length*2, 2*PCBholder_height+1], center=true);
translate([-PCB_dimX/2+PCB_holder_edge_length,0,-0.5])
cube([PCB_dimX-holderArmLength-PCB_holder_edge_length,workbed_size_Y, 2*PCBholder_height+1]);
scale([-1,-1,1]) translate([-PCB_dimX/2+PCB_holder_edge_length,0,-0.5])
cube([PCB_dimX-holderArmLength-PCB_holder_edge_length,workbed_size_Y, 2*PCBholder_height+1]);
// Holes for the screws
for (x = [-1,1], y=[-1,0,1]) {
translate([x*(PCB_dimX/2+screwSeparation),y*PCB_dimY/4,PCBholder_height+screwSize])
rotate([0,0,x*-90]) rotate([90,0,0]) hole_for_screw(size=screwSize,length=PCBholder_height+3,nutDepth=4.5,nutAddedLen=0,captiveLen=10, rot=90);
}
translate([PCB_dimX/2-holderArmLength/2,PCB_dimY/2+screwSeparation,PCBholder_height+screwSize])
rotate([90,0,0]) hole_for_screw(size=screwSize,length=PCBholder_height+3,nutDepth=4.5,nutAddedLen=0,captiveLen=10, rot=90);
scale([-1,-1,1]) translate([PCB_dimX/2-holderArmLength/2,PCB_dimY/2+screwSeparation,PCBholder_height+screwSize])
rotate([90,0,0]) hole_for_screw(size=screwSize,length=PCBholder_height+3,nutDepth=4.5,nutAddedLen=0,captiveLen=10, rot=90);
}
// Holder top L supports
translate([0,0,0.5])
difference() {
color(color_movingPart) translate([0,0,PCBholder_height+(holderL_thickness+holderL_thickness_btm)/2])
bcube([PCB_dimX+PCB_holder_tolerance*2+holderL_width, PCB_dimY+PCB_holder_tolerance*2+holderL_width, holderL_thickness+holderL_thickness_btm], cr=8, cres=0);
translate([0,0,PCBholder_height+holderL_thickness_btm/2])
bcube([PCB_dimX+PCB_holder_tolerance*2+holderL_innerWidth, PCB_dimY+PCB_holder_tolerance*2+holderL_innerWidth, holderL_thickness_btm], cr=8, cres=0);
if(draw_references) %frame();
translate([0,0,PCBholder_height/2])
cube([PCB_dimX-PCB_holder_edge_length*2,PCB_dimY-PCB_holder_edge_length*2, 2*PCBholder_height+1], center=true);
translate([-PCB_dimX/2+PCB_holder_edge_length,0,-0.5])
cube([PCB_dimX-holderArmLength-PCB_holder_edge_length,workbed_size_Y, 2*PCBholder_height+1]);
scale([-1,-1,1]) translate([-PCB_dimX/2+PCB_holder_edge_length,0,-0.5])
cube([PCB_dimX-holderArmLength-PCB_holder_edge_length,workbed_size_Y, 2*PCBholder_height+1]);
// Holes for the screws
translate([0,0,holderL_thickness+(holderL_thickness+holderL_thickness_btm)/2]) {
if(Render_PCBholderBottom) {
difference() {
color(color_stillPart) translate([0,0,PCBholder_height/2])
bcube([workbed_size_X,workbed_size_Y,PCBholder_height], cr=25, cres=0);
// Hole for the PCB
translate([0,0,PCBholder_height])
cube([PCB_dimX+PCB_holder_tolerance*2,PCB_dimY+PCB_holder_tolerance*2,PCB_dimZ], center=true);
// Holes to split the part in two pieces
translate([0,0,PCBholder_height/2])
cube([PCB_dimX-PCB_holder_edge_length*2,PCB_dimY-PCB_holder_edge_length*2, 2*PCBholder_height+1], center=true);
translate([-PCB_dimX/2+PCB_holder_edge_length,0,-0.5])
cube([PCB_dimX-holderArmLength-PCB_holder_edge_length,workbed_size_Y, 2*PCBholder_height+1]);
scale([-1,-1,1]) translate([-PCB_dimX/2+PCB_holder_edge_length,0,-0.5])
cube([PCB_dimX-holderArmLength-PCB_holder_edge_length,workbed_size_Y, 2*PCBholder_height+1]);
// Holes for the screws
for (x = [-1,1], y=[-1,0,1]) {
translate([x*(PCB_dimX/2+screwSeparation),y*PCB_dimY/4,PCBholder_height+screwSize])
rotate([0,0,x*-90]) rotate([90,0,0]) hole_for_screw(size=screwSize,length=PCBholder_height*10,nutDepth=4.5,nutAddedLen=0,captiveLen=10, rot=90);
rotate([0,0,x*-90]) rotate([90,0,0]) hole_for_screw(size=screwSize,length=PCBholder_height+3,nutDepth=4.5,nutAddedLen=0,captiveLen=10,tolerance=screwHoleTolerance, rot=90);
}
translate([PCB_dimX/2-holderArmLength/2,PCB_dimY/2+screwSeparation,PCBholder_height+screwSize])
rotate([90,0,0]) hole_for_screw(size=screwSize,length=PCBholder_height*10,nutDepth=4.5,nutAddedLen=0,captiveLen=10, rot=90);
rotate([90,0,0]) hole_for_screw(size=screwSize,length=PCBholder_height+3,nutDepth=4.5,nutAddedLen=0,captiveLen=10,tolerance=screwHoleTolerance, rot=90);
scale([-1,-1,1]) translate([PCB_dimX/2-holderArmLength/2,PCB_dimY/2+screwSeparation,PCBholder_height+screwSize])
rotate([90,0,0]) hole_for_screw(size=screwSize,length=PCBholder_height*10,nutDepth=4.5,nutAddedLen=0,captiveLen=10, rot=90);
rotate([90,0,0]) hole_for_screw(size=screwSize,length=PCBholder_height+3,nutDepth=4.5,nutAddedLen=0,captiveLen=10,tolerance=screwHoleTolerance, rot=90);
}
}
// Holder top L supports
if(Render_PCBholderTop) {
translate([0,0,0.5])
difference() {
color(color_movingPart) translate([0,0,PCBholder_height+(holderL_thickness+holderL_thickness_btm)/2])
bcube([PCB_dimX+PCB_holder_tolerance*2+holderL_width, PCB_dimY+PCB_holder_tolerance*2+holderL_width, holderL_thickness+holderL_thickness_btm], cr=8, cres=0);
translate([0,0,PCBholder_height+holderL_thickness_btm/2])
bcube([PCB_dimX+PCB_holder_tolerance*2+holderL_innerWidth, PCB_dimY+PCB_holder_tolerance*2+holderL_innerWidth, holderL_thickness_btm], cr=8, cres=0);
if(draw_references) %frame();
translate([0,0,PCBholder_height/2])
cube([PCB_dimX-PCB_holder_edge_length*2,PCB_dimY-PCB_holder_edge_length*2, 2*PCBholder_height+1], center=true);
translate([-PCB_dimX/2+PCB_holder_edge_length,0,-0.5])
cube([PCB_dimX-holderArmLength-PCB_holder_edge_length,workbed_size_Y, 2*PCBholder_height+1]);
scale([-1,-1,1]) translate([-PCB_dimX/2+PCB_holder_edge_length,0,-0.5])
cube([PCB_dimX-holderArmLength-PCB_holder_edge_length,workbed_size_Y, 2*PCBholder_height+1]);
// Holes for the screws
translate([0,0,holderL_thickness+(holderL_thickness+holderL_thickness_btm)/2]) {
for (x = [-1,1], y=[-1,0,1]) {
translate([x*(PCB_dimX/2+screwSeparation),y*PCB_dimY/4,PCBholder_height+screwSize])
rotate([0,0,x*-90]) rotate([90,0,0]) hole_for_screw(size=screwSize,length=PCBholder_height*10,nutDepth=4.5,nutAddedLen=0,captiveLen=10,tolerance=screwHoleTolerance, rot=90);
}
translate([PCB_dimX/2-holderArmLength/2,PCB_dimY/2+screwSeparation,PCBholder_height+screwSize])
rotate([90,0,0]) hole_for_screw(size=screwSize,length=PCBholder_height*10,nutDepth=4.5,nutAddedLen=0,captiveLen=10,tolerance=screwHoleTolerance, rot=90);
scale([-1,-1,1]) translate([PCB_dimX/2-holderArmLength/2,PCB_dimY/2+screwSeparation,PCBholder_height+screwSize])
rotate([90,0,0]) hole_for_screw(size=screwSize,length=PCBholder_height*10,nutDepth=4.5,nutAddedLen=0,captiveLen=10,tolerance=screwHoleTolerance, rot=90);
}
}
}
}
module Cyclone_Y_carriage() {
if(render_DXF_workbed) {
offset(delta = DXF_offset) projection(cut = true)
@ -240,17 +226,22 @@ module Cyclone_Y_carriage() {
}
} else {
if(draw_references) color("red") %frame(20);
rotate([0,0,180]) Cyclone_YsubPart_nutHolder();
if(Render_YsubPart_nutHolder){
rotate([0,0,180])
Cyclone_YsubPart_nutHolder();
}
translate([0,0,axes_Y_smoothThreaded_verticalSeparation]) {
Cyclone_YsubPart_linearBearingHolders();
difference() {
translate([0,0,workbed_separation_from_Y_threaded_rod+workbed_thickness-axes_Y_smoothThreaded_verticalSeparation])
Cyclone_YsubPart_PCBholder();
Cyclone_YsubPart_linearBearingHolders(onlyScrews=true);
if(Render_YsubPart_linearBearingHolders)
Cyclone_YsubPart_linearBearingHolders();
if(Render_PCBholderTop || Render_PCBholderBottom) {
difference() {
translate([0,0,workbed_separation_from_Y_threaded_rod+workbed_thickness-axes_Y_smoothThreaded_verticalSeparation])
Cyclone_YsubPart_PCBholder();
Cyclone_YsubPart_linearBearingHolders(onlyScrews=true);
}
}
}
color([0.9,0.9,0.9, 1]) translate([0,0,workbed_separation_from_Y_threaded_rod+workbed_thickness])
beveledBase(size=[workbed_size_X,workbed_size_Y,workbed_thickness], radius=3, res=15, echoPart=true);
}
}

View File

@ -14,27 +14,25 @@ module mirrorOrNot(mirrorPart=false, axes=[-1,1,1]) {
use <libs/MCAD/bearing.scad>
Ymotor_sideLen = 42.20;
axes_YgearSeparation = 37;
axes_YgearRatio = 21/21; // Number of tooth (motor/rod)
Y_motorModel = Nema17;
Ymotor_sideLen = lookup(NemaSideSize, Y_motorModel); //42.20;
axes_YgearRatio = Y_motorGearRatio/Y_rodGearRatio; // Number of tooth (motor/rod)
module Cyclone_Y_frontFrame() {
screwSize = 3; // M3, M4, etc (integers only)
screwSize = Y_frontFrame_footScrewSize;
motorWallSeparation = 5;
motorRotatedOffset = 5;
gearWallSeparation = 5;
motorWallSeparation = Y_motorWallSeparation;
motorRotatedOffset = Y_motorRotatedOffset;
gearWallSeparation = Y_gearWallSeparation;
motor_YgearSeparation_projected = axes_YgearSeparation*cos(-motorRotatedOffset);
rod_nut_len = 0.8*axes_Ythreaded_rodD;
gear_thickness = 5;
bearing_width = bearingWidth(608);
bearing_diam = bearingOuterDiameter(608);
bearingDepth = 3;
gear_thickness = Y_gear_thickness;
bearing_width = bearingWidth(Y_threaded_rodBearingModel);
bearing_diam = bearingOuterDiameter(Y_threaded_rodBearingModel);
bearingDepth = Y_threaded_rodBearingDepth;
partThickness = 5+screwSize*2;
dimX = bearing_diam+partThickness;
@ -42,23 +40,22 @@ module Cyclone_Y_frontFrame() {
dimZ = axes_Y_threaded_height;
footSeparation = screwSize*2;
foot_additional_separation = 5;
footThickness = 10;
foot_additional_separation = Y_foot_additional_separation;
footThickness = Y_frame_footThickness;
module Cyclone_YsubPart_gearCover() {
margin = 4;
rodGearAddedMargin = 0;
margin = gearCover_margin;
rodGearAddedMargin = rodGearAddedgearCover_margin;
effectiveYgearSeparation = axes_YgearSeparation+0.5;
wallThickness = 0.4*4;
screwHeadSpaceHeight = 4;
screwHeadSpaceDiam = 6;
coverHeight = 16;
coverExtraHeight = 5;
coverExtraRadius = -7;
nema_screw_separation = lookup(NemaDistanceBetweenMountingHoles, Nema17);
truncationAngle = 10;
wallThickness = gearCover_wallThickness;
screwHeadSpaceHeight = gearCover_screwHeadSpaceHeight;
screwHeadSpaceDiam = gearCover_screwHeadSpaceDiam;
coverHeight = gearCoverHeight;
coverExtraHeight = gearCoverExtraHeight;
coverExtraRadius = gearCoverExtraRadius;
nema_screw_separation = lookup(NemaDistanceBetweenMountingHoles, Y_motorModel);
truncationAngle = gearCover_truncationAngle;
motorGearRadius = axes_YgearSeparation/(1+axes_YgearRatio)+margin;
rodGearRadius = axes_YgearSeparation/(1+1/axes_YgearRatio)+margin+rodGearAddedMargin;
@ -143,7 +140,6 @@ module Cyclone_Y_frontFrame() {
}
}
translate([0,2*rod_nut_len+gear_thickness,0]) {
translate([0,bearing_width-bearingDepth,0]) {
if(draw_references) color("blue") %frame(20);
@ -188,22 +184,23 @@ module Cyclone_Y_frontFrame() {
translate([footSeparation+dimX/2,0,0])
rotate([0,90,0])
rotate([0,0,90])
hole_for_screw(size=screwSize,length=footThickness+base_thickness,nutDepth=0,nutAddedLen=0,captiveLen=0, rot=90, invert=true);
hole_for_screw(size=screwSize,length=footThickness+base_thickness,nutDepth=0,nutAddedLen=0,captiveLen=0,tolerance=screwHoleTolerance,rot=90, invert=true);
translate([dimX/3,dimY/2+footSeparation+foot_additional_separation,0])
rotate([0,90,0])
rotate([0,0,90])
hole_for_screw(size=screwSize,length=footThickness+base_thickness,nutDepth=0,nutAddedLen=0,captiveLen=0, rot=90, invert=true);
hole_for_screw(size=screwSize,length=footThickness+base_thickness,nutDepth=0,nutAddedLen=0,captiveLen=0,tolerance=screwHoleTolerance, rot=90, invert=true);
translate([-footSeparation-foot_additional_separation-motor_YgearSeparation_projected-Ymotor_sideLen/2,0,0])
rotate([0,90,0])
rotate([0,0,90])
hole_for_screw(size=screwSize,length=footThickness+base_thickness,nutDepth=0,nutAddedLen=0,captiveLen=0, rot=90, invert=true);
hole_for_screw(size=screwSize,length=footThickness+base_thickness,nutDepth=0,nutAddedLen=0,captiveLen=0,tolerance=screwHoleTolerance, rot=90, invert=true);
}
// Translate to motor axis position
rotate([0,-motorRotatedOffset,0]) {
translate([-axes_YgearSeparation,0,0])
rotate([0,motorRotatedOffset,0]) {
translate([0,motorWallSeparation-0.01,0])
rotate([0,0,90]) rotate([0,-90,0]) stepperMotor_mount(motorWallSeparation, sideLen=Ymotor_sideLen, slideOut=false);
rotate([0,0,90]) rotate([0,-90,0])
stepperMotor_mount(motorWallSeparation, sideLen=Ymotor_sideLen, slideOut=false);
}
}
}
@ -213,15 +210,15 @@ module Cyclone_Y_frontFrame() {
translate([footSeparation+dimX/2,0,0])
rotate([0,90,0])
rotate([0,0,90])
screw_and_nut(size=screwSize,length=footThickness+base_thickness,nutDepth=0,nutAddedLen=0,captiveLen=0, rot=90, invert=true, autoNutOffset=true, echoPart=true);
screw_and_nut(size=screwSize,length=footThickness+base_thickness,nutDepth=0,nutAddedLen=0,captiveLen=0,tolerance=screwHoleTolerance, rot=90, invert=true, autoNutOffset=true, echoPart=true);
translate([dimX/3,dimY/2+footSeparation+foot_additional_separation,0])
rotate([0,90,0])
rotate([0,0,90])
screw_and_nut(size=screwSize,length=footThickness+base_thickness,nutDepth=0,nutAddedLen=0,captiveLen=0, rot=90, invert=true, autoNutOffset=true, echoPart=true);
screw_and_nut(size=screwSize,length=footThickness+base_thickness,nutDepth=0,nutAddedLen=0,captiveLen=0,tolerance=screwHoleTolerance, rot=90, invert=true, autoNutOffset=true, echoPart=true);
translate([-footSeparation-foot_additional_separation-motor_YgearSeparation_projected-Ymotor_sideLen/2,0,0])
rotate([0,90,0])
rotate([0,0,90])
screw_and_nut(size=screwSize,length=footThickness+base_thickness,nutDepth=0,nutAddedLen=0,captiveLen=0, rot=90, invert=true, autoNutOffset=true, echoPart=true);
screw_and_nut(size=screwSize,length=footThickness+base_thickness,nutDepth=0,nutAddedLen=0,captiveLen=0,tolerance=screwHoleTolerance, rot=90, invert=true, autoNutOffset=true, echoPart=true);
}
// Translate to motor position
rotate([0,-motorRotatedOffset,0]) {
@ -230,43 +227,43 @@ module Cyclone_Y_frontFrame() {
translate([0,motorWallSeparation,0])
rotate([90,0,0])
stepperMotor(screwHeight=motorWallSeparation, echoPart=true);
translate([0,-rod_nut_len-gear_thickness-bearing_width+bearingDepth,0])
rotate([-90,0,0]) color(color_movingPart)
motorGear(r=axes_YgearSeparation/(1+axes_YgearRatio), echoPart=true);
if(Render_Y_motorGear) {
translate([0,-rod_nut_len-gear_thickness,0])
rotate([-90,180,0]) color(color_movingPart)
cyclone_motor_gear(Gear_N_Teeth=Y_motorGearRatio,gearHeight=gear_thickness,tolerance=0);
}
}
}
if(Render_Y_gearCover) {
// Draw the Y gear cover
translate([0,-0.1,0])
color(color_stillPart) Cyclone_YsubPart_gearCover();
}
}
rotate([-90,0,0])
radialBearing(echoPart=true);
}
translate([0,0.01,0])
translate([0,-METRIC_NUT_THICKNESS[axes_Ythreaded_rodD]/2,0])
rotate([-90,0,0])
rotate([0,0,45]) nut(size=axes_Ythreaded_rodD, chamfer=true, echoPart=true);
translate([0,rod_nut_len+gear_thickness,0])
rotate([-90,0,0])
nut(size=axes_Ythreaded_rodD, echoPart=true);
translate([0,rod_nut_len,0])
rotate([-90,0,0]) color(color_movingPart)
rodGear(r=axes_YgearSeparation/(1+1/axes_YgearRatio), echoPart=true);
if(Render_Y_rodGear) {
translate([0,METRIC_NUT_THICKNESS[axes_Ythreaded_rodD]/4+rod_nut_len,0])
rotate([-90,0,0]) color(color_movingPart)
cyclone_rod_gear(Gear_N_Teeth=Y_rodGearRatio,gearHeight=gear_thickness,nutSize=8,tolerance=0);
}
}
module Cyclone_Y_backFrame() {
screwSize = 3; // M3, M4, etc (integers only)
screwSize = Y_backFrame_footScrewSize;
rod_nut_len = 0.8*axes_Ythreaded_rodD;
bearing_width = bearingWidth(608);
bearing_diam = bearingOuterDiameter(608);
bearingDepth = 3;
bearing_width = bearingWidth(Y_threaded_rodBearingModel);
bearing_diam = bearingOuterDiameter(Y_threaded_rodBearingModel);
bearingDepth = Y_threaded_rodBearingDepth;
partThickness = 5+screwSize*2;
dimX = bearing_diam+partThickness;
@ -274,10 +271,10 @@ module Cyclone_Y_backFrame() {
dimZ = 0;
footSeparation = screwSize*2;
foot_additional_separation = 5;
footThickness = 10;
foot_additional_separation = Y_foot_additional_separation;
footThickness = Y_frame_footThickness;
endstopHolderRotation = 5;
endstopHolderRotation = Y_endstopHolderRotation;
translate([0,-2*rod_nut_len,0]) {
translate([0,bearingDepth-bearing_width,0]) {
@ -314,15 +311,15 @@ module Cyclone_Y_backFrame() {
translate([-footSeparation-dimX/2,0,0])
rotate([0,90,0])
rotate([0,0,90])
hole_for_screw(size=screwSize,length=footThickness+base_thickness,nutDepth=0,nutAddedLen=0,captiveLen=0, rot=90, invert=true);
hole_for_screw(size=screwSize,length=footThickness+base_thickness,nutDepth=0,nutAddedLen=0,captiveLen=0,tolerance=screwHoleTolerance, rot=90, invert=true);
translate([footSeparation+dimX/2,0,0])
rotate([0,90,0])
rotate([0,0,90])
hole_for_screw(size=screwSize,length=footThickness+base_thickness,nutDepth=0,nutAddedLen=0,captiveLen=0, rot=90, invert=true);
hole_for_screw(size=screwSize,length=footThickness+base_thickness,nutDepth=0,nutAddedLen=0,captiveLen=0,tolerance=screwHoleTolerance, rot=90, invert=true);
translate([0,dimY/2+footSeparation+foot_additional_separation,0])
rotate([0,90,0])
rotate([0,0,90])
hole_for_screw(size=screwSize,length=footThickness+base_thickness,nutDepth=0,nutAddedLen=0,captiveLen=0, rot=90, invert=true);
hole_for_screw(size=screwSize,length=footThickness+base_thickness,nutDepth=0,nutAddedLen=0,captiveLen=0,tolerance=screwHoleTolerance, rot=90, invert=true);
}
}
@ -331,15 +328,15 @@ module Cyclone_Y_backFrame() {
translate([-footSeparation-dimX/2,0,0])
rotate([0,90,0])
rotate([0,0,90])
screw_and_nut(size=screwSize,length=footThickness+base_thickness,nutDepth=0,nutAddedLen=0,captiveLen=0, rot=90, invert=true, autoNutOffset=true, echoPart=true);
screw_and_nut(size=screwSize,length=footThickness+base_thickness,nutDepth=0,nutAddedLen=0,captiveLen=0,tolerance=screwHoleTolerance, rot=90, invert=true, autoNutOffset=true, echoPart=true);
translate([footSeparation+dimX/2,0,0])
rotate([0,90,0])
rotate([0,0,90])
screw_and_nut(size=screwSize,length=footThickness+base_thickness,nutDepth=0,nutAddedLen=0,captiveLen=0, rot=90, invert=true, autoNutOffset=true, echoPart=true);
screw_and_nut(size=screwSize,length=footThickness+base_thickness,nutDepth=0,nutAddedLen=0,captiveLen=0,tolerance=screwHoleTolerance, rot=90, invert=true, autoNutOffset=true, echoPart=true);
translate([0,dimY/2+footSeparation+foot_additional_separation,0])
rotate([0,90,0])
rotate([0,0,90])
screw_and_nut(size=screwSize,length=footThickness+base_thickness,nutDepth=0,nutAddedLen=0,captiveLen=0, rot=90, invert=true, autoNutOffset=true, echoPart=true);
screw_and_nut(size=screwSize,length=footThickness+base_thickness,nutDepth=0,nutAddedLen=0,captiveLen=0,tolerance=screwHoleTolerance, rot=90, invert=true, autoNutOffset=true, echoPart=true);
}
}
rotate([90,0,0])
@ -353,19 +350,6 @@ module Cyclone_Y_backFrame() {
nut(size=axes_Ythreaded_rodD, echoPart=true);
}
module Cyclone_logo(sizemm = 30, thickness = 10, mirrorLogo = false) {
dxf_logo_size = 50; // Real size of the logo in the DXF file
scale_factor = sizemm/dxf_logo_size;
@ -379,10 +363,11 @@ module Cyclone_Y_rightSmoothRodIdler(mirrorLogo = false) {
holderThickness = 5;
holderOuterRadius = holderThickness+axes_Ysmooth_rodD/2;
screwSize = 3; // M3, M4, etc (integers only)
footScrewSize = Y_rightSmoothRodIdler_footScrewSize;
rodScrewSize = Y_rightSmoothRodIdler_rodScrewSize;
dimX = holderOuterRadius*2;
dimY = 5+screwSize*2;
dimY = 5+footScrewSize*2;
dimZ = axes_Yreference_height;
slotHeight = 3;
@ -391,8 +376,8 @@ module Cyclone_Y_rightSmoothRodIdler(mirrorLogo = false) {
logoDepth = dimY/4;
footSeparation = screwSize*2;
footThickness = 10;
footSeparation = footScrewSize*2;
footThickness = Y_frame_footThickness;
color(color_stillPart) difference() {
union() {
@ -415,51 +400,51 @@ module Cyclone_Y_rightSmoothRodIdler(mirrorLogo = false) {
translate([2.5+holderOuterRadius,dimY/2,holderOuterRadius])
rotate([0,90,0])
rotate([0,0,90])
hole_for_screw(size=screwSize,length=screwLength+10,nutDepth=10,nutAddedLen=0,captiveLen=10, rot=90);
hole_for_screw(size=rodScrewSize,length=screwLength+10,nutDepth=10,nutAddedLen=0,captiveLen=10,tolerance=screwHoleTolerance, rot=90);
translate([dimX/2,dimY/2,0])
cube([dimX+1,dimY+1,slotHeight],center=true);
translate([(dimX-holderOuterRadius)/2,-0.1,-(dimZ+axes_Ysmooth_rodD/2)/2])
scale([1,-1,1])
rotate([90,0,0])
Cyclone_logo(sizemm = min(dimX+holderOuterRadius-5,dimZ-axes_Ysmooth_rodD/2-5), thickness = logoDepth, mirrorLogo = mirrorLogo);
if(Logo){
translate([(dimX-holderOuterRadius)/2,-0.1,-(dimZ+axes_Ysmooth_rodD/2)/2])
scale([1,-1,1])
rotate([90,0,0])
Cyclone_logo(sizemm = min(dimX+holderOuterRadius-5,dimZ-axes_Ysmooth_rodD/2-5), thickness = logoDepth, mirrorLogo = mirrorLogo);
}
translate([0,dimY/2,-axes_Yreference_height+footThickness]) {
translate([-holderOuterRadius-footSeparation,0,0])
rotate([0,90,0])
rotate([0,0,90])
hole_for_screw(size=screwSize,length=footThickness+base_thickness,nutDepth=0,nutAddedLen=0,captiveLen=0, rot=90, invert=true);
hole_for_screw(size=footScrewSize,length=footThickness+base_thickness,nutDepth=0,nutAddedLen=0,captiveLen=0,tolerance=screwHoleTolerance, rot=90, invert=true);
translate([holderOuterRadius*2+footSeparation,0,0])
rotate([0,90,0])
rotate([0,0,90])
hole_for_screw(size=screwSize,length=footThickness+base_thickness,nutDepth=0,nutAddedLen=0,captiveLen=0, rot=90, invert=true);
hole_for_screw(size=footScrewSize,length=footThickness+base_thickness,nutDepth=0,nutAddedLen=0,captiveLen=0,tolerance=screwHoleTolerance, rot=90, invert=true);
translate([holderOuterRadius/2,dimY/2+footSeparation,0])
rotate([0,90,0])
rotate([0,0,90])
hole_for_screw(size=screwSize,length=footThickness+base_thickness,nutDepth=0,nutAddedLen=0,captiveLen=0, rot=90, invert=true);
hole_for_screw(size=footScrewSize,length=footThickness+base_thickness,nutDepth=0,nutAddedLen=0,captiveLen=0,tolerance=screwHoleTolerance, rot=90, invert=true);
}
}
// Draw nuts and bolts
translate([2.5+holderOuterRadius,dimY/2,holderOuterRadius])
rotate([0,90,0])
rotate([0,0,90])
screw_and_nut(size=screwSize,length=screwLength+10,nutDepth=10,nutAddedLen=0,captiveLen=0, rot=90, echoPart=true);
screw_and_nut(size=rodScrewSize,length=screwLength+10,nutDepth=10,nutAddedLen=0,captiveLen=0,tolerance=screwHoleTolerance, rot=90, echoPart=true);
translate([0,dimY/2,-axes_Yreference_height+footThickness]) {
translate([-holderOuterRadius-footSeparation,0,0])
rotate([0,90,0])
rotate([0,0,90])
screw_and_nut(size=screwSize,length=footThickness+base_thickness,nutDepth=0,nutAddedLen=0,captiveLen=0, autoNutOffset=true, rot=90, invert=true, echoPart=true);
screw_and_nut(size=footScrewSize,length=footThickness+base_thickness,nutDepth=0,nutAddedLen=0,captiveLen=0,tolerance=screwHoleTolerance, autoNutOffset=true, rot=90, invert=true, echoPart=true);
translate([holderOuterRadius*2+footSeparation,0,0])
rotate([0,90,0])
rotate([0,0,90])
screw_and_nut(size=screwSize,length=footThickness+base_thickness,nutDepth=0,nutAddedLen=0,captiveLen=0, autoNutOffset=true, rot=90, invert=true, echoPart=true);
screw_and_nut(size=footScrewSize,length=footThickness+base_thickness,nutDepth=0,nutAddedLen=0,captiveLen=0,tolerance=screwHoleTolerance, autoNutOffset=true, rot=90, invert=true, echoPart=true);
translate([holderOuterRadius/2,dimY/2+footSeparation,0])
rotate([0,90,0])
rotate([0,0,90])
screw_and_nut(size=screwSize,length=footThickness+base_thickness,nutDepth=0,nutAddedLen=0,captiveLen=0, autoNutOffset=true, rot=90, invert=true, echoPart=true);
screw_and_nut(size=footScrewSize,length=footThickness+base_thickness,nutDepth=0,nutAddedLen=0,captiveLen=0,tolerance=screwHoleTolerance, autoNutOffset=true, rot=90, invert=true, echoPart=true);
}
}
module Cyclone_Y_leftSmoothRodIdler() {
scale([-1,1,1]) Cyclone_Y_rightSmoothRodIdler(mirrorLogo = true);
}

View File

@ -1,31 +1,265 @@
// This file is part of Cyclone PCB Factory: an open-source 3D printable CNC machine for PCB manufacture
// http://reprap.org/wiki/Cyclone_PCB_Factory
// Original author: Carlosgs (http://carlosgs.es)
// License: CC BY-SA 4.0 (Attribution-ShareAlike 4.0 International, http://creativecommons.org/licenses/by-sa/4.0/)
// Designed with http://www.openscad.org/
// Cyclone PCB Factory: a 3D printable CNC machine for PCB manufacture
// Created by Carlosgs (http://carlosgs.es)
// License: Attribution - Share Alike - Creative Commons (http://creativecommons.org/licenses/by-sa/3.0/)
/*
* August 2013 changes to design top-part mounting screw at same side as bottom-part.
* also started introduced 2nd spindle diameter for a-symmetrical spindles. this is not working yet.
* by Harry Binnema.
*/
// TO-DO: Re-program the carriage in a parametric manner
include <libs/MCAD/stepper.scad>
include <libs/MCAD/bearing.scad>
include <libs/MCAD/metric_fastners.scad>
include <libs/MCAD/nuts_and_bolts.scad>
use <libs/Write/Write.scad>
use <libs/linear_bearing.scad>
use <libs/obiscad/obiscad/vector.scad>
use <libs/obiscad/obiscad/attach.scad>
use <libs/obiscad/obiscad/bcube.scad>
use <libs/standard_parts.scad>
use <libs/MCAD/materials.scad>
module Cyclone_Z_carriage() {
color(color_stillPart)
translate([axes_Zsmooth_separation/2,0,0]) rotate([0,0,-90])
import("Inherited_files/stl/Cycl_Zcarriage.stl");
Z_motorModel = Nema17;
motor_width = lookup(NemaSideSize, Z_motorModel);
motor_screw_head_diameter = METRIC_BOLT_CAP_DIAMETERS[3]+1+screwHoleTolerance;;
Z_bearing_width = bearingWidth(Z_threaded_rodBearingModel);
axis_distance = 21;
wall_thickness = Z_carriage_wall_thickness;
wall_height = motor_width;
wall_width = Z_carriage_wall_width;
axes_ZgearRatio = Z_motorGearRatio/Z_rodGearRatio; // Number of tooth (motor/rod)
Z_smooth_rods_sep = axes_Xsmooth_separation;
module Cyclone_Z_carriage(z_thread_rod_length=120, with_extra_parts=false, exploded=false) {
// Settings
linearBearingDiameter = linearBearing_D(Z_linearBearingModel);
linearBearingLength = linearBearing_L(Z_linearBearingModel);
spindle_holder_distance = linearBearingLength*2+3;
gear_thickness = Z_gear_thickness;
ZthreadedOffset = -3.5;
axes_Xsmooth_separation = 16+ZthreadedOffset;
Z_threaded_pos = motor_width/2+axis_distance+axes_Xsmooth_separation;
spindle_front_offset = 10+ZthreadedOffset;
module dummySpindle(length=0) {
translate([0,0,-length]) {
translate([0,0,spindle_motor_length-5]) color([0.95,0.95,0.95]) cylinder(r=26,h=30);
translate([0,0,spindle_motor_length-10]) color([0.95,0.95,0.95]) cylinder(r=10/2,h=5);
translate([0,0,-10]) color([0.6,0.6,0.6]) cylinder(r=26,h=spindle_motor_length);
translate([0,0,-40]) color([0.9,0.9,0.9]) cylinder(r=15/2,h=40);
translate([0,0,-50]) color([0.4,0.4,0.4]) cylinder(r=20/2,h=10);
translate([0,0,-50-20]) color([0.9,0.9,0.9]) cylinder(r1=1/2,r2=3/2,h=20);
}
}
// Derived from Spindle mount for ShapeOko by Misan (http://www.thingiverse.com/thing:26740)
module spindle_holder_holes(length,spindiam,top_part) {
translate([0,spindle_front_offset,0])
if (top_part){
translate([0,38,0]) rotate([0,0,0]) {
translate([0,0,-0.05]) {
cylinder(r=spindle_motor_diam_top_smaller/2,h=length+2);
intersection() {
cylinder(r=spindle_motor_diam_top/2,h=length+2);
cube([spindle_motor_diam_top,spindle_motor_sidelen,2*(length+2)],center=true);
}
}
translate([0,-4,-0.01]) cube([90,4,length+2]);
translate ([spindiam/2+15,15,length/2]) rotate([90,0,0]) cylinder(r=2,h=30);
translate ([spindiam/2+15,-10.5,length/2]) rotate([90,0,0]) cylinder(r=3.5,h=4,$fn=6);
translate ([spindiam/2+15,10.5,length/2]) rotate([0,0,0]) screw_and_nut(size=spindle_holder_screwSize,length=25,nutDepth=4,nutAddedLen=0,captiveLen=0,tolerance=screwHoleTolerance, autoNutOffset=true, echoPart=true);
}
}
else
{
translate([0,38,0]) rotate([0,0,180]) {
translate([0,0,-0.05]) cylinder(r=spindle_motor_diam/2,h=length+2);
translate([0,0,-0.01]) cube([90,4,length+2]);
translate ([spindiam/2+15,20,length/2]) rotate([90,0,0]) cylinder(r=2,h=30);
translate ([spindiam/2+15,15,length/2]) rotate([90,0,0]) cylinder(r=3.5,h=4,$fn=6);
translate ([spindiam/2+15,17,length/2]) rotate([0,0,0]) screw_and_nut(size=spindle_holder_screwSize,length=25,nutDepth=4,nutAddedLen=0,captiveLen=0,tolerance=screwHoleTolerance, invert=true, autoNutOffset=true, echoPart=true);
}
}
}
module motorHolesZ() {
nema_screw_separation = lookup(NemaDistanceBetweenMountingHoles, Z_motorModel);
// Screws for holding the motor
translate([0,0,-wall_thickness/1.9])
stepperMotor_mount(wall_thickness+1, sideLen=0, slideOut=false);
// Hole for the screwdriver
translate([0,-wall_width/2,wall_thickness/2])
rotate([0,90,90]) bcube([2*(wall_thickness-5),5,wall_height],cr=1);
for(i=[-1,1]) for(j=[-1,1])
translate([i*nema_screw_separation/2,j*nema_screw_separation/2,2.5-wall_thickness/2+3]) {
hull() {
translate([0,Z_motor_adjust_margin/2,0])
cylinder(r=motor_screw_head_diameter/2,h=10*wall_thickness,center=false);
translate([0,-Z_motor_adjust_margin/2,0])
cylinder(r=motor_screw_head_diameter/2,h=10*wall_thickness,center=false);
}
}
}
module motor_stand_holes_Z() {
partThickness = wall_thickness;
// Position relative to motor shaft
translate([motor_width/2,motor_width/2,wall_thickness/2]) {
motorHolesZ();
// Bearing holes
translate([0,axis_distance,0]) {
bearingHole(depth=Z_bearing_width, thickness=partThickness);
hull() {
cylinder(r=(axes_Zsmooth_rodD*2)/2,h=10*wall_thickness,center=true);
translate([0,-axis_distance,0])
cylinder(r=(axes_Zsmooth_rodD*2)/2,h=10*wall_thickness,center=true);
}
}
}
}
module linearBearingHolderZ(h=10) {
linearBearingDiameter = linearBearing_D(Z_linearBearingModel);
translate([0,0,1.5]) cylinder(r=linearBearingDiameter/2+Z_linearBearingHole_tolerance,h=h);
cylinder(r=linearBearingDiameter/2.5,h=10*h,center=true);
}
module Z_solid_body(top_part=true) {
color(color_stillPart) union() {
hull() {
if(top_part)
translate([wall_height/2,wall_width/2,wall_thickness/2])
bcube([wall_height,wall_width,wall_thickness],cr=4,cres=10);
else
translate([wall_height/2,wall_width,wall_thickness/2])
bcube([wall_height,wall_width/2,wall_thickness],cr=4,cres=10);
translate([0,spindle_front_offset,0])
translate([wall_height/2,wall_width-4,0])
translate([0,38,0])
if(top_part)
cylinder(r=spindle_motor_diam_top/2+spindle_holder_thickness,h=wall_thickness);
else
cylinder(r=spindle_motor_diam/2+spindle_holder_thickness,h=wall_thickness);
}
// For the linear bearing holders
hull() {
translate([wall_height/2-Z_smooth_rods_sep/2,Z_threaded_pos,0])
cylinder(r=3+linearBearingDiameter/2,h=wall_thickness);
translate([wall_height/2+Z_smooth_rods_sep/2,Z_threaded_pos,0])
cylinder(r=3+linearBearingDiameter/2,h=wall_thickness);
}
// For the claw of the spindle holder
translate([0,spindle_front_offset,0])
if(top_part){
translate([wall_height/2,wall_width-4,0])
translate([0,38,0]) {
rotate([0,0,0]) {
translate([spindle_motor_diam_top/2,-12.5,0]) cube([20,20,wall_thickness]);
// Write text in the front
color([0.5,0.5,0.5])
rotate([0,0,180]) scale([-1,1,-textHscale])
writecylinder(topText,[0,0,-wall_thickness/(2*textHscale)],spindle_motor_diam_top/2+spindle_holder_thickness,0,font="orbitron.dxf",space=1.1,h=wall_thickness,t=textThickness,center=true,ccw=true);
}
}
}
else
translate([wall_height/2,wall_width-4,0])
translate([0,38,0]) {
rotate([0,0,180]) {
translate([spindle_motor_diam/2,-7-0.5,0]) cube([22,20,wall_thickness]);
color([0.2,0.2,0.5])
scale([1,1,textHscale])
writecylinder(bottomText,[0,0,wall_thickness/(2*textHscale)+1],spindle_motor_diam/2+spindle_holder_thickness,0,font="orbitron.dxf",space=1.1,h=wall_thickness-2,t=textThickness,center=true,ccw=true);
}
}
}
}
module Z_carriage(showSpindle=false,top_part=true, with_extra_parts=false, exploded=false) {
difference() {
rotate([0,0,-90]) translate([-wall_height/2,-Z_threaded_pos,0]) {
difference () {
Z_solid_body(top_part);
if(top_part) motor_stand_holes_Z();
translate([wall_height/2,wall_width-4,0])
spindle_holder_holes(wall_thickness,spindle_motor_diam,top_part);
translate([wall_height/2-Z_smooth_rods_sep/2,Z_threaded_pos,0])
linearBearingHolderZ(wall_thickness);
translate([wall_height/2+Z_smooth_rods_sep/2,Z_threaded_pos,0])
linearBearingHolderZ(wall_thickness);
}
}
// Hole for the threaded rod
if(!top_part) {
translate([-axes_Xsmooth_separation,0,0])
cylinder(r=6+axes_Zsmooth_rodD,h=wall_thickness*10,center=true);
}
// Truncation in the base for avoiding collision with the X axis
if(!top_part) translate([-15-axes_Xsmooth_separation+11+ZthreadedOffset,0,0]) cube([20,100,50],center=true);
}
}
// Carriages
if(Render_Z_carriageBottom) {
rotate([0,0,-90])
Z_carriage(showSpindle=true,top_part=false,with_extra_parts=with_extra_parts, exploded=exploded);
}
if(Render_Z_carriageTop) {
translate([0,0,spindle_holder_distance+1.5]) rotate([180,0,-90])
Z_carriage(showSpindle=false,top_part=true,with_extra_parts=with_extra_parts, exploded=exploded);
}
// Bearings
linearBearing_single(model="LM8UU", echoPart=true);
translate([axes_Zsmooth_separation,0,0])
translate([-axes_Zsmooth_separation/2,0,1.5])
linearBearing_single(model="LM8UU", echoPart=true);
translate([0,0,24.5])
translate([axes_Zsmooth_separation/2,0,1.5])
linearBearing_single(model="LM8UU", echoPart=true);
translate([axes_Zsmooth_separation,0,24.5])
translate([-axes_Zsmooth_separation/2,0,linearBearingLength+0.5+1.5])
linearBearing_single(model="LM8UU", echoPart=true);
translate([axes_Zsmooth_separation/2,0,linearBearingLength+0.5+1.5])
linearBearing_single(model="LM8UU", echoPart=true);
translate([0,axes_Xsmooth_separation,spindle_holder_distance+1.5-wall_thickness/2])
rotate([180,0,0])
radialBearing(echoPart=true);
// Motor
translate([0,axes_Xsmooth_separation+axis_distance,spindle_holder_distance+1.5]) rotate([180,0,0])
stepperMotor(screwHeight=wall_thickness/2+1.5, echoPart=true);
// Gears
color(color_stillPart) {
translate([0,axes_Xsmooth_separation+axis_distance,spindle_holder_distance+2-wall_thickness-gear_thickness])
cyclone_motor_gear(Gear_N_Teeth=Z_motorGearRatio,gearHeight=gear_thickness,tolerance=0);
translate([0,axes_Xsmooth_separation,spindle_holder_distance+1.5-wall_thickness/2-Z_bearing_width*2-gear_thickness/4])
cyclone_rod_gear(Gear_N_Teeth=Z_rodGearRatio,gearHeight=gear_thickness,nutSize=8,tolerance=0);
}
// Nuts
translate([0,axes_Xsmooth_separation,spindle_holder_distance+1.5-wall_thickness/2-Z_bearing_width*2])
nut(size=axes_Zthreaded_rodD, echoPart=true);
translate([0,axes_Xsmooth_separation,spindle_holder_distance+1.5-wall_thickness/2-Z_bearing_width*2-gear_thickness*1.4])
nut(size=axes_Zthreaded_rodD, chamfer=true, echoPart=true);
// Motor
translate([axes_Zsmooth_separation/2,30,51]) rotate([180,0,0])
stepperMotor(screwHeight=0, echoPart=true);
// Dremel tool
translate([axes_Zsmooth_separation/2,-40,-40]) {
// Dremel tool
translate([0,-40,-40]) {
color([0.2,0.2,0.2]) %cylinder(r1=30/2, r2=50/2, h=40);
translate([0,0,50])
color([0.2,0.2,0.2]) %cylinder(r=50/2, h=80);
@ -36,5 +270,8 @@ module Cyclone_Z_carriage() {
translate([0,0,-20-20])
color([0.9,0.9,0.9]) %cylinder(r1=0.5/2, r2=3/2, h=20);
}
}
//if(z_thread_rod_length)
// translate([-axes_Xsmooth_separation,0,-z_thread_rod_length/2+spindle_holder_distance]) rotate([90,0,0])
// %rod(len=z_thread_rod_length, threaded=true);
}

View File

@ -49,76 +49,8 @@ animated_timePerPart = 1/animated_parts_number;
function animationBump(tbegin,tend,t=$t%1) = ((t >= tbegin) && (t <= tend)) ? (1+sin((t-tbegin)*360/(tend-tbegin)-90)) : 0;
function animatePart(n,dist=30,overlap=animated_timePerPart*0.25) = dist*animationBump((n-1)*animated_timePerPart-overlap,n*animated_timePerPart+overlap);
// Parameters for the bottom base
base_size_X = 304.8 + animatePart(1,overlap=0);
base_size_Y = 261.62 + animatePart(2);
base_thickness = 8;
base_corner_radius = 20;
base_corner_res = 0;
foot_offset = 25;
// Parameters for the axes sizes
axes_Xsmooth_rodLen = 250 + animatePart(1,overlap=0);
axes_Ysmooth_rodLen = 210 + animatePart(2);
axes_Zsmooth_rodLen = 110 + animatePart(3);
axes_Xthreaded_rodLen = axes_Xsmooth_rodLen+50;
axes_Ythreaded_rodLen = axes_Ysmooth_rodLen-10;
axes_Zthreaded_rodLen = 90;
axes_Xsmooth_rodD = 8.5 + animatePart(4,dist=5);
axes_Ysmooth_rodD = 8.5 + animatePart(4,dist=5);
axes_Zsmooth_rodD = 8.2 + animatePart(4,dist=5);
axes_Xthreaded_rodD = 8.5 + animatePart(4,dist=5);
axes_Ythreaded_rodD = 8.5 + animatePart(4,dist=5);
axes_Zthreaded_rodD = 8.5 + animatePart(4,dist=5);
// Parameters for the axes reference position
// Note: The reference coordinates are centered like this:
// Y axis reference is the Y smooth rod end, BACK of RIGHT FRAME
// X axis reference is the frontal X smooth rod end, RIGHT FRAME
// Z axis reference is the Z threaded rod, at the height of the Z nut, and relative to the X reference
axes_Yreference_height = 40 + animatePart(5);
axes_Xreference_height = 74 + animatePart(6); // relative to Y reference
axes_Zreference_height = -3 + animatePart(7) + animatePart(9); // relative to X reference
axes_Xreference_posY = -81-animatePart(8)-animatePart(9); // relative to Y reference. Moves the X axis towards the front of the machine
axes_Zreference_posY = 14; // relative to X reference. Positions Z rods between the Y rods
axes_Y_threaded_height = 30 + animatePart(5);
axes_Ysmooth_separation = 165 + animatePart(1,overlap=0);
axes_Xsmooth_separation = 40 + animatePart(9);
axes_Zsmooth_separation = 40 + animatePart(10,overlap=0);
// Carriage positions (for rendering)
axes_Xcarriage_pos = axes_Xsmooth_rodLen/2+sin($t*360)*axes_Xsmooth_rodLen/3;
axes_Ycarriage_pos = axes_Ysmooth_rodLen/2+sin($t*360)*axes_Ysmooth_rodLen/4.1;
axes_Zcarriage_pos = axes_Zsmooth_rodLen/2+sin($t*360)*axes_Zsmooth_rodLen/8;
// Parameters for the workbed
Ycarriage_linearBearingSeparation = 50;
workbed_size_X = axes_Ysmooth_separation+50;
workbed_size_Y = Ycarriage_linearBearingSeparation+70;
workbed_thickness = 8+3;
workbed_separation_from_Y_smooth_rod = 10;
// Part colors
blueColor = [0.3,0.6,0.9];
redColor = [0.8,0.3,0.3];
yellowColor = [0.9,0.9,0.1];
blackColor = [0.2,0.2,0.2];
color_movingPart = yellowColor+[0.1,0.1,0.1];
color_stillPart = yellowColor;
// Include config file (size and render options)
include <configs/Default_config.h>
// Calculations
axes_Xreference_posX = (axes_Ysmooth_separation-axes_Xsmooth_rodLen)/2; // relative to Y reference
@ -126,13 +58,6 @@ axes_Y_smoothThreaded_verticalSeparation = axes_Yreference_height-axes_Y_threade
axes_ZthreadedReference_posY = axes_Xsmooth_separation-axes_Zreference_posY-axes_Zreference_posY; // Relative to X carriage reference
// Activate/Deactivate rendering auxiliary references (LCS axis, etc)
draw_references = false;
render_DXF_base = false;
render_DXF_workbed = false;
render_bases_outline = false; // Toggle for rendering outline DXFs
DXF_offset = 0.4; // Needed to adjust the tolerance of the laser cutter
// Include Cyclone parts
include <Cycl_X_carriage.scad>
include <Cycl_Z_carriage.scad>
@ -173,26 +98,26 @@ render_2D_or_3D() {
}
// TRANSLATE REFERENCE POSITION to the RIGHT frame, Y smooth rod end
// TRANSLATE REFERENCE POSITION to the LEFT frame, Y smooth rod end
translate([-axes_Ysmooth_separation/2,axes_Ysmooth_rodLen/2,axes_Yreference_height]) {
if(draw_references) %frame();
if(draw_references) %frame();
// Draw right Y smooth rod
rotate([0,0,180]) standard_rod(diam=axes_Ysmooth_rodD, length=axes_Ysmooth_rodLen, threaded=false, echoPart=true);
Cyclone_X_rightFrame();
// TRANSLATE REFERENCE POSITION to the LEFT frame, Y smooth rod end
translate([axes_Ysmooth_separation,0,0]) {
if(draw_references) %frame();
// Draw right Y smooth rod
// Draw left Y smooth rod
rotate([0,0,180]) standard_rod(diam=axes_Ysmooth_rodD, length=axes_Ysmooth_rodLen, threaded=false, echoPart=true);
Cyclone_X_leftFrame();
}
if(Render_X_leftFrame)
Cyclone_X_leftFrame();
// TRANSLATE REFERENCE POSITION to the RIGHT frame, Y smooth rod end
translate([axes_Ysmooth_separation,0,0]) {
if(draw_references) %frame();
// Draw right Y smooth rod
rotate([0,0,180]) standard_rod(diam=axes_Ysmooth_rodD, length=axes_Ysmooth_rodLen, threaded=false, echoPart=true);
if(Render_X_rightFrame)
Cyclone_X_rightFrame();
}
// TRANSLATE REFERENCE POSITION to the right frame, X lower smooth rod end
@ -213,7 +138,8 @@ render_2D_or_3D() {
translate([axes_Xcarriage_pos,0,0]) {
if(draw_references) %frame();
Cyclone_X_carriage();
if(Render_X_carriage)
Cyclone_X_carriage();
// TRANSLATE REFERENCE POSITION to the Z axis origin (right smooth rod)
translate([-axes_Zsmooth_separation/2,axes_Zreference_posY,axes_Zreference_height]) {
@ -229,10 +155,11 @@ render_2D_or_3D() {
rotate([90,0,0]) standard_rod(diam=axes_Zthreaded_rodD, length=axes_Zthreaded_rodLen, threaded=true, echoPart=true);
// TRANSLATE REFERENCE POSITION to the Z axis reference
translate([0,0,axes_Zcarriage_pos]) {
translate([axes_Zsmooth_separation/2,0,axes_Zcarriage_pos]) {
if(draw_references) %frame();
Cyclone_Z_carriage();
if(Render_Z_carriage)
Cyclone_Z_carriage();
}
}
}
@ -241,25 +168,25 @@ render_2D_or_3D() {
}
translate([axes_Xsmooth_rodLen/2,0,0])
control_board(plasticColor=color_stillPart);
// TRANSLATE REFERENCE POSITION to the FRONT RIGHT Y rod idler, Y smooth rod end
translate([-axes_Ysmooth_separation/2,-axes_Ysmooth_rodLen/2,axes_Yreference_height]) {
if(draw_references) %frame();
Cyclone_Y_rightSmoothRodIdler();
if(Render_control_board) {
translate([axes_Xsmooth_rodLen/2,0,0])
control_board(plasticColor=color_stillPart);
}
// TRANSLATE REFERENCE POSITION to the FRONT LEFT Y rod idler, Y smooth rod end
translate([-axes_Ysmooth_separation/2,-axes_Ysmooth_rodLen/2,axes_Yreference_height]) {
if(draw_references) %frame();
if(Render_Y_leftSmoothRodIdler)
Cyclone_Y_leftSmoothRodIdler();
}
// TRANSLATE REFERENCE POSITION to the FRONT RIGHT Y rod idler, Y smooth rod end
translate([axes_Ysmooth_separation/2,-axes_Ysmooth_rodLen/2,axes_Yreference_height]) {
if(draw_references) %frame();
Cyclone_Y_leftSmoothRodIdler();
if(Render_Y_rightSmoothRodIdler)
Cyclone_Y_rightSmoothRodIdler();
}
@ -270,14 +197,16 @@ render_2D_or_3D() {
// Draw Y threaded rod
standard_rod(diam=axes_Ythreaded_rodD, length=axes_Ythreaded_rodLen, threaded=true, echoPart=true);
Cyclone_Y_frontFrame();
if(Render_Y_frontFrame)
Cyclone_Y_frontFrame();
// TRANSLATE REFERENCE POSITION to the BACK Y frame, Y threaded rod end
translate([0,axes_Ythreaded_rodLen,0]) {
if(draw_references) %frame();
Cyclone_Y_backFrame();
if(Render_Y_backFrame)
Cyclone_Y_backFrame();
}
}
@ -288,8 +217,6 @@ render_2D_or_3D() {
if(render_DXF_workbed)
!Cyclone_Y_carriage(); // Render carriage exclusively
else Cyclone_Y_carriage();
else if(Render_Y_carriage) Cyclone_Y_carriage();
}
}

View File

@ -0,0 +1,237 @@
// This file is part of Cyclone PCB Factory: an open-source 3D printable CNC machine for PCB manufacture
// http://reprap.org/wiki/Cyclone_PCB_Factory
// Original author: Carlosgs (http://carlosgs.es)
// License: CC BY-SA 4.0 (Attribution-ShareAlike 4.0 International, http://creativecommons.org/licenses/by-sa/4.0/)
// Designed with http://www.openscad.org/
// Default machine config file
// --- Size parameters ---
// --- Bottom base ---
base_size_X = 304.8 + animatePart(1,overlap=0);
base_size_Y = 261.62 + animatePart(2);
base_thickness = 8;
base_corner_radius = 20;
base_corner_res = 0;
foot_offset = 25;
// --- Axes reference position ---
// Note: The reference coordinates are centred like this:
// Y axis reference is the Y smooth rod end, BACK of RIGHT FRAME
// X axis reference is the frontal X smooth rod end, RIGHT FRAME
// Z axis reference is the Z threaded rod, at the height of the Z nut, and relative to the X reference
axes_Yreference_height = 40 + animatePart(5);
axes_Xreference_height = 74 + animatePart(6); // relative to Y reference
axes_Zreference_height = -3 + animatePart(7) + animatePart(9); // relative to X reference
axes_Xreference_posY = -81-animatePart(8)-animatePart(9); // relative to Y reference. Moves the X axis towards the front of the machine
axes_Zreference_posY = 14; // relative to X reference. Positions Z rods between the Y rods
axes_Y_threaded_height = 30 + animatePart(5);
axes_Ysmooth_separation = 165 + animatePart(1,overlap=0);
axes_Xsmooth_separation = 40 + animatePart(9);
axes_Zsmooth_separation = 40 + animatePart(10,overlap=0);
// --- Work bed ---
Ycarriage_linearBearingSeparation = 50;
workbed_size_X = axes_Ysmooth_separation+50;
workbed_size_Y = Ycarriage_linearBearingSeparation+70;
workbed_thickness = 8+3;
workbed_separation_from_Y_smooth_rod = 10;
PCBholder_height = 10;
PCB_dimX = 160;
PCB_dimY = 100;
PCB_dimZ = 1.6;
PCB_holder_edge_length = 3;
// --- Z carriage ---
Z_carriage_wall_thickness = 9;
Z_carriage_wall_width = 54;
// --- X frames ---
X_frames_additional_thickness = 5;
X_frame_footThickness = 10;
X_frame_corner_radius = 10;
X_frame_FrontalThickness = 15;
X_backlash_armThickness = 30;
X_motorWallSeparation = 5;
X_motorRotatedOffset = 5;
X_gearWallSeparation = 5;
// --- Y frames ---
Y_frame_footThickness = 10;
Y_motorWallSeparation = 5;
Y_motorRotatedOffset = 5;
Y_gearWallSeparation = 5;
Y_foot_additional_separation = 5;
Y_endstopHolderRotation = 5;
Logo = true; // Add logo to the Y Smooth Rod Idlers
// --- Axes sizes ---
// *_rodLen = length
// *_rodD = diameter
// Y smooth rod
axes_Ysmooth_rodLen = 210 + animatePart(2);
axes_Ysmooth_rodD = 8.5 + animatePart(4,dist=5);
// Y threaded rod
axes_Ythreaded_rodLen = axes_Ysmooth_rodLen-10;
axes_Ythreaded_rodD = 8.5 + animatePart(4,dist=5);
// X smooth rod
axes_Xsmooth_rodLen = 250 + animatePart(1,overlap=0);
axes_Xsmooth_rodD = 8.5 + animatePart(4,dist=5);
// X threaded rod
axes_Xthreaded_rodLen = axes_Xsmooth_rodLen+50;
axes_Xthreaded_rodD = 8.5 + animatePart(4,dist=5);
// Z smooth rod
axes_Zsmooth_rodLen = 110 + animatePart(3);
axes_Zsmooth_rodD = 8.2 + animatePart(4,dist=5);
// Z threaded rod
axes_Zthreaded_rodLen = 90;
axes_Zthreaded_rodD = 8.5 + animatePart(4,dist=5);
// --- Bearings ---
Y_linearBearingModel = "LM8UU";
X_linearBearingModel = "LM8UU";
X_linearBearingSeparation = 0;
X_threaded_rod_bearingDepth = 3;
Z_linearBearingModel = "LM8UU";
Z_threaded_rodBearingModel = 608;
Y_threaded_rodBearingModel = 608;
Y_threaded_rodBearingDepth = 3;
// --- Steppers ---
//Y_motorModel = Nema17;
//X_motorModel = Nema17;
//Z_motorModel = Nema17;
Z_motor_adjust_margin = 5;
// --- Screw sizes ---
// M3, M4, etc (integers only), at the moment only M3 and M4 will work.
Y_frontFrame_footScrewSize = 3;
Y_backFrame_footScrewSize = 3;
Y_rightSmoothRodIdler_footScrewSize = 3;
X_Frame_footScrewSize = 3;
Y_threaded_rodNutSize = 8;
X_threaded_rodNutSize = 8;
Z_threaded_rodNutSize = 8;
Y_nutHolder_screwSize = 3;
Y_singleLinearBearingHolder_screwSize = 3;
Y_PCBholder_screwSize = 3;
Y_backlash_washer_D = 15.8;
Y_backlash_washer_thickness = 1.6;
X_backlash_washer_D = 15.8-0.5;
X_backlash_washer_thickness = 1.6-0.9;
X_carriage_screwSize = 3;
Y_rightSmoothRodIdler_rodScrewSize = 3;
X_Frame_rodScrewSize = 3;
spindle_holder_screwSize = 3;
// --- Gears ---
axes_XgearSeparation = 37;
X_rodGearRatio = 21; // Number of tooth
X_motorGearRatio = 21; // Number of tooth
X_gear_thickness = 10;
Z_rodGearRatio = 15; // Number of tooth
Z_motorGearRatio = 8; // Number of tooth
Z_gear_thickness = 10;
axes_YgearSeparation = 37;
Y_rodGearRatio = 21; // Number of tooth
Y_motorGearRatio = 21; // Number of tooth
Y_gear_thickness = 5;
// --- Gear Cover ---
gearCover_margin = 4;
rodGearAddedgearCover_margin = 0;
gearCover_wallThickness = 0.4*4;
gearCover_screwHeadSpaceHeight = 4;
gearCover_screwHeadSpaceDiam = 6;
gearCoverHeight = 16;
gearCoverExtraHeight = 5;
gearCoverExtraRadius = -7;
gearCover_truncationAngle = 10;
// --- Spindle Motor ---
spindle_motor_diam_top = 51.3;
spindle_motor_diam_top_smaller = 47.5;
spindle_motor_diam = 47.5;
spindle_motor_sidelen = 32;
spindle_holder_thickness = 8;
spindle_motor_length = 90;
// --- Text ---
textHscale = 0.8;
textThickness = 1.5;
topText = "CYCLONE";
bottomText = "PCB Factory";
// --- Tolerances ---
Y_threaded_rod_Tolerance = 0.5;
Y_linearBearing_pressureFitTolerance = 0.5;
PCB_holder_tolerance = 1;
axes_Xsmooth_separation_tolerance = 0.5;
X_threaded_rod_Tolerance = 0.5;
Z_linearBearingHole_tolerance = 0.5;
LinearBearingPressureFitTolerance = 0.4;
screwHoleTolerance = 0.4;
// --- Render options ---
// --- Part colours ---
blueColor = [0.3,0.6,0.9];
redColor = [0.8,0.3,0.3];
yellowColor = [0.9,0.9,0.1];
blackColor = [0.2,0.2,0.2];
color_movingPart = yellowColor+[0.1,0.1,0.1];
color_stillPart = yellowColor;
// --- DXF output ---
// Activate/Deactivate rendering auxiliary references (LCS axis, etc)
draw_references = false; // Show reference axis's
render_DXF_base = false; // Render bottom base for DXF export
render_DXF_workbed = false; // Render work bed for DXF export
render_bases_outline = false; //Toggle for rendering outline DXFs
DXF_offset = 0.4; //Needed to adjust the tolerance of the laser cutter
// --- Carriage positions ---
axes_Xcarriage_pos = axes_Xsmooth_rodLen/2+sin($t*360)*axes_Xsmooth_rodLen/3;
axes_Ycarriage_pos = axes_Ysmooth_rodLen/2+sin($t*360)*axes_Ysmooth_rodLen/4.1;
axes_Zcarriage_pos = axes_Zsmooth_rodLen/2+sin($t*360)*axes_Zsmooth_rodLen/8;
// --- Parts ---
Render_X_leftFrame = true;
Render_X_rightFrame = true;
Render_X_carriage = true;
Render_Z_carriage = true;
Render_Z_carriageTop = true;
Render_Z_carriageBottom = true;
Render_Y_leftSmoothRodIdler = true;
Render_Y_rightSmoothRodIdler = true;
Render_Y_frontFrame = true;
Render_Y_backFrame = true;
Render_Y_carriage = true;
Render_control_board = true;
Render_Y_gearCover = true;
Render_Y_motorGear = true;
Render_Y_rodGear = true;
Render_X_gearCover = true;
Render_X_motorGear = true;
Render_X_rodGear = true;
Render_PCBholderTop = true;
Render_PCBholderBottom = true;
Render_YsubPart_linearBearingHolders = true;
Render_YsubPart_nutHolder = true;
//Render_rodHolder = true;

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,379 @@
/* Version 3
Added support for font selection (default is Letters.dxf)
Added WriteCube module
Added Rotate for text (rotates on the plane of the text)
Added writesphere
Added space= (spacing between characters in char widths) def=1
Added writecylinder()
By Harlan Martin
harlan@sutlog.com
January 2012
(The file TestWrite.scad gives More usage examples)
(This module requires the file Letters.dxf to reside in the same folder)
(The file Letters.dfx was created with inkscape..Each letter is in its own layer)
(This module seperates each letter in the string and imports it from Letters.dfx)
*/
pi=3.1415926535897932384626433832795028841971693993751058209;
pi2=pi*2;
// These control the default values for write() writesphere() writecube()
// if the parameters are not included in the call. Feel free to set your own
// defaults.
//default settings
center=false;
h = 4; //mm letter height
t = 1; //mm letter thickness
space =1; //extra space between characters in (character widths)
rotate=0; // text rotation (clockwise)
font = "Letters.dxf"; //default for aditional fonts
fontPath = "./"; // CGS MOD: Path for the DXF font files
// write cube defaults
face = "front"; // default face (top,bottom,left,right,back,front)
up =0; //mm up from center on face of cube
down=0;
right =0; //mm left from center on face of cube
left=0;
// write sphere defaults
rounded=false; //default for rounded letters on writesphere
north=0; // intial text position (I suggest leave these 0 defaults)
south=0;
east=0;
west=0;
spin=0;
// writecylinder defaults
middle=0; //(mm toward middle of circle)
ccw=false; //write on top or bottom in a ccw direction
r1=0; //(not implimented yet)
r2=0; //(not implimented yet)
// Contact me if your interested in how to make your own font files
// Its tedious and time consuming, but not very hard
module writecylinder(text,where,radius,height){
wid=(.125* h *5.5 * space);
widall=wid*(len(text)-1)/2;
//angle that measures width of letters on sphere
function NAngle(radius)=(wid/(pi2*radius))*360;
//angle of half width of text
function mmangle(radius)=(widall/(pi2*radius)*360);
if ((face=="top")||(face=="bottom") ){
if (face=="top" ){
if (center==true){
writecircle(text,where+[0,0,height/2],radius-h,rotate=rotate,font=font,h=h,t=t,
space=space,east=east,west=west,middle=middle,ccw=ccw);
}else{
writecircle(text,where+[0,0,height],radius-h,rotate=rotate,font=font,h=h,t=t,
space=space,east=east,west=west,middle=middle,ccw=ccw);
}
}else{
rotate(180,[1,0,0])
if (center==true){
writecircle(text,where+[0,0,height/2],radius-h,rotate=rotate,font=font,h=h,t=t,
space=space,east=east,west=west,middle=middle,ccw=ccw);
}else{
writecircle(text,where+[0,0,0],radius-h,rotate=rotate,font=font,h=h,t=t,
space=space,east=east,west=west,middle=middle,ccw=ccw);
}
}
}else{
// if (radius>0){
if (center==true) {
rotate(-mmangle(radius)*(1-abs(rotate)/90),[0,0,1])
translate(where)
writethecylinder(text,where,radius,height,r1=radius,r2=radius,h=h,
rotate=rotate,t=t,font=font,face=face,up=up,down=down,
east=east,west=west,center=center,space=space,rounded=rounded);
} else{
rotate(-mmangle(radius)*(1-abs(rotate)/90),[0,0,1])
translate(where+[0,0,height/2])
writethecylinder(text,where,radius,height,r1=radius,r2=radius,h=h,
rotate=rotate,t=t,font=font,face=face,up=up,down=down,
east=east,west=west,center=center,space=space,rounded=rounded);
}
// the remarked out code is for cone shaped cylinders (not complete)
// }else{
// if (center==true) {
// rotate(-mmangle(radius)*(1-abs(rotate)/90),[0,0,1])
// translate(where)
// writethecylinder(text,where,radius,height,r1=r1,r2=r2,h=h,
// rotate=rotate,t=t,font=font,face=face,up=up,down=down,
// east=east,west=west,center=center,space=space,rounded=rounded);
// } else{
// rotate(-mmangle(radius)*(1-abs(rotate)/90),[0,0,1])
// translate(where+[0,0,height/2])
// writethecylinder(text,where,radius,height,r1=r1,r2=r2,h=h,
// rotate=rotate,t=t,font=font,face=face,up=up,down=down,
// east=east,west=west,center=center,space=space,rounded=rounded);
// }
// }
}
}
module writecircle(text,where,radius){
wid=(.125* h *5.5 * space);
widall=wid*(len(text)-1)/2;
//angle that measures width of letters on sphere
function NAngle(radius)=(wid/(pi2*radius))*360;
//angle of half width of text
function mmangle(radius)=(widall/(pi2*radius)*360);
if (ccw==true){
rotate(-rotate+east-west,[0,0,1]){
rotate(-mmangle(radius-middle),[0,0,1]){
translate(where)
for (r=[0:len(text)-1]){
rotate(-90+r*NAngle(radius-middle),[0,0,1]) // bottom out=-270+r
translate([radius-middle,0,0])
//rotate(90,[1,0,0])
//rotate(90,[0,1,0])
rotate(-270,[0,0,1]) // flip text (botom out = -270)
write(text[r],center=true,h=h,t=t,font=font);
}
}
}
}else{
rotate(-rotate-east+west,[0,0,1]){
rotate(mmangle(radius-middle),[0,0,1]){
translate(where)
for (r=[0:len(text)-1]){
rotate(90-r*NAngle(radius-middle),[0,0,1]) // bottom out=-270+r
translate([radius-middle,0,0])
//rotate(90,[1,0,0])
//rotate(90,[0,1,0])
rotate(270,[0,0,1]) // flip text (botom out = -270)
write(text[r],center=true,h=h,t=t,font=font);
}
}
}
}
}
module writethecylinder(text,where,radius,height,r1,r2){
wid=(.125* h *5.5 * space);
widall=wid*(len(text)-1)/2;
//angle that measures width of letters on sphere
function NAngle(radius)=(wid/(pi2*radius))*360*(1-abs(rotate)/90);
//angle of half width of text
function mmangle(radius)=(widall/(pi2*radius)*360);
translate([0,0,up-down])
rotate(east-west,[0,0,1])
for (r=[0:len(text)-1]){
rotate(-90+(r*NAngle(radius)),[0,0,1])
translate([radius,0,-r*((rotate)/90*wid)+(len(text)-1)/2*((rotate)/90*wid)])
rotate(90,[1,0,0])
rotate(90,[0,1,0])
write(text[r],center=true,h=h,rotate=rotate,t=t,font=font);
//echo("zloc=",height/2-r*((rotate)/90*wid)+(len(text)-1)/2*((rotate)/90*wid));
}
}
module writesphere(text,where,radius){
wid=(.125* h *5.5 * space);
widall=wid*(len(text)-1)/2;
echo("-----------------",widall,wid,mmangle(radius));
//angle that measures width of letters on sphere
function NAngle(radius)=(wid/(pi2*radius))*360;
//angle of half width of text
function mmangle(radius)=(widall/(pi2*radius)*360);
rotate(east-west,[0,0,1]){
rotate(south-north,[1,0,0]){
rotate(spin,[0,1,0]){
rotate(-mmangle(radius),[0,0,1]){
if ( rounded== false ){
translate(where)
for (r=[0:len(text)-1]){
rotate(-90+r*NAngle(radius),[0,0,1])
translate([radius,0,0])
rotate(90,[1,0,0])
rotate(90,[0,1,0])
write(text[r],center=true,h=h,rotate=rotate,t=t,font=font);
}
}else{
difference(){
translate(where)
for (r=[0:len(text)-1]){
rotate(-90+r*NAngle(radius),[0,0,1])
translate([radius,0,0])
rotate(90,[1,0,0])
rotate(90,[0,1,0])
write(text[r],center=true,h=h,rotate=rotate,t=t*2+h,font=font);
}
difference(){ //rounded outside
sphere(radius+(t*2+h)*2);
sphere(radius+t/2);
}
sphere(radius-t/2); // rounded inside for indented text
}
}
}
}}}
}
module writecube(text,where,size){
if (str(size)[0] != "["){
// its a square cube (size was not a matrix so make it one)
writethecube(text,where,[size,size,size],h=h,rotate=rotate,space=space,
t=t,font=font,face=face,up=up,down=down,right=right,left=left);
}else{
// its not square
writethecube(text,where,size,h=h,rotate=rotate,space=space,
t=t,font=font,face=face,up=up,down=down,right=right,left=left);
}
}
// I split the writecube module into 2 pieces.. easier to add features later
module writethecube(text,where,size){
if (face=="front") {
translate([where[0]+right-left,where[1]-size[1]/2,where[2]+up-down])
rotate(90,[1,0,0])
write(text,center=true,h=h,rotate=rotate,t=t,font=font);
}
if (face=="back") {
translate([where[0]+right-left,where[1]+size[1]/2,where[2]+up-down])
rotate(90,[1,0,0]) // rotate around the x axis
rotate(180,[0,1,0]) // rotate around the y axis (z before rotation)
write(text,center=true,h=h,rotate=rotate,t=t,font=font);
}
if (face=="left") {
translate([where[0]-size[0]/2,where[1]-right+left,where[2]+up-down ])
rotate(90,[1,0,0]) // rotate around the x axis
rotate(90,[0,-1,0]) // rotate around the y axis (z before rotation)
write(text,center=true,h=h,rotate=rotate,t=t,font=font);
}
if (face=="right") {
translate([where[0]+size[0]/2,where[1]+right-left,where[2] +up-down])
rotate(90,[1,0,0]) // rotate around the x axis
rotate(90,[0,1,0]) // rotate around the y axis (z before rotation)
write(text,center=true,h=h,rotate=rotate,t=t,font=font);
}
if (face=="top") {
translate([where[0]+right-left,where[1]+up-down,where[2]+size[2]/2 ])
write(text,center=true,h=h,rotate=rotate,t=t,font=font);
}
if (face=="bottom") {
translate([where[0]+right-left,where[1]-up+down,where[2]-size[2]/2 ])
rotate(180,[1,0,0])
write(text,center=true,h=h,rotate=rotate,t=t,font=font);
}
}
module write(word){
echo (h);
echo (word);
echo ("There are " ,len(word) ," letters in this string");
// echo ("The second letter is ",word[1]);
// echo (str(word[0],"_"));
rotate(rotate,[0,0,-1]){
for (r = [0:len(word)]){ // count off each character
// if the letter is lower case, add an underscore to the end for file lookup
if ((word[r] == "a" ) || (word[r]== "b") || (word[r]== "c")
|| (word[r]== "d") || (word[r]== "e") || (word[r]== "f")
|| (word[r]== "g") || (word[r]== "h") || (word[r]== "i")
|| (word[r]== "j") || (word[r]== "k") || (word[r]== "l")
|| (word[r]== "m") || (word[r]== "n") || (word[r]== "o")
|| (word[r]== "p") || (word[r]== "q") || (word[r]== "r")
|| (word[r]== "s") || (word[r]== "t") || (word[r]== "u")
|| (word[r]== "v") || (word[r]== "w") || (word[r]== "x")
|| (word[r]== "y" )|| (word[r]== "z")){
if (center == true) {
translate([0,-h/2,0]){
scale([.125*h,.125*h,t]){
translate([ (-len(word)*5.5*space/2) + (r*5.5*space),0,0])
linear_extrude(height=1,convexity=10,center=true){
import(file = str(fontPath,font) ,layer=str(word[r],"_"));
}
}
}
}else{
translate([0,0,t/2]){
scale([.125*h,.125*h,t]){
translate([r*5.5*space,0,0])
linear_extrude(height=1,convexity=10,center=true){
import(file = str(fontPath,font) ,layer=str(word[r],"_"));
}
}
}
}
}else{
if (center == true) {
translate([0,-h/2,0]){
scale([.125*h,.125*h,t]){
translate([ (-len(word)*5.5*space/2) + (r*5.5*space),0,0])
linear_extrude(height=1,convexity=10,center=true){
import(file = str(fontPath,font) ,layer=str(word[r]));
}
}
}
}else{
translate([0,0,t/2]){
scale([.125*h,.125*h,t]){
translate([r*5.5*space,0,0])
linear_extrude(height=1,convexity=10,center=true){
import(file = str(fontPath,font) ,layer=str(word[r]));
}
}
}
}
}
}
}
}
/*writecylinder test
translate([0,0,0])
%cylinder(r=20,h=40,center=true);
color([1,0,0])
writecylinder("rotate=90",[0,0,0],20,40,center=true,down=0,rotate=90);
writecylinder("rotate = 30,east = 90",[0,0,0],20,40,center=true,down=0,rotate=30,east=90);
writecylinder("ccw = true",[0,0,0],20,40,center=true,down=0,face="top",ccw=true);
writecylinder("middle = 8",[0,0,0],20,40,h=3,center=true,down=0,face="top",middle=8);
writecylinder("face = top",[0,0,0],20,40,center=true,down=0,face="top");
writecylinder("east=90",[0,0,0],20,40,h=3,center=true,down=0,face="top",east=90);
writecylinder("west=90",[0,0,0],20,40,h=3,center=true,down=0,face="top",ccw=true,west=90);
writecylinder("face = bottom",[0,0,0],20,40,center=true,down=0,face="bottom");
*/
/*writesphere test
sphere(20);
color([1,0,0])
writesphere("Hello World",[0,0,0],20,t=1,h=6);
*/
/* writecube test
translate([30,30,30])
cube([10,15,30],center=true);
write("hello",center=true,rotate =30);
color([1,0,0])
writecube( "front",[30,30,30],[10,15,30],h=5,rotate=-90);
color([0,1,0])
writecube( "back",[30,30,30],size=[10,15,30],h=5,face="back",rotate=90,t=4);
color([0,0,1])
writecube( "left",[30,30,30],[10,15,30],h=5,face="left",up=5);
color([1,1,0])
writecube( "right",where=[30,30,30],size=[10,15,30],h=5,face="right",rotate=55);
color([1,0,1])
writecube( "top",where=[30,30,30],size=[10,15,30],h=5,face="top");
color([1,1,1])
writecube( "bttm",where=[30,30,30],size=[10,15,30],h=5,face="bottom",rotate=90);
*/

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,80 @@
/* Derived by Carlosgs from:
* http://www.thingiverse.com/thing:12789
* An extruder gear set for the TechZone Huxley,
* featuring Herringbone teeth.
* You will have to recalibrate your E_STEPS_PER_MM in
* your firmware (ratio changing from original techzone
* lasercut gears).
* This use 2 modules from the MCAD library that you can
* get from https://github.com/elmom/MCAD.
*
* Part - the motor gear mount hub with set screw hole -
* derived from http://www.thingiverse.com/thing:3104
* (thanks GilesBathgate) which is under GPL CC license.
*
* Copyright (C) 2011 Guy 'DeuxVis' P.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* --
* DeuxVis - device@ymail.com */
include <MCAD/involute_gears.scad>
// Increase the resolution of default shapes
$fa = 5; // Minimum angle for fragments [degrees]
$fs = 0.5; // Minimum fragment size [mm]
/* Herringbone gear module, adapted from MCAD/involute_gears */
module herringbone_gear( teeth=12, height=10, circles=0, shaft=5 ) {
twist=0;//100;
pressure_angle=30;
diam = teeth*2;
truncation_length = 2.8;
truncation_height = height/2.5;
module myGear() {
difference() {
gear(
number_of_teeth=teeth,
circular_pitch=320,
pressure_angle=pressure_angle,
clearance = 0.2,
gear_thickness = height/2,
rim_thickness = height/2,
rim_width = 1,
hub_thickness = height/2,
hub_diameter=1,
bore_diameter=shaft,
circles=circles,
twist=twist/teeth
);
if (teeth>=10) {
mirror([0,0,1]) translate([0,0,-height/2-0.01]) {
difference() {
cylinder(r=diam/2, h=truncation_height);
translate([0,0,-0.01])
cylinder(r1=diam/2-truncation_length, r2=diam/2+1, h=truncation_height+0.02);
}
}
}
}
}
myGear();
mirror( [0,0,1] )
myGear();
}

View File

@ -6,6 +6,7 @@
use <obiscad/obiscad/bcube.scad>
use <MCAD/metric_fastners.scad>
use <gears.scad>
/*Oak = [0.65, 0.5, 0.4];*/
/*Pine = [0.85, 0.7, 0.45];*/
@ -19,6 +20,11 @@ use <MCAD/metric_fastners.scad>
/*Brass = [0.88, 0.78, 0.5];*/
/*Transparent = [1, 1, 1, 0.2];*/
//Gear material save holes
nholes = 9; // 7
holes_diam = 6;
hole_distance_from_center = 13.5-4.5+holes_diam/2;
// Activate to generate STL for the fully assembled machine
render_all_parts = false;
@ -128,7 +134,6 @@ module hole_for_nut(size=3,nutAddedLen=0,captiveLen=0,rot=0,tolerance=0.35) {
}
}
module screw_single(size=3,length=10,tolerance=0, renderPart=false, echoPart=false) {
height = METRIC_NUT_THICKNESS[size]+tolerance;
color(BlackPaint)
@ -179,22 +184,64 @@ module stepperMotor(screwHeight=10, renderPart=false, echoPart=false) {
//if(echoPart) echo(str("BOM: Motor. Nema17")); // The motor library already outputs motor information
}
module cyclone_motor_gear(Gear_N_Teeth = 21, gearHeight=10, saveMaterial=false, tolerance=0) {
motor_rod_diam = 5/2+tolerance;
// Motor gear
union() difference() {
union() {
//gear
herringbone_gear(teeth=Gear_N_Teeth,height=gearHeight);
module motorGear(r=30,h=10,renderPart=false, echoPart=false) {
renderStandardPart(renderPart)
cylinder(r=r,h=h)
if(echoPart) echo(str("BOM: Gear. Motor."));
translate( [0, 0, 12] ) mirror( [0, 0, 1] ) difference() {
//shaft
cylinder( r=9, h=8);
//captive nut and grub holes
translate( [0, 19.5, 3.5] ) rotate( [90, 0, 0] ) union() {
//enterance
translate( [0, -3, 14.5] ) cube( [6, 6, 2.8], center=true );
//nut
translate( [0, 0, 14.5] ) rotate( [0, 0, 30] )
cylinder( r=6/2+0.5, h=2.8, $fn=6, center=true);
//grub hole
translate( [0, 0, 9] ) cylinder( r=3.3/2, h=10);
}
}
}
if(saveMaterial)
for(i=[0:nholes-1])
rotate( [0, 0, i*360/(nholes)+45])
translate( [hole_distance_from_center, 0] )
cylinder( r=holes_diam/2, h=11, center=true);
//shaft hole
translate( [0, 0, -6] ) cylinder( r=motor_rod_diam, h=20);
}
}
module rodGear(r=30,h=10,renderPart=false, echoPart=false) {
renderStandardPart(renderPart)
cylinder(r=r,h=h)
if(echoPart) echo(str("BOM: Gear. Rod."));
module cyclone_rod_gear(Gear_N_Teeth = 21, gearHeight=10, nutSize = 8, saveMaterial=false, tolerance=0) {
rod_diam = COURSE_METRIC_BOLT_MAJOR_THREAD_DIAMETERS[nutSize]+tolerance;
nut_separation = METRIC_NUT_THICKNESS[nutSize]/2+tolerance;
nut_radius = METRIC_NUT_AC_WIDTHS[nutSize]/2+tolerance;
// Rod Gear
difference() {
union() {
//gear
rotate([180,0,0]) herringbone_gear(teeth=Gear_N_Teeth, height=gearHeight, circles=0, shaft=rod_diam);
}
if(saveMaterial)
for(i=[0:nholes-1])
rotate( [0, 0, i*360/(nholes)+45])
translate( [hole_distance_from_center, 0] )
cylinder( r=holes_diam/2, h=11, center=true);
translate( [0, 0, (nut_separation/2)] )
cylinder(r=nut_radius,h=7,$fn=6);
}
}
use <MCAD/bearing.scad>
module bearingHole(depth=3, thickness=10, model=608, tolerance=1) {
bearingD = bearingOuterDiameter(model)+tolerance;