summaryrefslogtreecommitdiff
path: root/another.scad
Unidiff
Diffstat (limited to 'another.scad') (more/less context) (ignore whitespace changes)
-rw-r--r--another.scad300
1 files changed, 300 insertions, 0 deletions
diff --git a/another.scad b/another.scad
new file mode 100644
index 0000000..f78d1b0
--- a/dev/null
+++ b/another.scad
@@ -0,0 +1,300 @@
1draft=true;
2layer_height=0.2; extrusion_width=0.4;
3epsilon=0.01;
4$fs=0.0125;
5
6use <threads.scad>;
7module pushfit_thread(h=10) {
8 thr = 3/8 + .5/25.4;
9 slit = 25.4*thr/2 + 0.4;
10 if(draft) cylinder(d=thr*25.4,h=h);
11 else english_thread(diameter=thr,threads_per_inch=28,length=h/25.4,internal=true);
12 translate([-2,-slit,0]) cube([4,2*slit,h]);
13}
14
15module the_extruder(
16 // motor properties
17 gearbox_d = 36,
18 mount_d = 28, // the distance between opposite mounting holes
19 mounthole_depth = 5,
20 protrusion_d = 22, protrusion_h = 2.2, // the dimensions of the protrusion on top of gearbox
21 bore_d = 8, bore_l = 17.6,
22 // pulley properties
23 pulley_d = 11.5, pulley_h=10,
24 pulley_elevation = 1, // pulley elevation above the protrusion
25 teeth_elevation = 7.5, // distance from the bottom of the pulley to its teeth
26 // idler properties
27 idler_d = 9.5, idler_h = 4, idler_id = 3,// idler dimensions: outer and inner diameters and height
28 // spring properties
29 spring_d = 10, spring_lc = 9.6, // spring diameter and compressed length
30 // filament path properties
31 filament_d = 1.75,
32 filament_path_d = 2,
33 filament_guide_d = 4, // PTFE filament guide diameter
34
35 // screw it
36 mount_screw_d = 3, mount_screw_l = 20,
37 mount_screwhead_d=6, mount_screwhead_h=3,
38
39 // empty spaces
40 idler_travel = 3, // how far should idler travel when pressed
41 idler_clearance=1,
42 pulley_clearance=2,
43 lever_v_clearance=.7, // vertical clearance for the lever
44 spring_d_clearance=1,
45 protrusion_tolerance_h=.5, // horizontal tolerance for the motor protrusion
46 protrusion_tolerance_v=.5, // vertical tolerance for the motor protrusion
47 mount_screw_d_tolerance=.5,
48 idler_v_tolerance=.5,
49
50 what="lever",
51 left=false,
52 vitamins = true
53) {
54 lever_shell = mount_screwhead_h+0.5;
55 lever_thickness=max(spring_d+layer_height*8,idler_h+idler_v_tolerance+2*lever_shell);
56 lsd = idler_d-idler_clearance*2;
57 longwing=gearbox_d/2+spring_d/2+lsd/2;
58 h_ = (pulley_d+idler_d)/(2*sqrt(2));
59 ri = sqrt( pow(h_,2) + pow(mount_d/2-h_,2) );
60 spring_dl = idler_travel*longwing/ri;
61
62 module mirrorleft() {
63 mirror([left?0:1,0,0]) children();
64 }
65 module place_idler() {
66 rotate([0,0,45])
67 translate([(pulley_d+idler_d)/2,0,0])
68 children();
69 }
70 module finger_indent(d=lever_thickness,depth/*=1*/,r/*=15*/) {
71 if(depth) {
72 hh = (-4*pow(depth,2)+pow(d,2))/(8*depth);
73 rr = depth+hh;
74 translate([0,0,hh]) sphere(r=rr,$fn=2*PI*rr);
75 }else if(r) {
76 hh=sqrt(pow(r,2)-pow(d,2)/4);
77 translate([0,0,hh]) sphere(r=r,$fn=2*PI*r);
78 }
79 }
80
81 // vitamins
82 % if(vitamins) mirrorleft() {
83 translate([0,0,-epsilon]) mirror([0,0,1]) cylinder(d=gearbox_d,h=1,$fn=60);
84 for(zr=[0:90:359]) rotate([0,0,zr]) translate([mount_d/2,0,0])
85 cylinder(d=mount_screw_d,h=20,$fn=30);
86 translate([0,0,-epsilon]) cylinder(d=protrusion_d,h=protrusion_h,$fn=30);
87 translate([0,0,protrusion_h]) {
88 cylinder(d=bore_d,h=bore_l,$fn=30);
89 translate([0,0,pulley_elevation]) {
90 cylinder(d=pulley_d,h=pulley_h,$fn=30);
91 translate([0,0,teeth_elevation]) {
92 place_idler() {
93 cylinder(d=idler_d,h=idler_h,center=true,$fn=30);
94 cylinder(d=idler_id,h=lever_thickness+2,center=true,$fn=30);
95 }//place idler
96 // filament path
97 rotate([0,0,45]) translate([(pulley_d-filament_path_d)/2,0,0]) {
98 rotate([90,0,0]) cylinder(d=filament_d,h=gearbox_d*2,center=true,$fn=15);
99 rotate([-90,0,0])
100 translate([0,0,mount_d/sqrt(2)/2+mount_screw_d])
101 pushfit_thread();
102 }
103 }//translate teeth
104 }//translate pulley
105 }//translate protrusion
106 }// vitamins to let
107
108 module lever() {
109 translate([0,0,protrusion_h+pulley_elevation+teeth_elevation]) {
110 difference() {
111 union() {
112 hull() {
113 place_idler()
114 cylinder(d=lsd,h=lever_thickness,center=true,$fn=60);
115 translate([mount_d/2,0,0])
116 cylinder(d=lsd,h=lever_thickness,center=true,$fn=60);
117 }//hull
118 hull() {
119 translate([mount_d/2,0,0])
120 cylinder(d=lsd,h=lever_thickness,center=true,$fn=60);
121 translate([mount_d/2,-longwing,0]) rotate([0,90,0])
122 cylinder(d=lever_thickness,h=lsd,center=true,$fn=60);
123 }//hull
124 }//union
125
126 // filament path
127 place_idler() translate([-(idler_d+filament_path_d)/2,0,0]) rotate([90,0,0]) {
128 cylinder(d=filament_path_d,h=3*gearbox_d,center=true,$fn=30);
129 translate([0,-filament_path_d/2/sqrt(2),0]) rotate([0,0,45])
130 cube(size=[filament_path_d/2,filament_path_d/2,3*gearbox_d],center=true);
131 }
132
133 // idler space and mounting hole
134 place_idler() {
135 difference() {
136 cylinder(d=idler_d+idler_clearance*2,h=idler_h+idler_v_tolerance,center=true,$fn=60);
137 // supports
138 for(y=[-lsd/2+extrusion_width:(lsd-2*extrusion_width)/3:lsd/2-extrusion_width])
139 translate([-lsd/2-1,y-extrusion_width/2,-idler_h/2-idler_v_tolerance/2-1])
140 cube(size=[lsd+2,extrusion_width,idler_h+idler_v_tolerance+2]);
141 }
142 cylinder(d=mount_screw_d+mount_screw_d_tolerance,h=lever_thickness+2,center=true,$fn=30);
143 translate([0,0,lever_thickness/2-mount_screwhead_h])
144 cylinder(d=mount_screwhead_d,h=mount_screwhead_h+1,$fn=2*PI*mount_screwhead_d);
145 }
146 // mounting screw hole
147 translate([mount_d/2,0,0])
148 cylinder(d=mount_screw_d+mount_screw_d_tolerance,h=lever_thickness+2,center=true,$fn=2*PI*mount_screw_d);
149
150 // lever end
151 translate([mount_d/2,0,0]) rotate([0,90,0]) {
152 translate([0,-longwing,lsd/2]) finger_indent(d=lever_thickness-1,r=15);
153 translate([0,-longwing,0])
154 mirror([0,0,1])
155 difference() {
156 cylinder(d=spring_d+spring_d_clearance,h=lsd,$fn=2*PI*spring_d);
157 sphere(d=spring_d*3/4,$fn=PI*spring_d);
158 }
159 }//rotate-translate
160 }//difference
161 // bridging patch
162 place_idler()
163 translate([0,0,lever_thickness/2-mount_screwhead_h])
164 mirror([0,0,1])
165 cylinder(d=mount_screwhead_d,h=layer_height);
166 }//translate
167 }//lever module
168
169 module body() {
170 filament_elevation=protrusion_h+pulley_elevation+teeth_elevation;
171 ls_z = filament_elevation;
172 body_h = max(protrusion_h+bore_l,mount_screw_l-mounthole_depth/2+mount_screwhead_h,ls_z*2);
173 ls_h = lever_thickness+lever_v_clearance;
174 difference() {
175 union() {
176 cylinder(d=gearbox_d,h=body_h,$fn=2*PI*gearbox_d);
177 // finger and spring support
178 fsw = gearbox_d/2+mount_screwhead_d/2;
179 translate([-gearbox_d/2,0,0]) difference() {
180 union() {
181 hull() {
182 translate([0,-longwing,ls_z])
183 rotate([0,90,0])
184 cylinder(d=lever_thickness,h=fsw,$fn=2*PI*lever_thickness);
185 hh=body_h-ls_z;
186 translate([0,0,ls_z-lever_thickness/2])
187 mirror([0,1,0]) cube(size=[fsw,longwing-hh+lever_thickness/sqrt(2),hh+lever_thickness/2]);
188 hhh=ls_z;
189 translate([0,0,0])
190 mirror([0,1,0]) cube(size=[fsw,longwing-hhh+lever_thickness/sqrt(2),hhh+lever_thickness/2]);
191 }
192 }
193 translate([0,-longwing,ls_z]) rotate([0,-90,0])
194 finger_indent(d=lever_thickness-1,r=15);
195 } // translate
196
197 // pushfit bracket
198 translate([0,0,filament_elevation])
199 rotate([0,0,45]) translate([pulley_d/2,0,0])
200 rotate([-90,0,0])
201 translate([0,0,mount_d/sqrt(2)/2+mount_screw_d-gearbox_d/2/*TODO:*/])
202 cylinder(r=min(body_h-filament_elevation,filament_elevation)/sin(60)-epsilon,h=10+gearbox_d/2/*TODO:*/,$fn=6);
203 }//union (first child of difference)
204 // protrusion
205 translate([0,0,-1])
206 cylinder(d=protrusion_d+protrusion_tolerance_h,h=protrusion_h+protrusion_tolerance_v+1,$fn=2*PI*protrusion_d);
207 // mount screw holes
208 for(zr=[0:90:359]) rotate([0,0,zr]) translate([mount_d/2,0,0]) {
209 translate([0,0,mount_screw_l-mounthole_depth/2-layer_height-1])
210 mirror([0,0,1])
211 cylinder(d=mount_screw_d+mount_screw_d_tolerance,
212 h=mount_screw_l-mounthole_depth/2-layer_height+1,
213 $fn=2*PI*mount_screw_d);
214 translate([0,0,mount_screw_l-mounthole_depth/2])
215 cylinder(d=mount_screwhead_d,h=body_h+1,$fn=2*PI*mount_screwhead_d);
216 }//for
217 // pushfit threads
218 translate([0,0,filament_elevation])
219 rotate([0,0,45]) translate([pulley_d/2,0,0])
220 rotate([-90,0,0])
221 translate([0,0,mount_d/sqrt(2)/2+mount_screw_d+epsilon])
222 rotate([0,0,180]) {
223 pushfit_thread(h=10);
224 cylinder(d=filament_guide_d,h=gearbox_d,center=true,$fn=2*PI*filament_guide_d);
225 translate([0,-filament_guide_d/2/sqrt(2),0])
226 rotate([0,0,45])
227 cube(size=[filament_guide_d/2,filament_guide_d/2,gearbox_d],center=true);
228 }
229 // pulley
230 cylinder(d=pulley_d+pulley_clearance,h=body_h+1,$fn=2*PI*(pulley_d+pulley_clearance));
231 // leverspace
232 hull() for(x=[0,gearbox_d])
233 rotate([0,0,45])
234 translate([x,0,ls_z-ls_h/2])
235 cylinder(d=idler_d+idler_clearance,h=ls_h,$fn=2*PI*idler_d);
236
237 a=cos(45)*(pulley_d+idler_d)/2;
238 b=mount_d/2-a;
239 x=sqrt(pow(a,2)+pow(b,2));
240 translate([mount_d/2,0,ls_z])
241 intersection() {
242 r = x+idler_d/2+1;/* TODO: */
243 cylinder(r=r,h=ls_h,center=true);
244 translate([-r-1,0,-1]) cube(size=[2*r+2,r+1,ls_h+2]);
245 }
246
247 rotate([0,0,-45])
248 translate([0,0,ls_z-ls_h/2])
249 cube(size=[gearbox_d,gearbox_d,lever_thickness+lever_v_clearance]);
250 translate([0,0,ls_z-ls_h/2]) {
251 translate([mount_screwhead_d/2,0,0])
252 mirror([0,1,0])
253 cube(size=[gearbox_d,gearbox_d/2+1,lever_thickness+lever_v_clearance]);
254 }
255 //translate([-mount_d/2,-longwing,filament_elevation])
256 translate([mount_d/2,-longwing,filament_elevation])
257 rotate([0,-90,0]) difference() {
258 cylinder(d=spring_d+spring_d_clearance,h=spring_lc+spring_dl,$fn=PI*spring_d);
259 translate([0,0,spring_lc+spring_dl]) sphere(d=spring_d*3/4,$fn=PI*spring_d);
260 }
261 //sphere(d=spring_d*3/4,$fn=PI*spring_d);
262 *difference() {
263 // spring support
264 translate([0,-longwing,filament_elevation])
265 sphere(d=spring_d*3/4,$fn=PI*spring_d);
266 }
267
268 }//difference
269
270 intersection() {
271 difference() {
272 translate([0,0,ls_z-ls_h/2-epsilon])
273 cylinder(d=gearbox_d,h=ls_h+2*epsilon,$fn=2*PI*gearbox_d);
274 cylinder(d=pulley_d+pulley_clearance,h=body_h+1,$fn=2*PI*(pulley_d+pulley_clearance));
275 }
276 // supports
277 // TODO: hardcoded stuff below…
278 if(false) { // parallel
279 for(y=[-gearbox_d:4:gearbox_d])
280 translate([0,y-extrusion_width/2,0])
281 cube(size=[gearbox_d,extrusion_width,body_h]);
282 }else{ // radial
283 for(zr=[-65:(65+50)/7:50])
284 rotate([0,0,zr]) translate([0,-extrusion_width/2,0])
285 cube(size=[gearbox_d,extrusion_width,body_h]);
286 }
287 }
288
289 }//body module
290
291 mirrorleft()
292 if(what=="lever") color("green",0.7) lever();
293 else if(what=="body") color("yellow",0.7) body();
294 else if(what=="both") {
295 color("green",0.7) lever();
296 color("yellow",0.7) body();
297 }
298}
299
300the_extruder(what="both",left=false);