Fiddled with wade a bit to fix #66
[clinton/prusa3.git] / box_frame / extras / gregs-wade-v3.scad
1 // Greg's Wade Extruder.
2 // It is licensed under the Creative Commons - GNU GPL license.
3 // 2010 by GregFrost
4 // Extruder based on prusa git repo.
5 // http://www.thingiverse.com/thing:6713
6 // modified for i3 by vlnofka <vlnofka@gmail.com>
7
8 include<../configuration.scad>
9 include<../inc/functions.scad>
10
11 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
12 // Define the hotend_mounting style you want by specifying hotend_mount=style1+style2 etc.
13 //e.g. wade(hotend_mount=groovemount+peek_reprapsource_mount);
14 malcolm_hotend_mount=1;
15 groovemount=2;
16 peek_reprapsource_mount=4;
17 arcol_mount=8;
18 mendel_parts_v6_mount=16;
19 grrf_peek_mount=32;
20 wildseyed_mount=64;
21 geared_extruder_nozzle=128; // http://reprap.org/wiki/Geared_extruder_nozzle
22 jhead_mount=256;
23 geeksbase_mount=512;
24 malcolm_extrusion_mount=1024; //broken
25
26 //default_extruder_mount=malcolm_extrusion_mount;
27 default_extruder_mount=groovemount;
28
29 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
30
31 mounting_holes_legacy=1;
32 mounting_holes_symmetrical=2;
33 default_mounting_holes=mounting_holes_symmetrical;
34
35 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
36
37 wade(hotend_mount=default_extruder_mount,
38 mounting_holes=default_mounting_holes);
39
40 ////CarriageVisualisation
41 //translate([-8.5,20,base_extra_depth+wade_block_depth+10]) rotate([-90,180,-90]) %import("../output/x-carriage.stl");
42 %translate(large_wheel_translation) {
43 translate([0,0,-5])import("../output/wade-big-h.stl");
44 rotate([0,0,25]) translate([gear_separation,0,-1]) {
45 rotate([180,0,0]) import("../output/wade-small-h.stl");
46 rotate([0,0,-25]) translate([0,0,2]) {//nema17(places=[1,1,1,1], holes=true, shadow=5, $fn=7, h=8);
47 }
48 }
49 }
50
51 //translate([-14,39,0])
52 //bearing_washer();
53
54 //Place for printing
55
56 //translate([50,56,15.25]) // This is the translation for the 3mm version.
57 ////translate([50,56,13.92]) // This is the translation for the 1.75mm version.
58 //rotate(180)
59 translate([-20,0,15.25])
60 rotate([0,-90,0])
61 //
62 ////Place for assembly.
63 wadeidler();
64
65 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
66 /**
67 * Extruder
68 * @name Extruder
69 * @assembled
70 * @using 1 small-gear
71 * @id extruder
72 * @using 1 idler
73 * @using 1 extruder-body
74 * @using 1 m3nut
75 * @using 1 m3washer
76 * @using 1 m3x25
77 * @step Take idler and insert nut into small nut-trap inside the hinge.
78 * @step While holding the nut in place, preprare M3x25 bolt with washer and screw it into the hinge just enough to hold the nut.
79 * @step Now take the extruder body and idler. Place idler on the hinge counterpart and compleately screw the M3x25 bolt. This will create secured hinge.
80 *
81 * @using 2 m4nut
82 * @step Place M4 nuts into their nut traps, secure them with piece of tape. We need them in place, since later they would be harder to access.
83 *
84 * @using 3 m3x10
85 * @using 3 m3washer
86 * @using 1 NEMA17
87 * @step Prepare your NEMA17 stepper motor and three M3x10 screws with washers.
88 * @step Hold motor on place and lightly tighten the screws. We need to adjust motor position later, no need to tighten it hard.
89 *
90 * @using 1 large-gear
91 * @using 1 m8washer
92 * @using 2 m8nut
93 * @using 2 bearing-608
94 * @step Place two skate bearings on ther position, they should snuggly fit in.
95 * @step Insert prepared large gear into the body with mounted bearings.
96 * @step Check if the alignment of hobbed part with the filament path. Adjust it accordingly with adding or removing M8 washers.
97 * @step After adjusting, we need to fix the bolt in. So we place washer at the end of hobbed bolt and with two M8 nuts we will do locknut by tightening them against each other.
98 * @step Check if large gear turns freely.
99 *
100 * @using 2 m3x40
101 * @using 4 m3washer
102 * @using 2 extruder-spring
103 * @step Prepare two M3x40 screws with sandwitch of washer-spring-washer.
104 * @step Insert two M3 nuts into nut traps on top of drive mechanism. [[extruder/top-nut-traps.png]]
105 * @step Insert prepared screws into the holes on idler. Close the idler and tighten the screws into the trapped nuts. More you tighten those screws, more pressure will be on fillament.
106 * @step Your extruder is done. [[extruder/assembled.jpg]]
107 */
108
109 /**
110 * Extruder body
111 * @name Extruder body
112 * @category Printed
113 * @id extruder-body
114 */
115
116 /**
117 * Extruder idler
118 * @name Extruder Idler
119 * @id idler
120 * @category Printed
121 * @using 1 bearing-608
122 * @using 1 idler-m8-piece
123 * @step Insert piece of M8 rod into bearing.
124 * @step Insert 608 bearing with rod into printed idler part.
125 */
126
127 /**
128 * Small M8 rod
129 * @name Idler
130 * @id idler-m8-piece
131 * @category Rods and Bars
132 */
133
134 /**
135 * Spring used for idler on extruder.
136 * @name Extruder spring
137 * @id extruder-spring
138 */
139
140 //===================================================
141 // Parameters defining the wade body:
142
143 wade_block_height=55;
144 wade_block_width=24;
145 wade_block_depth=28;
146
147 block_bevel_r=7;
148
149 base_thickness=13;
150 base_length=66;
151 base_leadout=22;
152 base_extra_depth=11;
153
154 nema17_hole_spacing=31;
155 nema17_width=1.7*25.4;
156 nema17_support_d=nema17_width-nema17_hole_spacing;
157
158 screw_head_recess_diameter=7.2;
159 screw_head_recess_depth=3;
160
161 motor_mount_rotation=0;
162 //motor_mount_translation=[50.5,34+5,0];
163 motor_mount_translation=[46.78,50.78,0];
164 motor_mount_thickness=9;
165
166 large_wheel_translation=[50.5-(7.4444+32.0111+0.25),34,0];
167
168 m8_clearance_hole=8.8;
169 hole_for_608=22.3;
170 608_diameter=22;
171
172 block_top_right=[wade_block_width,wade_block_height];
173
174 layer_thickness=layer_height;
175 filament_diameter=3;
176 filament_feed_hole_d=(filament_diameter*1.1)/cos(180/8);
177 hobbing_depth=2;
178 echo ("filament_feed_hole_d", filament_feed_hole_d);
179
180 //This is the distance from the centre of the filament to the centre of the hobbed bolt.
181 filament_feed_hole_offset=8/2-hobbing_depth+filament_diameter/2;
182
183 echo ("filament_feed_hole_offset", filament_feed_hole_offset);
184
185 idler_nut_trap_depth=7.5;
186 idler_nut_thickness=4;
187
188 gear_separation=7.4444+32.0111+0.25;
189
190 function motor_hole(hole)=[
191 motor_mount_translation[0],
192 motor_mount_translation[1]]+
193 rotated(45+motor_mount_rotation+hole*90)*nema17_hole_spacing/sqrt(2);
194
195 // Parameters defining the idler.
196
197 filament_pinch=[
198 large_wheel_translation[0]-filament_feed_hole_offset-filament_diameter/2,
199 large_wheel_translation[1],
200 wade_block_depth/2];
201 idler_axis=filament_pinch-[608_diameter/2,0,0];
202 idler_fulcrum_offset=608_diameter/2+3.5+m3_diameter/2;
203 idler_fulcrum=idler_axis-[0,idler_fulcrum_offset,0];
204 idler_corners_radius=4;
205 idler_height=12;
206 idler_608_diameter=608_diameter+2;
207 idler_608_height=9;
208 idler_mounting_hole_across=8;
209 idler_mounting_hole_up=15;
210 idler_short_side=wade_block_depth-2;
211 idler_hinge_r=m3_diameter/2+3.5;
212 idler_hinge_width=6.5;
213 idler_end_length=(idler_height-2)+5;
214 idler_mounting_hole_diameter=m4_diameter+0.25;
215 idler_mounting_hole_elongation=1;
216 idler_long_top=idler_mounting_hole_up+idler_mounting_hole_diameter/2+idler_mounting_hole_elongation+2.5;
217 idler_long_bottom=idler_fulcrum_offset;
218 idler_long_side=idler_long_top+idler_long_bottom;
219
220 module bearing_washer()
221 {
222 difference()
223 {
224 cylinder(r=hole_for_608/2-0.05,h=1);
225 translate([0,0,-1])
226 cylinder(r=8,h=3);
227 }
228 }
229
230 module wade(
231 hotend_mount=default_extruder_mount,
232 mounting_holes=default_mounting_holes)
233 {
234 difference ()
235 {
236 union()
237 {
238 // The wade block.
239 cube([wade_block_width,wade_block_height,wade_block_depth]);
240
241 // Filler between wade block and motor mount.
242 translate([10-2,0,0])
243 cube([wade_block_width,
244 wade_block_height,
245 motor_mount_thickness]);
246
247 // Round the ends of the base
248 translate([base_length-base_leadout,0,0])
249 cylinder(r=base_thickness/2,h=wade_block_depth+base_extra_depth,$fn=20);
250
251 translate([-base_leadout,0,0])
252 cylinder(r=base_thickness/2,h=wade_block_depth+base_extra_depth,$fn=20);
253
254 //Provide the bevel betweeen the base and the wade block.
255 render()
256 difference()
257 {
258 translate([-block_bevel_r,0,0])
259 cube([block_bevel_r*2+wade_block_width,
260 base_thickness/2+block_bevel_r,wade_block_depth+base_extra_depth]);
261 translate([-block_bevel_r,block_bevel_r+base_thickness/2])
262 cylinder(r=block_bevel_r,h=wade_block_depth+base_extra_depth,$fn=60);
263 translate([wade_block_width+block_bevel_r,
264 block_bevel_r+base_thickness/2])
265 cylinder(r=block_bevel_r,h=wade_block_depth+base_extra_depth,$fn=60);
266 }
267
268 // The idler hinge.
269 translate(idler_fulcrum)
270 {
271 translate([idler_hinge_r,0,0])
272 cube([idler_hinge_r*2,idler_hinge_r*2,idler_short_side-2*idler_hinge_width-0.5],
273 center=true);
274 rotate(-30)
275 {
276 cylinder(r=idler_hinge_r,
277 h=idler_short_side-2*idler_hinge_width-0.5,
278 center=true,$fn=60);
279 translate([idler_hinge_r,0,0])
280 cube([idler_hinge_r*2,idler_hinge_r*2,
281 idler_short_side-2*idler_hinge_width-0.5],
282 center=true);
283 }
284 }
285
286 // The idler hinge support.
287 translate(idler_fulcrum)
288 {
289 rotate(-15)
290 translate([-(idler_hinge_r+3),-idler_hinge_r-2,-wade_block_depth/2])
291 difference()
292 {
293 cube([idler_hinge_r+3,
294 idler_hinge_r*2+4,
295 wade_block_depth/2-
296 idler_short_side/2+
297 idler_hinge_width+0.25+
298 layer_thickness]);
299 translate([idler_hinge_r+2,(idler_hinge_r*2+4)/2,layer_thickness*3])
300 cylinder(r=idler_hinge_r+1,h=10,$fn=50);
301 }
302 rotate(-15)
303 translate([-(idler_hinge_r+3),-idler_hinge_r-2,
304 -idler_short_side/2+idler_hinge_width+0.25])
305 cube([idler_hinge_r+3+15,
306 idler_hinge_r*2+4,
307 layer_thickness]);
308 }
309
310 //The base.
311 translate([-base_leadout,-base_thickness/2,0])
312 cube([base_length,base_thickness,wade_block_depth+base_extra_depth]);
313 //Base aligement helper
314 translate([-base_leadout,-base_thickness/2,wade_block_depth+base_extra_depth])
315 cube([base_length,1,layer_thickness]);
316
317
318 motor_mount ();
319 }
320
321 block_holes(mounting_holes=mounting_holes);
322 motor_mount_holes ();
323
324 translate([large_wheel_translation[0]-filament_feed_hole_offset,
325 -base_thickness/2,wade_block_depth/2])
326 rotate([-90,0,0])
327 {
328 if (in_mask (hotend_mount,malcolm_hotend_mount))
329 malcolm_hotend_holes ();
330 if (in_mask (hotend_mount,groovemount))
331 groovemount_holes ();
332 if (in_mask (hotend_mount,peek_reprapsource_mount))
333 peek_reprapsource_holes ();
334 if (in_mask (hotend_mount,arcol_mount))
335 arcol_mount_holes ();
336 if (in_mask (hotend_mount,mendel_parts_v6_mount))
337 mendel_parts_v6_holes(insulator_d=12.7);
338 if (in_mask(hotend_mount,grrf_peek_mount))
339 grrf_peek_mount_holes();
340 if (in_mask(hotend_mount,wildseyed_mount))
341 wildseyed_mount_holes(insulator_d=12.7);
342 if (in_mask(hotend_mount,geared_extruder_nozzle))
343 mendel_parts_v6_holes(insulator_d=15);
344 if (in_mask(hotend_mount,jhead_mount))
345 wildseyed_mount_holes(insulator_d=16);
346 if (in_mask (hotend_mount,geeksbase_mount))
347 geeksbase_holes ();
348 if (in_mask (hotend_mount,malcolm_extrusion_mount))
349 malcolm_extrusion_holes ();
350 }
351 }
352 }
353
354 function in_mask(mask,value)=(mask%(value*2))>(value-1);
355
356 //block_holes();
357
358 module block_holes(mounting_holes=default_mounting_holes)
359 {
360 echo("bhmh", mounting_holes)
361 //Round off the top of the block.
362 translate([0,wade_block_height-block_bevel_r,-1])
363 render()
364 difference()
365 {
366 translate([-1,0,0])
367 cube([block_bevel_r+1,block_bevel_r+1,wade_block_depth+2]);
368 translate([block_bevel_r,0,0])
369 cylinder(r=block_bevel_r,h=wade_block_depth+2,$fn=40);
370 }
371
372 //carriage mountig holes
373 #translate([-24.5+64+4,-0.5,3]) {
374 translate([-50,0,0]) {
375 translate([0,0,(wade_block_depth+base_extra_depth)/2+4+layer_thickness]) cylinder(r=m3_diameter/2, h=wade_block_depth+base_extra_depth, center=true);
376 translate([0, 0, 1]) cylinder(r=m3_washer_diameter/2, h=10.1, center=true);
377 }
378
379 translate([0,0,0]) {
380 translate([0,0,(wade_block_depth+base_extra_depth)/2+4+layer_thickness]) cylinder(r=m3_diameter/2, h=wade_block_depth+0.2+base_extra_depth, center=true);
381 translate([0, 0, 2]) cylinder(r=m3_washer_diameter/2, h=10.1, center=true);
382 }
383 }
384
385 // Idler fulcrum hole.
386 translate(idler_fulcrum+[0,0,0.4])
387 cylinder(r=m3_diameter/2,h=idler_short_side-2*idler_hinge_width-0.5,center=true,$fn=16);
388
389 translate(idler_fulcrum+[0,0,idler_short_side/2-idler_hinge_width-1])
390 cylinder(r=m3_nut_diameter/2+0.25,h=1,$fn=40);
391
392 //Rounded cutout for idler hinge.
393 render()
394 translate(idler_fulcrum)
395 difference()
396 {
397 cylinder(r=idler_hinge_r+0.5,h=idler_short_side+0.5,center=true,$fn=60);
398 cylinder(r=idler_hinge_r+1,h=idler_short_side-2*idler_hinge_width-0.5,center=true);
399 }
400
401 //translate(motor_mount_translation)
402 translate(large_wheel_translation)
403 {
404
405 // Open the top to remove overhangs and to provide access to the hobbing.
406 translate([-wade_block_width+2,0,9.5])
407 cube([wade_block_width,
408 wade_block_height-large_wheel_translation[1]+1,
409 wade_block_depth]);
410
411 translate([0,0,-1])
412 b608(h=9);
413
414 translate([0,0,20])
415 b608(h=9);
416
417 translate([-13,0,9.5])
418 b608(h=wade_block_depth);
419
420 translate([0,0,8+layer_thickness])
421 cylinder(r=m8_clearance_hole/2,h=wade_block_depth-(8+layer_thickness)+2);
422
423 translate([0,0,20-2])
424 cylinder(r=16/2,h=wade_block_depth-(8+layer_thickness)+2);
425
426 // Filament feed.
427 translate([-filament_feed_hole_offset,0,wade_block_depth/2])
428 rotate([90,0,0])
429 rotate(360/16)
430 cylinder(r=filament_feed_hole_d/2,h=wade_block_depth*3,center=true,$fn=8);
431
432 //Widened opening for hobbed bolt access.
433 translate([2,wade_block_height/2+2,wade_block_depth/2+0.2])
434 rotate([90,0,0])
435 rotate(-45)
436 union()
437 {
438 cylinder(r=5,h=wade_block_height,center=true,$fn=30);
439 translate([-5,0,0])
440 cube([10,10,wade_block_height],center=true);
441 }
442
443 // Mounting holes on the base.
444 //translate([0,-base_thickness/2,0])
445 translate(
446 (mounting_holes==mounting_holes_legacy)?[-3.4,0,-1]:[0,0,0])
447 for (mount=[0:1])
448 {
449 translate([-filament_feed_hole_offset+25*((mount<1)?1:-1),
450 -large_wheel_translation[1]-1-base_thickness/2,wade_block_depth/2])
451 rotate([-90,0,0])
452 rotate(360/16)
453 cylinder(r=m4_diameter/2,h=base_thickness+2,$fn=8);
454
455 translate([-filament_feed_hole_offset+25*((mount<1)?1:-1),
456 -large_wheel_translation[1],
457 wade_block_depth/2])
458 rotate([-90,0,0])
459 //fixme: (correct height
460 //cylinder(r=m4_nut_diameter/2,h=base_thickness,$fn=6);
461 cylinder(r=m4_nut_diameter/2,h=29.3,$fn=6);
462 }
463
464 }
465
466 // Idler mounting holes and nut traps.
467 for (idle=[-1,1])
468 {
469 translate([0,
470 idler_mounting_hole_up+large_wheel_translation[1],
471 wade_block_depth/2+idler_mounting_hole_across*idle])
472 rotate([0,90,0])
473 {
474 rotate([0,0,180/8])
475 translate([0,0,-1])
476 cylinder(r=m4_diameter/2,h=wade_block_depth+6,$fn=8);
477 rotate([0,0,180/6])
478 translate([0,0,wade_block_width-idler_nut_trap_depth])
479 cylinder(r=m4_nut_diameter/2,h=idler_nut_thickness,$fn=6);
480
481 translate([0,10/2,wade_block_width-idler_nut_trap_depth+idler_nut_thickness/2])
482 cube([m4_nut_diameter*cos(30),10,idler_nut_thickness],center=true);
483 }
484 }
485 }
486
487 module motor_mount()
488 {
489 linear_extrude(height=motor_mount_thickness)
490 {
491 barbell (motor_hole(1),motor_hole(2),nema17_support_d/2, nema17_support_d/2,20,160);
492 barbell (motor_hole(2),motor_hole(3),nema17_support_d/2, nema17_support_d/2,20,160);
493
494 // Connect block to top of motor mount.
495 barbell(block_top_right-[0,5],motor_hole(1),5,nema17_support_d/2,100,60);
496
497 //Connect motor mount to base.
498 barbell([base_length-base_leadout,
499 0],motor_hole(3),base_thickness/2,
500 nema17_support_d/2,100,60);
501 }
502 }
503
504 module motor_mount_holes()
505 {
506 radius=4/2;
507 slot_left=1;
508 slot_right=2;
509
510 {
511 translate([0,0,screw_head_recess_depth+layer_thickness])
512 for (hole=[0:3])
513 translate([motor_hole(hole)[0],motor_hole(hole)[1],0])
514 rotate([0,0,25])
515 {
516 translate([-slot_left,0,0])
517 cylinder(h=motor_mount_thickness-screw_head_recess_depth,r=radius,$fn=16);
518 translate([slot_right,0,0])
519 cylinder(h=motor_mount_thickness-screw_head_recess_depth,r=radius,$fn=16);
520
521 translate([-slot_left,-radius,0])
522 cube([slot_left+slot_right,radius*2,motor_mount_thickness-screw_head_recess_depth]);
523 }
524
525 translate([0,0,-1])
526 for (hole=[0:3])
527 translate([motor_hole(hole)[0],motor_hole(hole)[1],0])
528 rotate([0,0,25])
529 {
530 translate([-slot_left,0,0])
531 cylinder(h=screw_head_recess_depth+1,
532 r=screw_head_recess_diameter/2,$fn=16);
533 translate([slot_right,0,0])
534 cylinder(h=screw_head_recess_depth+1,
535 r=screw_head_recess_diameter/2,$fn=16);
536
537 translate([-slot_left,-screw_head_recess_diameter/2,0])
538 cube([slot_left+slot_right,
539 screw_head_recess_diameter,
540 screw_head_recess_depth+1]);
541 }
542 }
543 }
544
545 module wadeidler()
546 {
547 guide_height=12.3;
548 guide_length=10;
549
550 difference()
551 {
552 union()
553 {
554 //The idler block.
555 translate(idler_axis+[-idler_height/2+2,+idler_long_side/2-idler_long_bottom,0])
556 {
557 cube_fillet([idler_height,idler_long_side,idler_short_side], center=true, vertical = [0, 0, 0, 0], top = [3, 0, 0, 0], bottom = [3, 0, 0, 0]);
558
559 //Filament Guide.
560 translate([guide_height/2+idler_height/2-1,idler_long_side/2-guide_length/2,0])
561 cube([guide_height+1,guide_length,8],center=true);
562 }
563
564 // The fulcrum Hinge
565 translate(idler_fulcrum)
566 rotate([0,0,-30])
567 {
568 cylinder(h=idler_short_side,r=idler_hinge_r,center=true,$fn=60);
569 translate([-idler_end_length/2,0,0])
570 cube([idler_end_length,idler_hinge_r*2,idler_short_side],center=true);
571 }
572 }
573
574 //Filament Path
575 translate(idler_axis+[2+guide_height,+idler_long_side-idler_long_bottom-guide_length/2,0])
576 {
577 cube([7,guide_length+2,filament_diameter+0.5],center=true);
578 translate([-7/2,0,0])
579 rotate([90,0,0])
580 cylinder(h=guide_length+4,r=(filament_diameter+0.5)/2,center=true,$fn=16);
581 }
582
583 //Back of idler.
584 translate(idler_axis+[-idler_height/2+2-idler_height,
585 idler_long_side/2-idler_long_bottom-10,0])
586 cube([idler_height,idler_long_side,idler_short_side+2],center=true);
587
588 //Slot for idler fulcrum mount.
589 translate(idler_fulcrum)
590 {
591 cylinder(h=idler_short_side-2*idler_hinge_width,
592 r=idler_hinge_r+0.5,center=true,$fn=60);
593 rotate(-30)
594 translate([0,-idler_hinge_r-0.5,0])
595 cube([idler_hinge_r*2+1,idler_hinge_r*2+1,
596 idler_short_side-2*idler_hinge_width],center=true);
597 }
598
599 //Bearing cutout.
600 translate(idler_axis)
601 {
602 difference()
603 {
604 cylinder(h=idler_608_height,r=idler_608_diameter/2,
605 center=true,$fn=60);
606 for (i=[0,1])
607 rotate([180*i,0,0])
608 translate([0,0,6.9/2])
609 cylinder(r1=12/2,r2=16/2,h=2);
610 }
611 cylinder(h=idler_short_side-6,r=m8_diameter/2-0.25/*Tight*/,
612 center=true,$fn=20);
613 }
614
615 //Fulcrum hole.
616 translate(idler_fulcrum)
617 rotate(180/8)
618 cylinder(h=idler_short_side+2,r=m3_diameter/2-0.1,center=true,$fn=8);
619
620 //Nut trap for fulcrum screw.
621 translate(idler_fulcrum+[0,0,idler_short_side/2-idler_hinge_width-1])
622 rotate(360/16)
623 cylinder(h=3,r=m3_nut_diameter_horizontal/2,$fn=6);
624
625 for(idler_screw_hole=[-1,1])
626 translate(idler_axis+[2-idler_height,0,0])
627 {
628 //Screw Holes.
629 translate([-1,idler_mounting_hole_up,
630 idler_screw_hole*idler_mounting_hole_across])
631 rotate([0,90,0])
632 {
633 cylinder(r=idler_mounting_hole_diameter/2,h=idler_height+2,$fn=16);
634 translate([0,idler_mounting_hole_elongation,0])
635 cylinder(r=idler_mounting_hole_diameter/2,h=idler_height+2,$fn=16);
636 translate([-idler_mounting_hole_diameter/2,0,0])
637 cube([idler_mounting_hole_diameter,idler_mounting_hole_elongation,
638 idler_height+2]);
639 }
640
641 // Rounded corners.
642 /*
643 render()
644 translate([idler_height/2,idler_long_top,
645 idler_screw_hole*(idler_short_side/2)])
646 difference()
647 {
648 translate([0,-idler_corners_radius/2+0.5,-idler_screw_hole*(idler_corners_radius/2-0.5)])
649 cube([idler_height+2,idler_corners_radius+1,idler_corners_radius+1],
650 center=true);
651 rotate([0,90,0])
652 translate([idler_screw_hole*idler_corners_radius,-idler_corners_radius,0])
653 cylinder(h=idler_height+4,r=idler_corners_radius,center=true,$fn=40);
654 } */
655 }
656 }
657 }
658
659 module b608(h=8)
660 {
661 translate([0,0,h/2]) cylinder(r=hole_for_608/2,h=h,center=true,$fn=60);
662 }
663
664 module barbell (x1,x2,r1,r2,r3,r4)
665 {
666 x3=triangulate (x1,x2,r1+r3,r2+r3);
667 x4=triangulate (x2,x1,r2+r4,r1+r4);
668 render()
669 difference ()
670 {
671 union()
672 {
673 translate(x1)
674 circle (r=r1);
675 translate(x2)
676 circle(r=r2);
677 polygon (points=[x1,x3,x2,x4]);
678 }
679
680 translate(x3)
681 circle(r=r3,$fa=5);
682 translate(x4)
683 circle(r=r4,$fa=5);
684 }
685 }
686
687 function triangulate (point1, point2, length1, length2) =
688 point1 +
689 length1*rotated(
690 atan2(point2[1]-point1[1],point2[0]-point1[0])+
691 angle(distance(point1,point2),length1,length2));
692
693 function distance(point1,point2)=
694 sqrt((point1[0]-point2[0])*(point1[0]-point2[0])+
695 (point1[1]-point2[1])*(point1[1]-point2[1]));
696
697 function angle(a,b,c) = acos((a*a+b*b-c*c)/(2*a*b));
698
699 function rotated(a)=[cos(a),sin(a),0];
700
701 //========================================================
702 // Modules for defining holes for hotend mounts:
703 // These assume the extruder is verical with the bottom filament exit hole at [0,0,0].
704
705 //malcolm_hotend_holes ();
706 module malcolm_hotend_holes ()
707 {
708 extruder_recess_d=16;
709 extruder_recess_h=3.5;
710
711 // Recess in base
712 translate([0,0,-1])
713 cylinder(r=extruder_recess_d/2,h=extruder_recess_h+1);
714 }
715
716 //groovemount_holes ();
717 module groovemount_holes ()
718 {
719 extruder_recess_d=16;
720 extruder_recess_h=5.5;
721
722 // Recess in base
723 translate([0,0,-1])
724 cylinder(r=extruder_recess_d/2,h=extruder_recess_h+1);
725 }
726
727 //peek_reprapsource_holes ();
728 module peek_reprapsource_holes ()
729 {
730 extruder_recess_d=11;
731 extruder_recess_h=19;
732
733 // Recess in base
734 translate([0,0,-1])
735 cylinder(r=extruder_recess_d/2,h=extruder_recess_h+1);
736
737 // Mounting holes to affix the extruder into the recess.
738 translate([0,0,min(extruder_recess_h/2, base_thickness/2)])
739 rotate([-90,0,0])
740 cylinder(r=m4_diameter/2-0.5/* tight */,h=wade_block_depth+2,center=true);
741 }
742
743 //arcol_mount_holes();
744 module arcol_mount_holes()
745 {
746 hole_axis_rotation=42.5;
747 hole_separation=30;
748 hole_slot_height=4;
749 for(mount=[-1,1])
750 translate([hole_separation/2*mount,-7,0])
751 {
752 translate([0,0,-1])
753 cylinder(r=m4_diameter/2,h=base_thickness+2,$fn=8);
754
755 translate([0,0,base_thickness/2])
756 //rotate(hole_axis_rotation)
757 {
758 cylinder(r=m4_nut_diameter/2,h=base_thickness/2+hole_slot_height,$fn=6);
759 translate([0,-m4_nut_diameter,hole_slot_height/2+base_thickness/2])
760 cube([m4_nut_diameter,m4_nut_diameter*2,hole_slot_height],
761 center=true);
762 }
763 }
764 }
765
766 //mendel_parts_v6_holes ();
767 module mendel_parts_v6_holes (insulator_d=12.7)
768 {
769 extruder_recess_d=insulator_d+0.7;
770 extruder_recess_h=10;
771 hole_axis_rotation=42.5;
772 hole_separation=30;
773 hole_slot_height=5;
774
775 // Recess in base
776 translate([0,0,-1])
777 cylinder(r=extruder_recess_d/2,h=extruder_recess_h+1);
778
779 for(mount=[-1,1])
780 rotate([0,0,hole_axis_rotation+90+90*mount])
781 translate([hole_separation/2,0,0])
782 {
783 translate([0,0,-1])
784 cylinder(r=m4_diameter/2,h=base_thickness+2,$fn=8);
785
786 translate([0,0,base_thickness/2])
787 rotate(-hole_axis_rotation+180)
788 {
789 // rotate(30)
790 cylinder(r=m4_nut_diameter/2,h=base_thickness/2+hole_slot_height,$fn=6);
791 translate([0,-m4_nut_diameter,hole_slot_height/2+base_thickness/2])
792 cube([m4_nut_diameter,m4_nut_diameter*2,hole_slot_height],
793 center=true);
794 }
795 }
796 }
797
798 //grrf_peek_mount_holes();
799 module grrf_peek_mount_holes()
800 {
801 extruder_recess_d=16.5;
802 extruder_recess_h=10;
803
804 // Recess in base
805 translate([0,0,-1])
806 cylinder(r=extruder_recess_d/2,h=extruder_recess_h+1);
807
808 for (hole=[-1,1])
809 rotate(90,[1,0,0])
810 translate([hole*(extruder_recess_d/2-1.5),3+1.5,-wade_block_depth/2-1])
811 cylinder(r=1.5,h=wade_block_depth+2,$fn=10);
812 }
813
814 //wildseyed_mount_holes(insulator_d=16);
815 module wildseyed_mount_holes(insulator_d=12.7)
816 {
817 extruder_recess_d=insulator_d+0.7;
818 extruder_recess_h=10;
819
820 // Recess in base
821 translate([0,0,-1])
822 cylinder(r=extruder_recess_d/2,h=extruder_recess_h+1);
823
824 for (hole=[-1,1])
825 rotate(90,[1,0,0])
826 translate([hole*(extruder_recess_d/2-1.5),3+1.5,-wade_block_depth/2-1])
827 cylinder(r=1.5,h=wade_block_depth+2,$fn=10);
828 }
829
830 module geeksbase_holes ()
831 {
832 extruder_recess_d=10.8;
833 extruder_recess_h=20;
834
835 // Recess in base
836 translate([0,0,-1])
837 cylinder(r=extruder_recess_d/2,h=extruder_recess_h+1);
838
839 // Mounting holes to affix the extruder into the recess.
840 translate([5,0,min(extruder_recess_h/2, base_thickness/2-2)])
841 rotate([-90,0,0])
842 cylinder(r=m3_diameter/2-0.5,/*tight*/,h=wade_block_depth+2,center=true);
843 translate([-5,0,min(extruder_recess_h/2, base_thickness/2-2)])
844 rotate([-90,0,0])
845 cylinder(r=m3_diameter/2-0.5,/*tight*/,h=wade_block_depth+2,center=true);
846
847 //cylinder(r=m4_diameter/2-0.5/* tight */,h=wade_block_depth+2,center=true);
848 }
849
850 module malcolm_extrusion_holes ()
851 {
852 extruder_recess_d=16;
853 extruder_recess_h=4;
854 hole_axis_rotation=22;
855 hole_separation=33.2;
856 hole_slot_height=5;
857
858 // Recess in base
859 translate([0,0,-1])
860 cylinder(r=extruder_recess_d/2,h=extruder_recess_h+1);
861
862 for(mount=[-1,1])
863 rotate([0,0,hole_axis_rotation-90+90*mount])
864 translate([hole_separation/2,0,0])
865 {
866 translate([0,0,-1])
867 cylinder(r=m3_diameter/2,h=base_thickness+2,$fn=8);
868
869 translate([0,0,base_thickness-2])
870 rotate(-hole_axis_rotation+180)
871 {
872 cylinder(r=m3_nut_diameter/2,h=base_thickness/2+hole_slot_height,$fn=6);
873 translate([0,-m3_nut_diameter,hole_slot_height/2+base_thickness/2])
874 cube([m3_nut_diameter,m3_nut_diameter*2,hole_slot_height],
875 center=true);
876 }
877 }
878 }