diff --git a/Hardware/Development/Cyclone_Template/template.scad b/Hardware/Development/Cyclone_Template/template.scad new file mode 100644 index 0000000..97c6d95 --- /dev/null +++ b/Hardware/Development/Cyclone_Template/template.scad @@ -0,0 +1,229 @@ +// Cyclone PCB Factory: a 3D printable CNC machine for PCB manufacture +// Created by Carlosgs (http://carlosgs.es) +// License: Attribution - Share Alike - Creative Commons (http://creativecommons.org/licenses/by-sa/3.0/) + +use <../libs/Write/Write.scad> +use <../libs/build_plate.scad> +use <../main_frame/frame.scad> +use <../Y_axis/Y_rod_idler.scad> +use <../Y_axis/motor_stand.scad> +use <../Y_axis/linear_bearing_holder.scad> +use <../Y_axis/Y_nut_holder.scad> +use <../XZ_axis/X_carriage.scad> +use <../XZ_axis/Z_carriage.scad> + +X_axis_sep = 210; +Y_axis_sep = 210; +Y_threaded_rod_length = (Y_axis_sep/2)+40; +Y_linear_bearing_dist = Y_axis_sep/2-25-20; + +Y_rod_height = 40; +Y_rod_dist_from_workbed = 12.5; + +Y_threaded_rod_height = Y_rod_height-8.218; // Obtained "by sight" +Y_threaded_rod_dist_from_workbed = (Y_rod_height-Y_threaded_rod_height)+Y_rod_dist_from_workbed; + +workbed_X = X_axis_sep+20; +workbed_Y = 122;//Y_linear_bearing_dist+25+20-3; +workbed_thickness = 10; + +X_threaded_rod_height = 99.65; +X_smooth_rods_sep = 50; +X_smooth_rods_sep_projected = sqrt((X_smooth_rods_sep*X_smooth_rods_sep)/2); // Be careful with this measure, it is not properly named since it is used with the following offset: +smooth_rod_margin = 1; + +X_rod_sep_real = X_smooth_rods_sep_projected+smooth_rod_margin; + +module frame_right() { + color([1,0.8,0]) rotate([0,0,90]) scale([-1,1,1]) translate([-85,-23,135]) rotate([-90,0,0]) frame(with_motor = 0); +} + +module frame_left() { + color([1,1,0]) rotate([0,0,90]) scale([-1,-1,1]) translate([-85,-23,135]) rotate([-90,0,0]) frame(with_motor = 1); +} + +module Y_rod_idler_left() { + color([0.8,1,1]) rotate([0,0,90]) scale([1,-1,1]) translate([-26,-17,39]) rotate([-90,0,0]) Y_rod_idler(); +} + +module Y_rod_idler_right() { + color([1,1,1]) rotate([0,0,90]) translate([-26,-17,39]) rotate([-90,0,0]) Y_rod_idler(); +} + +module Y_motor_stand() { + color([0,1,1]) rotate([0,90,0]) translate([-45,0,52.4]) rotate([-90,0,0]) motor_stand(); +} + +module Y_idle_stand() { + color([0,1,0.8]) rotate([0,90,180]) translate([-45,0,52.4]) rotate([-90,0,0]) idle_stand(); +} + +module linear_bearing_holder() { + color([1,0.5,0]) + rotate([0,-90,-90]) translate([3,0,0]) lm8uu_bearing_holder(); +} + +module Y_nut_holder() { + color([0.5,0.5,0]) + nut_holder_positioned(); +} + +module cnc_workbed() { + + // ---- work bed ---- + translate([0,0,-workbed_thickness/2+1]) { + color([0.5,1,0.5,0.5]) { // Transparent color + %cube([workbed_X,workbed_Y,workbed_thickness],center=true); + difference() { + cube([workbed_X,workbed_Y,workbed_thickness],center=true); + cube([workbed_X-1,workbed_Y-1,workbed_thickness+1],center=true); + } + } + } + + // --- Y axis nut holder + rotate([0,0,180]) + Y_nut_holder(); + + // ---- work bed linear bearing position ---- + translate([-X_axis_sep/2,-Y_linear_bearing_dist/2,0]) + rotate([0,0,180]) + linear_bearing_holder(); + translate([-X_axis_sep/2,Y_linear_bearing_dist/2,0]) + rotate([0,0,180]) + linear_bearing_holder(); + translate([X_axis_sep/2,-Y_linear_bearing_dist/2,0]) + linear_bearing_holder(); + translate([X_axis_sep/2,Y_linear_bearing_dist/2,0]) + linear_bearing_holder(); +} + +module X_carriage() { + translate([0,X_rod_sep_real/2,0]) + rotate([0,0,90]) + X_carriage_assembled(show_printbed = 0, show_Xrods = 0, show_Zrods = 1); +} + +module Z_carriage_piece() { + translate([0,0,41]) + rotate([0,0,90]) + Z_carriage_assembled(); +} + +module cnc(show_printbed = 1) { + // ---- build plate ---- + if(show_printbed) { + //for display only, doesn't contribute to final object + translate([X_axis_sep/2,Y_axis_sep/2,0]) + build_plate(3,297,210); // A4 + } + + // ---- main frames ---- + frame_left(); + translate([X_axis_sep,0,0]) + frame_right(); + + // ---- Y rod idlers ---- + translate([0,Y_axis_sep,0]) { + Y_rod_idler_left(); + translate([X_axis_sep,0,0]) + Y_rod_idler_right(); + } + + // ---- Y threaded rod motor and idler ---- + translate([X_axis_sep/2,Y_axis_sep/2,0]) { + translate([0,Y_threaded_rod_length/2,0]) Y_motor_stand(); + translate([0,-Y_threaded_rod_length/2,0]) Y_idle_stand(); + } +} + +module reference(dist=200,offset=0) { + lineWidth = 0.5; + thickness = 5; + textSize = 5; + translate([offset,0,0]) write(str(dist," mm"),t=thickness,h=textSize,center=true); + translate([0,textSize,0]) { + cube([dist,lineWidth,thickness],center=true); + translate([dist/2,0,0]) cube([lineWidth,5,thickness],center=true); + translate([-dist/2,0,0]) cube([lineWidth,5,thickness],center=true); + } +} + +module cnc_base_template() { + projection(cut=true) translate([0,0,-1]) { + cnc(); // Main structure + translate([X_axis_sep/2,Y_axis_sep/2,0]) { // Reference rulers + reference(X_axis_sep,60); + translate([-20,0,0]) + rotate([0,0,90]) + reference(Y_threaded_rod_length,40); + } + } +} + +module cnc_workbed_template() { + projection(cut=true) translate([0,0,-1]) { + cnc_workbed(); // Main structure + translate([0,-20,0]) + reference(workbed_X,60); + translate([-20,0,0]) + rotate([0,0,90]) + reference(workbed_Y,40); + } +} + +module rod(len=100) { + color([0.8,0.8,0.8]) + rotate([90,0,0]) + cylinder(r=8/2,h=len,center=true,$fn=30); +} + +module cnc_assembled(Y_offset=0,X_offset=0,Z_offset=0) { + translate([-X_axis_sep/2,-Y_axis_sep/2]) + cnc(); + translate([0,0,Y_rod_height]) { // Y rod height, centered + // --- workbed --- + translate([0,Y_offset,12.5]) + rotate([0,180,0]) + cnc_workbed(); + + // --- Y threaded rod --- + translate([0,0,Y_threaded_rod_height-Y_rod_height]) + color([0.5,0.5,0.5]) rod(Y_threaded_rod_length+60); + + // --- Y smooth rods --- + translate([X_axis_sep/2,0,0]) + rod(Y_axis_sep+15); + translate([-X_axis_sep/2,0,0]) + rod(Y_axis_sep+15); + } + + translate([0,-19,99.65]) { // X threaded rod height, centered over SMOOTH rod + // --- X axis --- + translate([0,-X_rod_sep_real,0]) { + translate([-X_offset,0,0]) { + X_carriage(); + translate([0,X_rod_sep_real/2,Z_offset]) + Z_carriage_piece(); + } + rotate([0,0,90]) + color([0.5,0.5,0.5]) rod(X_axis_sep+80); + translate([0,0,X_rod_sep_real]) + rotate([0,0,90]) + rod(X_axis_sep+60); + } + rotate([0,0,90]) + rod(X_axis_sep+60);/// WARNING!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + /// INCOHERENT X_axis_sep!!!!!!!!!!! + } + + // --- Wood base --- + translate([0,0,-15/2-0.1]) + color([0.7,0.6,0.4]) + cube([X_axis_sep+70,Y_axis_sep+30,15],center=true); +} + +rotate([0,0,90])cnc_assembled(Y_offset=30,X_offset=-50,Z_offset=10); + +//rotate([0,0,90]) cnc_base_template(); // So the generated dxf matches inkscape's default orientation +// cnc_workbed_template();