summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--dremelfuge-v4.scad104
-rw-r--r--metadata.yaml15
-rw-r--r--shapes.scad154
3 files changed, 269 insertions, 4 deletions
diff --git a/dremelfuge-v4.scad b/dremelfuge-v4.scad
new file mode 100644
index 0000000..050d641
--- /dev/null
+++ b/dremelfuge-v4.scad
@@ -0,0 +1,104 @@
+// ===== DremelFuge =====
+// Cathal Garvey (cathalgarvey@gmail.com
+// Creative Commons NonCommercial Sharealike Attribution license
+// http://creativecommons.org/licenses/by-nc-sa/3.0/
+
+// ===== Parameters =====
+// Includes:
+<shapes.scad><Eppie.scad>
+// Note: Shapes.scad is released under a GNU License, further details in that script.
+// Many thanks to Catarina Mota <clifford@clifford.at> for providing this very useful resource to the community!
+// Note also: Eppie.scad is released under a Creative Commons Attribution Sharealike License.
+
+// All dimensions are in mm.
+// $fn is a global variable that determines the number of faces to divide a curved surface into. Increase $fn for more detailed models.
+$fn = 80;
+
+// EppieRad is how wide the top of the eppie is, but not the lip! The Lip should exceed this width by a good margin!
+EppieRad = 5.35;
+EppieLipRad = 6.65;
+// AxleRad is the radius of the axle that protudes from the top, which is accepted by the drill/dremel to spin the device.
+// AxleLength is how long the Axle is, including the rotor.
+AxleRad = 4.5;
+AxleLength = 12.5;
+HollowAxle = 1;
+
+// AxleInnerRad is how wide the inner bore of the axle should be, if HollowAxle is set to 1.
+// AxleInnerDepth is how deep the bore should be starting from the top of the Axle Length.
+// ScrewHoleRad is how wide the smaller hole at the end of the Inner Bore should be.
+AxleInnerRad = 2.45;
+AxleInnerDepth = 10.5;
+ScrewHoleRad = 1;
+
+// RotorDisplacement is how far from the central axle the rotor is intended to extend.
+// This determines in large part the G-force that will be applied to the spun samples.
+RotorDisplacement = 32;
+// RotorEdgeSpan is how thick the rim of the rotor should be.
+// This confers strength and momentum, but puts more strain on the dremel and likely increases the odds of uneven plastic infill.
+RotorEdgeSpan = 5.8;
+// SpokeWidth is how thick the spokes of the rotor/axle are.
+SpokeWidth = 3;
+// SpokeSpan is how long a spoke is from tip to tip.
+SpokeSpan = RotorDisplacement*2 - RotorEdgeSpan / 2;
+
+// RotorHeight is how tall the Rotor is when placed on end. It's important that this be larger than the diameter of the Eppies used, or the holes cut for the Eppies will be larger than the rotor's rim!
+RotorHeight = 12.5;
+
+// ===== Modules ======
+module Spoke(SpokeH,SpokeL,SpokeW,SpokeRo){
+ translate([0,0,SpokeH/2]) rotate([0,0,SpokeRo])
+ cube([SpokeL,SpokeW,SpokeH],center=true);
+}
+module Rotor(SpurR,SpurH,RimW,RimR,SpokeW,Height,BoreD,BoreW,ScrewW){
+ difference(){
+ union(){
+ cylinder(SpurH,SpurR,SpurR);
+ tube(Height,RimR,RimW);
+ Spoke(Height,SpokeSpan,SpokeW,60);
+ Spoke(Height,SpokeSpan,SpokeW,120);
+ Spoke(Height,SpokeSpan,SpokeW,180);
+ }
+ if(HollowAxle == 1){
+ translate([0,0,SpurH-BoreD]) cylinder(BoreD,BoreW,BoreW);
+ cylinder(SpurH,ScrewW,ScrewW);
+ }
+ }
+}
+module EppieCutouts(CutOutSize,Rotation){
+ // Cylinder for Eppie:
+ translate([0,0,1+RotorHeight/2]) rotate([0,90,Rotation]) translate([0,0,-RotorDisplacement-1])
+ cylinder(RotorEdgeSpan+3,CutOutSize,CutOutSize);
+ translate([0,0,1+RotorHeight/2]) rotate([0,90,Rotation])
+ translate([0,0,-RotorDisplacement+RotorEdgeSpan-0.5])
+ cylinder(3,CutOutSize+1.2,EppieLipRad);
+ // Box cutout for ease of insertion:
+ translate([0,0,RotorHeight-2]) rotate([0,90,Rotation]) translate([0,0,-RotorDisplacement+3.7])
+ cube([5,CutOutSize*2-0.48,RotorEdgeSpan+2],center = true);
+ // Box cutout to preserve cap closure:
+ translate([0,0,1.9]) rotate([0,90,Rotation]) translate([0,0,-RotorDisplacement+RotorEdgeSpan])
+ cube([4,CutOutSize*2-0.5,4],center = true);
+
+ // Matching Cylinder for facing Eppie:
+ translate([0,0,1+RotorHeight/2]) rotate([0,90,Rotation+180]) translate([0,0,-RotorDisplacement-1])
+ cylinder(RotorEdgeSpan+3,CutOutSize,CutOutSize);
+ translate([0,0,1+RotorHeight/2]) rotate([0,90,Rotation+180])
+ translate([0,0,-RotorDisplacement+RotorEdgeSpan-0.5])
+ cylinder(3,CutOutSize+1.2,EppieLipRad);
+ // Box cutout for ease of insertion:
+ translate([0,0,RotorHeight-2]) rotate([0,90,Rotation+180]) translate([0,0,-RotorDisplacement+3.7])
+ cube([5,CutOutSize*2-0.48,RotorEdgeSpan+2],center = true);
+ // Box cutout to preserve cap closure:
+ translate([0,0,1.9]) rotate([0,90,Rotation+180]) translate([0,0,-RotorDisplacement+RotorEdgeSpan])
+ cube([4,CutOutSize*2-0.5,4],center = true);
+}
+
+module RotorWithHoles(){
+ difference(){
+ Rotor(AxleRad, AxleLength, RotorEdgeSpan, RotorDisplacement, SpokeWidth, RotorHeight,AxleInnerDepth,AxleInnerRad,ScrewHoleRad);
+ EppieCutouts(EppieRad,30);
+ EppieCutouts(EppieRad,90);
+ EppieCutouts(EppieRad,150);
+ }
+ }
+
+RotorWithHoles();
diff --git a/metadata.yaml b/metadata.yaml
index cc37daf..e3a2dd2 100644
--- a/metadata.yaml
+++ b/metadata.yaml
@@ -2,6 +2,13 @@
name: dremelfuge
license: CC-BY-SA 3.0
status: untested
+version: 4
+package version: 0.1
+maintainer: Bryan Bishop <kanzure@gmail.com>
+author: Cathal Garvey <cathalgarvey@gmail.com>
+created: 2011-01-21 10:30:00 -0600
+contributors:
+ - Catarina Mota <catarina@openmaterials.org>
short description:
A printable rotor for centrifuging standard microcentrifuge tubes and
miniprep columns.
@@ -55,10 +62,6 @@ description: """
this great workhorse script, as well as for letting me sidestep the
"Inheritence Clause" of the license.
"""
-maintainer: Bryan Bishop <kanzure@gmail.com>
-author: Cathal Garvey <cathalgarvey@gmail.com>
-contributors:
- - Catarina Mota <catarina@openmaterials.org>
dependencies:
build:
- or:
@@ -68,6 +71,10 @@ dependencies:
- plastic
use:
- rotary-tool
+ software:
+ - openscad
+files:
+ - dremelfuge-v4.scad
links:
- http://www.thingiverse.com/thing:1483
- http://www.appropedia.org/DremelFuge
diff --git a/shapes.scad b/shapes.scad
new file mode 100644
index 0000000..e09279b
--- /dev/null
+++ b/shapes.scad
@@ -0,0 +1,154 @@
+/*
+ * OpenSCAD Shapes Library (www.openscad.at)
+ * Copyright (C) 2009 Catarina Mota <clifford@clifford.at>
+ *
+ * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+*/
+
+
+//box(width, height, depth);
+//roundedBox(width, height, depth, factor);
+//cone(height, radius);
+//oval(width, height, depth);
+//tube(height, radius, wall);
+//ovalTube(width, height, depth, wall);
+//hexagon(height, depth);
+//octagon(height, depth);
+//dodecagon(height, depth);
+//hexagram(height, depth);
+//rightTriangle(adjacent, opposite, depth);
+//equiTriangle(side, depth);
+//12ptStar(height, depth);
+
+//----------------------
+
+module box(w,h,d) {
+ scale ([w,h,d]) cube(1, true);
+}
+
+module roundedBox(w,h,d,f){
+ difference(){
+ box(w,h,d);
+ translate([-w/2,h/2,0]) cube(w/(f/2),true);
+ translate([w/2,h/2,0]) cube(w/(f/2),true);
+ translate([-w/2,-h/2,0]) cube(w/(f/2),true);
+ translate([w/2,-h/2,0]) cube(w/(f/2),true);
+ }
+ translate([-w/2+w/f,h/2-w/f,-d/2]) cylinder(d,w/f, w/f);
+ translate([w/2-w/f,h/2-w/f,-d/2]) cylinder(d,w/f, w/f);
+ translate([-w/2+w/f,-h/2+w/f,-d/2]) cylinder(d,w/f, w/f);
+ translate([w/2-w/f,-h/2+w/f,-d/2]) cylinder(d,w/f, w/f);
+}
+
+module cone(height, radius) {
+ cylinder(height, radius, 0);
+}
+
+module oval(w,h,d) {
+ scale ([w/100, h/100, 1]) cylinder(d, 50, 50);
+}
+
+module tube(height, radius, wall) {
+ difference(){
+ cylinder(height, radius, radius);
+ cylinder(height, radius-wall, radius-wall);
+ }
+}
+
+module ovalTube(w,h,d,wall) {
+ difference(){
+ scale ([w/100, h/100, 1]) cylinder(d, 50, 50);
+ scale ([w/100, h/100, 1]) cylinder(d, 50-wall, 50-wall);
+ }
+}
+
+module hexagon(height, depth) {
+ boxWidth=height/1.75;
+ union(){
+ box(boxWidth, height, depth);
+ rotate([0,0,60]) box(boxWidth, height, depth);
+ rotate([0,0,-60]) box(boxWidth, height, depth);
+ }
+}
+
+module octagon(height, depth) {
+ intersection(){
+ box(height, height, depth);
+ rotate([0,0,45]) box(height, height, depth);
+ }
+}
+
+module dodecagon(height, depth) {
+ intersection(){
+ hexagon(height, depth);
+ rotate([0,0,90]) hexagon(height, depth);
+ }
+}
+
+module hexagram(height, depth) {
+ boxWidth=height/1.75;
+ intersection(){
+ box(height, boxWidth, depth);
+ rotate([0,0,60]) box(height, boxWidth, depth);
+ }
+ intersection(){
+ box(height, boxWidth, depth);
+ rotate([0,0,-60]) box(height, boxWidth, depth);
+ }
+ intersection(){
+ rotate([0,0,60]) box(height, boxWidth, depth);
+ rotate([0,0,-60]) box(height, boxWidth, depth);
+ }
+}
+
+module rightTriangle(adjacent, opposite, depth) {
+ difference(){
+ translate([-adjacent/2,opposite/2,0]) box(adjacent, opposite, depth);
+ translate([-adjacent,0,0]){
+ rotate([0,0,atan(opposite/adjacent)]) dislocateBox(adjacent*2, opposite, depth);
+ }
+ }
+}
+
+module equiTriangle(side, depth) {
+ difference(){
+ translate([-side/2,side/2,0]) box(side, side, depth);
+ rotate([0,0,30]) dislocateBox(side*2, side, depth);
+ translate([-side,0,0]){
+ rotate([0,0,60]) dislocateBox(side*2, side, depth);
+ }
+ }
+}
+
+module 12ptStar(height, depth) {
+ starNum=3;
+ starAngle=360/starNum;
+ for (s=[1:starNum]){
+ rotate([0, 0, s*starAngle]) box(height, height, depth);
+ }
+}
+
+//-----------------------
+//MOVES THE ROTATION AXIS OF A BOX FROM ITS CENTER TO THE BOTTOM LEFT CORNER
+module dislocateBox(w,h,d){
+ translate([w/2,h,0]){
+ difference(){
+ box(w, h*2, d+1);
+ translate([-w,0,0]) box(w, h*2, d+1);
+ }
+ }
+}
+