cyclone-pcb-factory/Hardware/CYCLONE_2/Source_files/Cycl_Y_carriage.scad

257 lines
11 KiB
OpenSCAD
Raw Normal View History

// 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/
2014-11-05 23:00:47 +07:00
include <libs/MCAD/nuts_and_bolts.scad>
workbed_separation_from_Y_threaded_rod = axes_Y_smoothThreaded_verticalSeparation+workbed_separation_from_Y_smooth_rod+axes_Ysmooth_rodD/2;
PCBholder_height = 10;
2014-07-10 21:35:59 +07:00
module Cyclone_YsubPart_nutHolder() {
2014-07-21 06:14:17 +07:00
footThickness = 10;
screwSeparation = 10;
2014-07-22 21:48:58 +07:00
rod_nut_len = 0.8*axes_Ythreaded_rodD;
dimX = axes_Ythreaded_rodD*2+6;
dimY = screwSeparation+22;
2014-07-22 21:48:58 +07:00
dimZ = workbed_separation_from_Y_threaded_rod;
holderExtension = 10;
rodTolerance = 0.5;
rodSize = 8; // M3, M4, etc (integers only)
washer_D = 15.8;
washer_thickness = 1.6;
screwSize = Y_nutHolder_screwSize;
2014-07-22 21:48:58 +07:00
difference() {
// Main shape
translate([0,0,dimZ/2-holderExtension/2])
color(color_movingPart) bcube([dimX,dimY,dimZ+holderExtension],cr=2,cres=10);
2014-07-22 21:48:58 +07:00
// Hole for the rod
hull() {
standard_rod(diam=axes_Ythreaded_rodD+rodTolerance, length=dimY*4, threaded=true, renderPart=true, center=true);
translate([0,0,-holderExtension*2])
standard_rod(diam=axes_Ythreaded_rodD+rodTolerance, length=dimY*4, threaded=true, renderPart=true, center=true);
}
// Hole for the main nut
translate([0,dimY/2+0.01+rod_nut_len/2,0])
2014-07-22 21:48:58 +07:00
hull() {
rotate([0,90,0]) hole_for_nut(size=rodSize,nutAddedLen=0,captiveLen=0,tolerance=0.1);
translate([0,0,-holderExtension*2])
rotate([0,90,0]) hole_for_nut(size=rodSize,nutAddedLen=0,captiveLen=0,tolerance=0.1);
}
translate([0,dimY/2+0.01-rod_nut_len/2-3,0]) {
2014-07-22 21:48:58 +07:00
// Hole for the sliding nut
hull() {
rotate([0,90,0]) hole_for_nut(size=rodSize,nutAddedLen=dimY,captiveLen=0,tolerance=0.3);
2014-07-22 21:48:58 +07:00
translate([0,0,-holderExtension*2])
rotate([0,90,0]) hole_for_nut(size=rodSize,nutAddedLen=dimY,captiveLen=0,tolerance=0.3);
2014-07-22 21:48:58 +07:00
}
// Hole for the washer
hull() {
washer_single(diam=washer_D, thickness=washer_thickness, renderPart=true, tolerance=0.3);
2014-07-22 21:48:58 +07:00
translate([0,0,-holderExtension*2])
washer_single(diam=washer_D, thickness=washer_thickness, renderPart=true, tolerance=0.3);
2014-07-22 21:48:58 +07:00
}
}
// Holes for the supporting screws
translate([0,-screwSeparation/2,workbed_separation_from_Y_threaded_rod+workbed_thickness])
rotate([90,0,0])
hole_for_screw(size=screwSize,length=workbed_thickness+footThickness,nutDepth=-dimZ,nutAddedLen=dimZ,captiveLen=0);
2014-07-22 21:48:58 +07:00
translate([0,+screwSeparation/2,workbed_separation_from_Y_threaded_rod+workbed_thickness])
rotate([90,0,0])
hole_for_screw(size=screwSize,length=workbed_thickness+footThickness,nutDepth=-dimZ,nutAddedLen=dimZ,captiveLen=0);
2014-07-22 21:48:58 +07:00
}
translate([0,dimY/2+rod_nut_len/2,0])
rotate([0,90,0]) rotate([90,0,0]) nut(size=8, echoPart=true);
translate([0,-dimY/2,0])
rotate([0,90,0]) rotate([-90,0,0]) nut(size=8, echoPart=true);
translate([0,dimY/2+0.01-rod_nut_len/2-3,0])
washer_single(diam=washer_D, thickness=washer_thickness, echoPart=true);
2014-07-10 21:35:59 +07:00
}
2014-07-28 07:13:32 +07:00
use <libs/linear_bearing.scad>
module Cyclone_YsubPart_singleLinearBearingHolder(onlyScrews=false) {
2014-07-24 06:35:51 +07:00
linearBearingModel = "LM8UU";
linearBearingLength = linearBearing_L(linearBearingModel);
linearBearingDiameter = linearBearing_D(linearBearingModel);
2014-07-24 21:51:39 +07:00
plasticHolderLength = 3;
dimX = linearBearingDiameter+linearBearingDiameter/2;
dimY = linearBearingLength+2*plasticHolderLength;
2014-07-24 06:35:51 +07:00
dimZ = workbed_separation_from_Y_smooth_rod+axes_Ysmooth_rodD/2;
2014-07-24 21:51:39 +07:00
holderExtension = linearBearingDiameter/3;
2014-07-24 06:35:51 +07:00
screwSize = Y_singleLinearBearingHolder_screwSize;
2014-07-24 21:51:39 +07:00
footSeparation = screwSize*2;
footThickness = 7;
workbed_screws_aditional_length = PCBholder_height;
2014-07-24 21:51:39 +07:00
linearBearing_pressureFitTolerance = 0.5;
2014-07-24 06:35:51 +07:00
if(onlyScrews) {
2014-07-24 21:51:39 +07:00
// Hole for the screw and nut
translate([dimX/2+footSeparation,0,dimZ+workbed_thickness+workbed_screws_aditional_length])
rotate([90,0,0]) hole_for_screw(size=screwSize,length=workbed_screws_aditional_length+footThickness+workbed_thickness,nutDepth=0,nutAddedLen=0,captiveLen=0);
} else {
difference() {
// Main part
color(color_movingPart) union() {
translate([0,0,dimZ/2])
bcube([dimX,dimY,dimZ], cr=3, cres=0);
translate([0,0,dimZ])
hull() {
translate([screwSize/2,0,-footThickness/2])
bcube([dimX+screwSize,dimY,footThickness], cr=3, cres=0);
translate([dimX/2+footSeparation,0,-footThickness/2])
cylinder(r=screwSize+3,h=footThickness,center=true);
}
translate([0,0,-holderExtension/2])
bcube([dimX,dimY,holderExtension], cr=3, cres=0);
}
// Hole for linear bearing
linearBearingHole(model=linearBearingModel, lateralExtension=holderExtension, lengthExtension=2*plasticHolderLength, holderLength=plasticHolderLength/2);
//linearBearingHole(model=linearBearingModel);
// Hole for the screw and nut
translate([dimX/2+footSeparation,0,dimZ+workbed_thickness+workbed_screws_aditional_length])
rotate([90,0,0]) hole_for_screw(size=screwSize,length=workbed_screws_aditional_length+footThickness+workbed_thickness,nutDepth=0,nutAddedLen=0,captiveLen=0);
}
2014-07-24 21:51:39 +07:00
translate([0,linearBearingLength/2,0])
rotate([90,0,0]) linearBearing_single(model=linearBearingModel, echoPart=true);
}
2014-07-24 06:35:51 +07:00
}
module Cyclone_YsubPart_linearBearingHolders(onlyScrews=false) {
2014-07-24 06:35:51 +07:00
translate([axes_Ysmooth_separation/2,Ycarriage_linearBearingSeparation/2])
Cyclone_YsubPart_singleLinearBearingHolder(onlyScrews=onlyScrews);
2014-07-24 06:35:51 +07:00
translate([axes_Ysmooth_separation/2,-Ycarriage_linearBearingSeparation/2])
Cyclone_YsubPart_singleLinearBearingHolder(onlyScrews=onlyScrews);
2014-07-24 06:35:51 +07:00
scale([-1,1,1]) translate([axes_Ysmooth_separation/2,Ycarriage_linearBearingSeparation/2])
Cyclone_YsubPart_singleLinearBearingHolder(onlyScrews=onlyScrews);
2014-07-24 06:35:51 +07:00
scale([-1,1,1]) translate([axes_Ysmooth_separation/2,-Ycarriage_linearBearingSeparation/2])
Cyclone_YsubPart_singleLinearBearingHolder(onlyScrews=onlyScrews);
}
module Cyclone_YsubPart_PCBholder() {
2014-08-07 06:04:23 +07:00
PCB_dimX = 160;
PCB_dimY = 100;
PCB_dimZ = 1.6;
PCB_holder_edge_length = 3;
PCB_holder_tolerance = 1;
2014-08-07 06:04:23 +07:00
holderArmLength = 30;
holderL_thickness = 2;
2014-09-15 22:09:59 +07:00
holderL_thickness_btm = 1;
holderL_width = workbed_size_Y-PCB_dimY-PCB_holder_tolerance*2;
2014-09-15 22:09:59 +07:00
holderL_innerWidth = holderL_width/2;
screwSize = Y_PCBholder_screwSize;
screwSeparation = screwSize*0.84;
// Draw the PCB (transparent)
%translate([0,0,PCBholder_height])
color([0.2,0.6,0, 1]) cube([PCB_dimX+PCB_holder_tolerance*2,PCB_dimY+PCB_holder_tolerance*2,PCB_dimZ], center=true);
%translate([0,0,PCBholder_height+PCB_dimZ/2])
color([0.8,0.5,0, 1]) cube([PCB_dimX+PCB_holder_tolerance*2,PCB_dimY+PCB_holder_tolerance*2,PCB_dimZ/10], center=true);
2014-08-07 06:04:23 +07:00
difference() {
color(color_stillPart) translate([0,0,PCBholder_height/2])
2014-08-07 06:04:23 +07:00
bcube([workbed_size_X,workbed_size_Y,PCBholder_height], cr=25, cres=0);
// Hole for the PCB
2014-08-07 06:04:23 +07:00
translate([0,0,PCBholder_height])
cube([PCB_dimX+PCB_holder_tolerance*2,PCB_dimY+PCB_holder_tolerance*2,PCB_dimZ], center=true);
2014-08-07 06:04:23 +07:00
// Holes to split the part in two pieces
translate([0,0,PCBholder_height/2])
cube([PCB_dimX-PCB_holder_edge_length*2,PCB_dimY-PCB_holder_edge_length*2, 2*PCBholder_height+1], center=true);
2014-08-07 06:04:23 +07:00
translate([-PCB_dimX/2+PCB_holder_edge_length,0,-0.5])
cube([PCB_dimX-holderArmLength-PCB_holder_edge_length,workbed_size_Y, 2*PCBholder_height+1]);
2014-08-07 06:04:23 +07:00
scale([-1,-1,1]) translate([-PCB_dimX/2+PCB_holder_edge_length,0,-0.5])
cube([PCB_dimX-holderArmLength-PCB_holder_edge_length,workbed_size_Y, 2*PCBholder_height+1]);
2014-08-07 06:04:23 +07:00
// Holes for the screws
2014-08-07 06:04:23 +07:00
for (x = [-1,1], y=[-1,0,1]) {
translate([x*(PCB_dimX/2+screwSeparation),y*PCB_dimY/4,PCBholder_height+screwSize])
rotate([0,0,x*-90]) rotate([90,0,0]) hole_for_screw(size=screwSize,length=PCBholder_height+3,nutDepth=4.5,nutAddedLen=0,captiveLen=10, rot=90);
2014-08-07 06:04:23 +07:00
}
translate([PCB_dimX/2-holderArmLength/2,PCB_dimY/2+screwSeparation,PCBholder_height+screwSize])
rotate([90,0,0]) hole_for_screw(size=screwSize,length=PCBholder_height+3,nutDepth=4.5,nutAddedLen=0,captiveLen=10, rot=90);
scale([-1,-1,1]) translate([PCB_dimX/2-holderArmLength/2,PCB_dimY/2+screwSeparation,PCBholder_height+screwSize])
rotate([90,0,0]) hole_for_screw(size=screwSize,length=PCBholder_height+3,nutDepth=4.5,nutAddedLen=0,captiveLen=10, rot=90);
2014-08-07 06:04:23 +07:00
}
// Holder top L supports
2014-09-15 22:09:59 +07:00
translate([0,0,0.5])
difference() {
2014-09-15 22:09:59 +07:00
color(color_movingPart) translate([0,0,PCBholder_height+(holderL_thickness+holderL_thickness_btm)/2])
bcube([PCB_dimX+PCB_holder_tolerance*2+holderL_width, PCB_dimY+PCB_holder_tolerance*2+holderL_width, holderL_thickness+holderL_thickness_btm], cr=8, cres=0);
translate([0,0,PCBholder_height+holderL_thickness_btm/2])
bcube([PCB_dimX+PCB_holder_tolerance*2+holderL_innerWidth, PCB_dimY+PCB_holder_tolerance*2+holderL_innerWidth, holderL_thickness_btm], cr=8, cres=0);
if(draw_references) %frame();
translate([0,0,PCBholder_height/2])
cube([PCB_dimX-PCB_holder_edge_length*2,PCB_dimY-PCB_holder_edge_length*2, 2*PCBholder_height+1], center=true);
translate([-PCB_dimX/2+PCB_holder_edge_length,0,-0.5])
cube([PCB_dimX-holderArmLength-PCB_holder_edge_length,workbed_size_Y, 2*PCBholder_height+1]);
scale([-1,-1,1]) translate([-PCB_dimX/2+PCB_holder_edge_length,0,-0.5])
cube([PCB_dimX-holderArmLength-PCB_holder_edge_length,workbed_size_Y, 2*PCBholder_height+1]);
// Holes for the screws
2014-09-15 22:09:59 +07:00
translate([0,0,holderL_thickness+(holderL_thickness+holderL_thickness_btm)/2]) {
for (x = [-1,1], y=[-1,0,1]) {
translate([x*(PCB_dimX/2+screwSeparation),y*PCB_dimY/4,PCBholder_height+screwSize])
rotate([0,0,x*-90]) rotate([90,0,0]) hole_for_screw(size=screwSize,length=PCBholder_height*10,nutDepth=4.5,nutAddedLen=0,captiveLen=10, rot=90);
}
translate([PCB_dimX/2-holderArmLength/2,PCB_dimY/2+screwSeparation,PCBholder_height+screwSize])
rotate([90,0,0]) hole_for_screw(size=screwSize,length=PCBholder_height*10,nutDepth=4.5,nutAddedLen=0,captiveLen=10, rot=90);
scale([-1,-1,1]) translate([PCB_dimX/2-holderArmLength/2,PCB_dimY/2+screwSeparation,PCBholder_height+screwSize])
rotate([90,0,0]) hole_for_screw(size=screwSize,length=PCBholder_height*10,nutDepth=4.5,nutAddedLen=0,captiveLen=10, rot=90);
}
}
}
module Cyclone_Y_carriage() {
2014-08-07 06:04:23 +07:00
if(render_DXF_workbed) {
2014-07-24 23:33:49 +07:00
offset(delta = DXF_offset) projection(cut = true)
translate([0,0,-workbed_separation_from_Y_threaded_rod]) {
Cyclone_YsubPart_nutHolder();
2014-07-24 06:35:51 +07:00
translate([0,0,axes_Y_smoothThreaded_verticalSeparation])
Cyclone_YsubPart_linearBearingHolders();
2014-09-15 22:09:59 +07:00
translate([0,0,workbed_separation_from_Y_threaded_rod+workbed_thickness])
beveledBase(size=[workbed_size_X,workbed_size_Y,workbed_thickness], radius=3, res=15, echoPart=true, renderPart=render_bases_outline);
}
} else {
2014-07-24 06:35:51 +07:00
if(draw_references) color("red") %frame(20);
rotate([0,0,180]) Cyclone_YsubPart_nutHolder();
translate([0,0,axes_Y_smoothThreaded_verticalSeparation]) {
2014-07-24 06:35:51 +07:00
Cyclone_YsubPart_linearBearingHolders();
difference() {
translate([0,0,workbed_separation_from_Y_threaded_rod+workbed_thickness-axes_Y_smoothThreaded_verticalSeparation])
Cyclone_YsubPart_PCBholder();
2014-08-07 06:04:23 +07:00
Cyclone_YsubPart_linearBearingHolders(onlyScrews=true);
}
}
2014-09-15 22:09:59 +07:00
color([0.9,0.9,0.9, 1]) translate([0,0,workbed_separation_from_Y_threaded_rod+workbed_thickness])
2014-07-23 05:08:12 +07:00
beveledBase(size=[workbed_size_X,workbed_size_Y,workbed_thickness], radius=3, res=15, echoPart=true);
}
}