Merge branch 'development'

pull/20/head
Carlos Garcia 2014-07-22 13:05:25 +02:00
commit 0181d00a75
40 changed files with 417614 additions and 2 deletions

6
.gitmodules vendored Normal file
View File

@ -0,0 +1,6 @@
[submodule "Hardware/CYCLONE_2/libs/MCAD"]
path = Hardware/CYCLONE_2/libs/MCAD
url = ssh://git@github.com/openscad/MCAD.git
[submodule "Hardware/CYCLONE_2/libs/obiscad"]
path = Hardware/CYCLONE_2/libs/obiscad
url = ssh://git@github.com/Obijuan/obiscad.git

View File

@ -0,0 +1,255 @@
// 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/
// Increase the resolution of default shapes
$fa = 5; // Minimum angle for fragments [degrees]
$fs = 0.5; // Minimum fragment size [mm]
// Load necessary libraries
use <libs/obiscad/obiscad/vector.scad>
use <libs/obiscad/obiscad/attach.scad>
use <libs/obiscad/obiscad/bcube.scad>
use <libs/standard_parts.scad>
use <MCAD/materials.scad>
// Functions for animations. Quick and dirty implementation, will need some cleanup
animated_parts_number = 10;
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 = 40;
// Parameters for the axes sizes
axes_Xsmooth_rodLen = animatePart(1,overlap=0)+250;//265;
axes_Ysmooth_rodLen = animatePart(2)+210;
axes_Zsmooth_rodLen = 90+animatePart(3);
axes_Xthreaded_rodLen = axes_Xsmooth_rodLen+50;
axes_Ythreaded_rodLen = axes_Ysmooth_rodLen-10;
axes_Zthreaded_rodLen = axes_Zsmooth_rodLen-20;
axes_Xsmooth_rodD = 8.5+animatePart(4,dist=5);
axes_Ysmooth_rodD = 8.5+animatePart(4,dist=5);
axes_Zsmooth_rodD = 8.5+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 = 42+animatePart(5);
axes_Xreference_height = 70+animatePart(6); // relative to Y reference
axes_Zreference_height = 45+animatePart(7)+animatePart(9); // relative to X reference
axes_Xreference_posY = -80-animatePart(8)-animatePart(9); // relative to Y reference. Moves the X axis towards the front of the machine
axes_Zreference_posY = 15; // relative to X reference. Positions Z nut 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 = 35+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/3;
axes_Zcarriage_pos = axes_Zsmooth_rodLen/3+sin($t*360)*axes_Zsmooth_rodLen/4;
// Parameters for the workbed
Ycarriage_linearBearingSeparation = 50;
workbed_size_X = axes_Ysmooth_separation+50;
workbed_size_Y = Ycarriage_linearBearingSeparation+70;
workbed_thickness = 8;
workbed_separation_from_Y_smooth_rod = 10;
// Calculations
axes_Xreference_posX = (axes_Ysmooth_separation-axes_Xsmooth_rodLen)/2; // relative to Y reference
axes_Y_smoothThreaded_verticalSeparation = axes_Yreference_height-axes_Y_threaded_height;
// Activate/Deactivate rendering auxiliary references (LCS axis, etc)
draw_references = true;
render_2D_plane = false;
// Include Cyclone parts
include <Cyclone_X_carriage.scad>
include <Cyclone_Z_carriage.scad>
include <Cyclone_X_frames.scad>
include <Cyclone_Y_carriage.scad>
include <Cyclone_Y_frames.scad>
// This small module is used to select if an object is rendered as a 2D plane or as a 3D object
module render_2D_or_3D() {
if(render_2D_plane) {
projection(cut = true) children();
} else children();
}
// BEGIN ASSEMBLING THE DESIGN
render_2D_or_3D() {
if(draw_references) %frame();
// Main base for the machine
beveledBase([base_size_X,base_size_Y,base_thickness], radius=base_corner_radius, res=base_corner_res, echoPart=true);//, renderPart=render_2D_plane);
//%color("brown") translate([0,0,-base_thickness/2]) bcube([base_size_X,base_size_Y,base_thickness], cr=base_corner_radius, cres=base_corner_res);
// A4 paper sheet for reference
standard_paperSheet_A4(echoPart=true);
// Cyclone foot stands
translate([0,0,-base_thickness]) {
translate([base_size_X/2-foot_offset,base_size_Y/2-foot_offset])
rubberFoot(echoPart=true);
translate([-base_size_X/2+foot_offset,base_size_Y/2-foot_offset])
rubberFoot(echoPart=true);
translate([-base_size_X/2+foot_offset,-base_size_Y/2+foot_offset])
rubberFoot(echoPart=true);
translate([base_size_X/2-foot_offset,-base_size_Y/2+foot_offset])
rubberFoot(echoPart=true);
}
// TRANSLATE REFERENCE POSITION to the RIGHT frame, Y smooth rod end
translate([-axes_Ysmooth_separation/2,axes_Ysmooth_rodLen/2,axes_Yreference_height]) {
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
rotate([0,0,180]) standard_rod(diam=axes_Ysmooth_rodD, length=axes_Ysmooth_rodLen, threaded=false, echoPart=true);
Cyclone_X_leftFrame();
}
// TRANSLATE REFERENCE POSITION to the right frame, X lower smooth rod end
translate([axes_Xreference_posX,axes_Xreference_posY,axes_Xreference_height]) {
if(draw_references) %frame();
// Draw bottom X smooth rod
rotate([0,0,-90]) standard_rod(diam=axes_Xsmooth_rodD, length=axes_Xsmooth_rodLen, threaded=false, echoPart=true);
// Draw X threaded rod
translate([-(axes_Xthreaded_rodLen-axes_Xsmooth_rodLen)/2,axes_Xsmooth_separation,0])
rotate([0,0,-90]) standard_rod(diam=axes_Xthreaded_rodD, length=axes_Xthreaded_rodLen, threaded=true, echoPart=true);
// Draw top X smooth rod
translate([0,axes_Xsmooth_separation,axes_Xsmooth_separation])
rotate([0,0,-90]) standard_rod(diam=axes_Xsmooth_rodD, length=axes_Xsmooth_rodLen, threaded=false, echoPart=true);
// TRANSLATE REFERENCE POSITION to the X carriage (centered)
translate([axes_Xcarriage_pos,0,0]) {
if(draw_references) %frame();
Cyclone_X_carriage();
// TRANSLATE REFERENCE POSITION to the Z axis origin (top of X carriage, right smooth rod)
translate([-axes_Zsmooth_separation/2,axes_Zreference_posY,axes_Zreference_height]) {
if(draw_references) %frame();
// Draw Z smooth rod (right)
rotate([90,0,0]) standard_rod(diam=axes_Zsmooth_rodD, length=axes_Zsmooth_rodLen, threaded=false, echoPart=true);
// Draw Z smooth rod (left)
translate([axes_Zsmooth_separation,0,0])
rotate([90,0,0]) standard_rod(diam=axes_Zsmooth_rodD, length=axes_Zsmooth_rodLen, threaded=false, echoPart=true);
// Draw Z threaded rod
translate([axes_Zsmooth_separation/2,0,0])
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]) {
if(draw_references) %frame();
Cyclone_Z_carriage();
}
}
}
}
}
// 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();
}
// 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();
Cyclone_Y_leftSmoothRodIdler();
}
// TRANSLATE REFERENCE POSITION to the FRONT Y frame, Y threaded rod end
translate([0,-axes_Ythreaded_rodLen/2,axes_Y_threaded_height]) {
if(draw_references) %frame();
// Draw Y threaded rod
standard_rod(diam=axes_Ythreaded_rodD, length=axes_Ythreaded_rodLen, threaded=true, echoPart=true);
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();
}
}
// TRANSLATE REFERENCE POSITION to the CENTERED Y carriage nut, Y threaded rod
translate([0,-axes_Ysmooth_rodLen/2+axes_Ycarriage_pos,axes_Y_threaded_height]) {
if(draw_references) %frame();
Cyclone_Y_carriage();
}
}

View File

@ -0,0 +1,12 @@
// 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/
module Cyclone_X_carriage() {
color("lightblue") translate([-(axes_Zsmooth_separation+10)/2,-5,-5])
cube([axes_Zsmooth_separation+10,axes_Xsmooth_separation+10,axes_Zreference_height+5]);
}

View File

@ -0,0 +1,205 @@
// 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/
Xmotor_sideLen = 42.20;
axes_XgearSeparation = 37;
axes_XgearRatio = 21/21; // Number of tooth (motor/rod)
X_frames_additional_thickness = 5;
module Cyclone_X_rightFrame() {
scale([-1,1,1]) Cyclone_X_leftFrame(isLeft=false);
}
module Cyclone_X_leftFrame(isLeft=true) {
screwSize = 3; // M3, M4, etc (integers only)
motorWallSeparation = 5;
motorRotatedOffset = 10;
gearWallSeparation = 5;
partThickness = X_frames_additional_thickness+screwSize*2;
dimX = partThickness;
dimY = max(-axes_Xreference_posY,axes_Xsmooth_separation+axes_XgearSeparation*cos(motorRotatedOffset)+Xmotor_sideLen/2+2);
dimZ = axes_Yreference_height+axes_Xreference_height+axes_Xsmooth_separation;
footSeparation = screwSize*3;
footThickness = 10;
footWidth = dimX+2*footSeparation;
bearingDepth = 3;
corner_radius = 10;
difference() {
// Main block
union() {
translate([-axes_Xreference_posX-dimX-0.01,axes_Xreference_posY,-axes_Yreference_height]) {
cube([dimX,dimY,dimZ-axes_Xsmooth_separation]);
translate([-footWidth/2+dimX,dimY/2,footThickness/2]) bcube([footWidth,dimY,footThickness], cr=corner_radius, cres=10);
}
//translate([-axes_Xreference_posX-dimX-0.01,axes_Xreference_posY+axes_Xsmooth_separation,-axes_Yreference_height])
// cube([dimX,dimY-axes_Xsmooth_separation,dimZ]);
rodHolder(rodD=axes_Ysmooth_rodD, screwSize=screwSize, 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]) cylinder(r=axes_Xsmooth_separation,h=partThickness);
}
}
}
// TRANSLATE REFERENCE POSITION to the left frame, X lower smooth rod end
translate([-axes_Xreference_posX,axes_Xreference_posY,axes_Xreference_height]) {
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);
// TRANSLATE REFERENCE POSITION to the threaded rod
translate([0,axes_Xsmooth_separation,0]) {
translate([0,-15,-40]) rotate([0,-90,0]) cylinder(r=15,h=partThickness*2);
translate([0,30,-40]) rotate([0,-90,0]) cylinder(r=15,h=partThickness*2);
translate([0,-15,-80]) rotate([0,-90,0]) cylinder(r=15,h=partThickness*2);
rotate([0,-90,0]) bearingHole(depth=bearingDepth, thickness=partThickness);
//rotate([0,0,90]) standard_rod(diam=axes_Xthreaded_rodD+10, length=partThickness*4, threaded=false, renderPart=true, center=true);
// Translate to motor position
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, slide_distance=5, sideLen=Xmotor_sideLen, slideOut=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);
}
}
}
// Holes for the screws
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);
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);
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);
}
}
// Draw rod holders, motor, gears, screws
// TRANSLATE REFERENCE POSITION to the left frame, X lower smooth rod end
translate([-axes_Xreference_posX,axes_Xreference_posY,axes_Xreference_height]) {
if(draw_references) color("red") %frame(20);
rotate([0,0,-90])
rotate([0,90,0])
rodHolder(rodD=axes_Ysmooth_rodD, screwSize=screwSize);
// 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])
radialBearing(echoPart=true);
if(isLeft) {
translate([gearWallSeparation,0,0]) rotate([0,90,0])
rodGear(r=axes_XgearSeparation/(1+1/axes_XgearRatio), echoPart=true);
// Translate to motor position
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]) motorGear(r=axes_XgearSeparation/(1+axes_XgearRatio), echoPart=true);
}
}
}
translate([0,0,axes_Xsmooth_separation])
rotate([0,0,-90])
rodHolder(rodD=axes_Ysmooth_rodD, screwSize=screwSize);
}
}
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, 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, 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, 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;
dimY = X_frames_additional_thickness+screwSize*2;
dimZ = rodD/2+thickness;
corner_radius = 4;
if(negative) {
translate([screwSize+screwAditionalDistance,-dimY/2,dimZ])
rotate([-90,0,0])
rotate([0,0,180])
hole_for_screw(size=screwSize,length=dimZ+15,nutDepth=5,nutAddedLen=0,captiveLen=10);
translate([-screwSize-screwAditionalDistance,-dimY/2,dimZ])
rotate([-90,0,0])
rotate([0,0,180])
hole_for_screw(size=screwSize,length=dimZ+15,nutDepth=5,nutAddedLen=0,captiveLen=10);
} else {
difference() {
union() {
translate([0,-dimY/2,dimZ/2+space/4]) bcube([dimX,dimY,dimZ-space/2],cr=corner_radius,cres=10);
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);
else
translate([0,-dimY/2,-height/2-space/4]) bcube([dimX,dimY,height-space/2],cr=corner_radius,cres=10);
}
translate([screwSize+screwAditionalDistance,-dimY/2,dimZ])
rotate([-90,0,0])
rotate([0,0,180])
hole_for_screw(size=screwSize,length=dimZ+15,nutDepth=5,nutAddedLen=0,captiveLen=10);
translate([-screwSize-screwAditionalDistance,-dimY/2,dimZ])
rotate([-90,0,0])
rotate([0,0,180])
hole_for_screw(size=screwSize,length=dimZ+15,nutDepth=5,nutAddedLen=0,captiveLen=10);
standard_rod(diam=rodD, length=dimY*4, threaded=false, renderPart=true, center=true);
rodHolder(rodD=rodD, screwSize=screwSize, negative=true);
}
// Draw screws
translate([screwSize+screwAditionalDistance,-dimY/2,dimZ+0.01])
rotate([-90,0,0])
rotate([0,0,180])
screw_and_nut(size=screwSize,length=dimZ+15,nutDepth=5,nutAddedLen=0,captiveLen=0, echoPart=true);
translate([-screwSize-screwAditionalDistance,-dimY/2,dimZ+0.01])
rotate([-90,0,0])
rotate([0,0,180])
screw_and_nut(size=screwSize,length=dimZ+15,nutDepth=5,nutAddedLen=0,captiveLen=0, echoPart=true);
}
}

View File

@ -0,0 +1,44 @@
// 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/
module Cyclone_YsubPart_nutHolder() {
workbed_separation_from_Y_threaded_rod = axes_Y_smoothThreaded_verticalSeparation+workbed_separation_from_Y_smooth_rod+axes_Ysmooth_rodD/2;
footThickness = 10;
screwSeparation = 14;
dimX = 15;
dimY = screwSeparation*2;
dimZ = workbed_separation_from_Y_threaded_rod+10;
#translate([-10,-dimY/2,-10])
cube([dimX,dimY,dimZ]);
translate([0,-screwSeparation/2,workbed_separation_from_Y_threaded_rod+workbed_thickness])
rotate([90,0,0])
hole_for_screw(size=3,length=workbed_thickness+footThickness,nutDepth=-dimZ,nutAddedLen=dimZ,captiveLen=0);
translate([0,+screwSeparation/2,workbed_separation_from_Y_threaded_rod+workbed_thickness])
rotate([90,0,0])
hole_for_screw(size=3,length=workbed_thickness+footThickness,nutDepth=-dimZ,nutAddedLen=dimZ,captiveLen=0);
}
module Cyclone_Y_carriage() {
baseHeight = workbed_separation_from_Y_smooth_rod-1;
color("lightgreen") {
Cyclone_YsubPart_nutHolder();
translate([0,0,axes_Y_smoothThreaded_verticalSeparation+baseHeight/2]) {
translate([axes_Ysmooth_separation/2,Ycarriage_linearBearingSeparation/2])
cube([10,10,10+baseHeight], center=true);
translate([-axes_Ysmooth_separation/2,Ycarriage_linearBearingSeparation/2])
cube([10,10,10+baseHeight], center=true);
translate([-axes_Ysmooth_separation/2,-Ycarriage_linearBearingSeparation/2])
cube([10,10,10+baseHeight], center=true);
translate([axes_Ysmooth_separation/2,-Ycarriage_linearBearingSeparation/2])
cube([10,10,10+baseHeight], center=true);
}
}
color([0.9,0.8,0.8,0.5]) translate([0,0,8+5+axes_Y_smoothThreaded_verticalSeparation+baseHeight])
beveledBase(size=[workbed_size_X,workbed_size_Y,workbed_thickness], radius=3, res=15, echoPart=true);
}

View File

@ -0,0 +1,354 @@
// 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/
module mirrorOrNot(mirrorPart=false, axes=[-1,1,1]) {
if(mirrorPart) scale(axes) children();
else children();
}
use <MCAD/bearing.scad>
Ymotor_sideLen = 42.20;
axes_YgearSeparation = 37;
axes_YgearRatio = 21/21; // Number of tooth (motor/rod)
module Cyclone_Y_frontFrame() {
*color("red")
translate([-10,0,-axes_Y_threaded_height])
cube([20,10,axes_Y_threaded_height+5]);
screwSize = 3; // M3, M4, etc (integers only)
motorWallSeparation = 5;
motorRotatedOffset = 5;
gearWallSeparation = 5;
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;
partThickness = 5+screwSize*2;
dimX = bearing_diam+partThickness;
dimY = partThickness;
dimZ = axes_Y_threaded_height;
footSeparation = screwSize*2;
foot_additional_separation = 5;
footThickness = 10;
translate([0,2*rod_nut_len+gear_thickness,0]) {
translate([0,bearing_width-bearingDepth,0]) {
if(draw_references) color("blue") %frame(20);
difference() {
// Main block
union() {
hull() {
rotate([-90,0,0])
cylinder(r=dimX/2,h=dimY);
translate([-dimX/2,0,-dimZ])
cube([dimX,dimY,dimZ]);
translate([-20,0,0]) {
rotate([-90,0,0])
cylinder(r=dimX/2,h=dimY);
translate([-dimX/2,0,-dimZ])
cube([dimX/2,dimY,dimZ]);
}
}
translate([0,dimY/2,-dimZ]) {
hull() {
translate([0,0,0])
cylinder(r=dimY/2,h=footThickness);
translate([-footSeparation-foot_additional_separation-motor_YgearSeparation_projected-Ymotor_sideLen/2,0,0])
cylinder(r=dimY/2,h=footThickness);
}
translate([-motor_YgearSeparation_projected-Ymotor_sideLen/2-2,-dimY/2,1])
cube([dimX,dimY,dimZ/2]);
}
translate([0,dimY/2,-dimZ])
hull() {
cylinder(r=dimY/2,h=footThickness);
translate([footSeparation+dimX/2,0,0])
cylinder(r=dimY/2,h=footThickness);
translate([dimX/3,dimY/2+footSeparation+foot_additional_separation,0])
cylinder(r=dimY/2,h=footThickness);
}
}
translate([0,-0.01,0])
rotate([-90,0,0])
bearingHole(depth=bearingDepth, thickness=partThickness);
translate([0,dimY/2,-dimZ+footThickness]) {
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);
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);
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);
}
// Translate to motor axis position
rotate([0,-motorRotatedOffset,0]) {
translate([-axes_XgearSeparation,0,0])
rotate([0,motorRotatedOffset,0]) {
translate([0,motorWallSeparation-0.01,0])
rotate([0,0,90]) rotate([0,-90,0]) stepperMotor_mount(motorWallSeparation, slide_distance=5, sideLen=Ymotor_sideLen, slideOut=false);
}
}
}
// Draw vitamins (nuts, bolts, bearings)
translate([0,dimY/2,-dimZ+footThickness]) {
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, 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, 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, autoNutOffset=true, echoPart=true);
}
// Translate to motor position
rotate([0,-motorRotatedOffset,0]) {
translate([-axes_XgearSeparation,0,0])
rotate([0,motorRotatedOffset,0]) {
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]) motorGear(r=axes_XgearSeparation/(1+axes_XgearRatio), echoPart=true);
}
}
}
rotate([-90,0,0])
radialBearing(echoPart=true);
}
translate([0,0.01,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])
rodGear(r=axes_YgearSeparation/(1+1/axes_YgearRatio), echoPart=true);
}
module Cyclone_Y_backFrame() {
screwSize = 3; // M3, M4, etc (integers only)
rod_nut_len = 0.8*axes_Ythreaded_rodD;
bearing_width = bearingWidth(608);
bearing_diam = bearingOuterDiameter(608);
bearingDepth = 3;
partThickness = 5+screwSize*2;
dimX = bearing_diam+partThickness;
dimY = partThickness;
dimZ = 0;
footSeparation = screwSize*2;
foot_additional_separation = 5;
footThickness = 10;
translate([0,-2*rod_nut_len,0]) {
translate([0,bearingDepth-bearing_width,0]) {
difference() {
union() {
rotate([90,0,0])
cylinder(r=dimX/2,h=dimY);
translate([-dimX/2,-dimY,-axes_Y_threaded_height])
cube([dimX,dimY,axes_Y_threaded_height]);
translate([0,-dimY/2,-axes_Y_threaded_height])
hull() {
translate([-footSeparation-dimX/2,0,0])
cylinder(r=dimY/2,h=footThickness);
translate([footSeparation+dimX/2,0,0])
cylinder(r=dimY/2,h=footThickness);
translate([0,dimY/2+footSeparation+foot_additional_separation,0])
cylinder(r=dimY/2,h=footThickness);
}
}
translate([0,0.01,0])
rotate([90,0,0])
bearingHole(depth=bearingDepth, thickness=partThickness);
translate([0,-dimY/2,-axes_Y_threaded_height+footThickness]) {
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);
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);
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);
}
}
// Draw vitamins (nuts, bolts, bearings)
translate([0,-dimY/2,-axes_Y_threaded_height+footThickness]) {
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, 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, 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, autoNutOffset=true, echoPart=true);
}
}
rotate([90,0,0])
radialBearing(echoPart=true);
}
translate([0,0.01,0])
rotate([90,0,0])
rotate([0,0,45]) nut(size=axes_Ythreaded_rodD, chamfer=true, echoPart=true);
translate([0,-rod_nut_len,0])
rotate([90,0,0])
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;
if(mirrorLogo)
mirror([ 1, 0, 0 ]) linear_extrude(height=thickness) scale(scale_factor) import("dxf/CycloneLogo.dxf", layer="logo");
else
linear_extrude(height=thickness) scale(scale_factor) import("dxf/CycloneLogo.dxf", layer="logo");
}
module Cyclone_Y_rightSmoothRodIdler(mirrorLogo = false) {
holderThickness = 5;
holderOuterRadius = holderThickness+axes_Ysmooth_rodD/2;
screwSize = 3; // M3, M4, etc (integers only)
dimX = holderOuterRadius*2;
dimY = 5+screwSize*2;
dimZ = axes_Yreference_height;
slotHeight = 3;
screwLength = holderOuterRadius*2;
logoDepth = dimY/4;
footSeparation = screwSize*2;
footThickness = 10;
color("lightcyan") {
difference() {
union() {
translate([0,0,-axes_Yreference_height])
cube([dimX,dimY,dimZ+holderThickness+axes_Ysmooth_rodD/2]);
translate([-holderOuterRadius,0,-axes_Yreference_height])
cube([dimX,dimY,dimZ]);
rotate([-90,0,0]) cylinder(r=holderOuterRadius, h=dimY);
translate([0,dimY/2,-axes_Yreference_height])
hull() {
translate([-holderOuterRadius-footSeparation,0,0])
cylinder(r=dimY/2,h=footThickness);
translate([holderOuterRadius*2+footSeparation,0,0])
cylinder(r=dimY/2,h=footThickness);
translate([holderOuterRadius/2,dimY/2+footSeparation,0])
cylinder(r=dimY/2,h=footThickness);
}
}
standard_rod(diam=axes_Ysmooth_rodD, length=dimY*4, threaded=false, renderPart=true, center=true);
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);
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);
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);
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);
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);
}
}
}
// 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, 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, 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, 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, echoPart=true);
}
}
module Cyclone_Y_leftSmoothRodIdler() {
scale([-1,1,1]) Cyclone_Y_rightSmoothRodIdler(mirrorLogo = true);
}

View File

@ -0,0 +1,16 @@
// 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/
module Cyclone_Z_carriage() {
color("cyan") translate([-5,-100+5,0]) {
cube([axes_Zsmooth_separation+10,100,10]);
translate([0,0,30])
cube([axes_Zsmooth_separation+10,100,10]);
}
}

View File

@ -0,0 +1,30 @@
Hardware for Cyclone-PCB-Factory
===================
Version 2.0
--
Adressing all the issues from the original design, implementing improvements by yOPERO, Martin Zabojnik and others.
* Tougher parts (great ongoing work!):
* Stronger holders for the linear bearings (vibration makes them slide away)
* Reinforce screw holders
* Attachment for a vacuum cleaner
* Better scalability (particularly for the Y axis)
* Better spindle motor design:
* Brushless motor for the spindle
* Spindle speed control
* Integrated endstop holders
Work in progress
--
![ScreenShot](output/cyclone.png)
The new design tries to be more parameterized:
![ScreenShot](output/cyclone.gif)
Disclaimer
--
This hardware/software is provided "as is", and you use the hardware/software at your own risk. Under nocircumstances shall any author be liable for direct, indirect, special, incidental, or consequential damages resulting from the use, misuse, or inability to use this hardware/software, even if the authors have been advised of the possibility of such damages.

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,99 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="178.17004"
height="173.37346"
id="svg3064"
version="1.1"
inkscape:version="0.48.4 r9939"
sodipodi:docname="CycloneLogo.svg">
<defs
id="defs3" />
<sodipodi:namedview
inkscape:document-units="mm"
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="2.8284271"
inkscape:cx="3.6162388"
inkscape:cy="-7.7762638"
inkscape:current-layer="layer1"
showgrid="true"
units="mm"
inkscape:window-width="1920"
inkscape:window-height="1025"
inkscape:window-x="0"
inkscape:window-y="27"
inkscape:window-maximized="1"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0">
<inkscape:grid
type="xygrid"
id="grid3016"
empspacing="5"
visible="true"
enabled="true"
snapvisiblegridlinesonly="true" />
</sodipodi:namedview>
<metadata
id="metadata4">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="logo"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-19.272178,-351.38974)">
<path
inkscape:connector-curvature="0"
d="m -48.719241,437.84548 8.623657,0.15308 10.970922,1.04607 10.996436,1.68391 10.8433545,2.29624 10.511673,2.85754 10.0269065,3.36782 9.363559,3.80155 8.54711,4.20977 7.55208,4.56697 1.53083,1.07157 4.51594,1.88802 4.337341,2.24522 4.13323,2.55137 3.92912,2.85755 7.16937,6.53152 6.14882,7.5776 2.627919,4.10771 2.347261,4.33734 2.01559,4.51594 1.709419,4.72005 1.32672,4.84762 0.99504,5.0007 0.20411,1.78596 -45.59311,0 -0.892989,-1.68391 -2.347261,-2.80651 -2.80652,-2.34727 -3.24025,-1.73494 -3.57193,-1.12261 -3.82706,-0.3827 -3.82707,0.3827 -3.57192,1.12261 -3.240251,1.73494 -2.8065165,2.34727 -2.347268,2.80651 -1.734936,3.24025 -1.12260701,3.57193 -0.382706,3.82706 0.382706,3.82707 1.12260701,3.57193 1.734936,3.24025 2.347268,2.80651 2.8065165,2.32176 3.240251,1.76045 3.57192,1.09709 3.82707,0.38271 3.82706,-0.38271 3.57193,-1.09709 3.24025,-1.76045 2.80652,-2.32176 2.347261,-2.80651 1.734939,-3.24025 0.0765,-0.22963 44.802191,0 -0.99504,6.40396 -1.76045,6.60807 -2.39829,6.3019 -3.01063,5.99574 -3.57193,5.58752 -4.0822,5.17929 -4.56697,4.74556 0.10206,1.22466 0.5613,4.84762 0.969519,4.03117 1.505321,3.57193 2.143149,3.46988 3.112681,3.49538 3.64847,3.16371 6.09779,3.67398 7.11835,3.03613 8.368509,2.47486 9.848323,1.99006 1.91353,0.38272 -0.3827,0.33166 -6.02125,1.45428 -7.552082,0.96954 -16.992171,0 -10.99644,-1.04607 -10.99643,-1.68392 -10.84336,-2.29623 -10.51167,-2.85755 -10.02691,-3.36781 -9.36356,-3.80155 -8.5471095,-4.20977 -7.552079,-4.56697 -1.836991,-1.32671 -4.439398,-1.93905 -4.2863145,-2.24521 -7.934783,-5.43444 -7.041801,-6.53152 -6.046763,-7.52657 -4.898646,-8.41954 -1.990072,-4.49042 -1.658397,-4.66902 -1.326717,-4.79659 -0.94401,-4.97519 -0.586816,-5.07724 -0.20411,-5.20481 0.357194,-7.01629 1.071578,-6.81218 1.734936,-6.53152 2.372781,-6.25088 2.959597,-5.9447 3.495388,-5.56201 4.031176,-5.15378 4.490423,-4.72005 -0.127568,-1.55634 -0.561303,-4.84761 -0.995036,-4.03118 -1.505313,-3.57193 -2.143158,-3.46987 -3.112679,-3.49539 -3.622956,-3.18922 -6.097791,-3.67398 -7.118345,-3.01063 -8.368518,-2.47484 -9.848315,-1.99007 -1.913533,-0.38271 0.382707,-0.33167 6.02125,-1.45429 7.552075,-0.96953 8.368519,-0.17859 0,0"
style="fill:#000000;stroke:#000000;stroke-width:0.28802216"
id="path34" />
</g>
<g
inkscape:groupmode="layer"
id="layer3"
inkscape:label="dot">
<path
style="fill:#000000"
d="m 11.111679,173.37345 -0.225752,2.2394 -0.64746,2.08577 -1.0244855,1.88748 -1.35684,1.6445 -1.644493,1.35683 -1.88748,1.02449 -2.085781,0.64747 -2.239386,0.22574 -2.239394,-0.22574 -2.085773,-0.64747 -1.88748,-1.02449 -1.6445,-1.35683 -1.356833,-1.6445 -1.0244865,-1.88748 -0.647467,-2.08577 -0.225747,-2.2394 0.225747,-2.23938 0.647467,-2.08578 1.0244865,-1.88748 1.356833,-1.6445 1.6445,-1.35683 1.88748,-1.02449 2.085773,-0.64746 2.239394,-0.22575 2.239386,0.22575 2.085781,0.64746 1.88748,1.02449 1.644493,1.35683 1.35684,1.6445 1.0244855,1.88748 0.64746,2.08578 z"
id="path2991"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccccccccccccccccccccccccccccccccc" />
</g>
<g
inkscape:groupmode="layer"
id="layer4"
inkscape:label="Origin">
<path
sodipodi:type="arc"
style="fill:#000000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
id="path3024"
sodipodi:cx="0"
sodipodi:cy="173.37346"
sodipodi:rx="1"
sodipodi:ry="1"
d="m 1,173.37346 a 1,1 0 1 1 -2,0 1,1 0 1 1 2,0 z" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 5.4 KiB

View File

@ -0,0 +1,136 @@
/* 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.
*
* August 2013 added 2 extra setscrews to ensure centered usage.
* by Harry Binnema.
*
* 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/materials.scad>
include <MCAD/teardrop.scad>
include <MCAD/involute_gears.scad>
motor_shaft_diameter=5.3;
BigGear_N_Teeth = 21; // 24
nholes = 9; // 7
holes_diam = 6;
hole_distance_from_center = 13.5-4.5+holes_diam/2;
/* Herringbone gear module, adapted from MCAD/involute_gears */
module herringbone_gear( teeth=12, circles=0, shaft=5 ) {
twist=200;
height=10;
pressure_angle=30;
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
);
mirror( [0,0,1] )
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
);
}
module cyclone_motor_gear(with_extra_parts=false, exploded=false) {
// Motor gear
union() difference() {
union() {
//gear
herringbone_gear( teeth=BigGear_N_Teeth );
translate( [0, 0, 12] ) mirror( [0, 0, 1] ) difference() {
//shaft
cylinder( r=9, h=15, $fn=40 );
//adapted to include 3 captive nuts for symmetrical positioning
//adpted bij HJ Binnema on August 26 2013.
for (i= [0:2]){
rotate([0,0,i*120]){
//captive nut and grub holes
translate( [0, 20, 3.5] ) rotate( [90, 0, 0] ) union() {
//enterance
translate( [0, -3, 14.5] ) cube( [6, 6, 2.6], center=true );
//nut
translate( [0, 0, 13.3] ) rotate( [0, 0, 30] )
cylinder( r=6/2+0.5, h=2.6, $fn=6 );
//grub hole
translate( [0, 0, 9] ) cylinder( r=3.2/2, h=10, $fn=6 );
}}}
}
}
//holes to save plastic
for(i=[0:nholes-1])
rotate( [0, 0, i*360/(nholes)+45], $fn=20 )
translate( [hole_distance_from_center, 0] )
cylinder( r=holes_diam/2, h=11, center=true, $fn=30 );
//shaft hole
translate( [0, 0, -6] ) cylinder( r=motor_shaft_diameter/2, h=20, $fn=30 );
}
if(with_extra_parts)
cyclone_motor_gear_extras(exploded_distance=(exploded?20:0));
module cyclone_motor_gear_extras(exploded_distance=0) {
echo("Non-Plastic Parts, 1, Grub Screw M3 x 8 mm to attach gear to motor shaft");
translate([0,2.5+8+exploded_distance,12-3.5])
rotate([90, 0, 0])
color(Steel) cylinder(r=1.5, h=8, $fn=30);
}
}
cyclone_motor_gear();

View File

@ -0,0 +1,114 @@
/* 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/metric_fastners.scad>
include <MCAD/materials.scad>
include <MCAD/teardrop.scad>
include <MCAD/involute_gears.scad>
M8_nut_diameter = 15.3;
nut_separation = 3;
SmallGear_N_Teeth = 21;//17; // 12
M8_rod_diam = 8.4;
/* Herringbone gear module, adapted from MCAD/involute_gears */
module herringbone_gear( teeth=12, circles=0, shaft=5 ) {
twist=200;
height=10;
pressure_angle=30;
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
);
mirror( [0,0,1] )
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
);
}
module cyclone_rod_gear(with_extra_parts=false, exploded=false) {
// Extruder Gear
difference() {
union() {
//gear
rotate([180,0,0]) herringbone_gear( teeth=SmallGear_N_Teeth, circles=0, shaft=M8_rod_diam, $fn=40 );
//M8 hobbed bolt head fit washer
/*difference() {
translate( [0, 0, 5] ) cylinder( r=8, h=3, $fn=60 );
translate( [0, 0, 5-0.01] ) cylinder( r=M8_nut_diameter/2, h=7, $fn=6 );
}*/
/*rotate([180,0,0]) difference() {
translate( [0, 0, 5] ) cylinder( r=13, h=3, $fn=60 );
translate( [0, 0, 5+0.4] ) cylinder( r=M8_nut_diameter/2, h=7, $fn=6 );
}*/
}
translate( [0, 0, (nut_separation/2)] ) cylinder( r=M8_nut_diameter/2, h=7, $fn=6 );
}
if(with_extra_parts)
cyclone_rod_gear_extras(exploded_distance=(exploded?12:0));
module cyclone_rod_gear_extras(exploded_distance=0) {
echo("Non-Plastic Parts, 2, Nut M8 to attach rod_gear on threaded rod");
translate([0,0,-10/2-0.8*8-1.0*exploded_distance]) color(Steel) flat_nut(8);
translate([0,0,nut_separation/2+0.8*8+1.0*exploded_distance]) rotate([180,0,0]) color(Steel) flat_nut(8);
}
}
cyclone_rod_gear();

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

@ -0,0 +1 @@
Subproject commit 85794e4b4f2294a1b445a4d928866bedd5cc64ec

View File

@ -0,0 +1,42 @@
// Useful OpenScad command reference:
//use <MCAD/motors.scad>
//stepper_motor_mount(nema_standard=17, slide_distance=10, $fn=40, mochup=true);
//use <MCAD/boxes.scad>
//roundedBox([10,20,30], radius=2, sidesonly=false, $fn=60);
//use <libs/obiscad/bcube.scad>
//bcube([20,20,10],cr=4, cres=10);
//include <MCAD/stepper.scad>
//motor(Nema17, size=NemaMedium, dualAxis=false);
//use <MCAD/teardrop.scad>
//teardrop(radius=10, length=20, angle=90);
//use <MCAD/nuts_and_bolts.scad>
//nutHole(size=3, tolerance=0.5, proj=-1);
//boltHole(size=3, length=10, tolerance=0.5, proj=-1, $fn=40);
//use <libs/hole_for_screw.scad>
//hole_for_screw(size=3,length=15,nutDepth=0,nutAddedLen=3.5,captiveLen=0);
//-- Connector definitions
// att. point att. axis roll
//C_origin = [ [0,0,0], [0,0,1], 0 ];
//C_other = [ [0,0,20], [0,1,1], 5 ];
//
//if(draw_references) {
// %frame();
// %connector(C_origin);
// %connector(C_other);
//}
//attach(a,origin) cylinder(r=0.25, h=20, $fn=3);

@ -0,0 +1 @@
Subproject commit 5c6541222e0cc4b2d75c60e553f46ee5e2f8572e

View File

@ -0,0 +1,197 @@
// 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/
use <obiscad/obiscad/bcube.scad>
use <MCAD/metric_fastners.scad>
/*Oak = [0.65, 0.5, 0.4];*/
/*Pine = [0.85, 0.7, 0.45];*/
/*Birch = [0.9, 0.8, 0.6];*/
/*FiberBoard = [0.7, 0.67, 0.6];*/
/*BlackPaint = [0.2, 0.2, 0.2];*/
/*Iron = [0.36, 0.33, 0.33];*/
/*Steel = [0.65, 0.67, 0.72];*/
/*Stainless = [0.45, 0.43, 0.5];*/
/*Aluminum = [0.77, 0.77, 0.8];*/
/*Brass = [0.88, 0.78, 0.5];*/
/*Transparent = [1, 1, 1, 0.2];*/
// Activate to generate STL for the fully assembled machine
render_all_parts = false;
// Selects if the part is fully rendered or only in preview mode
module renderStandardPart(renderPart) {
if(renderPart || render_all_parts) children();
else %children();
}
module standard_paperSheet_A4(t=0.05, renderPart=false, echoPart=false) {
renderStandardPart(renderPart)
translate([0,0,t/2])
color("white") cube([297,210,t], center=true);
if(echoPart) echo(str("BOM: Paper sheet. A4. Thickness ", t, "mm"));
}
module standard_rod(diam=8, length=10, threaded=true, center=false, renderPart=false, echoPart=false) {
renderStandardPart(renderPart)
if(threaded) {
color(BlackPaint) rotate([-90,0,0]) cylinder(r=diam/2, h=length, center=center);
if(echoPart) echo(str("BOM: Rod. Threaded. Diameter ", diam, "mm. Length ", length, "mm"));
} else {
color(Stainless) rotate([-90,0,0]) cylinder(r=diam/2, h=length, center=center);
if(echoPart) echo(str("BOM: Rod. Smooth. Diameter ", diam, "mm. Length ", length, "mm"));
}
}
module rubberFoot(diam=40, thickness=8, renderPart=false, echoPart=false) {
renderStandardPart(renderPart)
color(BlackPaint)
translate([0,0,-thickness])
cylinder(r=diam/2, h=thickness);
if(echoPart) echo(str("BOM: Rubber foot. Diameter ", diam, "mm. Thickness ", thickness, "mm"));
}
module beveledBase(size=[100,200,10], radius=10, res=15, renderPart=false, echoPart=false) {
renderStandardPart(renderPart)
color("brown")
translate([0,0,-size.z/2])
bcube(size, cr=radius, cres=res);
if(echoPart) echo(str("BOM: Base. Size ", size, "mm"));
}
include <MCAD/nuts_and_bolts.scad>
module hole_for_screw(size=3,length=20,nutDepth=5,nutAddedLen=0,captiveLen=0,tolerance=0.35, echoPart=false) {
radius = METRIC_NUT_AC_WIDTHS[size]/2+tolerance;
height = METRIC_NUT_THICKNESS[size]+tolerance;
translate([0,-length/2,0]) {
translate([0,-length/2+height+nutAddedLen+nutDepth-0.01,0])
scale([1,(height+nutAddedLen)/height,1])
rotate([90,0,0])
hull() {
nutHole(size=size, tolerance=tolerance, proj=-1);
translate([0,captiveLen,0])
nutHole(size=size, tolerance=tolerance, proj=-1);
}
translate([0,length/2-height+0.01,0]) //TODO (from MCAD): proper screw cap values: instead of "height" will use METRIC_BOLT_CAP_HEIGHTS[size]+tolerance;
rotate([90,0,0])
render() boltHole(size=size, length=length-2.6+0.5, tolerance=tolerance, proj=-1);
}
if(echoPart) echo(str("BOM: Screw. M", size, ". Length ", length, "mm"));
if(echoPart) echo(str("BOM: Nut. M", size, "."));
}
module screw_and_nut(size=3,length=20,nutDepth=5,nutAddedLen=0,captiveLen=0,tolerance=0, autoNutOffset=false, renderPart=false, echoPart=false) {
renderStandardPart(renderPart)
color(BlackPaint)
difference() {
if(autoNutOffset)
hole_for_screw(size,length+METRIC_NUT_THICKNESS[size],nutDepth,nutAddedLen,captiveLen,tolerance, echoPart=echoPart);
else
hole_for_screw(size,length,nutDepth,nutAddedLen,captiveLen,tolerance, echoPart=echoPart);
rotate([0,45,0]) {
cube([1,1,10],center=true);
cube([10,1,1],center=true);
}
}
}
module nut(size=8, chamfer=false, renderPart=false, echoPart=false) {
renderStandardPart(renderPart)
color(steel)
flat_nut(size, apply_chamfer=chamfer);
if(echoPart) {
if(chamfer)
echo(str("BOM: Nut. M", size, ". With chamfer."));
else
echo(str("BOM: Nut. M", size, "."));
}
}
module screw_single(size=3,length=10,tolerance=0, renderPart=false, echoPart=false) {
height = METRIC_NUT_THICKNESS[size]+tolerance;
color(BlackPaint)
renderStandardPart(renderPart)
difference() {
translate([0,-length/2,0]) {
translate([0,length/2-height+0.01,0]) //TODO (from MCAD): proper screw cap values: instead of "height" will use METRIC_BOLT_CAP_HEIGHTS[size]+tolerance;
rotate([90,0,0])
boltHole(size=size, length=length-2.6+0.5, tolerance=tolerance, proj=-1);
}
rotate([0,45,0]) {
cube([1,1,10],center=true);
cube([10,1,1],center=true);
}
}
if(echoPart) echo(str("BOM: Screw. M", size, ". Length ", length, "mm"));
}
use <MCAD/motors.scad>
include <MCAD/stepper.scad>
module stepperMotor_mount(height, tolerance=0.15, slide_distance=5, sideLen=42.20, slideOut=false, renderPart=false) {
render() union() {
linear_extrude(height=height) offset(delta = tolerance, join_type = "round") union() {
stepper_motor_mount(nema_standard=17, slide_distance=slide_distance, mochup=false);
if(slideOut) translate([0,50]) square([22,100],center=true);
}
if(slideOut)
translate([0,25,-25]) bcube([sideLen+2*tolerance,sideLen+slide_distance+2*tolerance+50,50],cr=3,cres=10);
else
translate([0,0,-25]) bcube([sideLen+2*tolerance,sideLen+slide_distance+2*tolerance,50],cr=3,cres=10);
}
}
module stepperMotor(screwHeight=10, renderPart=false, echoPart=false) {
nema_screw_separation = lookup(NemaDistanceBetweenMountingHoles, Nema17);
realScrewLength = screwHeight+METRIC_NUT_THICKNESS[3];
echo("BOM:");
scale([1,1,-1]) renderStandardPart(renderPart) {
translate([0,0,-1]) motor(Nema17, size=NemaMedium, dualAxis=false);
translate([nema_screw_separation/2,nema_screw_separation/2,-realScrewLength]) rotate([-90,0,0]) screw_single(size=3,length=realScrewLength+5,echoPart=echoPart);
translate([nema_screw_separation/2,-nema_screw_separation/2,-realScrewLength]) rotate([-90,0,0]) screw_single(size=3,length=realScrewLength+5,echoPart=echoPart);
translate([-nema_screw_separation/2,-nema_screw_separation/2,-realScrewLength]) rotate([-90,0,0]) screw_single(size=3,length=realScrewLength+5,echoPart=echoPart);
//translate([-nema_screw_separation/2,nema_screw_separation/2,-realScrewLength]) rotate([-90,0,0]) screw_single(size=3,length=realScrewLength+5,echoPart=echoPart);
}
//if(echoPart) echo(str("BOM: Motor. Nema17")); // The motor library already outputs motor information
}
module motorGear(r=30,renderPart=false, echoPart=false) {
renderStandardPart(renderPart)
color("lightgreen") cylinder(r=r,h=10)
if(echoPart) echo(str("BOM: Gear. Motor."));
}
module rodGear(r=30,renderPart=false, echoPart=false) {
renderStandardPart(renderPart)
color("lightgreen") cylinder(r=r,h=10)
if(echoPart) echo(str("BOM: Gear. Rod."));
}
use <MCAD/bearing.scad>
module bearingHole(depth=3, thickness=10, model=608, tolerance=1) {
bearingD = bearingOuterDiameter(model)+tolerance;
union() {
cylinder(r=bearingD/2,h=depth);
translate([0,0,depth-0.01]) cylinder(r1=bearingD/2,r2=bearingD/2-1,h=1.5);
cylinder(r=bearingD/2-1,h=thickness+0.1);
}
}
module radialBearing(model=608,renderPart=false, echoPart=false) {
renderStandardPart(renderPart)
bearing(model=model, outline=false);
if(echoPart) echo(str("BOM: Radial bearing. Model ",model));
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

Binary file not shown.

File diff suppressed because it is too large Load Diff

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 787 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

View File

@ -0,0 +1,87 @@
tube_diameter = 17;
tube_len = 29;
corrugation_depth = 1;
vacuum_cleaner_diam = 32;
vacuum_cleaner_tube_len = 50;
adapter_len = 20;
part_diam = vacuum_cleaner_diam+10;
tube_separation = vacuum_cleaner_diam-tube_diameter+5;
tube_angle = 0;
$fn=60;
module corrugated_tube_shape() {
$fn=40;
union() {
cylinder(r=tube_diameter/2-corrugation_depth,h=tube_len);
for (i = [0:3.75:tube_len-0.1]) {
translate([0,0,i])
cylinder(r=tube_diameter/2, h=3);
}
}
}
module corrugated_tube_attachment() {
difference() {
//cylinder(r=tube_diameter/2+5, h=30, $fn=30, center=true);
cube([tube_diameter+10,tube_diameter+10,30],center=true);
cylinder(r=tube_diameter/2-corrugation_depth, h=31, $fn=30, center=true);
for (i = [-4:4]) {
translate([0,0,i*3.75])
cylinder(r=tube_diameter/2, h=3, $fn=30, center=true);
}
translate([50,0,0])
cube([100,100,100],center=true);
}
}
*translate([0,-(tube_diameter+10)/2,0]) {
corrugated_tube_attachment();
translate([0,tube_diameter+10,0])
corrugated_tube_attachment();
}
module vacuum_cleaner_adapter_shape() {
translate([0,tube_separation/2,0])
rotate([-tube_angle,0,0])
corrugated_tube_shape();
translate([0,-tube_separation/2,0])
rotate([tube_angle,0,0])
corrugated_tube_shape();
hull() {
translate([0,tube_separation/2,0])
rotate([-tube_angle,0,0])
cylinder(r=tube_diameter/2,h=0.01);
translate([0,0,-adapter_len])
cylinder(r=vacuum_cleaner_diam/2,h=0.01);
}
hull() {
translate([0,-tube_separation/2,0])
rotate([tube_angle,0,0])
cylinder(r=tube_diameter/2,h=0.01);
translate([0,0,-adapter_len])
cylinder(r=vacuum_cleaner_diam/2,h=0.01);
}
hull() {
translate([0,0,-adapter_len])
cylinder(r=vacuum_cleaner_diam/2,h=0.01);
translate([0,0,-adapter_len-vacuum_cleaner_tube_len])
cylinder(r=2+vacuum_cleaner_diam/2,h=0.01);
}
//translate([0,0,-adapter_len-vacuum_cleaner_tube_len]) cylinder(r=vacuum_cleaner_diam/2,h=vacuum_cleaner_tube_len);
}
difference() {
translate([-part_diam/2,-part_diam/2,-adapter_len-vacuum_cleaner_tube_len]) cube([part_diam,part_diam,tube_len+adapter_len+vacuum_cleaner_tube_len]);
vacuum_cleaner_adapter_shape();
translate([0,-part_diam/2,-adapter_len-vacuum_cleaner_tube_len]) cube([part_diam,part_diam,tube_len+adapter_len+vacuum_cleaner_tube_len]);
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,88 @@
tube_diameter = 17;
tube_len = 16.5;
corrugation_depth = 1;
vacuum_cleaner_diam = 30;
vacuum_cleaner_tube_len = 1;
adapter_len = 25-6;
part_diam = 60+15;
tube_separation = tube_diameter+26+5;
tube_angle = 5;
$fn=60;
module corrugated_tube_shape(incL=0) {
$fn=40;
union() {
cylinder(r=tube_diameter/2-corrugation_depth,h=tube_len+incL);
for (i = [0:3.75:tube_len+incL-0.1]) {
translate([0,0,i])
cylinder(r=tube_diameter/2, h=3);
}
}
}
module corrugated_tube_attachment() {
difference() {
//cylinder(r=tube_diameter/2+5, h=30, $fn=30, center=true);
cube([tube_diameter+10,tube_diameter+10,30],center=true);
cylinder(r=tube_diameter/2-corrugation_depth, h=31, $fn=30, center=true);
for (i = [-4:4]) {
translate([0,0,i*3.75])
cylinder(r=tube_diameter/2, h=3, $fn=30, center=true);
}
translate([50,0,0])
cube([100,100,100],center=true);
}
}
*translate([0,-(tube_diameter+10)/2,0]) {
corrugated_tube_attachment();
translate([0,tube_diameter+10,0])
corrugated_tube_attachment();
}
module vacuum_cleaner_adapter_shape() {
translate([0,tube_separation/2,0])
rotate([-tube_angle,0,0])
corrugated_tube_shape(5);
translate([0,-tube_separation/2,0])
rotate([tube_angle,0,0])
corrugated_tube_shape(5);
hull() {
translate([0,tube_separation/2,0])
rotate([-tube_angle,0,0])
cylinder(r=tube_diameter/2,h=0.01);
translate([0,0,-adapter_len])
cylinder(r=vacuum_cleaner_diam/2,h=0.01);
}
hull() {
translate([0,-tube_separation/2,0])
rotate([tube_angle,0,0])
cylinder(r=tube_diameter/2,h=0.01);
translate([0,0,-adapter_len])
cylinder(r=vacuum_cleaner_diam/2,h=0.01);
}
translate([0,0,6])
cylinder(r=27/2,h=50);
cylinder(r=(27-3)/2,h=100,center=true);
translate([0,0,-adapter_len-vacuum_cleaner_tube_len])
cylinder(r=vacuum_cleaner_diam/2,h=vacuum_cleaner_tube_len);
//translate([0,0,-adapter_len-vacuum_cleaner_tube_len]) cylinder(r=vacuum_cleaner_diam/2,h=vacuum_cleaner_tube_len);
}
difference() {
translate([-part_diam/4,-part_diam/2,-adapter_len-vacuum_cleaner_tube_len]) cube([part_diam,part_diam,tube_len+adapter_len+vacuum_cleaner_tube_len]);
vacuum_cleaner_adapter_shape();
translate([0,-part_diam/2,-adapter_len-vacuum_cleaner_tube_len]) cube([part_diam,part_diam,tube_len+adapter_len+vacuum_cleaner_tube_len]);
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,121 @@
dremel_accessory_diam = 20+1;
dremel_accesory_height = 12-2;
aspirator_thickness_thick = 4;
aspirator_thickness_slim = 1;
aspirator_tube_diam = 15;
aspirator_tube_holder_height = 15;
aspirator_hole_height = 15+5;
aspirator_hole_diam = 30;
dremel_wrench_diam = 25;
dremel_wrench_hole_offset = 10;
dremel_accessory_screw_separation = 25.6;
dremel_accessory_tube_offset = dremel_accessory_diam-aspirator_tube_diam;
aspirator_tube_separation = dremel_accessory_diam+aspirator_tube_diam+aspirator_thickness_thick*2+1.5;
dremel_accessory_hole_offset = 0;//dremel_accessory_diam-aspirator_hole_diam;
// Useful MCAD functions reference
//use <MCAD/motors.scad>
//stepper_motor_mount(nema_standard=17, slide_distance=10, $fn=40, mochup=true);
//use <MCAD/boxes.scad>
//roundedBox([10,20,30], radius=2, sidesonly=false, $fn=60);
//include <MCAD/stepper.scad>
//motor(Nema17, size=NemaMedium, dualAxis=false);
//use <MCAD/teardrop.scad>
//teardrop(radius=10, length=20, angle=90);
//use <MCAD/nuts_and_bolts.scad>
//nutHole(size=3, tolerance=0.5, proj=-1);
//boltHole(size=3, length=10, tolerance=0.5, proj=-1, $fn=40);
use <MCAD/teardrop.scad>
use <MCAD/nuts_and_bolts.scad>
module aspirator_accessory_2Dshape() {
hull() {
translate([aspirator_tube_separation/2,-dremel_accessory_tube_offset/2])
circle(r=aspirator_thickness_thick+aspirator_tube_diam/2, h=dremel_accesory_height, $fn=60);
circle(r=aspirator_thickness_thick+dremel_accessory_diam/2, h=dremel_accesory_height, $fn=60);
translate([-aspirator_tube_separation/2,-dremel_accessory_tube_offset/2])
circle(r=aspirator_thickness_thick+aspirator_tube_diam/2, h=dremel_accesory_height, $fn=60);
}
}
module aspirator_accessory_filledshape() {
linear_extrude(height=dremel_accesory_height,center=true)
aspirator_accessory_2Dshape();
hull() {
translate([0,0,-dremel_accesory_height/2])
linear_extrude(height=0.001,center=true)
aspirator_accessory_2Dshape();
translate([0,dremel_accessory_hole_offset/2,-dremel_accesory_height/2-aspirator_hole_height])
linear_extrude(height=0.001,center=true)
circle(r=aspirator_thickness_slim+aspirator_hole_diam/2, $fn=60);
}
}
module aspirator_accessory_2Dholes() {
translate([aspirator_tube_separation/2,-dremel_accessory_tube_offset/2])
circle(r=aspirator_tube_diam/2, $fn=60);
circle(r=dremel_accessory_diam/2, $fn=60);
translate([-aspirator_tube_separation/2,-dremel_accessory_tube_offset/2])
circle(r=aspirator_tube_diam/2, $fn=60);
}
module screwHole() {
translate([0,-8,0])
rotate([90,0,0])
hull() {
translate([0,0,20])
nutHole(size=3, tolerance=0.5, proj=-1);
nutHole(size=3, tolerance=0.5, proj=-1);
}
translate([0,10,0])
rotate([90,0,0])
boltHole(size=3, length=30, tolerance=0.4, proj=-1, $fn=40);
}
module aspirator_accessory_holes() {
linear_extrude(height=dremel_accesory_height+0.01,center=true)
aspirator_accessory_2Dholes();
hull() {
translate([0,0,-dremel_accesory_height/2+0.01])
linear_extrude(height=0.001,center=true)
aspirator_accessory_2Dholes();
translate([0,dremel_accessory_hole_offset/2,-dremel_accesory_height/2-aspirator_hole_height+1-0.01])
linear_extrude(height=0.001,center=true)
circle(r=aspirator_hole_diam/2, $fn=60);
}
translate([0,dremel_accessory_hole_offset/2,-dremel_accesory_height/2-aspirator_hole_height])
linear_extrude(height=2+0.1,center=true)
circle(r=aspirator_hole_diam/2, $fn=60);
// Hole for the tightener
translate([0,-dremel_accessory_tube_offset/4,0])
cube([aspirator_tube_separation,1,dremel_accesory_height+0.01],center=true);
// Frontal hole for the wrench
translate([0,(dremel_accessory_diam+aspirator_thickness_thick)/2,-(dremel_accesory_height+aspirator_hole_height)/2-dremel_wrench_hole_offset])
cube([dremel_wrench_diam,10,aspirator_hole_height+0.01],center=true);
// Holes for the nut/screws
#translate([dremel_accessory_screw_separation/2,0,0])
screwHole();
#translate([-dremel_accessory_screw_separation/2,0,0])
screwHole();
}
difference() {
aspirator_accessory_filledshape();
aspirator_accessory_holes();
}

View File

@ -0,0 +1,52 @@
dremel_accessory_diam = 20;
dremel_accesory_height = 12;
aspirator_thickness_thick = 4;
aspirator_thickness_slim = 2;
aspirator_tube_diam = 15;
aspirator_tube_holder_height = 15;
aspirator_hole_height = 15;
aspirator_hole_diam = 15;
dremel_wrench_diam = 25;
// Useful MCAD functions reference
//use <MCAD/motors.scad>
//stepper_motor_mount(nema_standard=17, slide_distance=10, $fn=40, mochup=true);
//use <MCAD/boxes.scad>
//roundedBox([10,20,30], radius=2, sidesonly=false, $fn=60);
//include <MCAD/stepper.scad>
//motor(Nema17, size=NemaMedium, dualAxis=false);
//use <MCAD/teardrop.scad>
//teardrop(radius=10, length=20, angle=90);
//use <MCAD/nuts_and_bolts.scad>
//nutHole(size=3, tolerance=0.5, proj=-1);
//boltHole(size=3, length=10, tolerance=0.5, proj=-1, $fn=40);
use <MCAD/boxes.scad>
difference() {
roundedBox([dremel_accessory_diam+aspirator_tube_diam*2+aspirator_thickness_thick*3,
dremel_accessory_diam+aspirator_thickness_thick*2,
dremel_accesory_height],
radius=(dremel_accessory_diam+aspirator_thickness_thick*2)/2,
sidesonly=true, $fn=60);
cylinder(r=dremel_accessory_diam/2, h=dremel_accesory_height+0.1, $fn=60,center=true);
translate([dremel_accessory_diam/2+aspirator_tube_diam/2+aspirator_thickness_thick,0,0])
cylinder(r=aspirator_tube_diam/2, h=dremel_accesory_height+0.1, $fn=60,center=true);
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,125 @@
dremel_accessory_diam = 20;
dremel_accesory_height = 12-2;
aspirator_thickness_thick = 2;
aspirator_thickness_slim = 1;
aspirator_thickness_screw = aspirator_thickness_slim;
aspirator_tube_diam = 15;
aspirator_tube_holder_height = 15;
aspirator_hole_height = 15+5-6;
aspirator_hole_diam = 30;
dremel_wrench_diam = 0;
dremel_wrench_hole_offset = 8;
dremel_accessory_screw_separation = dremel_accessory_diam+aspirator_thickness_screw+1.25;
dremel_accessory_angle = 8;
dremel_accessory_tube_offset = dremel_accessory_diam-aspirator_tube_diam;
aspirator_tube_separation = dremel_accessory_diam+aspirator_tube_diam+aspirator_thickness_screw*2+1.5;
dremel_accessory_hole_offset = 0;//dremel_accessory_diam-aspirator_hole_diam;
// Useful MCAD functions reference
//use <MCAD/motors.scad>
//stepper_motor_mount(nema_standard=17, slide_distance=10, $fn=40, mochup=true);
//use <MCAD/boxes.scad>
//roundedBox([10,20,30], radius=2, sidesonly=false, $fn=60);
//include <MCAD/stepper.scad>
//motor(Nema17, size=NemaMedium, dualAxis=false);
//use <MCAD/teardrop.scad>
//teardrop(radius=10, length=20, angle=90);
//use <MCAD/nuts_and_bolts.scad>
//nutHole(size=3, tolerance=0.5, proj=-1);
//boltHole(size=3, length=10, tolerance=0.5, proj=-1, $fn=40);
use <MCAD/teardrop.scad>
use <MCAD/nuts_and_bolts.scad>
module aspirator_accessory_2Dshape() {
hull() {
translate([aspirator_tube_separation/2,-dremel_accessory_tube_offset/2])
circle(r=aspirator_thickness_thick+aspirator_tube_diam/2, h=dremel_accesory_height, $fn=60);
circle(r=aspirator_thickness_thick+dremel_accessory_diam/2, h=dremel_accesory_height, $fn=60);
translate([-aspirator_tube_separation/2,-dremel_accessory_tube_offset/2])
circle(r=aspirator_thickness_thick+aspirator_tube_diam/2, h=dremel_accesory_height, $fn=60);
}
}
module aspirator_accessory_filledshape() {
linear_extrude(height=dremel_accesory_height,center=true)
aspirator_accessory_2Dshape();
hull() {
translate([0,0,-dremel_accesory_height/2])
linear_extrude(height=0.001,center=true)
aspirator_accessory_2Dshape();
translate([0,dremel_accessory_hole_offset/2,-dremel_accesory_height/2-aspirator_hole_height])
linear_extrude(height=0.001,center=true)
circle(r=aspirator_thickness_slim+aspirator_hole_diam/2, $fn=60);
}
}
module aspirator_accessory_2Dholes() {
translate([aspirator_tube_separation/2,-dremel_accessory_tube_offset/2])
circle(r=aspirator_tube_diam/2, $fn=60);
circle(r=dremel_accessory_diam/2, $fn=60);
translate([-aspirator_tube_separation/2,-dremel_accessory_tube_offset/2])
circle(r=aspirator_tube_diam/2, $fn=60);
}
module screwHole() {
translate([0,-7,0])
rotate([90,0,0])
hull() {
translate([0,0,20])
nutHole(size=3, tolerance=0.5, proj=-1);
nutHole(size=3, tolerance=0.5, proj=-1);
}
translate([0,7,0])
rotate([90,0,0])
boltHole(size=3, length=30, tolerance=0.4, proj=-1, $fn=40);
}
module aspirator_accessory_holes() {
linear_extrude(height=dremel_accesory_height+0.01,center=true)
aspirator_accessory_2Dholes();
hull() {
translate([0,0,-dremel_accesory_height/2+0.01])
linear_extrude(height=0.001,center=true)
aspirator_accessory_2Dholes();
translate([0,dremel_accessory_hole_offset/2,-dremel_accesory_height/2-aspirator_hole_height+1-0.01])
linear_extrude(height=0.001,center=true)
circle(r=aspirator_hole_diam/2, $fn=60);
}
translate([0,dremel_accessory_hole_offset/2,-dremel_accesory_height/2-aspirator_hole_height])
linear_extrude(height=2+0.1,center=true)
circle(r=aspirator_hole_diam/2, $fn=60);
// Hole for the tightener
*translate([0,-dremel_accessory_tube_offset/4,0])
cube([aspirator_tube_separation,1,dremel_accesory_height+0.01],center=true);
// Frontal hole for the wrench
*translate([0,(dremel_accessory_diam+aspirator_thickness_thick)/2,-(dremel_accesory_height+aspirator_hole_height)/2-dremel_wrench_hole_offset])
cube([dremel_wrench_diam,10,aspirator_hole_height+0.01],center=true);
// Holes for the nut/screws
*translate([dremel_accessory_screw_separation/2,0,0])
rotate([0,0,-dremel_accessory_angle])
screwHole();
*translate([-dremel_accessory_screw_separation/2,0,0])
rotate([0,0,dremel_accessory_angle])
screwHole();
}
difference() {
aspirator_accessory_filledshape();
aspirator_accessory_holes();
}

View File

@ -0,0 +1,126 @@
dremel_accessory_diam = 20;
dremel_accesory_height = 12-2;
aspirator_thickness_thick = 2;
aspirator_thickness_slim = 2;
aspirator_thickness_screw = 4;
aspirator_tube_diam = 20;
aspirator_tube_holder_height = 15;
aspirator_hole_height = 20;
aspirator_hole_diam = 33-3;
dremel_accessory_tube_offset = 0;//dremel_accessory_diam-aspirator_tube_diam;
aspirator_tube_separation = aspirator_tube_diam+aspirator_thickness_screw*2+1.5;
dremel_accessory_hole_offset = 0;//dremel_accessory_diam-aspirator_hole_diam;
vacuum_cleaner_diam = 33;
vacuum_cleaner_tube_len = 40;
// Useful MCAD functions reference
//use <MCAD/motors.scad>
//stepper_motor_mount(nema_standard=17, slide_distance=10, $fn=40, mochup=true);
//use <MCAD/boxes.scad>
//roundedBox([10,20,30], radius=2, sidesonly=false, $fn=60);
//include <MCAD/stepper.scad>
//motor(Nema17, size=NemaMedium, dualAxis=false);
//use <MCAD/teardrop.scad>
//teardrop(radius=10, length=20, angle=90);
//use <MCAD/nuts_and_bolts.scad>
//nutHole(size=3, tolerance=0.5, proj=-1);
//boltHole(size=3, length=10, tolerance=0.5, proj=-1, $fn=40);
use <MCAD/teardrop.scad>
use <MCAD/nuts_and_bolts.scad>
module aspirator_accessory_2Dshape() {
hull() {
translate([aspirator_tube_separation/2,-dremel_accessory_tube_offset/2])
circle(r=aspirator_thickness_thick+aspirator_tube_diam/2, h=dremel_accesory_height, $fn=60);
translate([-aspirator_tube_separation/2,-dremel_accessory_tube_offset/2])
circle(r=aspirator_thickness_thick+aspirator_tube_diam/2, h=dremel_accesory_height, $fn=60);
}
}
module aspirator_accessory_filledshape() {
linear_extrude(height=dremel_accesory_height,center=true)
aspirator_accessory_2Dshape();
hull() {
translate([0,0,-dremel_accesory_height/2])
linear_extrude(height=0.001,center=true)
aspirator_accessory_2Dshape();
translate([0,dremel_accessory_hole_offset/2,-dremel_accesory_height/2-aspirator_hole_height])
linear_extrude(height=0.001,center=true)
circle(r=aspirator_thickness_slim+aspirator_hole_diam/2, $fn=60);
}
hull() {
translate([0,0,-dremel_accesory_height/2-aspirator_hole_height])
linear_extrude(height=0.001,center=true)
circle(r=aspirator_thickness_slim+aspirator_hole_diam/2, $fn=60);
translate([0,0,-dremel_accesory_height/2-aspirator_hole_height-vacuum_cleaner_tube_len])
linear_extrude(height=0.001,center=true)
circle(r=aspirator_thickness_slim+vacuum_cleaner_diam/2, $fn=60);
}
}
module aspirator_accessory_2Dholes() {
translate([aspirator_tube_separation/2,-dremel_accessory_tube_offset/2])
circle(r=aspirator_tube_diam/2, $fn=60);
translate([-aspirator_tube_separation/2,-dremel_accessory_tube_offset/2])
circle(r=aspirator_tube_diam/2, $fn=60);
}
module screwHole() {
translate([0,-5,0])
rotate([90,0,0])
hull() {
translate([0,0,20])
nutHole(size=3, tolerance=0.5, proj=-1);
nutHole(size=3, tolerance=0.5, proj=-1);
}
translate([0,aspirator_tube_diam/2,0])
rotate([90,0,0])
boltHole(size=3, length=30, tolerance=0.4, proj=-1, $fn=40);
}
module aspirator_accessory_holes() {
linear_extrude(height=dremel_accesory_height+0.01,center=true)
aspirator_accessory_2Dholes();
hull() {
translate([0,0,-dremel_accesory_height/2+0.01])
linear_extrude(height=0.001,center=true)
aspirator_accessory_2Dholes();
translate([0,dremel_accessory_hole_offset/2,-dremel_accesory_height/2-aspirator_hole_height+1-0.01])
linear_extrude(height=0.001,center=true)
circle(r=aspirator_hole_diam/2, $fn=60);
}
hull() {
translate([0,0,-dremel_accesory_height/2-aspirator_hole_height+0.01])
linear_extrude(height=0.001,center=true)
circle(r=aspirator_hole_diam/2, $fn=60);
translate([0,0,-dremel_accesory_height/2-aspirator_hole_height-vacuum_cleaner_tube_len-0.01])
linear_extrude(height=0.001,center=true)
circle(r=vacuum_cleaner_diam/2, $fn=60);
}
translate([0,dremel_accessory_hole_offset/2,-dremel_accesory_height/2-aspirator_hole_height])
linear_extrude(height=2+0.1,center=true)
circle(r=aspirator_hole_diam/2, $fn=60);
// Hole for the tightener
cube([aspirator_tube_separation,2.5,dremel_accesory_height+0.01],center=true);
// Holes for the nut/screws
#screwHole();
}
difference() {
aspirator_accessory_filledshape();
aspirator_accessory_holes();
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,125 @@
dremel_accessory_diam = 20;
dremel_accesory_height = 12-2;
aspirator_thickness_thick = 2;
aspirator_thickness_slim = 1;
aspirator_thickness_screw = 4;
aspirator_tube_diam = 20;
aspirator_tube_holder_height = 15;
aspirator_hole_height = 15;
aspirator_hole_diam = 35;
dremel_wrench_diam = 0;
dremel_wrench_hole_offset = 8;
dremel_accessory_screw_separation = dremel_accessory_diam+aspirator_thickness_screw+0.8;
dremel_accessory_angle = 0;
dremel_accessory_tube_offset = dremel_accessory_diam-aspirator_tube_diam;
aspirator_tube_separation = dremel_accessory_diam+aspirator_tube_diam+aspirator_thickness_screw*2+1.5;
dremel_accessory_hole_offset = 0;//dremel_accessory_diam-aspirator_hole_diam;
// Useful MCAD functions reference
//use <MCAD/motors.scad>
//stepper_motor_mount(nema_standard=17, slide_distance=10, $fn=40, mochup=true);
//use <MCAD/boxes.scad>
//roundedBox([10,20,30], radius=2, sidesonly=false, $fn=60);
//include <MCAD/stepper.scad>
//motor(Nema17, size=NemaMedium, dualAxis=false);
//use <MCAD/teardrop.scad>
//teardrop(radius=10, length=20, angle=90);
//use <MCAD/nuts_and_bolts.scad>
//nutHole(size=3, tolerance=0.5, proj=-1);
//boltHole(size=3, length=10, tolerance=0.5, proj=-1, $fn=40);
use <MCAD/teardrop.scad>
use <MCAD/nuts_and_bolts.scad>
module aspirator_accessory_2Dshape() {
hull() {
translate([aspirator_tube_separation/2,-dremel_accessory_tube_offset/2])
circle(r=aspirator_thickness_thick+aspirator_tube_diam/2, h=dremel_accesory_height, $fn=60);
circle(r=aspirator_thickness_thick+dremel_accessory_diam/2, h=dremel_accesory_height, $fn=60);
translate([-aspirator_tube_separation/2,-dremel_accessory_tube_offset/2])
circle(r=aspirator_thickness_thick+aspirator_tube_diam/2, h=dremel_accesory_height, $fn=60);
}
}
module aspirator_accessory_filledshape() {
linear_extrude(height=dremel_accesory_height,center=true)
aspirator_accessory_2Dshape();
hull() {
translate([0,0,-dremel_accesory_height/2])
linear_extrude(height=0.001,center=true)
aspirator_accessory_2Dshape();
translate([0,dremel_accessory_hole_offset/2,-dremel_accesory_height/2-aspirator_hole_height])
linear_extrude(height=0.001,center=true)
circle(r=aspirator_thickness_slim+aspirator_hole_diam/2, $fn=60);
}
}
module aspirator_accessory_2Dholes() {
translate([aspirator_tube_separation/2,-dremel_accessory_tube_offset/2])
circle(r=aspirator_tube_diam/2, $fn=60);
circle(r=dremel_accessory_diam/2, $fn=60);
translate([-aspirator_tube_separation/2,-dremel_accessory_tube_offset/2])
circle(r=aspirator_tube_diam/2, $fn=60);
}
module screwHole() {
translate([0,-7,0])
rotate([90,0,0])
hull() {
translate([0,0,20])
nutHole(size=3, tolerance=0.5, proj=-1);
nutHole(size=3, tolerance=0.5, proj=-1);
}
translate([0,aspirator_tube_diam/2,0])
rotate([90,0,0])
boltHole(size=3, length=30, tolerance=0.4, proj=-1, $fn=40);
}
module aspirator_accessory_holes() {
linear_extrude(height=dremel_accesory_height+0.01,center=true)
aspirator_accessory_2Dholes();
hull() {
translate([0,0,-dremel_accesory_height/2+0.01])
linear_extrude(height=0.001,center=true)
aspirator_accessory_2Dholes();
translate([0,dremel_accessory_hole_offset/2,-dremel_accesory_height/2-aspirator_hole_height+1-0.01])
linear_extrude(height=0.001,center=true)
circle(r=aspirator_hole_diam/2, $fn=60);
}
translate([0,dremel_accessory_hole_offset/2,-dremel_accesory_height/2-aspirator_hole_height])
linear_extrude(height=2+0.1,center=true)
circle(r=aspirator_hole_diam/2, $fn=60);
// Hole for the tightener
translate([0,-dremel_accessory_tube_offset/4,0])
cube([aspirator_tube_separation,2.5,dremel_accesory_height+0.01],center=true);
// Frontal hole for the wrench
translate([0,(dremel_accessory_diam+aspirator_thickness_thick)/2,-(dremel_accesory_height+aspirator_hole_height)/2-dremel_wrench_hole_offset])
cube([dremel_wrench_diam,10,aspirator_hole_height+0.01],center=true);
// Holes for the nut/screws
#translate([dremel_accessory_screw_separation/2,0,0])
rotate([0,0,-dremel_accessory_angle])
screwHole();
#translate([-dremel_accessory_screw_separation/2,0,0])
rotate([0,0,dremel_accessory_angle])
screwHole();
}
difference() {
aspirator_accessory_filledshape();
aspirator_accessory_holes();
}

File diff suppressed because it is too large Load Diff

View File

@ -17,10 +17,22 @@ Wiki entry on RepRap.org
--
<http://reprap.org/wiki/Cyclone_PCB_Factory>
Must read: Progress and current status of the Cyclone proyect
--
*Must read: Progress and current status of the Cyclone proyect:*
<http://carlosgs.es/node/47>
Getting the source code
--
Install git (http://git-scm.com/) onto your system. Then run a clone:
git clone git://github.com/carlosgs/Cyclone-PCB-Factory.git
This will download the latest sources into a directory named 'openscad'.
To pull the MCAD (<http://reprap.org/wiki/MCAD>) and Obiscad (<https://github.com/Obijuan/obiscad>) libraries, do the following:
cd Cyclone-PCB-Factory
git submodule update --init
Bill of materials
--
_Work in progress_