Re-structuration of the repository, updated readme files for each section

pull/9/head
carlosgs 2013-09-26 19:43:09 +02:00
parent 14c246c516
commit 743118fa0d
121 changed files with 420831 additions and 88622 deletions

View File

@ -0,0 +1,7 @@
Hardware for Cyclone-PCB-Factory
===================
**Development** version of the hardware
_Designs present in this folder may not be consistent_

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

87
Hardware/README.md Normal file
View File

@ -0,0 +1,87 @@
Hardware for Cyclone-PCB-Factory
===================
Render (v0.9.7)
--
![ScreenShot](https://github.com/carlosgs/Cyclone-PCB-Factory/raw/master/Media/Cyclone_render_v0.9.7.png)
To-Do list
--
- Fix this: The linear bearings of the X carriage must be glued in place (use epoxy or similar) since vibrations produced by the spindle motor move the bearings out of place.
- Reinforce left&right frames
- Reinforce screw holders in the Z axis parts
- Add Endstop holder files (same of Prusa/Mendel)
- Create holder for a vacuum cleaner
- Create assembly instructions
News
--
- v0.9.7 has an improved Z carriage: uses much less plastic, it holds the spindle tightly and leaves more metal surface exposed for better cooling.
- v0.9.6b has a robust Y axis motor stand (improvement suggested and tested by **Yopero**), and the Z carriage now shows the name of the machine (how cool is that? :P)
Notes
--
- Using a thick wood piece as the main base.
- As shown in one of the pictures, a cheap dremel-like drill has nice bearings and is a good option as the main tool. **Finally it will be using a proper spindle** (check the BOM for the reference).
- Desired working range of >=100mm for the X axis and >=160mm for the Y axis.
- Parts are designed to be printable with the small volume of a Printrbot Jr
- Bed leveling is done with probing and an appropriate software.
Bill of materials
--
_Work in progress_
Kobus' <https://docs.google.com/spreadsheet/ccc?key=0AjYcEd1WlkqCdERINEFvRk9mVTZvdXZFR0VHVjRWc2c#gid=0>
Robsbots' <https://docs.google.com/spreadsheet/ccc?key=0AmiiQRLnjs9cdE12VDFmTHJ4N3JoTzcwbkJPb0ZLSWc#gid=0>
Carlosgs' <https://docs.google.com/spreadsheet/ccc?key=0AsQp8IK25R4IdGk3LTdOWmpFR0Nrc0RhaVJaUC1CMUE>
Tutorials
--
_Work in progress_
<http://reprap.org/wiki/Cyclone_PCB_Factory>
License
--
License: **Attribution - Share Alike - Creative Commons (<http://creativecommons.org/licenses/by-sa/3.0/>)**
Authors (Hardware):
--
- **Carlos García Saura (Carlosgs <http://carlosgs.es>)** (original design)
- **Daniel Garrido (yOPERO <http://yopero-tech.blogspot.com.es/>)** (hardware improvements)
Special thanks
--
- Z axis concepts by **Quim Borras** and the spindle motor holder by **Misan** were really useful!! Also, **Diego Viejo**'s machine was of great inspiration for the Z axis (<https://plus.google.com/u/0/photos/113930344830086538817/albums/5868944432651911713?authkey=CLDJgdehlN773gE>) **Thank you all!!**
- This design woudn't have been possible without the encouragement of the **Panda CNC community** (<https://plus.google.com/u/0/communities/102402711800402614517>)
- Also, thanks to **Juan González-Gómez (Obijuan <http://iearobotics.com>)** for naming the machine Cyclone :)
Derived from / we have used / inspirational
--
- "Linear actuator concept for CNC machines" by **Carlosgs** (<http://www.thingiverse.com/thing:45103>)
- "Obiscad library" by **Obijuan** (<https://github.com/Obijuan/obiscad>)
- "Minimal footprint friction-fit LM8UU holder" by **thantik** (<http://www.thingiverse.com/thing:23041>)
- "Spindle mount for ShapeOko" by **Misan** (<http://www.thingiverse.com/thing:26740>)
- "Carro Z para Cyclone CNC mill intended for PCB" by **Quim** (<http://www.thingiverse.com/thing:80718>)
- "Write.scad (and DXF fonts)" by **HarlanDMii** (<http://www.thingiverse.com/thing:16193>)
- "PCB Machining Vise" by **Forgetful_Guy** (<http://www.thingiverse.com/thing:63578>)
Credit for the ideas used
--
The origin of Cyclone took place while I was inside the **Panda CNC** community (<https://plus.google.com/u/0/communities/102402711800402614517>). This is from December 2012 to mid-February 2013.
Here is the credit for the ideas that were used:
* _Let's design a 3D-printable CNC for PCB milling, it will be named Panda:_ **Guillermo Welch** (mid-December, via Google Talk)
* _X carriage rod distribution:_ **César Augusto Fernández Cano** claims Cyclone's X axis is a derivate of his concept: <https://plus.google.com/u/0/111421387442355054591/posts/QrfYtEuZBaj>
* _100x160mm workspace:_ **David Martin** <https://dl.dropboxusercontent.com/u/16122275/PandaCNC_credit/workplace_size.png>
* _Using gears to drive the X-Y axes:_ **Guillermo Welch** <https://plus.google.com/u/0/101232926728463427403/posts/QjZGNcWcgGg>
* _Regarding the woodbase:_ **Guillermo Welch** always contemplated the possibility of attaching the machine (optionally) to a woodbase. I decided to use the base as a main structural part instead. See <https://dl.dropboxusercontent.com/u/16122275/PandaCNC_credit/woodbase.png> (screenshot from <https://plus.google.com/u/0/113437723819360223498/posts/8LDCSSVWqCS>)
* _List of CNC endmill types:_ **David Martin** <https://dl.dropboxusercontent.com/u/16122275/PandaCNC_credit/cnc_endmill_types.png>
Please note I have taken screenshots of the post that are on the closed G+ Panda community (<https://plus.google.com/u/0/communities/116318709564872967169>). You can register and see by yourself.
**All other development present on Cyclone has nothing to do with Panda and is not related to the Panda project.**
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

File diff suppressed because it is too large Load Diff

Binary file not shown.

File diff suppressed because it is too large Load Diff

View File

@ -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();

View File

@ -0,0 +1,113 @@
/* 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/teardrop.scad>
include <MCAD/involute_gears.scad>
motor_shaft_diameter=5.4;
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
);
}
// 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 );
//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 );
}

View File

@ -0,0 +1,98 @@
/* 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/teardrop.scad>
include <MCAD/involute_gears.scad>
M8_nut_diameter = 15.3;
nut_separation = 3;
SmallGear_N_Teeth = 15; // 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
);
}
// 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 );
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,5 @@
Hardware for Cyclone-PCB-Factory
===================
Release version of the hardware

View File

@ -0,0 +1,217 @@
// 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/obiscad/bcube.scad>
use <../libs/obiscad/bevel.scad>
use <../libs/build_plate.scad>
use <../libs/teardrop.scad>
include <./lm8uu_holder.scad>
cyl_res = 40;
layer_height = 0.4;
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;
X_rod_sep_real_diag = sqrt(2*(X_rod_sep_real*X_rod_sep_real));
screw_diam = 4;
M8_rod_diam = 8;
M8_rod_hole_diam = M8_rod_diam+0.2;
M8_nut_diameter = 15.3;
// Adjust these values to match the thickness of the nuts you will use
M8_nut_height_Z = 4;
M8_nut_height_X = 1+6.5;
X_axis_nut_support_thickness = 10;
X_nut_screw_diam = 2.5;
lbearing_length = 24;
Z_smooth_rods_sep = 55;
Z_smooth_rods_len = 140;
Z_threaded_rod_len = 120;
lbearing_holder_length = Z_smooth_rods_sep+M8_rod_diam+5;
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 rodHole(len=100,radius=M8_rod_hole_diam/2, truncateMM=1) {
color([0.8,0.8,0.8])
rotate([90,-90,0])
translate([0,0,-len/2])
teardrop(radius, len, truncateMM);
}
module X_nut_holder() {
difference() {
translate([0,0,11.5])
cube([M8_nut_diameter+2,10,25],center=true);
rotate([0,45,0]) translate([0,0,-16])
cube([20,20,20],center=true);
rotate([-90,0,0]) hull() {
translate([0,-1,1.5])
rotate([0,0,90])
cylinder(r=M8_nut_diameter/2,h=M8_nut_height_X,$fn=6);
translate([0,10,1.5])
rotate([0,0,90])
cylinder(r=M8_nut_diameter/2,h=M8_nut_height_X,$fn=6);
}
rotate([90,0,0])
rotate([0,0,90])
cylinder(r=M8_rod_diam/2+2,h=40,center=true,$fn=6);
translate([-4,0,10])
rotate([90,0,0])
cylinder(r=X_nut_screw_diam/2,h=40,center=true,$fn=20);
}
}
module X_nut_holder_cover() {
X_nut_screw_diam = X_nut_screw_diam*1.2;
scale([1,1,-1]) rotate([-90,0,0])
difference() {
translate([0,0,7])
cube([M8_nut_diameter+2,3,17],center=true);
rotate([0,45,0]) translate([0,0,-16])
cube([20,20,20],center=true);
rotate([0,45,0]) translate([0,0,19])
cube([60,20,20],center=true);
rotate([-90,0,0]) hull() {
translate([0,-1,0.5])
rotate([0,0,90])
cylinder(r=M8_nut_diameter/2,h=M8_nut_height_X,$fn=6);
translate([0,10,0.5])
rotate([0,0,90])
cylinder(r=M8_nut_diameter/2,h=M8_nut_height_X,$fn=6);
}
rotate([90,0,0])
rotate([0,0,90])
cylinder(r=M8_rod_diam/2+2,h=40,center=true,$fn=6);
translate([-4,0,10])
rotate([90,0,0])
cylinder(r=X_nut_screw_diam/2,h=40,center=true,$fn=20);
}
}
module X_carriage(show_printbed = 0, show_support = 0) {
if(show_printbed) {
//for display only, doesn't contribute to final object
translate([0,0,-lbearing_holder_width/2])
build_plate(3,110,140);
}
difference() {
union() {
// Origin is set on the base of the Z threaded rod
// ---------- Support for the X nut -------------
translate([-X_rod_sep_real/2,-lbearing_holder_length/2+X_axis_nut_support_thickness/2,0]) {
rotate([0,45,0]) X_nut_holder();
}
// Now, the origin is set on the top smooth rod, and we make a 45deg turn
translate([-X_rod_sep_real/2,0,X_rod_sep_real])
rotate([0,45,0]) {
// --------- Linear bearing supports ------------
lm8uu_bearing_holder_XZ(lbearing_holder_length);
translate([X_rod_sep_real_diag,0,0])
lm8uu_bearing_holder_XZ(lbearing_holder_length);
difference() {
union() { // Join both linear bearing holders
translate([X_rod_sep_real_diag/2,0,lbearing_holder_height/4+2])
cube([X_rod_sep_real_diag+8,lbearing_holder_length,lbearing_holder_height/2],center=true);
rotate([0,-45,0]) // Draw a cube for the Z nut holder
translate([M8_nut_diameter,0,0])
cube([M8_nut_diameter*1.5,lbearing_holder_length,lbearing_holder_height/2],center=true);
}
// Leave clear the inside of the bearing holders
rotate([90,0,0]) {
cylinder(r=lbearing_holder_extDiam-1, h=lbearing_holder_length+0.1, center=true, $fn=40);
translate([X_rod_sep_real_diag,0,0])
cylinder(r=lbearing_holder_extDiam-1, h=lbearing_holder_length+0.1, center=true, $fn=40);
}
}
}
// ------- Z smooth rods holder -------
translate([0,Z_smooth_rods_sep/2,30/2])
cube([M8_rod_diam+9,M8_rod_diam+5,50],center=true);
translate([0,-Z_smooth_rods_sep/2,30/2])
cube([M8_rod_diam+9,M8_rod_diam+5,50],center=true);
if(show_support) translate([0,0,-10+2/2])
cube([M8_rod_diam+9,lbearing_holder_length,2],center=true);
} // End of union
// -------- Z axis rod holes --------
translate([0,0,40-M8_nut_height_Z])
cylinder(r=M8_nut_diameter/2,h=100,$fn=6);// Nut holder (Z)
rotate([90,0,0]) {
translate([0,70/2-5,0]) // --- Hole for the threaded rod ---
rodHole(len=50,radius=M8_rod_diam/2+2, truncateMM=2.5);
translate([0,Z_smooth_rods_len/2-5,Z_smooth_rods_sep/2])
rodHole(len=Z_smooth_rods_len);
translate([0,Z_smooth_rods_len/2-5,-Z_smooth_rods_sep/2])
rodHole(len=Z_smooth_rods_len);
}
} // End of difference
}
module X_carriage_assembled(show_printbed = 0, show_Xrods = 0, show_Zrods = 0) {
X_carriage(show_printbed);
if(show_Xrods){
// ---- Rods (for reference) ----
translate([-X_rod_sep_real/2,0,0]) {
color([0.5,0.5,0.5]) rod(len=100);
}
translate([-X_rod_sep_real/2,0,X_rod_sep_real]) {
rod(len=100);
}
translate([X_rod_sep_real/2,0,0]) {
rod(len=100);
}
}
if(show_Zrods)
translate([0,0,0])
rotate([90,0,0]) {
translate([0,Z_threaded_rod_len/2-10,0])
color([0.5,0.5,0.5]) rod(len=Z_threaded_rod_len);
translate([0,Z_smooth_rods_len/2-5,Z_smooth_rods_sep/2])
rod(len=Z_smooth_rods_len);
translate([0,Z_smooth_rods_len/2-5,-Z_smooth_rods_sep/2])
rod(len=Z_smooth_rods_len);
}
}
module X_carriage_print_plate() {
//for display only, doesn't contribute to final object
build_plate(3,110,140);
translate([0,0,lbearing_holder_length/2])
rotate([90,0,0])
X_carriage(show_printbed = 0, show_support = 1);
}
//X_carriage_assembled(show_printbed = 1,show_Xrods = 1,show_Zrods = 1);
X_carriage_print_plate();
//translate([0,20,0]) X_nut_holder_cover();

View File

@ -0,0 +1,231 @@
// 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/obiscad/bcube.scad>
use <../libs/build_plate.scad>
use <../libs/Write/Write.scad>
spindle_motor_diam = 26*2;
spindle_holder_thickness = 7;
bottom_thickness = 4;
base_width = 20;
base_length = 25;
base_screw_diameter = 5;
motor_width = 43;
motor_length = 49; // not used
motor_screw_distance = 31.3;
motor_center_diameter = 23;
motor_adjust_margin = 3;
motor_screw_diameter = 3.7;
motor_screw_head_diameter = 8;
bearing_diameter = 22.4;
M8_rod_diameter = 8.2;
axis_distance = 21;
wall_thickness = 8;
wall_height = motor_width;
wall_width = 54;
idler_width = 25;
lbearing_holder_length = 23*2;
Z_threaded_pos = motor_width/2+axis_distance;
Z_smooth_rods_sep = 55;
textHscale = 0.8;
textThickness = 1;
LM8UU_dia = 15.4;
module dummySpindle() {
translate([0,0,-length]) {
translate([0,0,85]) color([0.95,0.95,0.95]) cylinder(r=26,h=30,$fn=60);
translate([0,0,80]) color([0.95,0.95,0.95]) cylinder(r=10/2,h=5,$fn=60);
translate([0,0,-10]) color([0.6,0.6,0.6]) cylinder(r=26,h=90,$fn=60);
translate([0,0,-40]) color([0.9,0.9,0.9]) cylinder(r=15/2,h=40,$fn=60);
translate([0,0,-50]) color([0.4,0.4,0.4]) cylinder(r=20/2,h=10,$fn=60);
translate([0,0,-50-20]) color([0.9,0.9,0.9]) cylinder(r1=1/2,r2=3/2,h=20,$fn=60);
}
}
// Derived from Spindle mount for ShapeOko by Misan (http://www.thingiverse.com/thing:26740)
module spindle_holder_holes(length=50,showSpindle=true) {
$fn=6;
translate([20,8,-0.05]) cylinder(r=base_screw_diameter/2,h=length+2,$fn=60);
translate([-20,8,-0.05]) cylinder(r=base_screw_diameter/2,h=length+2,$fn=60);
translate([0,38,0]) rotate([0,0,180]) {
translate([0,0,-0.05]) cylinder(r=spindle_motor_diam/2,h=length+2,$fn=60);
translate([0,0,-0.01]) cube([90,3,length+2]);
translate ([36,20,length/2]) rotate([90,0,0]) cylinder(r=2,h=30);
translate ([36,14,length/2]) rotate([90,0,0]) cylinder(r=3.5,h=4,$fn=6);
}
}
module motorHolesZ() {
// Hole for the motor shaft
hull() {
translate([0,motor_adjust_margin/2,0])
cylinder(r=motor_center_diameter/2,h=10*wall_thickness,center=true,$fn=40);
translate([0,-motor_adjust_margin/2,0])
cylinder(r=motor_center_diameter/2,h=10*wall_thickness,center=true,$fn=40);
}
// Hole for the screwdriver
translate([0,-wall_width/2,wall_thickness/2]) rotate([0,90,90]) bcube([2*(wall_thickness-5),5,wall_height],cr=1);
// Screws for holding the motor
for(i=[-1,1]) for(j=[-1,1])
translate([i*motor_screw_distance/2,j*motor_screw_distance/2,2.5-wall_thickness/2]) {
hull() {
translate([0,motor_adjust_margin/2,0])
cylinder(r=motor_screw_diameter/2,h=10*wall_thickness,center=true,$fn=40);
translate([0,-motor_adjust_margin/2,0])
cylinder(r=motor_screw_diameter/2,h=10*wall_thickness,center=true,$fn=40);
}
hull() {
translate([0,motor_adjust_margin/2,0])
cylinder(r=motor_screw_head_diameter/2,h=10*wall_thickness,center=false,$fn=40);
translate([0,-motor_adjust_margin/2,0])
cylinder(r=motor_screw_head_diameter/2,h=10*wall_thickness,center=false,$fn=40);
}
}
}
module motor_stand_holes_Z() {
//difference() {
// translate([wall_height/2,wall_width/2,wall_thickness/2])
// bcube([wall_height,wall_width,wall_thickness],cr=4,cres=10);
// Position relative to motor shaft
translate([motor_width/2,motor_width/2,wall_thickness/2]) {
motorHolesZ();
// Bearing holes
rotate([0,0,0]) translate([0,axis_distance,0]) {
hull() {
cylinder(r=(M8_rod_diameter*2)/2,h=10*wall_thickness,center=true,$fn=40);
translate([0,-axis_distance,0])
cylinder(r=(M8_rod_diameter*2)/2,h=10*wall_thickness,center=true,$fn=40);
}
cylinder(r=bearing_diameter/2,h=10*wall_thickness,center=false,$fn=60);
}
} // End of translate relative to motor shaft
//} // End of difference
}
module linearBearingHolderZ(h=10) {
translate([0,0,1.5]) cylinder(r=LM8UU_dia/2,h=h,$fn=50);
cylinder(r=LM8UU_dia/2.5,h=10*h,center=true,$fn=50);
}
module Z_solid_body(top_part=true) {
hull() {
if(top_part)
translate([wall_height/2,wall_width/2,wall_thickness/2])
bcube([wall_height,wall_width,wall_thickness],cr=4,cres=10);
else
translate([wall_height/2,wall_width,wall_thickness/2])
bcube([wall_height,wall_width/2,wall_thickness],cr=4,cres=10);
translate([wall_height/2,wall_width-4,0])
translate([0,38,0])
cylinder(r=spindle_motor_diam/2+spindle_holder_thickness,h=wall_thickness,$fn=60);
}
// For the linear bearing holders
hull() {
translate([wall_height/2-Z_smooth_rods_sep/2,Z_threaded_pos,0])
cylinder(r=3+LM8UU_dia/2,h=wall_thickness,$fn=50);
translate([wall_height/2+Z_smooth_rods_sep/2,Z_threaded_pos,0])
cylinder(r=3+LM8UU_dia/2,h=wall_thickness,$fn=50);
}
// For the screw of the spindle holder
translate([wall_height/2,wall_width-4,0])
translate([0,38,0]) {
rotate([0,0,180]) {
translate([28,-7,0]) cube([15,20,wall_thickness]);
// Write text in the front
color([0.5,0.5,0.5])
if(top_part)
scale([-1,1,-textHscale])
writecylinder("CYCLONE",[0,0,-wall_thickness/(2*textHscale)],spindle_motor_diam/2+spindle_holder_thickness,0,font="orbitron.dxf",space=1.1,h=wall_thickness,t=textThickness,center=true,ccw=true);
else
scale([1,1,textHscale])
writecylinder("PCB Factory",[0,0,wall_thickness/(2*textHscale)+1],spindle_motor_diam/2+spindle_holder_thickness,0,font="orbitron.dxf",space=1.1,h=wall_thickness-2,t=textThickness,center=true,ccw=true);
}
}
}
//for display only, doesn't contribute to final object
build_plate(3,200,200);
module Z_carriage(showSpindle=false,top_part=true) {
difference() {
rotate([0,0,-90]) translate([-wall_height/2,-Z_threaded_pos,0]) {
difference () {
Z_solid_body(top_part);
if(top_part) motor_stand_holes_Z();
translate([wall_height/2,wall_width-4,0])
spindle_holder_holes(wall_thickness,showSpindle);
translate([wall_height/2-Z_smooth_rods_sep/2,Z_threaded_pos,0])
linearBearingHolderZ(wall_thickness);
translate([wall_height/2+Z_smooth_rods_sep/2,Z_threaded_pos,0])
linearBearingHolderZ(wall_thickness);
}
}
// Hole for the threaded rod
if(!top_part) {
hull() {
cylinder(r=2+M8_rod_diameter/2,h=wall_thickness*10,center=true,$fn=30);
translate([-15,0,0])
cylinder(r=2+M8_rod_diameter/2,h=wall_thickness*10,center=true,$fn=30);
}
}
// Truncation in the base for avoiding collision with the X axis
if(!top_part) translate([-15,0,0]) rotate([0,45,0]) cube([20,100,10],center=true);
}
if(showSpindle) rotate([0,0,-90]) translate([0,wall_width-4-Z_threaded_pos,0])
translate([0,38,-20+8]) dummySpindle();
}
module Z_carriage_assembled() {
Z_carriage(showSpindle=true,top_part=false);
translate([0,0,3+23*2]) rotate([180,0,0]) Z_carriage(showSpindle=false,top_part=true);
}
//Z_carriage(top_part=true);
Z_carriage(top_part=false);
//Z_carriage_assembled();

View File

@ -0,0 +1,143 @@
// 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/obiscad/bcube.scad>
use <../libs/build_plate.scad>
use <../libs/Write/Write.scad>
include <./lm8uu_holder.scad>
bottom_thickness = 4;
base_width = 20;
base_length = 25;
base_screw_diameter = 5;
motor_width = 43;
motor_length = 49; // not used
motor_screw_distance = 31.3;
motor_center_diameter = 23;
motor_screw_diameter = 3.7;
motor_screw_head_diameter = 8;
bearing_diameter = 22.4;
M8_rod_diameter = 8.2;
axis_distance = 21;
wall_thickness = 5;
wall_height = motor_width;
wall_width = 54;
idler_width = 25;
lbearing_holder_length = 23*2;
Z_threaded_pos = motor_width/2+axis_distance;
Z_smooth_rods_sep = 55;
textHscale = 0.8;
textThickness = 1.5;
// Derived from Spindle mount for ShapeOko by Misan (http://www.thingiverse.com/thing:26740)
module spindle_holder(length=50,showSpindle=true) {
$fn=6;
translate([0,38,0]) rotate([0,0,180]) {
if(showSpindle) scale([1,1,-1]) translate([0,0,-length]) {
translate([0,0,85]) color([0.95,0.95,0.95]) cylinder(r=26,h=30,$fn=60);
translate([0,0,80]) color([0.95,0.95,0.95]) cylinder(r=10/2,h=5,$fn=60);
translate([0,0,-10]) color([0.6,0.6,0.6]) cylinder(r=26,h=90,$fn=60);
translate([0,0,-40]) color([0.9,0.9,0.9]) cylinder(r=15/2,h=40,$fn=60);
translate([0,0,-50]) color([0.4,0.4,0.4]) cylinder(r=20/2,h=10,$fn=60);
translate([0,0,-50-20]) color([0.9,0.9,0.9]) cylinder(r1=1/2,r2=3/2,h=20,$fn=60);
}
difference() {
union() {
cylinder(r=30,h=length,$fn=60);
// Write text in the front
color([0.5,0.5,0.5]) scale([-1,1,-textHscale]) writecylinder("CYCLONE",[0,0,-length/(3*textHscale)],30,0,font="orbitron.dxf",space=1.1,h=12,t=textThickness,center=true,ccw=true);
translate ([-30,0,0]) cube([60,38,length]);
translate([28,-7,0]) cube([20,20,length]);
color([0.5,0.5,0.5]) scale([-1,1,-textHscale]) writecylinder("PCB Factory",[0,0,-length/(1.5*textHscale)],30,0,font="orbitron.dxf",space=1.1,h=14/2,t=textThickness,center=true,ccw=true);
translate ([-30,0,0]) cube([60,38,length]);
translate([28,-7,0]) cube([20,20,length]);
}
translate([0,0,-0.05]) cylinder(r=26,h=length+2,$fn=60);
translate([0,0,-0.01]) cube([90,3,length+2]);
translate ([40,20,3*length/4]) rotate([90,0,0]) cylinder(r=2,h=30);
translate ([40,20,length/4]) rotate([90,0,0]) cylinder(r=2,h=30);
translate ([40,14,3*length/4]) rotate([90,0,0]) cylinder(r=3.5,h=4,$fn=6);
translate ([40,14,length/4]) rotate([90,0,0]) cylinder(r=3.5,h=4,$fn=6);
difference() {
translate ([-30+15,0,-0.1]) cube([30,38.1,30]);
cylinder(r=26+1,h=length,$fn=60);
}
}
}
}
module motor_stand_no_base_Z(with_motor=true) {
difference() {
translate([wall_height/2,wall_width/2,wall_thickness/2])
bcube([wall_height,wall_width,wall_thickness],cr=4,cres=10);
// Position relative to motor shaft
translate([motor_width/2,motor_width/2,wall_thickness/2]) {
if(with_motor) {
// Hole for the motor shaft
translate([0,-wall_width/2,0])
cube([20,wall_width,10*wall_thickness],cr=4,cres=10,center=true);
cylinder(r=motor_center_diameter/2,h=10*wall_thickness,center=true,$fn=40);
// Screws for holding the motor
for(i=[-1,1]) for(j=[-1,1])
translate([i*motor_screw_distance/2,j*motor_screw_distance/2,0]) {
cylinder(r=motor_screw_diameter/2,h=10*wall_thickness,center=true,$fn=40);
cylinder(r=motor_screw_head_diameter/2,h=10*wall_thickness,center=false,$fn=40);
}
} // End if with motor
// Bearing holes
rotate([0,0,0]) translate([0,axis_distance,0]) {
cylinder(r=(M8_rod_diameter*2)/2,h=10*wall_thickness,center=true,$fn=40);
cylinder(r=bearing_diameter/2,h=10*wall_thickness,center=false,$fn=60);
}
} // End of translate relative to motor shaft
} // End of difference
}
module motor_stand_Z(with_motor=true) {
union() {
motor_stand_no_base_Z(with_motor);
}
}
//for display only, doesn't contribute to final object
build_plate(3,200,200);
module Z_carriage(showSpindle=false) {
rotate([0,0,-90]) translate([-wall_height/2,-Z_threaded_pos,0]) {
motor_stand_Z();
translate([wall_height/2,wall_width-4,0]) spindle_holder(lbearing_holder_length,showSpindle);
translate([wall_height/2-Z_smooth_rods_sep/2,Z_threaded_pos,lbearing_holder_length/2]) rotate([-90,0,0]) lm8uu_bearing_holder_XZ(lbearing_holder_length);
translate([wall_height/2+Z_smooth_rods_sep/2,Z_threaded_pos,lbearing_holder_length/2]) rotate([-90,0,0]) lm8uu_bearing_holder_XZ(lbearing_holder_length);
}
}
Z_carriage(showSpindle=false);

View File

@ -0,0 +1,56 @@
// As Cyclone v0.9, this part is derived from the holder for the Y workbed
// The difference is that mount_plate(); is not shown, only the holder itself
// Plus it has been simplified and variables given a better name
// LM8UU bushing holder modified for its use in Cyclone PCB Factory
// Modified to have only one center screw
// Derived by Carlosgs from:
// LM8UU bushing holder
// http://www.thingiverse.com/thing:23041 by thantik
// Inspired/derived from:
//http://www.thingiverse.com/thing:14942
//Which is derived from:
// http://www.thingiverse.com/thing:14814
//And is a drop-in replacement for:
//http://www.thingiverse.com/thing:10287
// main body dimensions
lbearing_holder_width = 20;
lbearing_gap_width = 14;
lbearing_holder_height = 16;
//lbearing_holder_length = 20;
LM8UU_dia = 15.0;
lbearing_holder_extDiam = LM8UU_dia/2+3;
lbearing_holder_rodPos = LM8UU_dia/2+2;
module lm8uu_bearing_holder_XZ(lbearing_holder_length = 20) {
rotate([0,180,0]) translate([0,0,-lbearing_holder_rodPos])
intersection() {
difference()
{
union()
{
translate([-lbearing_holder_width/2,-lbearing_holder_length/2,0])
cube([lbearing_holder_width,lbearing_holder_length,lbearing_holder_height]);
}
// bushing hole
translate([0,0,lbearing_holder_rodPos])
rotate([90,0,0])
cylinder(r=LM8UU_dia/2, h=lbearing_holder_length+0.1, center=true, $fn=40);
// top gap
translate([0,0,20])
cube([lbearing_gap_width-1,lbearing_holder_length+0.1,20],center=true);
}
translate([0,0,lbearing_holder_rodPos])
rotate([90,0,0])
cylinder(r=lbearing_holder_extDiam, h=lbearing_holder_length+0.1, center=true, $fn=40);
}
}

View File

@ -0,0 +1,104 @@
/* 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/teardrop.scad>
include <MCAD/involute_gears.scad>
motor_shaft_diameter=5.4;
nholes = 7;
/* 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
);
}
// Motor gear
rotate([180,0,0]) union() difference() {
union() {
//gear
herringbone_gear( teeth=8 );
translate( [0, 0, 12] ) mirror( [0, 0, 1] ) difference() {
//shaft
cylinder( r=9, h=7, $fn=40 );
//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=1.5, h=10, $fn=20 );
}
}
}
//shaft hole
translate( [0, 0, -6] ) cylinder( r=motor_shaft_diameter/2, h=20, $fn=30 );
}

View File

@ -0,0 +1,95 @@
/* 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/teardrop.scad>
include <MCAD/involute_gears.scad>
M8_nut_diameter = 15.3;
nut_separation = 3;
/* 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
);
}
// Extruder Gear
difference() {
union() {
//gear
rotate([180,0,0]) herringbone_gear( teeth=16, circles=0, shaft=8.5, $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 );
}

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

File diff suppressed because it is too large Load Diff

Binary file not shown.

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,116 @@
// 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/obiscad/bcube.scad>
use <../libs/build_plate.scad>
use <../libs/Write/Write.scad>
// Adjust these values to match the thickness of the nuts you will use
M8_nut_height_margin = 0.1;
M8_nut_height = M8_nut_height_margin+6.2;
Y_rod_height = 40;
Y_rod_dist_from_workbed = 12.5;
Y_threaded_rod_height = Y_rod_height-8.218; // Obtained "by sight" using the template 3D assembled model
Y_threaded_rod_dist_from_workbed = (Y_rod_height-Y_threaded_rod_height)+Y_rod_dist_from_workbed;
nut_slot_thickness = 1;
nut_slot_length = 3;
bottom_thickness = 4;
base_width = 16;
base_length = 30;
base_screw_diameter = 5;
reinforcement_length = 7.5;
M8_rod_diameter = 8.2+1;
M8_nut_diameter = 15.3;
wall_thickness = 10;
wall_height = Y_threaded_rod_dist_from_workbed+11.5;
wall_width = base_width;
module text(dist=5) {
lineWidth = 0.5;
thickness = 2*0.75;
textSize = 6;
rotate([0,180,-90])
write(str(dist," mm"),t=thickness,h=textSize,center=true);
}
module nut_holder_no_hole() {
translate([0,wall_height])
rotate([0,0,-90])
union() {
translate([wall_height/2,wall_width/2,wall_thickness/2])
bcube([wall_height,wall_width,wall_thickness],cr=2,cres=10);
difference() {
union() {
translate([wall_height-bottom_thickness,wall_width-base_width]) {
cube([bottom_thickness,base_width,base_length]);
hull() {
cube([bottom_thickness,5,10+reinforcement_length]);
translate([-wall_height+bottom_thickness+5,0,wall_thickness])
cube([0.001,5,0.001]);
}
}
}
// --- screws for the base ---
translate([wall_height,wall_width-5.5,20])
rotate([0,90,0]) {
translate([-5,0,0])
cylinder(r=base_screw_diameter/2,h=100,center=true,$fn=6);
translate([5,0,0])
cylinder(r=base_screw_diameter/2,h=100,center=true,$fn=6);
}
} // End of difference
}
}
module nut_holder() {
union() {
difference() {
nut_holder_no_hole();
translate([base_width-3.7,Y_threaded_rod_dist_from_workbed,0]) {
// Hole for the M8 rod
hull() {
cylinder(r=M8_rod_diameter/2,h=100,$fn=25,center=true);
translate([10,0,0])
cylinder(r=M8_rod_diameter/2,h=100,$fn=25,center=true);
}
// Slot for the M8 nut
translate([0,0,wall_thickness/2]) {
cylinder(r=M8_nut_diameter/2,h=M8_nut_height,$fn=6,center=true);
translate([0,0,M8_nut_height/2-nut_slot_thickness/2])
cylinder(r=nut_slot_length+(M8_nut_diameter/2),h=nut_slot_thickness,$fn=6,center=true);
translate([0,0,-(M8_nut_height/2-nut_slot_thickness/2)])
cylinder(r=nut_slot_length+(M8_nut_diameter/2),h=nut_slot_thickness,$fn=6,center=true);
}
//translate([-8,-5,0])
// text(M8_nut_height-M8_nut_height_margin);
}
} // End of difference
translate([base_width-3.7,Y_threaded_rod_dist_from_workbed,0])
translate([-8,-5,0])
text(M8_nut_height-M8_nut_height_margin);
} // End of union
}
module nut_holder_positioned() {
rotate([90,0,0])
translate([-(base_width-3.7),0,-wall_thickness/2])
nut_holder();
}
//for display only, doesn't contribute to final object
build_plate(3,200,200);
rotate([0,-90,0])
nut_holder();

View File

@ -0,0 +1,104 @@
// 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/obiscad/bcube.scad>
use <../libs/obiscad/bevel.scad>
use <../libs/build_plate.scad>
module Y_rod_idler(show_printbed = 0) {
motor_stand_thickness = 5;
bearing_diameter = 22.4;
M8_rod_diam = 8.2;
smooth_rod_margin = 1;
smooth_rod_screw_sep = 8;
smooth_rod_screw_diam = 3;
smooth_rod_screw_len = 7;
frame_thickness = 4;
bottom_thickness = 4;
base_screw_diameter = 5;
Y_rod_height = 40;
Y_rod_dist_from_wall = 15;
Y_rod_support_lenght = Y_rod_dist_from_wall+smooth_rod_screw_sep+smooth_rod_screw_diam;
frame_width = 30;
frame_height = Y_rod_height-smooth_rod_margin;
wall_thickness = 5;
if(show_printbed) {
//for display only, doesn't contribute to final object
translate([frame_width/2,frame_height/2,0]) build_plate(3,110,140);
}
union() {
// --------- Main frame --------- //
difference() {
translate([frame_width/2,frame_height/2,frame_thickness/2])
cube([frame_width,frame_height,frame_thickness],center=true);
rotate([0,0,35]) cube([33,frame_height*10,frame_thickness*10],center=true);
} // End of difference() command
// --------- Step with screws in the base --------- //
difference() {
translate([0,frame_height-bottom_thickness,frame_thickness/2])
cube([frame_width,bottom_thickness,Y_rod_support_lenght/2],center=false);
// --------- Screws in the base --------- //
rotate([90,0,0]) translate([frame_width/3,Y_rod_support_lenght/2.5,-frame_height]) {
translate([-5,0,0])
cylinder(r=base_screw_diameter/2,h=2*smooth_rod_screw_len,center=true,$fn=6);
translate([5,0,0])
cylinder(r=base_screw_diameter/2,h=2*smooth_rod_screw_len,center=true,$fn=6);
}
} // End of difference() command
// --------- Bevel base supports --------- //
translate([frame_width-frame_thickness,frame_height,frame_thickness-0.5])
rotate([90,0,-90])
bconcave_corner(cr=Y_rod_support_lenght-0.5, cres=0, l=frame_thickness*2, th=0.5, ext_corner=true);
// --------- Bevel Y rod support --------- //
translate([frame_width-frame_thickness,frame_height,frame_thickness-2])
translate([0,-Y_rod_height+smooth_rod_margin,0]) {
difference() {
rotate([90,0,90]) // Bevel
bconcave_corner(cr=Y_rod_support_lenght-smooth_rod_screw_len, cres=0, l=frame_thickness*2, th=smooth_rod_screw_len, ext_corner=true);
translate([0,-smooth_rod_margin,Y_rod_dist_from_wall]) rotate([0,90,0]) {
cylinder(r=M8_rod_diam/2,h=10*frame_thickness,center=true,$fn=40);
// Screws
rotate([90,0,0]) {
translate([-smooth_rod_screw_sep,0,-1])
cylinder(r=smooth_rod_screw_diam/2,h=2*smooth_rod_screw_len,center=true,$fn=6);
translate([smooth_rod_screw_sep,0,-1])
cylinder(r=smooth_rod_screw_diam/2,h=2*smooth_rod_screw_len,center=true,$fn=6);
}
}
}
}
} // End of union() command
}
Y_rod_idler(show_printbed = 1);
//scale([-1,1,1]) Y_rod_idler(show_printbed = 1);

View File

@ -0,0 +1,86 @@
// LM8UU bushing holder modified for its use in Cyclone PCB Factory
// Modified to have only one center screw
// Derived by Carlosgs from:
// LM8UU bushing holder
// http://www.thingiverse.com/thing:23041 by thantik
// Inspired/derived from:
//http://www.thingiverse.com/thing:14942
//Which is derived from:
// http://www.thingiverse.com/thing:14814
//And is a drop-in replacement for:
//http://www.thingiverse.com/thing:10287
// screw/nut dimensions
screw_dia = 4;
nut_dia = 8.5;
nut_height=2;
// main body dimensions
body_width = 20;
gap_width = 14;
body_height = 16;
body_length=23;
LM8UU_dia = 15.0;
screw_elevation = body_height-1.5;
//mounting plate dimensions
plate_height = 4;
plate_length=body_length;
plate_width=body_width+11;
screw_space_x = -14.5*2;
screw_space_y = 0;
module mount_plate()
{
difference()
{
//bottom plate
translate([-plate_width+body_width/2,-plate_length/2,-3])
cube([plate_width,plate_length,plate_height]);
//screw holes
translate([screw_space_x/2,screw_space_y/2,-8.1])
cylinder(r=screw_dia/2, h=plate_height+10, $fn=20);
// translate([-screw_space_x/2,-screw_space_y/2,-8.1])
// cylinder(r=screw_dia/2, h=plate_height+1, $fn=20);
//nut traps
}
}
module lm8uu_bearing_holder() {
intersection() {
rotate([90,0,90])
difference()
{
union()
{
mount_plate();
translate([-body_width/2,-body_length/2,0])
cube([body_width,body_length,body_height]);
}
// bushing hole
translate([0,0,LM8UU_dia/2+2])
rotate([90,0,0])
cylinder(r=LM8UU_dia/2, h=body_length+0.1, center=true, $fn=40);
// top gap
translate([0,0,20])
cube([gap_width-1,body_length+0.1,20],center=true);
}
rotate([90,45,90])
//cube([plate_width+3,plate_width+3,100],center=true);
cylinder(r=(plate_width+10)/2,h=100,center=true,$fn=8);
}
}
lm8uu_bearing_holder();

View File

@ -0,0 +1,149 @@
// 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/)
// History:
// - (05/25/2013) Added @yopero's four screw suggestion for the motor stand
// - (05/28/2013) Added @yopero's four screw suggestion for the idle stand
use <../libs/obiscad/bcube.scad>
use <../libs/build_plate.scad>
motor_width = 43;
motor_length = 49; // not used
motor_screw_distance = 31.3;
motor_center_diameter = 23;
motor_screw_diameter = 3.7;
motor_screw_head_diameter = 8;
motor_adjust_margin = 3;
bearing_diameter = 22.4;
M8_rod_diameter = 8.2;
axis_distance = 32;
wall_thickness = 8;
wall_height = 45;
wall_width = 70;
idler_width = 25;
// For the supports with screws
bottom_thickness = 5;
base_width = 20;
base_length = 20+wall_thickness;
base_screw_diameter = 5;
wall_extraWidth_left = base_width+5;
wall_extraWidth_right = 5;
totalWallWidth = wall_width+wall_extraWidth_left+wall_extraWidth_right;
module motorHolesY() {
// Hole for the motor shaft
hull() {
translate([0,motor_adjust_margin/2,0])
cylinder(r=motor_center_diameter/2,h=10*wall_thickness,center=true,$fn=40);
translate([0,-motor_adjust_margin/2,0])
cylinder(r=motor_center_diameter/2,h=10*wall_thickness,center=true,$fn=40);
}
// Hole for the screwdriver
translate([-wall_height/2,0,wall_thickness/2]) rotate([0,90,0]) bcube([2*(wall_thickness-5),5,wall_height],cr=1);
// Screws for holding the motor
for(i=[-1,1]) for(j=[-1,1])
translate([i*motor_screw_distance/2,j*motor_screw_distance/2,2.5-wall_thickness/2]) {
hull() {
translate([0,motor_adjust_margin/2,0])
cylinder(r=motor_screw_diameter/2,h=10*wall_thickness,center=true,$fn=40);
translate([0,-motor_adjust_margin/2,0])
cylinder(r=motor_screw_diameter/2,h=10*wall_thickness,center=true,$fn=40);
}
hull() {
translate([0,motor_adjust_margin/2,0])
cylinder(r=motor_screw_head_diameter/2,h=10*wall_thickness,center=false,$fn=40);
translate([0,-motor_adjust_margin/2,0])
cylinder(r=motor_screw_head_diameter/2,h=10*wall_thickness,center=false,$fn=40);
}
}
}
module motor_stand_no_base(with_motor=true) {
difference() {
translate([wall_height/2,totalWallWidth/2-wall_extraWidth_left,wall_thickness/2])
bcube([wall_height,totalWallWidth,wall_thickness],cr=4,cres=10);
// Position relative to motor shaft
translate([motor_width/2,motor_width/2,wall_thickness/2]) {
if(with_motor)
motorHolesY();
// Bearing holes
rotate([0,0,15]) translate([0,axis_distance,2.5-wall_thickness/2]) {
cylinder(r=(M8_rod_diameter*2)/2,h=10*wall_thickness,center=true,$fn=40);
cylinder(r=bearing_diameter/2,h=10*wall_thickness,center=false,$fn=60);
}
} // End of translate relative to motor shaft
} // End of difference
}
module holder(h=35,noScrews=false,base_width_inc=0) {
difference() {
union() {
translate([wall_height-bottom_thickness,0]) {
if(!noScrews) cube([bottom_thickness,base_width+base_width_inc,base_length]);
hull() {
cube([bottom_thickness,5,base_length]);
translate([-h,0,0])
cube([0.001,5,0.001]);
}
}
}
// --- screws for the base ---
if(!noScrews) translate([wall_height,base_width/2+2.5,base_length/1.5])
rotate([0,90,0]) {
translate([-5,0,0])
cylinder(r=base_screw_diameter/2,h=100,center=true,$fn=7);
translate([5,0,0])
cylinder(r=base_screw_diameter/2,h=100,center=true,$fn=7);
}
} // End of difference
}
module motor_stand(with_motor=true) {
union() {
motor_stand_no_base(with_motor);
translate([0,wall_width]) holder(noScrews=true);
translate([0,52.4-5/2]) holder(h=12,base_width_inc=1);
translate([0,-wall_extraWidth_left+base_width]) scale([1,-1,1]) holder();
}
}
module idle_stand() {
union() {
intersection() { // Remove the motor part
motor_stand(with_motor=false);
translate([wall_height/2,wall_width/2+52.4-(wall_width+wall_extraWidth_right-52.4),wall_thickness/2])
bcube([wall_height,wall_width,100],cr=4,cres=10);
}
translate([0,wall_width+5-2*(wall_width+wall_extraWidth_right-52.4)]) holder(noScrews=true);
translate([0,52.4+5/2]) scale([1,-1,1]) holder(h=15,base_width_inc=1);
}
}
//for display only, doesn't contribute to final object
build_plate(3,200,200);
//motor_stand();
idle_stand();

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

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

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

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

File diff suppressed because it is too large Load Diff

Some files were not shown because too many files have changed in this diff Show More