Merge branch 'development'
commit
0181d00a75
|
@ -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
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -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]);
|
||||
}
|
||||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
|
@ -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);
|
||||
}
|
||||
|
|
@ -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);
|
||||
}
|
||||
|
|
@ -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]);
|
||||
}
|
||||
}
|
||||
|
|
@ -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
|
||||
--
|
||||
|
||||

|
||||
|
||||
The new design tries to be more parameterized:
|
||||
|
||||

|
||||
|
||||
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
|
@ -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 |
|
@ -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();
|
|
@ -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
|
|
@ -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
|
|
@ -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 |
|
@ -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
|
@ -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
|
@ -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();
|
||||
}
|
|
@ -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
|
@ -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();
|
||||
}
|
|
@ -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
|
@ -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
16
README.md
16
README.md
|
@ -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_
|
||||
|
|
Loading…
Reference in New Issue