Re-structuration of the repository, updated readme files for each section
parent
14c246c516
commit
743118fa0d
|
@ -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
|
@ -0,0 +1,87 @@
|
|||
Hardware for Cyclone-PCB-Factory
|
||||
===================
|
||||
|
||||
Render (v0.9.7)
|
||||
--
|
||||

|
||||
|
||||
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
Binary file not shown.
|
@ -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();
|
|
@ -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 );
|
||||
}
|
|
@ -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
|
@ -0,0 +1,5 @@
|
|||
Hardware for Cyclone-PCB-Factory
|
||||
===================
|
||||
|
||||
Release version of the hardware
|
||||
|
|
@ -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();
|
|
@ -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();
|
||||
|
||||
|
||||
|
|
@ -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);
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
@ -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 );
|
||||
}
|
|
@ -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
Binary file not shown.
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
|
@ -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();
|
||||
|
|
@ -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);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
@ -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();
|
||||
|
|
@ -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
Binary file not shown.
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -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
Loading…
Reference in New Issue