1 // Greg's Wade Extruder.
2 // It is licensed under the Creative Commons - GNU GPL license.
4 // Extruder based on prusa git repo.
5 // http://www.thingiverse.com/thing:6713
6 // modified for i3 by vlnofka <vlnofka@gmail.com>
8 include<../configuration.scad>
9 include<../inc/functions.scad>
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;
16 peek_reprapsource_mount=4;
18 mendel_parts_v6_mount=16;
21 geared_extruder_nozzle=128; // http://reprap.org/wiki/Geared_extruder_nozzle
24 malcolm_extrusion_mount=1024; //broken
26 //default_extruder_mount=malcolm_extrusion_mount;
27 default_extruder_mount=groovemount;
29 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
31 mounting_holes_legacy=1;
32 mounting_holes_symmetrical=2;
33 default_mounting_holes=mounting_holes_symmetrical;
35 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
37 wade(hotend_mount=default_extruder_mount,
38 mounting_holes=default_mounting_holes);
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);
51 //translate([-14,39,0])
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.
59 translate([-20,0,15.25])
62 ////Place for assembly.
65 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
73 * @using 1 extruder-body
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.
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.
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.
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.
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]]
111 * @name Extruder body
118 * @name Extruder Idler
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.
131 * @category Rods and Bars
135 * Spring used for idler on extruder.
136 * @name Extruder spring
137 * @id extruder-spring
140 //===================================================
141 // Parameters defining the wade body:
143 wade_block_height=55;
151 base_leadout=25+2+1-6;
154 nema17_hole_spacing=31;
155 nema17_width=1.7*25.4;
156 nema17_support_d=nema17_width-nema17_hole_spacing;
158 screw_head_recess_diameter=7.2;
159 screw_head_recess_depth=3;
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;
166 large_wheel_translation=[50.5-(7.4444+32.0111+0.25),34,0];
168 m8_clearance_hole=8.8;
172 block_top_right=[wade_block_width,wade_block_height];
174 layer_thickness=0.35;
176 filament_feed_hole_d=(filament_diameter*1.1)/cos(180/8);
178 echo ("filament_feed_hole_d", filament_feed_hole_d);
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;
183 echo ("filament_feed_hole_offset", filament_feed_hole_offset);
185 idler_nut_trap_depth=7.5;
186 idler_nut_thickness=4;
188 gear_separation=7.4444+32.0111+0.25;
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);
195 // Parameters defining the idler.
198 large_wheel_translation[0]-filament_feed_hole_offset-filament_diameter/2,
199 large_wheel_translation[1],
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;
206 idler_608_diameter=608_diameter+2;
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;
220 module bearing_washer()
224 cylinder(r=hole_for_608/2-0.05,h=1);
231 hotend_mount=default_extruder_mount,
232 mounting_holes=default_mounting_holes)
239 cube([wade_block_width,wade_block_height,wade_block_depth]);
241 // Filler between wade block and motor mount.
242 translate([10-2,0,0])
243 cube([wade_block_width,
245 motor_mount_thickness]);
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);
251 translate([-base_leadout,0,0])
252 cylinder(r=base_thickness/2,h=wade_block_depth+base_extra_depth,$fn=20);
254 //Provide the bevel betweeen the base and the wade block.
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);
269 translate(idler_fulcrum)
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],
276 cylinder(r=idler_hinge_r,
277 h=idler_short_side-2*idler_hinge_width-0.5,
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],
286 // The idler hinge support.
287 translate(idler_fulcrum)
290 translate([-(idler_hinge_r+3),-idler_hinge_r-2,-wade_block_depth/2])
293 cube([idler_hinge_r+3,
297 idler_hinge_width+0.25+
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);
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,
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]);
321 block_holes(mounting_holes=mounting_holes);
322 motor_mount_holes ();
324 translate([large_wheel_translation[0]-filament_feed_hole_offset,
325 -base_thickness/2,wade_block_depth/2])
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))
348 if (in_mask (hotend_mount,malcolm_extrusion_mount))
349 malcolm_extrusion_holes ();
354 function in_mask(mask,value)=(mask%(value*2))>(value-1);
358 module block_holes(mounting_holes=default_mounting_holes)
360 echo("bhmh", mounting_holes)
361 //Round off the top of the block.
362 translate([0,wade_block_height-block_bevel_r,-1])
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);
372 //carriage mountig holes
373 translate([-24.5+64+4,0,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);
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);
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);
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);
392 //Rounded cutout for idler hinge.
394 translate(idler_fulcrum)
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);
401 //translate(motor_mount_translation)
402 translate(large_wheel_translation)
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,
417 translate([-13,0,9.5])
418 b608(h=wade_block_depth);
420 translate([0,0,8+layer_thickness])
421 cylinder(r=m8_clearance_hole/2,h=wade_block_depth-(8+layer_thickness)+2);
423 translate([0,0,20-2])
424 cylinder(r=16/2,h=wade_block_depth-(8+layer_thickness)+2);
427 translate([-filament_feed_hole_offset,0,wade_block_depth/2])
430 cylinder(r=filament_feed_hole_d/2,h=wade_block_depth*3,center=true,$fn=8);
432 //Widened opening for hobbed bolt access.
433 translate([2,wade_block_height/2+2,wade_block_depth/2+0.2])
438 cylinder(r=5,h=wade_block_height,center=true,$fn=30);
440 cube([10,10,wade_block_height],center=true);
443 // Mounting holes on the base.
444 //translate([0,-base_thickness/2,0])
446 (mounting_holes==mounting_holes_legacy)?[-3.4,0,-1]:[0,0,0])
449 translate([-filament_feed_hole_offset+25*((mount<1)?1:-1),
450 -large_wheel_translation[1]-1-base_thickness/2,wade_block_depth/2])
453 cylinder(r=m4_diameter/2,h=base_thickness+2,$fn=8);
455 translate([-filament_feed_hole_offset+25*((mount<1)?1:-1),
456 -large_wheel_translation[1],
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);
466 // Idler mounting holes and nut traps.
470 idler_mounting_hole_up+large_wheel_translation[1],
471 wade_block_depth/2+idler_mounting_hole_across*idle])
476 cylinder(r=m4_diameter/2,h=wade_block_depth+6,$fn=8);
478 translate([0,0,wade_block_width-idler_nut_trap_depth])
479 cylinder(r=m4_nut_diameter/2,h=idler_nut_thickness,$fn=6);
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);
489 linear_extrude(height=motor_mount_thickness)
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);
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);
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);
504 module motor_mount_holes()
511 translate([0,0,screw_head_recess_depth+layer_thickness])
513 translate([motor_hole(hole)[0],motor_hole(hole)[1],0])
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);
521 translate([-slot_left,-radius,0])
522 cube([slot_left+slot_right,radius*2,motor_mount_thickness-screw_head_recess_depth]);
527 translate([motor_hole(hole)[0],motor_hole(hole)[1],0])
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);
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]);
555 translate(idler_axis+[-idler_height/2+2,+idler_long_side/2-idler_long_bottom,0])
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]);
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);
565 translate(idler_fulcrum)
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);
575 translate(idler_axis+[2+guide_height,+idler_long_side-idler_long_bottom-guide_length/2,0])
577 cube([7,guide_length+2,filament_diameter+0.5],center=true);
578 translate([-7/2,0,0])
580 cylinder(h=guide_length+4,r=(filament_diameter+0.5)/2,center=true,$fn=16);
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);
588 //Slot for idler fulcrum mount.
589 translate(idler_fulcrum)
591 cylinder(h=idler_short_side-2*idler_hinge_width,
592 r=idler_hinge_r+0.5,center=true,$fn=60);
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);
600 translate(idler_axis)
604 cylinder(h=idler_608_height,r=idler_608_diameter/2,
608 translate([0,0,6.9/2])
609 cylinder(r1=12/2,r2=16/2,h=2);
611 cylinder(h=idler_short_side-6,r=m8_diameter/2-0.25/*Tight*/,
616 translate(idler_fulcrum)
618 cylinder(h=idler_short_side+2,r=m3_diameter/2-0.1,center=true,$fn=8);
620 //Nut trap for fulcrum screw.
621 translate(idler_fulcrum+[0,0,idler_short_side/2-idler_hinge_width-1])
623 cylinder(h=3,r=m3_nut_diameter/2,$fn=6);
625 for(idler_screw_hole=[-1,1])
626 translate(idler_axis+[2-idler_height,0,0])
629 translate([-1,idler_mounting_hole_up,
630 idler_screw_hole*idler_mounting_hole_across])
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,
644 translate([idler_height/2,idler_long_top,
645 idler_screw_hole*(idler_short_side/2)])
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],
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);
661 translate([0,0,h/2]) cylinder(r=hole_for_608/2,h=h,center=true,$fn=60);
664 module barbell (x1,x2,r1,r2,r3,r4)
666 x3=triangulate (x1,x2,r1+r3,r2+r3);
667 x4=triangulate (x2,x1,r2+r4,r1+r4);
677 polygon (points=[x1,x3,x2,x4]);
687 function triangulate (point1, point2, length1, length2) =
690 atan2(point2[1]-point1[1],point2[0]-point1[0])+
691 angle(distance(point1,point2),length1,length2));
693 function distance(point1,point2)=
694 sqrt((point1[0]-point2[0])*(point1[0]-point2[0])+
695 (point1[1]-point2[1])*(point1[1]-point2[1]));
697 function angle(a,b,c) = acos((a*a+b*b-c*c)/(2*a*b));
699 function rotated(a)=[cos(a),sin(a),0];
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].
705 //malcolm_hotend_holes ();
706 module malcolm_hotend_holes ()
708 extruder_recess_d=16;
709 extruder_recess_h=3.5;
713 cylinder(r=extruder_recess_d/2,h=extruder_recess_h+1);
716 //groovemount_holes ();
717 module groovemount_holes ()
719 extruder_recess_d=16;
720 extruder_recess_h=5.5;
724 cylinder(r=extruder_recess_d/2,h=extruder_recess_h+1);
727 //peek_reprapsource_holes ();
728 module peek_reprapsource_holes ()
730 extruder_recess_d=11;
731 extruder_recess_h=19;
735 cylinder(r=extruder_recess_d/2,h=extruder_recess_h+1);
737 // Mounting holes to affix the extruder into the recess.
738 translate([0,0,min(extruder_recess_h/2, base_thickness/2)])
740 cylinder(r=m4_diameter/2-0.5/* tight */,h=wade_block_depth+2,center=true);
743 //arcol_mount_holes();
744 module arcol_mount_holes()
746 hole_axis_rotation=42.5;
750 translate([hole_separation/2*mount,-7,0])
753 cylinder(r=m4_diameter/2,h=base_thickness+2,$fn=8);
755 translate([0,0,base_thickness/2])
756 //rotate(hole_axis_rotation)
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],
766 //mendel_parts_v6_holes ();
767 module mendel_parts_v6_holes (insulator_d=12.7)
769 extruder_recess_d=insulator_d+0.7;
770 extruder_recess_h=10;
771 hole_axis_rotation=42.5;
777 cylinder(r=extruder_recess_d/2,h=extruder_recess_h+1);
780 rotate([0,0,hole_axis_rotation+90+90*mount])
781 translate([hole_separation/2,0,0])
784 cylinder(r=m4_diameter/2,h=base_thickness+2,$fn=8);
786 translate([0,0,base_thickness/2])
787 rotate(-hole_axis_rotation+180)
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],
798 //grrf_peek_mount_holes();
799 module grrf_peek_mount_holes()
801 extruder_recess_d=16.5;
802 extruder_recess_h=10;
806 cylinder(r=extruder_recess_d/2,h=extruder_recess_h+1);
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);
814 //wildseyed_mount_holes(insulator_d=16);
815 module wildseyed_mount_holes(insulator_d=12.7)
817 extruder_recess_d=insulator_d+0.7;
818 extruder_recess_h=10;
822 cylinder(r=extruder_recess_d/2,h=extruder_recess_h+1);
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);
830 module geeksbase_holes ()
832 extruder_recess_d=10.8;
833 extruder_recess_h=20;
837 cylinder(r=extruder_recess_d/2,h=extruder_recess_h+1);
839 // Mounting holes to affix the extruder into the recess.
840 translate([5,0,min(extruder_recess_h/2, base_thickness/2-2)])
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)])
845 cylinder(r=m3_diameter/2-0.5,/*tight*/,h=wade_block_depth+2,center=true);
847 //cylinder(r=m4_diameter/2-0.5/* tight */,h=wade_block_depth+2,center=true);
850 module malcolm_extrusion_holes ()
852 extruder_recess_d=16;
854 hole_axis_rotation=22;
855 hole_separation=33.2;
860 cylinder(r=extruder_recess_d/2,h=extruder_recess_h+1);
863 rotate([0,0,hole_axis_rotation-90+90*mount])
864 translate([hole_separation/2,0,0])
867 cylinder(r=m3_diameter/2,h=base_thickness+2,$fn=8);
869 translate([0,0,base_thickness-2])
870 rotate(-hole_axis_rotation+180)
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],