├── box_frame ├── output │ ├── README │ └── extras │ │ └── README ├── doc │ ├── ystep1.png │ ├── ystep10.png │ ├── ystep11.png │ ├── ystep2.png │ ├── ystep3.png │ ├── ystep4.png │ ├── ystep5.png │ ├── ystep6.png │ ├── ystep7.png │ ├── ystep8.png │ ├── ystep9.png │ ├── framestep1.png │ ├── framestep2.png │ ├── framestep3.png │ ├── framestep4.png │ ├── framestep5.png │ ├── framestep6.png │ ├── DEVELOPERS.md │ ├── dimensions.md │ ├── boxframe.scad │ ├── complete-printer.scad │ ├── manual.txt │ └── complete-printer-plus.scad ├── extras │ ├── groovemount.scad │ ├── bearing-holder-single-plate-y.scad │ ├── foldingclamp.scad │ ├── tube_clamp.scad │ ├── calibrate.scad │ ├── endstop-holder.scad │ ├── endstop-holder-extra.scad │ ├── wade-gears.scad │ └── inc │ │ └── parametric_involute_gear_v5.0.scad ├── sample_stls │ ├── default_box_gt2_lm10uu │ │ ├── README.md │ │ └── configuration.scad │ ├── single_plate_gt2_lm8uu │ │ ├── README.md │ │ └── configuration.scad │ └── big_htd3_lm12luu │ │ ├── README.md │ │ └── configuration.scad ├── inc │ ├── settings.scad │ ├── metric.scad │ ├── bearing-guide.scad │ ├── conf_bushing.scad │ └── functions.scad ├── Makefile ├── README.md ├── i3.tdoc ├── y-belt-holder.scad ├── update-samples.sh ├── y-axis-corner.scad ├── y-axis-bracket.scad ├── y-drivetrain.scad ├── common.tdoc ├── configuration.scad.dist ├── x-carriage.scad ├── z-axis.scad ├── x-end.scad └── bushing.scad ├── mini ├── y-idler.stl ├── y-motor.stl ├── frame-mount.stl ├── mini-plate.dxf ├── x-end-idler.stl ├── x-end-motor.stl ├── z-top-right.stl ├── y-bushing_1x.stl ├── z-bottom-left.stl ├── z-bottom-right.stl ├── z-endstop-holder.stl ├── y-bushing-side_2x.stl └── extruder │ ├── mgs │ ├── mgs-body.stl │ ├── mgs-idler.stl │ ├── mgs-mount.stl │ └── mgs-groovemount_ABS.stl │ └── greg-wade │ └── greg-adapter.scad ├── old_single_plate ├── .gitignore ├── src │ ├── frame │ │ └── 6mm │ │ │ └── README.md │ ├── magnetic-holder.scad │ ├── x-end-idler.scad │ ├── belt-guide.scad │ ├── fan-mount.scad │ ├── y-idler.scad │ ├── y-belt-holder.scad │ ├── x-end-motor.scad │ ├── y-motor.scad │ ├── inc │ │ ├── x-end.scad │ │ ├── bearing.scad │ │ ├── roundCornersCube.scad │ │ └── nuts_and_bolts.scad │ ├── y-corners.scad │ ├── z-axis-top.scad │ ├── x-carriage.scad │ ├── z-axis-bottom.scad │ ├── dual-extruder.scad │ └── compact-extruder.scad ├── Makefile ├── README └── configuration.scad-dist ├── .gitignore └── README.md /box_frame/output/README: -------------------------------------------------------------------------------- 1 | stl are here after make 2 | -------------------------------------------------------------------------------- /mini/y-idler.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josefprusa/Prusa3/HEAD/mini/y-idler.stl -------------------------------------------------------------------------------- /mini/y-motor.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josefprusa/Prusa3/HEAD/mini/y-motor.stl -------------------------------------------------------------------------------- /old_single_plate/.gitignore: -------------------------------------------------------------------------------- 1 | .* 2 | *.stl 3 | *.gcode 4 | tags 5 | configuration.scad 6 | -------------------------------------------------------------------------------- /mini/frame-mount.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josefprusa/Prusa3/HEAD/mini/frame-mount.stl -------------------------------------------------------------------------------- /mini/mini-plate.dxf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josefprusa/Prusa3/HEAD/mini/mini-plate.dxf -------------------------------------------------------------------------------- /mini/x-end-idler.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josefprusa/Prusa3/HEAD/mini/x-end-idler.stl -------------------------------------------------------------------------------- /mini/x-end-motor.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josefprusa/Prusa3/HEAD/mini/x-end-motor.stl -------------------------------------------------------------------------------- /mini/z-top-right.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josefprusa/Prusa3/HEAD/mini/z-top-right.stl -------------------------------------------------------------------------------- /mini/y-bushing_1x.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josefprusa/Prusa3/HEAD/mini/y-bushing_1x.stl -------------------------------------------------------------------------------- /mini/z-bottom-left.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josefprusa/Prusa3/HEAD/mini/z-bottom-left.stl -------------------------------------------------------------------------------- /box_frame/doc/ystep1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josefprusa/Prusa3/HEAD/box_frame/doc/ystep1.png -------------------------------------------------------------------------------- /box_frame/doc/ystep10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josefprusa/Prusa3/HEAD/box_frame/doc/ystep10.png -------------------------------------------------------------------------------- /box_frame/doc/ystep11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josefprusa/Prusa3/HEAD/box_frame/doc/ystep11.png -------------------------------------------------------------------------------- /box_frame/doc/ystep2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josefprusa/Prusa3/HEAD/box_frame/doc/ystep2.png -------------------------------------------------------------------------------- /box_frame/doc/ystep3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josefprusa/Prusa3/HEAD/box_frame/doc/ystep3.png -------------------------------------------------------------------------------- /box_frame/doc/ystep4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josefprusa/Prusa3/HEAD/box_frame/doc/ystep4.png -------------------------------------------------------------------------------- /box_frame/doc/ystep5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josefprusa/Prusa3/HEAD/box_frame/doc/ystep5.png -------------------------------------------------------------------------------- /box_frame/doc/ystep6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josefprusa/Prusa3/HEAD/box_frame/doc/ystep6.png -------------------------------------------------------------------------------- /box_frame/doc/ystep7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josefprusa/Prusa3/HEAD/box_frame/doc/ystep7.png -------------------------------------------------------------------------------- /box_frame/doc/ystep8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josefprusa/Prusa3/HEAD/box_frame/doc/ystep8.png -------------------------------------------------------------------------------- /box_frame/doc/ystep9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josefprusa/Prusa3/HEAD/box_frame/doc/ystep9.png -------------------------------------------------------------------------------- /mini/z-bottom-right.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josefprusa/Prusa3/HEAD/mini/z-bottom-right.stl -------------------------------------------------------------------------------- /mini/z-endstop-holder.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josefprusa/Prusa3/HEAD/mini/z-endstop-holder.stl -------------------------------------------------------------------------------- /mini/y-bushing-side_2x.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josefprusa/Prusa3/HEAD/mini/y-bushing-side_2x.stl -------------------------------------------------------------------------------- /box_frame/doc/framestep1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josefprusa/Prusa3/HEAD/box_frame/doc/framestep1.png -------------------------------------------------------------------------------- /box_frame/doc/framestep2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josefprusa/Prusa3/HEAD/box_frame/doc/framestep2.png -------------------------------------------------------------------------------- /box_frame/doc/framestep3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josefprusa/Prusa3/HEAD/box_frame/doc/framestep3.png -------------------------------------------------------------------------------- /box_frame/doc/framestep4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josefprusa/Prusa3/HEAD/box_frame/doc/framestep4.png -------------------------------------------------------------------------------- /box_frame/doc/framestep5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josefprusa/Prusa3/HEAD/box_frame/doc/framestep5.png -------------------------------------------------------------------------------- /box_frame/doc/framestep6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josefprusa/Prusa3/HEAD/box_frame/doc/framestep6.png -------------------------------------------------------------------------------- /mini/extruder/mgs/mgs-body.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josefprusa/Prusa3/HEAD/mini/extruder/mgs/mgs-body.stl -------------------------------------------------------------------------------- /box_frame/output/extras/README: -------------------------------------------------------------------------------- 1 | After make extras, here you can find model that can be useful, but not necessary. 2 | -------------------------------------------------------------------------------- /mini/extruder/mgs/mgs-idler.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josefprusa/Prusa3/HEAD/mini/extruder/mgs/mgs-idler.stl -------------------------------------------------------------------------------- /mini/extruder/mgs/mgs-mount.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josefprusa/Prusa3/HEAD/mini/extruder/mgs/mgs-mount.stl -------------------------------------------------------------------------------- /mini/extruder/mgs/mgs-groovemount_ABS.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josefprusa/Prusa3/HEAD/mini/extruder/mgs/mgs-groovemount_ABS.stl -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .* 2 | *.gcode 3 | box_frame/output/*.stl 4 | box_frame/output/extras/*.stl 5 | single_plate/output/*.stl 6 | tags 7 | configuration.scad 8 | -------------------------------------------------------------------------------- /old_single_plate/src/frame/6mm/README.md: -------------------------------------------------------------------------------- 1 | Warning 2 | ======= 3 | Files here are unsupported. Current plate is at: 4 | https://github.com/josefprusa/Prusa3-vanilla/blob/master/src/alu-frame.dxf 5 | -------------------------------------------------------------------------------- /old_single_plate/src/magnetic-holder.scad: -------------------------------------------------------------------------------- 1 | difference(){ 2 | translate([-12,0.7,0])cube([24,8,10]); 3 | translate([0,0,-1]) cylinder(r=4.1, h=20, $fn=25); 4 | translate([8.5,10,5]) rotate([90,0,0]) rotate([0,0,30]) cylinder(r=1.8, h=20); 5 | translate([-8.5,10,5]) rotate([90,0,0]) rotate([0,0,30]) cylinder(r=1.8, h=20); 6 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # This is Prusa iteration 3 2 | Published under GPL v3 3 | 4 | All models are in the box_frame folder, including models for aluminium single plate. For some common configs we prepared models, see box_frame/sample_stls. 5 | 6 | If you are looking for models that josefprusa uses in workshops, you need to go to https://github.com/josefprusa/Prusa3-vanilla 7 | -------------------------------------------------------------------------------- /old_single_plate/Makefile: -------------------------------------------------------------------------------- 1 | INCLUDES = $(wildcard src/inc/*.scad) 2 | MODELS = $(patsubst src/%,%,$(wildcard src/*.scad)) 3 | 4 | STL_FILES_1 = $(foreach src, $(MODELS),output/$(src)) 5 | STL_FILES = $(STL_FILES_1:%.scad=%.stl) 6 | 7 | all: $(STL_FILES) 8 | 9 | output/%.stl: src/%.scad $(INCLUDES) configuration.scad 10 | mkdir -p output 11 | openscad -o $@ $< 12 | -------------------------------------------------------------------------------- /box_frame/extras/groovemount.scad: -------------------------------------------------------------------------------- 1 | module groovemount(){ 2 | 3 | difference(){ 4 | translate([-12,-35,0])cube(size=[29,70,12], center=false); 5 | 6 | translate([-10,0,5])cube(size=[20,12.5,15], center=true); 7 | translate([-10,0,5+4.4])cube(size=[20,16.5,10], center=true); 8 | 9 | cylinder(h=20, r=12.5/2); 10 | translate([0,0,4.4])cylinder(h=20, r=16.5/2); 11 | translate([0,-25,0])cylinder(h=20, r=5/2); 12 | translate([0,25,0])cylinder(h=20, r=5/2); 13 | } 14 | } 15 | 16 | groovemount(); 17 | -------------------------------------------------------------------------------- /old_single_plate/README: -------------------------------------------------------------------------------- 1 | This is Prusa iteration 3 2 | Published under GPL v3 3 | 4 | To start: 5 | Copy configuration.scad.dist to configuration.scad and fill custom 6 | settings section there 7 | 8 | 9 | RP every .scad in this directory (except complete-printer) once. 10 | Aim for 0.3mm layers and 2.2 extrusion width (width over thickness), 11 | for 0.66mm stroke width. Printer is tested at this setting. 12 | 13 | Using doc/complete-printer.scad as a visual clue and doc/manual.txt as a 14 | guide, build the printer. 15 | -------------------------------------------------------------------------------- /box_frame/sample_stls/default_box_gt2_lm10uu/README.md: -------------------------------------------------------------------------------- 1 | # Default box version 2 | Those parts are for use with box made of six 450x100x18mm boards (with optional top 486x100x18), as described on http://78.47.92.212/i3_documentation_pics/06-frame.md.html 3 | From variable vitamins you need 2x *623 bearings*, 2x *gt2 Pulley with 18-30 teeth*, and GT2 belts. The bearings are all *lm10uu* (10x) and smooth rods have diameter of 10mm. 4 | You will also need extruder, included carriage will take one narrow (for example MGS or geared stepper based) or wade (see extras) 5 | -------------------------------------------------------------------------------- /box_frame/sample_stls/single_plate_gt2_lm8uu/README.md: -------------------------------------------------------------------------------- 1 | # Single plate version with thicker smooth rods 2 | Those parts are for use with *Prusa i3 (single plate) aluminium frame*. Frame blueprints are at https://github.com/josefprusa/Prusa3-vanilla/blob/master/src/alu-frame.dxf 3 | From variable vitamins you need 2x *623 bearings*, 2x *gt2 Pulley with 18-25 teeth*, and a 6mm wide gt2 belts. The bearings are all *lm10uu* (10x) and smooth rods are 10mm. 4 | You will also need extruder, included carriage will take one narrow (for example MGS or geared stepper based) or wade (see extras) 5 | -------------------------------------------------------------------------------- /box_frame/sample_stls/big_htd3_lm12luu/README.md: -------------------------------------------------------------------------------- 1 | # Big box version 2 | Those parts are for use with box made of two 600x100x18mm boards (top and bottom) and four 450x100x18mm (sides). Building is described at http://78.47.92.212/i3_documentation_pics/06-frame.md.html 3 | From variable vitamins you need 2x *623 bearings*, 2x *HTD3 Pulley with 18-25 teeth*, and a 9mm wide HTD3 belts. The bearings are 5 *lm12luu* and one *lm12uu*. Smooth rods are 12mm thick. 4 | You will also need extruder, included carriage will take two narrow (for example MGS or geared stepper based) or one wade (see extras) 5 | -------------------------------------------------------------------------------- /box_frame/inc/settings.scad: -------------------------------------------------------------------------------- 1 | // Moved from config.scad 2 | 3 | board_to_xz_distance = 26; 4 | xaxis_rod_distance = 45; 5 | 6 | //calculated from settings 7 | single_wall_width = width_over_thickness * layer_height; 8 | 9 | idler_width = max(belt_width, (idler_bearing[1] > 7 ? idler_bearing[1] : 7)) + 2.5 * idler_bearing[3] ; 10 | 11 | //deltas are used to enlarge parts for bigger bearings 12 | xy_delta = ((bushing_xy[1] <= 7.7) ? 0 : bushing_xy[1] - 7.7) * 0.9; 13 | z_delta = (bushing_z[1] <= 7.7) ? 0 : bushing_z[1] - 7.7; 14 | 15 | m3_nut_diameter_bigger = ((m3_nut_diameter / 2) / cos (180 / 6)) * 2; 16 | -------------------------------------------------------------------------------- /box_frame/extras/bearing-holder-single-plate-y.scad: -------------------------------------------------------------------------------- 1 | //Part that fixes bearings to alu Y plate. For us ziptie haters;) 2 | /// use with M3x20 countersunk screws 3 | // GNU GPL v3 4 | // Václav 'ax' Hůla 5 | include <../configuration.scad>; 6 | 7 | module bearingholdersingleplate(){ 8 | difference(){ 9 | translate([0, -25/2, 0]) cube([10, 25, 9]); 10 | translate([-1, 0, 0]) rotate([0,90,0]) cylinder(r=7.7, h=21); 11 | mirror([0, 0, 1]) translate([5, -19/2, -9]) screw(); 12 | mirror([0, 0, 1]) translate([5, 19/2, -9]) screw(); 13 | } 14 | } 15 | 16 | 17 | mirror([0, 0, 1]) bearingholdersingleplate(); 18 | -------------------------------------------------------------------------------- /old_single_plate/src/x-end-idler.scad: -------------------------------------------------------------------------------- 1 | // PRUSA iteration3 2 | // X end idler 3 | // GNU GPL v3 4 | // Josef Průša and contributors 5 | // http://www.reprap.org/wiki/Prusa_Mendel 6 | // http://prusamendel.org 7 | 8 | use 9 | 10 | module x_end_idler_base(){ 11 | x_end_base(); 12 | } 13 | 14 | module x_end_idler_holes(){ 15 | x_end_holes(); 16 | translate(v=[0,-25,30.25]) rotate(a=[0,-90,0]) cylinder(h = 80, r=2.2, $fn=30); 17 | } 18 | 19 | // Final part 20 | module x_end_idler(){ 21 | mirror([0,1,0]) difference(){ 22 | x_end_idler_base(); 23 | x_end_idler_holes(); 24 | } 25 | } 26 | 27 | x_end_idler(); 28 | 29 | 30 | -------------------------------------------------------------------------------- /old_single_plate/configuration.scad-dist: -------------------------------------------------------------------------------- 1 | x_rod_distance = 45; 2 | 3 | // Select your belt type ****************************************************** 4 | 5 | //T2.5 6 | belt_tooth_distance = 2.5; 7 | belt_tooth_ratio = 0.5; 8 | 9 | //T5 (strongly discouraged) 10 | //belt_tooth_distance = 5; 11 | //belt_tooth_ratio = 0.75; 12 | 13 | //HTD3 14 | //belt_tooth_distance = 3; 15 | //belt_tooth_ratio = 0.75; 16 | 17 | //MXL 18 | //belt_tooth_distance = 2.032; 19 | //belt_tooth_ratio = 0.64; 20 | 21 | // Select your hot-end mount ****************************************************** 22 | 23 | // 0 = none; 1 = groove-mount (J-head/MakerGear etc.) 24 | hotend_mount = 1; 25 | 26 | hotend_groovemount_depth = 5; 27 | hotend_groovemount_diameter = 16; 28 | -------------------------------------------------------------------------------- /old_single_plate/src/belt-guide.scad: -------------------------------------------------------------------------------- 1 | // PRUSA iteration3 2 | // 624 bearing belt guide 3 | // GNU GPL v3 4 | // Josef Průša and contributors 5 | // http://www.reprap.org/wiki/Prusa_Mendel 6 | // http://prusamendel.org 7 | 8 | wall= 1.2; 9 | clearence= 0.1; 10 | 11 | module belt_guide_base(){ 12 | cylinder(r=6.5+wall+clearence, h=5-0.5, $fn=50); 13 | cylinder(r=6.5+wall+clearence+2*wall, h=0.95, $fn=50); 14 | } 15 | 16 | module belt_guide_holes(){ 17 | translate([0,0,2]) cylinder(r=5.1+clearence, h=10, $fn=50); 18 | translate([0,0,-1]) cylinder(r=5+wall+clearence-2*wall, h=10, $fn=50); 19 | } 20 | 21 | // Final part 22 | module belt_guide(){ 23 | difference(){ 24 | belt_guide_base(); 25 | belt_guide_holes(); 26 | } 27 | } 28 | 29 | belt_guide(); -------------------------------------------------------------------------------- /old_single_plate/src/fan-mount.scad: -------------------------------------------------------------------------------- 1 | // PRUSA iteration3 2 | // Fan mount 3 | // GNU GPL v3 4 | // Josef Průša and contributors 5 | // http://www.reprap.org/wiki/Prusa_Mendel 6 | // http://prusamendel.org 7 | 8 | module fan_mount_base(){ 9 | translate([0,0,0]) rotate([0,0,0]) cube([20,10, 4]); 10 | translate([0,0,0]) rotate([0,45,0]) translate([-10,0,0]) cube([10,10, 4]); 11 | } 12 | 13 | module fan_mount_holes(){ 14 | translate([10,5,-1]) rotate([0,0,0]) cylinder(h=30, r=1.8, $fn=10); 15 | translate([0,5,0]) rotate([0,45,0]) translate([-5,0,-1]) cylinder(h=30, r=2.2, $fn=10); 16 | } 17 | 18 | // Final part 19 | module fan_mount(){ 20 | difference(){ 21 | fan_mount_base(); 22 | fan_mount_holes(); 23 | } 24 | } 25 | 26 | fan_mount(); 27 | 28 | -------------------------------------------------------------------------------- /box_frame/Makefile: -------------------------------------------------------------------------------- 1 | #openscad -o output/bushing.stl bushing.scad 2 | 3 | # Type of 3D Model file to output. Known to work with AMF or STL. 4 | OUTPUT_TYPE=stl 5 | INCLUDES = $(wildcard inc/*.scad) 6 | 7 | MODELS = $(filter-out configuration.scad, $(wildcard *.scad)) 8 | 9 | STL_FILES_1 = $(foreach src, $(MODELS),output/$(src)) 10 | STL_FILES = $(STL_FILES_1:%.scad=%.$(OUTPUT_TYPE)) 11 | 12 | all: $(STL_FILES) 13 | 14 | MODELS_EXTRAS = $(wildcard extras/*.scad) 15 | STL_EXTRAS_1 = $(foreach src, $(MODELS_EXTRAS),output/$(src)) 16 | STL_EXTRAS = $(STL_EXTRAS_1:%.scad=%.$(OUTPUT_TYPE)) 17 | 18 | extras: $(STL_EXTRAS) 19 | 20 | output/%.$(OUTPUT_TYPE): %.scad $(INCLUDES) configuration.scad 21 | openscad -o $@ $< 22 | 23 | clean: 24 | rm output/*.$(OUTPUT_TYPE) output/*.gcode output/extras/*.stl output/extras/*.gcode 25 | -------------------------------------------------------------------------------- /old_single_plate/src/y-idler.scad: -------------------------------------------------------------------------------- 1 | // PRUSA iteration3 2 | // Y idler 3 | // GNU GPL v3 4 | // Josef Průša and contributors 5 | // http://www.reprap.org/wiki/Prusa_Mendel 6 | // http://prusamendel.org 7 | 8 | 9 | module y_idler_base(){ 10 | translate(v = [0,0,0]) cylinder(h = 19, r=8); 11 | translate(v = [0,20,0]) cylinder(h = 19, r=8); 12 | translate(v = [0,10,9.5]) cube(size = [16,20,19], center=true); 13 | translate(v = [-4,10,9.5]) cube(size = [8,16+20,19], center=true); 14 | } 15 | 16 | module y_idler_holes(){ 17 | translate(v = [0,0,-1]) cylinder(h = 120, r=1.8); 18 | translate(v = [0,20,-1]) cylinder(h = 25, r=4.5); 19 | translate(v = [0,0,4]) cylinder(h = 11, r=12); 20 | } 21 | 22 | // Final part 23 | module y_idler(){ 24 | translate(v = [0,0,8])rotate([0,-90,0]) difference(){ 25 | y_idler_base(); 26 | y_idler_holes(); 27 | } 28 | } 29 | 30 | y_idler(); 31 | -------------------------------------------------------------------------------- /box_frame/inc/metric.scad: -------------------------------------------------------------------------------- 1 | // PRUSA iteration3 2 | // Default metric sizes 3 | // GNU GPL v3 4 | // Josef Průša 5 | // http://www.reprap.org/wiki/Prusa_Mendel 6 | // http://github.com/josefprusa/Prusa3 7 | 8 | // DONT CHANGE THIS FILE! ALTER VALUES IN CONFIGURATION.SCAD INSTEAD 9 | 10 | // RODS 11 | 12 | threaded_rod_diameter = 8.7; 13 | threaded_rod_diameter_horizontal = 8.7; 14 | smooth_bar_diameter = 8; 15 | smooth_bar_diameter_horizontal = 8.5; 16 | 17 | // Nuts and bolts 18 | 19 | 20 | m8_diameter = 9; 21 | //iso4032 says Width across corners = 14.38 22 | m8_nut_diameter = 14.1; 23 | 24 | m4_diameter = 4.7; 25 | //iso4032 says 7.66 26 | m4_nut_diameter = 7.6; 27 | m4_nut_diameter_horizontal = 8.15; 28 | 29 | m3_diameter = 3.6; 30 | //iso4032 says 6.01 31 | m3_nut_diameter = 5.3; 32 | m3_nut_diameter_horizontal = 6.8; 33 | m3_washer_diameter = 6.9; 34 | 35 | // Motors 36 | 37 | motor_shaft = 5.5; 38 | -------------------------------------------------------------------------------- /box_frame/extras/foldingclamp.scad: -------------------------------------------------------------------------------- 1 | // rod holder for prusa i3 in folded position 2 | module foldingclamp() { 3 | difference(){ 4 | union(){ 5 | translate([-7.5,0,0])rotate([0,0,0])cube(size = [15,30,15]); 6 | translate([-20,0,0])rotate([0,0,0])cube(size = [40,5,15]); 7 | //translate([0,23,0])rotate([0,0,45])cube(size = [6,6,15]); 8 | } 9 | translate([-2.5,5,-2])rotate([0,0,0])cube(size = [5,12,20]); //lightening hole 10 | translate([0,25,-1])rotate([0,0,0])cylinder(h=20, r=4); //main rod attachment hole 11 | translate([-13,10,7.5])rotate([90,0,0])cylinder(h=20, r=1.5); //screw attachment hole 12 | translate([13,10,7.5])rotate([90,0,0])cylinder(h=20, r=1.5); //screw attachment hole 13 | translate([-3,23,-2])rotate([0,0,0])cube(size = [6,12,20]); //rod access hole 14 | 15 | } 16 | } 17 | 18 | //foldingclamp(); 19 | translate([-15,1,0])rotate([0,0,0])foldingclamp(); 20 | translate([15,31,0])rotate([0,0,180])foldingclamp(); 21 | translate([-15,-31,0])rotate([0,0,0])foldingclamp(); 22 | translate([15,-1,0])rotate([0,0,180])foldingclamp(); 23 | -------------------------------------------------------------------------------- /box_frame/README.md: -------------------------------------------------------------------------------- 1 | # This is Prusa iteration 3 2 | Published under GPL v3 3 | 4 | ## To start: 5 | Copy configuration.scad.dist to configuration.scad and fill custom settings section there 6 | 7 | Print calibarion part form extras and check that: 8 | * your bearings fit tightly in the holder 9 | * Z smooth rod sits firmly inside the round hole, its ok if it needs to be forced there 10 | * X smooth rod can be inserted in the half round/half square hole. May need some processing of the flat part if the bridge sags. Your X ends may break if you need hammer here. 11 | * Hexagonal nut trap can hold M3 nut 12 | * Screw that you will be using to attach parts to frame can be inserted to hole near the nut trap 13 | * Your belt can be inserted in the slot and sits there __firmly__. 14 | 15 | RP every .scad in this directory once 16 | Aim for 0.3mm layers and 2.2 extrusion width (width over thickness), for 0.66mm stroke width. Printer is tested at this setting. 17 | If you print bushing.stl/y-carriage.stl in PLA it may deform due to heatbed being close, and printed groovemount is in danger too. 18 | 19 | Using doc/complete-printer-plus.scad as a visual clue and doc/manual.txt as a guide, build the printer. 20 | -------------------------------------------------------------------------------- /old_single_plate/src/y-belt-holder.scad: -------------------------------------------------------------------------------- 1 | // PRUSA iteration3 2 | // Y belt holder 3 | // GNU GPL v3 4 | // Josef Průša and contributors 5 | // http://www.reprap.org/wiki/Prusa_Mendel 6 | // http://prusamendel.org 7 | 8 | include <../configuration.scad> 9 | 10 | module belt_holder_base(){ 11 | translate([-33-8.5,0,-1]) cube([33,15,16]); 12 | translate([-33-8.5,11,-1]) cube([33,15,16]); 13 | translate([-50,22,-1]) cube([50,4,16]); 14 | } 15 | 16 | module belt_holder_beltcut(){ 17 | position_tweak=-0.2; 18 | // Belt slit 19 | translate([-66,-0.5+10,belt_tooth_distance]) cube([67,1,15]); 20 | // Smooth insert cutout 21 | translate([-66,-0.5+10,12]) rotate([45,0,0]) cube([67,15,15]); 22 | // Individual teeth 23 | for ( i = [0 : 23] ){ 24 | translate([0-i*belt_tooth_distance+position_tweak,-0.5+8,3]) cube([1.7,3,15]); 25 | } 26 | // Middle opening 27 | translate([-2-25,-1,3]) cube([4,11,15]); 28 | } 29 | 30 | module belt_holder_holes(){ 31 | translate([-4.5,0,7.5]) rotate([-90,0,0]) cylinder(h=30, r=1.7, $fn=10); 32 | translate([-45.5,0,7.5]) rotate([-90,0,0]) cylinder(h=30, r=1.7, $fn=10); 33 | } 34 | 35 | // Final part 36 | module belt_holder(){ 37 | difference(){ 38 | belt_holder_base(); 39 | belt_holder_beltcut(); 40 | belt_holder_holes(); 41 | } 42 | } 43 | 44 | belt_holder(); -------------------------------------------------------------------------------- /box_frame/doc/DEVELOPERS.md: -------------------------------------------------------------------------------- 1 | #This is the developers guidelines for box_model i3. 2 | its focuses on two main areas, how to share your ideas and how to publish your changes. 3 | 4 | ##If you are not going to do programming 5 | but you have idea on how to make the printer better, draw it on paper. Use pencils of different color for different materials and possibly parts. Scan or photograph it, publish it on iternet and let me know at [gmail] (mailto:axtheb+prusa3@gmail.com). We will discuss it on irc, and if somenone likes the idea it may be implemented. 6 | 7 | ##If you are going to write some code 8 | fork the repo on github, write code, send pull request. Its always good to come to IRC channel #prusa3-dev on freenode to discuss the changes. 9 | 10 | ###Style guide 11 | Use one true brace style, ie. open the block on same line as the module statement: 12 | ``` 13 | module my_awesome code(awesome_parameter=1){ 14 | something(); 15 | } 16 | ``` 17 | Note there are no spaces around the = in the definition of implicit parameters, its not there even on module calls. Put spaces after commas, around mathematical operators but not unary minus. 18 | ``` 19 | cube([10, (a / 2) + 1, -1]); 20 | ``` 21 | Indent by four spaces, dont leave spaces at end of line. 22 | 23 | *If you dont do this, yor code will be reformated and it makes checking author of code harder* 24 | -------------------------------------------------------------------------------- /old_single_plate/src/x-end-motor.scad: -------------------------------------------------------------------------------- 1 | // PRUSA iteration3 2 | // X end motor 3 | // GNU GPL v3 4 | // Josef Průša and contributors 5 | // http://www.reprap.org/wiki/Prusa_Mendel 6 | // http://prusamendel.org 7 | 8 | use 9 | 10 | module x_end_motor_base(){ 11 | x_end_base(); 12 | translate(v=[-14,31,26.5]) cube(size = [17,44,53], center = true); 13 | } 14 | 15 | module x_end_motor_holes(){ 16 | x_end_holes(); 17 | // Position to place 18 | translate(v=[-0,32,30.25]){ 19 | // Belt hole 20 | translate(v=[-14,1,0]) cube(size = [10,46,22], center = true); 21 | // Motor mounting holes 22 | translate(v=[-10,-15.5,-15.5]) cube(size = [60,3.5,3.5], center = true); 23 | translate(v=[-10,-15.5,15.5]) cube(size = [60,3.5,3.5], center = true); 24 | translate(v=[-10,15.5,-15.5]) cube(size = [60,3.5,3.5], center = true); 25 | translate(v=[-10,15.5,15.5]) cube(size = [60,3.5,3.5], center = true); 26 | // Material saving cutout 27 | translate(v=[-10,40,-30]) rotate(a=[45,0,0]) cube(size = [60,42,42], center = true); 28 | // Motor shaft cutout 29 | translate(v=[0,0,0]) rotate(a=[0,-90,0]) rotate(a=[0,0,90]) cylinder(h = 80, r=18, $fn=6); 30 | } 31 | } 32 | 33 | // Final part 34 | module x_end_motor(){ 35 | difference(){ 36 | x_end_motor_base(); 37 | x_end_motor_holes(); 38 | } 39 | } 40 | 41 | x_end_motor(); -------------------------------------------------------------------------------- /old_single_plate/src/y-motor.scad: -------------------------------------------------------------------------------- 1 | // PRUSA iteration3 2 | // Y motor mount 3 | // GNU GPL v3 4 | // Josef Průša and contributors 5 | // http://www.reprap.org/wiki/Prusa_Mendel 6 | // http://prusamendel.org 7 | 8 | //include 9 | 10 | module y_motor_base(){ 11 | // Motor holding part 12 | translate(v = [29,-21+50,0]){ 13 | translate(v = [-21+4.5,0,5]) cube(size = [9,31,10], center=true); 14 | translate(v = [-15.5,-15.5,0]) cylinder(h = 10, r=5.5); 15 | translate(v = [-15.5,+15.5,0]) cylinder(h = 10, r=5.5); 16 | // Joins motor holder and rod plate 17 | translate(v = [-29,-21,0]) cube(size = [14,30,10]); 18 | } 19 | // Front holding part 20 | translate(v = [0,10,0]) cylinder(h = 10, r=8); 21 | translate(v = [0,20,5])cube(size = [16,20,10], center=true); 22 | translate(v = [0,30,0])cylinder(h = 10, r=8); 23 | } 24 | 25 | module y_motor_holes(){ 26 | translate(v = [29,-21+50,0]){ 27 | // Screw head holes 28 | translate(v = [-15.5,-15.5,-1]) cylinder(h = 10, r=1.7); 29 | translate(v = [-15.5,+15.5,-1]) cylinder(h = 10, r=1.7); 30 | // Screw holes 31 | translate(v = [-15.5,-15.5,5]) cylinder(h = 7, r=3.5); 32 | translate(v = [-15.5,+15.5,5]) cylinder(h = 7, r=3.5); 33 | } 34 | translate(v = [0,10,-1]) cylinder(h = 12, r=4.5); 35 | translate(v = [0,30,-1])cylinder(h = 12, r=4.5); 36 | } 37 | 38 | // Final part 39 | module y_motor(){ 40 | difference(){ 41 | y_motor_base(); 42 | y_motor_holes(); 43 | } 44 | } 45 | 46 | y_motor(); 47 | -------------------------------------------------------------------------------- /old_single_plate/src/inc/x-end.scad: -------------------------------------------------------------------------------- 1 | // PRUSA iteration3 2 | // X end prototype 3 | // GNU GPL v3 4 | // Josef Průša and contributors 5 | // http://www.reprap.org/wiki/Prusa_Mendel 6 | // http://prusamendel.org 7 | 8 | include <../../configuration.scad> 9 | use 10 | 11 | module x_end_base(){ 12 | // Main block 13 | translate(v=[-14,-10,30]) cube(size = [17,39,60], center = true); 14 | // Bearing holder 15 | vertical_bearing_base(); 16 | //Nut trap 17 | // Cube 18 | translate(v=[-2-2,-17,4]) cube(size = [8,16,8], center = true); 19 | // Hexagon 20 | translate(v=[0,-17,0]) rotate([0,0,30]) cylinder(h = 8, r=8, $fn = 6); 21 | } 22 | 23 | module x_end_holes(){ 24 | vertical_bearing_holes(); 25 | // Belt hole 26 | translate(v=[-5.5-10+1.5,-10,30]) cube(size = [10,46,32], center = true); 27 | // Bottom pushfit rod 28 | translate(v=[-14,-40,6]) rotate(a=[-90,0,0]) pushfit_rod(8,50); 29 | // Top pushfit rod 30 | translate(v=[-14,-40,x_rod_distance+6]) rotate(a=[-90,0,0]) pushfit_rod(8,50); 31 | // Nut trap 32 | translate(v=[0,-17,-1]) cylinder(h = 10, r=2.45); 33 | translate(v=[0,-17,3]) rotate([0,0,30]) cylinder(h = 5, r=4.5, $fn = 6); 34 | } 35 | 36 | 37 | // Final prototype 38 | module x_end_plain(){ 39 | difference(){ 40 | x_end_base(); 41 | x_end_holes(); 42 | } 43 | } 44 | 45 | //x_end_plain(); 46 | 47 | 48 | module pushfit_rod(diameter,length){ 49 | cylinder(h = length, r=diameter/2, $fn=30); 50 | translate(v=[0,-diameter/4,length/2]) cube(size = [diameter,diameter/2,length], center = true); 51 | translate(v=[0,-diameter/2-2,length/2]) cube(size = [diameter,1,length], center = true); 52 | } 53 | 54 | -------------------------------------------------------------------------------- /box_frame/doc/dimensions.md: -------------------------------------------------------------------------------- 1 | # Here you can get all your rod lengths for i3 right. 2 | If you are using single plate model, use *italic numbers*. 3 | "Default box" is made of 6 450mm boards and one that is 2 * board thickness longer, see http://78.47.92.212/i3_documentation_pics/06-frame.md.html 4 | 5 | ## Y axis 6 | You need 2 smooth rods, 2 M10 rods and 4 M8 rods 7 | 8 | ### Y smooth rod length is sum of: 9 | * workarea (200mm) 10 | * belt assembly parts (100mm) or outer dimensions of Y bearings (100mm for Prusa3ALU-FREZOVANY-v4.dxf) 11 | * 40mm inside Y axis corners 12 | 13 | for 340mm minimum. EiNSTeiN uses *400mm* rods, so I may be missing something here. 14 | Take care they are cut exactly to the same length 15 | 16 | ### Y threaded rods (M8): 17 | Sum of: 18 | * rod separation (170mm) 19 | * Y axis corner (20mm) 20 | * nuts and washers (15mm) 21 | 22 | For *205mm*, or 210mm if you use nyloc nuts. 23 | If your rods are cut right to the size (and are all exactly the same length) you will have easier time getting the frame right. 24 | 25 | ### Y threaded rods (M10): 26 | Y Smooth rod + 30mm, so *430mm*. May be longer. 27 | 28 | 29 | ## X axis 30 | You need 2 smooth rods 31 | 32 | ### X axis smooth rod 33 | is box/plate width plus 25mm, so *395* for single plate, 475 default box. May be longer. 34 | 35 | Working area will be at most box width - 170 for single extruder and box width - 270 for dual extruder 36 | 37 | ## Z axis 38 | You need 2 smooth rods and 2 M5 threaded rods 39 | 40 | ### Z axis smooth rod: 41 | Box height - 50mm, so *320mm* for single plate, or 400 for default box. May be longer 42 | ### Z axis threaded rod 43 | Smooth rod - 20mm, so *300mm* (or 380 for default box). May be longer. 44 | -------------------------------------------------------------------------------- /box_frame/i3.tdoc: -------------------------------------------------------------------------------- 1 | /** 2 | * @root 3 | * @name Prusa i3 RepRap 4 | * @category Printer 5 | * @using extruder 6 | * @using xaxis 7 | * @using yaxis 8 | * @using frame 9 | * @using zaxis 10 | * @using electronics 11 | */ 12 | 13 | /** 14 | * @id xaxis 15 | * @name X Axis Assembly 16 | * @category Assemblies 17 | * @using xMotorEnd 18 | * @using xIdlerEnd 19 | * @using xCarriage 20 | * @using NEMA17 21 | * @using belt 22 | * @using 3 m3x10xhex 23 | * @using m3xgrubscrew 24 | * @using beltPulley 25 | * @using bearing-608 26 | * @using 7 lm8uu 27 | * @using 7 m3x25xhex 28 | * @using 7 m3nut 29 | * @using 7 m3washer 30 | * @using 2 m8smoothRod 31 | */ 32 | 33 | /** 34 | * @id yaxis 35 | * @name Y Axis Assembly 36 | * @category Assemblies 37 | * @using yMotorHolder 38 | * @using 4 yCorner 39 | * @using yIdler 40 | * @using yBeltClamp 41 | * @using 3 yBearingHolder 42 | * @using 4 yFrameBracket 43 | * @using buildPlatform 44 | * @using buildSurface 45 | * @using NEMA17 46 | * @using belt 47 | * @using 2 m3x10xhex 48 | * @using beltPulley 49 | * @using m3xgrubscrew 50 | * @using bearing-608 51 | * @using 3 lm8uu 52 | * @using 3 m3x25xhex 53 | * @using 3 m3nut 54 | * @using 3 m3washer 55 | * @using 2 m8smoothRod 56 | * @using 22 m8nut 57 | * @using 22 m8washer 58 | * @using 12 m10nut 59 | * @using 12 m10washer 60 | * @using 4 m8threadedRod 61 | * @using 2 m10threadedRod 62 | * @using 9 woodScrew 63 | */ 64 | 65 | /** 66 | * @id frame 67 | * @name Frame 68 | * @category Assemblies 69 | * @using 6 plate 70 | * @using longPlate 71 | * @using 28 woodScrew 72 | * @using spacer 73 | */ 74 | 75 | /** 76 | * @id zaxis 77 | * @name Z Axis Assembly 78 | * @category Assemblies 79 | * @using 2 zMotorHolder 80 | * @using 2 zRodHolder 81 | * @using 2 NEMA17 82 | * @using 6 m3x10xhex 83 | * @using 8 woodScrew 84 | * @using 2 couplerTubing 85 | * @using spacer 86 | */ 87 | -------------------------------------------------------------------------------- /box_frame/y-belt-holder.scad: -------------------------------------------------------------------------------- 1 | // PRUSA iteration3 2 | // Y belt holder 3 | // GNU GPL v3 4 | // Josef Průša 5 | // Václav 'ax' Hůla 6 | // http://www.reprap.org/wiki/Prusa_Mendel 7 | // http://github.com/josefprusa/Prusa3 8 | 9 | // ThingDoc entry 10 | /** 11 | * @id yBeltClamp 12 | * @name Y Belt Holder 13 | * @category Printed 14 | */ 15 | 16 | include 17 | 18 | module y_belt_holder(len=40) { 19 | y_delta = i_am_box == 0 ? -2.5 : xy_delta; 20 | ybelt_hole_to_side = 5; 21 | real_len = len + 2 * ybelt_hole_to_side; 22 | screw_hole_z_offset = i_am_box == 0 ? 0 : 4; 23 | 24 | difference(){ 25 | union(){ 26 | 27 | translate([-21 - belt_thickness, -7, 0]) cube_fillet([13 + y_delta, 14, len], vertical=[3,0,0,0], fn=8 ); 28 | translate([-14, -5.5, len / 2]) cube_fillet([24 + 2 * y_delta, 3, len], vertical=[3, 0, 0, 0], center = true); 29 | translate([-24.5, 0, real_len / 2]) cube_fillet([11.5, 16, real_len], center = true, vertical = [1, 1, 1, 1], $fn=16); 30 | translate([-4.0 + y_delta, 0, len / 2]) cube_fillet([8, 14, len], center = true, vertical = [2,2,0,2]); 31 | 32 | } 33 | translate([-4.5 + y_delta, 0, real_len / 2]) cube([10, 10, 10], center = true); 34 | translate([-11, 0, ybelt_hole_to_side + len]) { 35 | translate([screw_hole_z_offset,0,0]) rotate([0, -90, 0]) plate_screw(20); 36 | translate([8 + y_delta, 0, 0]) cube([10, 9, 9], center=true); 37 | } 38 | translate([-11, 0, ybelt_hole_to_side]) { 39 | translate([screw_hole_z_offset,0,0]) rotate([0, -90, 0]) plate_screw(20); 40 | translate([8 + y_delta, 0, 0]) cube([10, 9, 9], center=true); 41 | } 42 | 43 | translate([-8 + y_delta, 0, 0]) mirror([1, 0, 0]) belt(real_len); 44 | } 45 | } 46 | 47 | 48 | y_belt_holder(); 49 | -------------------------------------------------------------------------------- /old_single_plate/src/y-corners.scad: -------------------------------------------------------------------------------- 1 | // PRUSA iteration3 2 | // Y frame corners 3 | // GNU GPL v3 4 | // Josef Průša and contributors 5 | // http://www.reprap.org/wiki/Prusa_Mendel 6 | // http://prusamendel.org 7 | 8 | 9 | module corner_base(){ 10 | translate([-9,-11,0])cube([18,22,47]); 11 | } 12 | 13 | module corner_holes(){ 14 | translate([-11,-11,0]){ 15 | // Bottom hole 16 | translate([0,11,10]) rotate([0,90,0]) translate([0,0,-5]) cylinder(h = 270, r=4.4, $fn=30); 17 | // Top hole 18 | translate([0,11,30]) rotate([0,90,0]) translate([0,0,-5]) cylinder(h = 270, r=4.4, $fn=30); 19 | // Middle hole 20 | translate([11,0,20]) rotate([0,0,90]) rotate([0,90,0]) translate([0,0,-5]) cylinder(h = 270, r=5.4, $fn=30); 21 | 22 | // Washer hole 23 | translate([11,-3,20]) rotate([0,0,90]) rotate([0,90,0]) translate([0,0,-5]) cylinder(h = 10, r=11, $fn=30); 24 | 25 | // Top smooth rod insert 26 | // Smooth rod place 27 | translate([11,2,45]) rotate([0,90,90]) cylinder(h = 270, r=4.2, $fn=30); 28 | // Ziptie 29 | translate([-5,9,39]) cube([30,3.5,2]); 30 | } 31 | } 32 | 33 | module corner_fancy(){ 34 | // Side corner cutouts 35 | translate([-8,-9,0]) rotate([0,0,-45-180]) translate([-15,0,-1]) cube([30,30,51]); 36 | translate([8,-9,0]) rotate([0,0,45-180]) translate([-15,0,-1]) cube([30,30,51]); 37 | // Top corner cutouts 38 | translate([7,0,49-2]) rotate([0,45,0]) translate([-15,-15,0]) cube([30,30,30]); 39 | translate([-7,0,49-2]) rotate([0,-45,0]) translate([-15,-15,0]) cube([30,30,30]); 40 | rotate([0,0,90]){ 41 | translate([-9,0,49-2]) rotate([0,-45,0]) translate([-15,-15,0]) cube([30,30,30]); 42 | } 43 | } 44 | 45 | 46 | // Final part 47 | module corner(){ 48 | // Rotate the part for better printing 49 | translate([0,0,11]) rotate([-90,0,0]) difference(){ 50 | corner_base(); 51 | corner_holes(); 52 | corner_fancy(); 53 | } 54 | } 55 | 56 | corner(); 57 | -------------------------------------------------------------------------------- /box_frame/extras/tube_clamp.scad: -------------------------------------------------------------------------------- 1 | //makes tube clamping part. Useful for strenghtening Z axis tubing or as holder for Z axis endstop. 2 | // GNU GPL v3 3 | // Václav 'ax' Hůla 4 | include <../configuration.scad>; 5 | $fn=64; 6 | 7 | module tube_clamp(tube_r, wall_width=3, endstop=false, h=10) { 8 | //wall_width is in single_wall_widths 9 | difference() { 10 | union(){ 11 | intersection() { 12 | union(){ 13 | cylinder(r=tube_r + wall_width * single_wall_width, h=h); 14 | translate([-4.5, 0, 0]) cube([9, 20, h]); 15 | } 16 | cylinder(r=tube_r + 5 + wall_width * single_wall_width, h=h); 17 | } 18 | if (endstop) { 19 | translate([-4.5, 5 + tube_r, 0]) cube([4.5, 30, h]); 20 | } 21 | } 22 | translate([0, 0, -0.5]) cylinder(r=tube_r, h=h + 1); 23 | translate([-0.5, 0, -0.5]) cube([1, 45, h + 1]); 24 | 25 | translate([-7, max (6, tube_r + wall_width * single_wall_width + 0.5) , h / 2]) { 26 | rotate([0, 90, 0]) screw(r=1.7, r_head=m3_washer_diameter/2, head_drop=3, slant=false); 27 | translate([10, 0, 0]) rotate([0, 90, 0]) cylinder(r=m3_nut_diameter_horizontal/2, $fn=6, h=2); 28 | } 29 | if (endstop) { 30 | translate([-7, 10 + tube_r, h / 2]) rotate([0, 90, 0]) { 31 | cylinder(r = 1.2, h=10); 32 | translate([0, 10, 0]) 33 | cylinder(r = 1.2, h=10); 34 | translate([0, 20, 0]) 35 | cylinder(r = 1.2, h=10); 36 | } 37 | } 38 | 39 | } 40 | } 41 | 42 | tube_clamp(3.5); 43 | translate([15, 0, 0]) tube_clamp(3.5); 44 | translate([0, 20, 0]) { 45 | tube_clamp(bushing_xy[0], endstop=true, h=12); 46 | translate([20, 0, 0]) tube_clamp(bushing_xy[0], endstop=true, h=12); 47 | translate([-20, 0, 0]) tube_clamp(bushing_z[0], endstop=true, h=12); 48 | } 49 | -------------------------------------------------------------------------------- /box_frame/update-samples.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | #this script generates models for all samples 3 | 4 | find sample_stls -name "*.stl" -delete 5 | find sample_stls -name "*.gcode" -delete 6 | 7 | if [ -e configuration.scad.dist ]; then 8 | if [ -e configuration.scad ]; then 9 | mv --backup=numbered configuration.scad configuration.scad.autobackup 10 | fi 11 | 12 | 13 | for i in `ls sample_stls` 14 | do 15 | DIR=sample_stls/$i 16 | echo $DIR 17 | if [ -e $DIR/configuration.scad ]; then 18 | rm configuration.scad 19 | cp $DIR/configuration.scad configuration.scad 20 | make clean 21 | # build standard models 22 | make 23 | 24 | # I do not want all extras in samples, 25 | # so lets build only some of them 26 | EXTRAS="tube_clamp.stl calibrate.stl" 27 | 28 | # for box model there is additional part in extras (replaces bushing.stl) 29 | # (brackets that hold Y bearings to Y carriage) 30 | # and we dont want y-axis-bracket from standard models 31 | if grep "i_am_box = 0;" configuration.scad ; then 32 | rm output/y-axis-bracket.stl 33 | rm output/bushing.stl 34 | EXTRAS="$EXTRAS bearing-holder-single-plate-y.stl" 35 | fi 36 | # build wade extruder for medium carriage 37 | if grep "carriage_l_base = 50" configuration.scad ; then 38 | EXTRAS="$EXTRAS gregs-wade-v3.stl wade-gears.stl" 39 | fi 40 | # build the extras 41 | for model in $EXTRAS 42 | do 43 | make output/extras/$model 44 | done 45 | 46 | cp -f output/*stl $DIR 47 | cp -f output/extras/*stl $DIR/extras 48 | fi 49 | 50 | done 51 | 52 | if [ -e configuration.scad.autobackup ]; then 53 | mv configuration.scad.autobackup configuration.scad 54 | fi 55 | 56 | else 57 | echo "configuration.scad.dist not found, aborting" 58 | fi 59 | -------------------------------------------------------------------------------- /old_single_plate/src/z-axis-top.scad: -------------------------------------------------------------------------------- 1 | // PRUSA iteration3 2 | // Z axis top holder 3 | // GNU GPL v3 4 | // Josef Průša and contributors 5 | // http://www.reprap.org/wiki/Prusa_Mendel 6 | // http://prusamendel.org 7 | 8 | module z_top_base(){ 9 | translate([0,-5,0]) cube([8,45,16]); // plate touching the base 10 | translate([0,-5,0]) cube([30,5.01,12]); // plate touching the base 11 | translate([0,-5,0]) cube([38,15,5]); // plate touching the base 12 | } 13 | 14 | module z_top_fancy(){ 15 | // Corner cutouts 16 | translate([0.5,0.5,0]) rotate([0,0,-45-180]) translate([-15,0,-1]) cube([30,30,51]); 17 | translate([0.5,40-0.5,0]) rotate([0,0,-45+90]) translate([-15,0,-1]) cube([30,30,51]); 18 | translate([-4,40+5,0]) rotate([0,0,-45-0]) translate([0,0,-1]) cube([30,30,51]); 19 | translate([8,0,12]) rotate([0,-45,0]) translate([0,-5,0]) cube([30,50,30]); 20 | translate([38-2.5,-5+2.5,0]) rotate([0,0,-45-90]) translate([-15,0,-1]) cube([30,30,51]); 21 | translate([38-1.5,10-1.5,0]) rotate([0,0,-45]) translate([-15,0,-1]) cube([30,30,51]); 22 | translate([0,0,5]) rotate([45+180,0,0]) rotate([0,0,-45+90]) translate([0,0,-15]) cube([30,30,30]); 23 | 24 | // Stiffner cut out 25 | translate([30,0,5.5]) rotate([0,-45,0]) translate([0,-5,0]) cube([30,50,30]); 26 | } 27 | 28 | module z_top_holes(){ 29 | // Screw holes 30 | translate([-1,10,10]) rotate([0,90,0]) cylinder(h = 20, r=1.8, $fn=30); 31 | translate([-1,10+20,10]) rotate([0,90,0]) cylinder(h = 20, r=1.8, $fn=30); 32 | 33 | // Screw heads 34 | translate([4,10,10]) rotate([0,90,0]) cylinder(h = 20, r=3.1, $fn=30); 35 | translate([4,10-3.1,10]) cube([10,6.2,10]); 36 | translate([4,10+20,10]) rotate([0,90,0]) cylinder(h = 20, r=3.1, $fn=30); 37 | translate([4,10+20-3.1,10]) cube([10,6.2,10]); 38 | 39 | // Z rod holder 40 | translate([25+4.3,4.2,-1]) rotate([0,0,0]) cylinder(h = 50, r=4.1, $fn=15); 41 | translate([25+4.3-1,3,0.6]) cube([2,10,7]); // it's bit up because it helps with printing 42 | } 43 | 44 | // Final part 45 | module z_top(){ 46 | difference(){ 47 | z_top_base(); 48 | z_top_fancy(); 49 | z_top_holes(); 50 | } 51 | translate([0,-13,0]) mirror([0,1,0]) difference(){ 52 | z_top_base(); 53 | z_top_fancy(); 54 | z_top_holes(); 55 | } 56 | } 57 | 58 | z_top(); -------------------------------------------------------------------------------- /box_frame/extras/calibrate.scad: -------------------------------------------------------------------------------- 1 | // PRUSA iteration3 2 | // Calibrating object 3 | // GNU GPL v3 4 | // Václav 'ax' Hůla 5 | 6 | include <../configuration.scad> 7 | use <../bushing.scad> 8 | 9 | use <../x-end.scad> 10 | 11 | intersection() { 12 | difference() { 13 | union(){ 14 | //central cube 15 | translate([-10, -10, 0]) cube_fillet([20, 20, 20], top=[3, 0, 3, 0]); 16 | //xy bearing. If the bearing is hard to put inside you are probably extruding too much fabric. 17 | mirror([1, 0, 0]) translate([20, 0, 0]) linear_bearing(); 18 | //z smooth rod. See note above. You can adjust it in inc/conf_bushing.scad, but the problem is likely to be in machine. 19 | translate([-12, 7, 0]) cube_fillet([24, 13, 4.5], vertical=[3, 3, 0, 0]); 20 | translate([0, 18, 0]) cylinder(h=2.5, r=(bushing_z[0] + 5 * single_wall_width)); 21 | //z wall 22 | translate([-11, -36, 0]) cube_fillet([5, 31, 20], top=[0, 0, 5, 7]); 23 | //belt holder. Belt thickness is in configuration.scad 24 | translate([14 + belt_thickness, -1, 10]) cube_fillet([8, 14, 20], center = true, vertical = [2,0,2,2], fn=8); 25 | translate([5, 3, 0]) cube ([10, 3, 20]); 26 | 27 | } 28 | 29 | //xy bearing hole 30 | mirror([1, 0, 0]) translate([20, 0, 0]) linear_bearing_negative(); 31 | //x smooth rod 32 | translate([0, -11, 5 + bushing_xy[0]]) rotate([-90, 0, 0]) pushfit_rod(bushing_xy[0] * 2 + 0.2, 50); 33 | //z smooth rod 34 | translate([0, 18, -1]) cylinder(h=20, r=bushing_z[0] + single_wall_width / 4); 35 | 36 | //screw 37 | translate([0, -20, 10]) rotate([0, -90, 0]) screw(head_drop=7, h=122, r_head=4.5); 38 | //x carriage nut. Too bad its not parametrised (todo) 39 | translate([-7,-29, 10]) rotate([90, 0, 0]) { 40 | rotate([0, 90, 0]) cylinder(r=3.4, h=5, $fn=6, center=true); 41 | rotate([0, 90, 0]) cylinder(r=1.8, h=22, center=true); 42 | 43 | } 44 | //belt 45 | translate([10, -2, 0]) belt(25); 46 | #translate([10, -2, 0]) belt(25); 47 | 48 | 49 | } 50 | //Cut top to save plastic 51 | translate([-50, -50, 0]) cube([100, 100, 20]); 52 | } 53 | -------------------------------------------------------------------------------- /box_frame/extras/endstop-holder.scad: -------------------------------------------------------------------------------- 1 | // PRUSA Mendel 2 | // Endstop holder 3 | // Used to attach endstops to 8mm rods 4 | // GNU GPL v3 5 | // Josef Průša 6 | // josefprusa@me.com 7 | // prusadjs.cz 8 | // http://www.reprap.org/wiki/Prusa_Mendel 9 | // http://github.com/josefprusa/Prusa3 10 | 11 | include <../configuration.scad> 12 | 13 | /** 14 | * This endstop holder has 3 holes for endstops with either 10mm or 20mm spacing 15 | * @id endstop-holder 16 | * @name Endstop holder 17 | * @category Printed 18 | * @using 1 m3x20xhex 19 | * @using 1 m3nut 20 | * @using 2 m3washer 21 | */ 22 | module endstop(shaft_radius){ 23 | shaft_diameter=shaft_radius*2; 24 | outer_diameter = shaft_diameter/2+3.3; 25 | screw_hole_spacing = 20; 26 | screw_hole_spacing2 = 10; 27 | opening_size = shaft_radius*2-1.5; //openingsize 28 | 29 | segments=64; 30 | 31 | difference(){ 32 | union(){ 33 | 34 | 35 | translate([outer_diameter, outer_diameter, 0]) cylinder(h =10, r = outer_diameter, $fn = segments); 36 | translate([outer_diameter, 0, 0]) cube([15.5,outer_diameter*2,10]); 37 | translate([-30, 0, 0]) cube([40, 4, 10]); 38 | translate([17, 10+opening_size, 5]) rotate([90, 0, 0]) cylinder(h =5, r = 5.77, $fn = 6); 39 | } 40 | 41 | 42 | 43 | 44 | translate([9, outer_diameter-opening_size/2, 0]) cube([18,opening_size,20]); 45 | translate([outer_diameter, outer_diameter, 0]) cylinder(h =30, r = shaft_radius, $fn = segments); 46 | 47 | //Securing hole 48 | translate([17, 20, 5]) rotate([90, 0, 0]) cylinder(h =20, r = m3_diameter/2, $fn = segments); 49 | translate([17, 12+opening_size, 5]) rotate([90, 0, 0]) cylinder(h =5, r = m3_nut_diameter_horizontal/2, $fn = 6); 50 | 51 | translate([17, 17, 5]) rotate([90, 0, 0]) cylinder(h =20, r = m3_diameter/2, $fn = segments); 52 | // Endstop holders 53 | translate([-5, 17, 5]) rotate([90, 0, 0]) cylinder(h =20, r = m3_diameter/2, $fn = segments); 54 | translate([-(5+screw_hole_spacing), 17, 5]) rotate([90, 0, 0]) cylinder(h =20, r = m3_diameter/2, $fn = segments); 55 | translate([-(5+screw_hole_spacing2), 17, 5]) rotate([90, 0, 0]) cylinder(h =20, r = m3_diameter/2, $fn = segments); 56 | 57 | } 58 | } 59 | 60 | endstop(bushing_xy[0]); 61 | translate([0,22,0]) endstop(bushing_xy[0]); 62 | translate([0,44,0]) endstop(bushing_z[0]); 63 | 64 | -------------------------------------------------------------------------------- /box_frame/inc/bearing-guide.scad: -------------------------------------------------------------------------------- 1 | // PRUSA iteration3 2 | // Bearing guide 3 | // GNU GPL v3 4 | // Josef Průša 5 | // Václav 'ax' Hůla 6 | // Original design by Greg Frost 7 | // http://www.reprap.org/wiki/Prusa_Mendel 8 | // http://github.com/josefprusa/Prusa3 9 | 10 | // ThingDoc entry 11 | /** 12 | * @description Helps to hold belt aligned on the bearing. 13 | * @id bearing-guide 14 | * @name Bearing guide 15 | * @category Printed 16 | */ 17 | 18 | include <../configuration.scad> 19 | include 20 | 21 | //guiding_wall_thickness of guiding wall 22 | guiding_wall_thickness=layer_height * 4; 23 | 24 | 25 | height = max(belt_width, idler_bearing[1]) + guiding_wall_thickness; 26 | //How much the guiding wall overlaps the bearing wall (to the center) 27 | wall_descent = 1; 28 | 29 | module bearing_guide_inner(){ 30 | //inner (smaller) part of the guide 31 | difference(){ 32 | cylinder(r=idler_bearing[0] / 2 + single_wall_width * 3, h=height - (max( idler_bearing[1], belt_width) - idler_bearing[1]) / 2); 33 | translate([0, 0, -1]) 34 | cylinder(r=idler_bearing[0] / 2, h=height + 2); 35 | } 36 | 37 | difference(){ 38 | union() { 39 | cylinder(r=idler_assy_r_outer(idler_bearing), h=guiding_wall_thickness); //guide wall 40 | cylinder(r=idler_bearing[0] / 2, h=guiding_wall_thickness + (belt_width - idler_bearing[1])/2); //this centers the guide on bearing 41 | } 42 | translate([0,0,-1]) 43 | cylinder(r=idler_bearing[0] / 2 - wall_descent, h=guiding_wall_thickness + 10); 44 | } 45 | } 46 | 47 | module bearing_guide_outer(){ 48 | difference(){ 49 | cylinder(r=idler_bearing[0] / 2 + 6 * single_wall_width + 0.2, h=height); 50 | translate([0,0,-1]) 51 | cylinder(r=idler_bearing[0] / 2 + single_wall_width * 3, h=height + 2); 52 | } 53 | 54 | difference(){ 55 | union(){ 56 | cylinder(r=idler_assy_r_outer(idler_bearing), h=guiding_wall_thickness); 57 | cylinder(r=idler_bearing[0] / 2, h=guiding_wall_thickness + (belt_width - idler_bearing[1])/2); 58 | } 59 | translate([0,0,-1]) 60 | cylinder(r=idler_bearing[0]/2-wall_descent, h=height + 5); 61 | } 62 | } 63 | 64 | module bearing_assy(){ 65 | 66 | bearing_guide_inner(); 67 | translate([idler_assy_r_outer(idler_bearing) * 2 + 2, 0, 0]) 68 | bearing_guide_outer(); 69 | } 70 | 71 | bearing_assy(); 72 | -------------------------------------------------------------------------------- /box_frame/doc/boxframe.scad: -------------------------------------------------------------------------------- 1 | module pl(x=100,y=100,z=12){ 2 | cube([x,y,z]); 3 | } 4 | module screw(depth=20){ 5 | color([1,1,0]){ 6 | cylinder(r1=4,r2=3.5/2,h=4); 7 | cylinder(r1=3.5/2,r2=3.5/2,h=depth-2); 8 | translate([0,0,depth-2])cylinder(r1=3.5/2,r2=0,h=2); 9 | 10 | } 11 | 12 | } 13 | module p3bscorner(){ 14 | translate([30,-12.5,6])rotate([-90,0,0])screw(); 15 | translate([422,-12.5,6])rotate([-90,0,0])screw(); 16 | translate([220,-12.5,6])rotate([-90,0,0])screw(); 17 | //front board vertical 18 | color([0.5,0.5,0.5,0.8])pl(x=450); 19 | //side board 20 | color([0.5,0.5,0.6,0.8])rotate([90,0,0])pl(x=450); 21 | } 22 | module p3bsgantry(){ 23 | //side and front boards 24 | translate([440,-110,25])mirror([0,0,1])screw(); 25 | translate([440,110+50,25])mirror([0,0,1])screw(); 26 | translate([360,-110,25])mirror([0,0,1])screw(); 27 | translate([360,110+50,25])mirror([0,0,1])screw(); 28 | translate([360,-180,25])mirror([0,0,1])screw(); 29 | translate([360,180+50,25])mirror([0,0,1])screw(); 30 | //front board across 31 | color([0.5,0.5,0.6,0.9])translate([450,-200,12])rotate([0,0,90])pl(x=450); 32 | translate([0,-200,0])color([0,0,0,0.3])p3bscorner(); 33 | translate([0,250,0])color([0,0,0,0.3])mirror([0,1,0])p3bscorner(); 34 | } 35 | module boxframe(top=false){ 36 | translate([285,-212.5,6])rotate([-90,0,0])screw(); 37 | translate([220,-212.5,6])rotate([-90,0,0])screw(); 38 | translate([285,262.5,6])rotate([90,0,0])screw(); 39 | translate([220,262.5,6])rotate([90,0,0])screw(); 40 | translate([312.5,-180,6])rotate([90,0,-90])screw(); 41 | translate([312.5,-110,6])rotate([90,0,-90])screw(); 42 | translate([312.5,240,6])rotate([90,0,-90])screw(); 43 | translate([312.5,160,6])rotate([90,0,-90])screw(); 44 | 45 | translate([300,-180,0])rotate([0,0,90])color([1,0,0,0.35])pl(x=400,z=3); 46 | //bottom board 47 | translate([300,-200,3])rotate([0,0,90])color([0,0,1,0.55])pl(x=450); 48 | translate([312,0])rotate([0,-90,0])color([0,0,0,0.4])p3bsgantry(); 49 | if(top){ 50 | translate([220,-206,463])mirror([0,0,1])screw(); 51 | translate([220,256,463])mirror([0,0,1])screw(); 52 | translate([280,-206,463])mirror([0,0,1])screw(); 53 | translate([280,256,463])mirror([0,0,1])screw(); 54 | translate([306,-156,463])mirror([0,0,1])screw(); 55 | translate([306,206,463])mirror([0,0,1])screw(); 56 | //top board 57 | translate([312,-212,450])rotate([0,0,90])color([0,0,1,0.55])pl(x=475); 58 | 59 | } 60 | } 61 | 62 | color([0,0,0,0.4])boxframe(true); 63 | 64 | color([0.8,0.8,0.2,0.35])translate([100,0,-100])cube([800,800,200],true); 65 | -------------------------------------------------------------------------------- /box_frame/extras/endstop-holder-extra.scad: -------------------------------------------------------------------------------- 1 | // PRUSA Mendel 2 | // Endstop holder extra adapter rotator 3 | // Used to rotate endstops for Prusa i2/i3 endstop holders 4 | // GNU GPL v3 5 | // Ethan Sherman 6 | // ethan@blackguest.net 7 | 8 | include <../configuration.scad> 9 | 10 | /** 11 | * This endstop adapter has 3 holes for endstops with either 10mm or 20mm spacing. 12 | * It is designed to fit on the original endstop-holder to rotate a mechanical endstop 90 degrees. 13 | * 14 | * @id endstop-holder-extra 15 | * @name Endstop holder extra 16 | * @category Printed 17 | */ 18 | module endstop_extra(shaft_radius){ 19 | screw_hole_spacing = 20; 20 | screw_hole_spacing2 = 10; 21 | 22 | segments=64; 23 | 24 | difference(){ 25 | union(){ 26 | // for reference, here is the main endstop arm 27 | //translate([-30, 0, 0]) cube([40, 4, 10]); 28 | 29 | // endstop arm mount 30 | translate([-20, -35.99, -5]) cube([10, 35, 5]); 31 | // main sliding endstop mount slider plate 32 | translate([-30, -5, -5]) cube([30, 5, 15]); 33 | // extra overhang support (may not be easy to print in this orientation) 34 | //#translate([-30, -0, -5]) cube([30, 6, 5]); 35 | 36 | // extra curved arm support (optional) 37 | difference(){ 38 | translate([-30, -15, -5]) cube([30, 11, 5]); 39 | translate([-10, -10, -10]) rotate([0, 0, 90]) 40 | translate([-5, -10, -1]) rotate([0, 0, 0]) cylinder(h =20, r = 10, $fn = segments); 41 | translate([-40, -10, -10]) rotate([0, 0, 90]) 42 | translate([-5, -10, -1]) rotate([0, 0, 0]) cylinder(h =20, r = 10, $fn = segments); 43 | } 44 | } 45 | 46 | // main slot 47 | for (z = [0:20]){ 48 | translate([-(5+screw_hole_spacing) + z, 7, 5]) rotate([90, 0, 0]) cylinder(h =20, r = m3_diameter/2, $fn = segments); 49 | } 50 | 51 | // small m2 holes 52 | translate([-25, -8, -10]) rotate([0, 0, 90]){ 53 | translate([-5, -10, -1]) rotate([0, 0, 0]) cylinder(h =20, r = m2_diameter/2, $fn = segments); 54 | translate([-(5+screw_hole_spacing), -10, -1]) rotate([0, 0, 0]) cylinder(h =20, r = m2_diameter/2, $fn = segments); 55 | translate([-(5+screw_hole_spacing2), -10, -1]) rotate([0, 0, 0]) cylinder(h =20, r = m2_diameter/2, $fn = segments); 56 | } 57 | } 58 | } 59 | 60 | rotate([-90, 0, 0]) endstop_extra(bushing_xy[0]); 61 | -------------------------------------------------------------------------------- /old_single_plate/src/inc/bearing.scad: -------------------------------------------------------------------------------- 1 | // PRUSA iteration3 2 | // Bearing holders 3 | // GNU GPL v3 4 | // Josef Průša and contributors 5 | // http://www.reprap.org/wiki/Prusa_Mendel 6 | // http://prusamendel.org 7 | 8 | bearing_diameter = 15; 9 | 10 | module horizontal_bearing_base(bearings=1){ 11 | translate(v=[0,0,6]) cube(size = [24,8+bearings*25,12], center = true); 12 | } 13 | module horizontal_bearing_holes(bearings=1){ 14 | cutter_lenght = 10+bearings*25; 15 | one_holder_lenght = 8+25; 16 | holder_lenght = 8+bearings*25; 17 | 18 | // Main bearing cut 19 | difference(){ 20 | translate(v=[0,0,12+1.5]) rotate(a=[90,0,0]) translate(v=[0,0,-cutter_lenght/2]) cylinder(h = cutter_lenght, r=bearing_diameter/2, $fn=50); 21 | // Bearing retainers 22 | translate(v=[0,1-holder_lenght/2,3+1.5]) cube(size = [24,6,8], center = true); 23 | translate(v=[0,-1+holder_lenght/2,3+1.5]) cube(size = [24,6,8], center = true); 24 | } 25 | 26 | // Ziptie cutouts 27 | ziptie_cut_ofset = 0; 28 | for ( i = [0 : bearings-1] ){ 29 | // For easier positioning I move them by half of one 30 | // bearing holder then add each bearign lenght and then center again 31 | translate(v=[0,-holder_lenght/2,0]) translate(v=[0,one_holder_lenght/2+i*25,0]) difference(){ 32 | union(){ 33 | translate(v=[0,2-6,12]) rotate(a=[90,0,0]) translate(v=[0,0,0]) cylinder(h = 4, r=12.5, $fn=50); 34 | translate(v=[0,2+6,12]) rotate(a=[90,0,0]) translate(v=[0,0,0]) cylinder(h = 4, r=12.5, $fn=50); 35 | } 36 | translate(v=[0,10,12]) rotate(a=[90,0,0]) translate(v=[0,0,0]) cylinder(h = 24, r=10, $fn=50); 37 | } 38 | } 39 | 40 | } 41 | 42 | module horizontal_bearing_test(){ 43 | difference(){ 44 | horizontal_bearing_base(1); 45 | horizontal_bearing_holes(1); 46 | } 47 | translate(v=[30,0,0]) difference(){ 48 | horizontal_bearing_base(2); 49 | horizontal_bearing_holes(2); 50 | } 51 | translate(v=[60,0,0]) difference(){ 52 | horizontal_bearing_base(3); 53 | horizontal_bearing_holes(3); 54 | } 55 | } 56 | 57 | 58 | 59 | thinwall = 2; 60 | bearing_size = bearing_diameter + 2 * thinwall; 61 | 62 | module vertical_bearing_base(){ 63 | translate(v=[-2-bearing_size/4,0,30]) cube(size = [4+bearing_size/2,bearing_size,60], center = true); 64 | cylinder(h = 60, r=bearing_size/2, $fn = 60); 65 | } 66 | 67 | module vertical_bearing_holes(){ 68 | translate(v=[0,0,-1]) cylinder(h = 62, r=bearing_diameter/2, $fn = 60); 69 | rotate(a=[0,0,-60]) translate(v=[10,0,31]) cube(size = [10,1,62], center = true); 70 | } 71 | 72 | difference(){ 73 | vertical_bearing_base(); 74 | vertical_bearing_holes(); 75 | } 76 | -------------------------------------------------------------------------------- /old_single_plate/src/x-carriage.scad: -------------------------------------------------------------------------------- 1 | // PRUSA iteration3 2 | // X carriage 3 | // GNU GPL v3 4 | // Josef Průša and contributors 5 | // http://www.reprap.org/wiki/Prusa_Mendel 6 | // http://prusamendel.org 7 | 8 | include <../configuration.scad> 9 | use 10 | 11 | module x_carriage_base(){ 12 | // Small bearing holder 13 | translate([-33/2,+2,0]) rotate([0,0,90]) horizontal_bearing_base(1); 14 | hull(){ 15 | // Long bearing holder 16 | translate([-33/2,x_rod_distance+2,0]) rotate([0,0,90]) horizontal_bearing_base(2); 17 | // Belt holder base 18 | translate([-36,20,0]) cube([39,16,17]); 19 | } 20 | // Base plate 21 | translate([-38,-11.5,0]) cube([39+4,68,7+1.5]); 22 | 23 | } 24 | 25 | module x_carriage_beltcut(){ 26 | // Cut in the middle for belt 27 | translate([-2.5-16.5+1,19,7]) cube([4.5,13,15]); 28 | // Cut clearing space for the belt 29 | translate([-39,5,7]) cube([50,13,15]); 30 | // Belt slit 31 | translate([-50,21.5+10,6]) cube([67,1,15]); 32 | // Smooth entrance 33 | translate([-56,21.5+10,14]) rotate([45,0,0]) cube([67,15,15]); 34 | // Teeth cuts 35 | for ( i = [0 : 33] ){ 36 | translate([25-i*belt_tooth_distance,21.5+8,6+1.5]) cube([1.7,3,15]); 37 | } 38 | } 39 | 40 | module x_carriage_holes(){ 41 | // Small bearing holder holes cutter 42 | translate([-33/2,2,0]) rotate([0,0,90]) horizontal_bearing_holes(1); 43 | // Long bearing holder holes cutter 44 | translate([-33/2,x_rod_distance+2,0]) rotate([0,0,90]) horizontal_bearing_holes(2); 45 | // Extruder mounting holes 46 | translate([-16.5+15,24,-1])cylinder(r=1.7, h=20, $fn=32); 47 | translate([-16.5+15,24,10])cylinder(r=3.3, h=20, $fn=6); 48 | translate([-16.5-15,24,-1])cylinder(r=1.7, h=20, $fn=32); 49 | translate([-16.5-15,24,10])cylinder(r=3.3, h=20, $fn=6); 50 | } 51 | 52 | module x_carriage_fancy(){ 53 | // Top right corner 54 | translate([13.5,-5,0]) translate([0,45+11.5,-1]) rotate([0,0,45]) translate([0,-15,0]) cube([30,30,20]); 55 | // Bottom right corner 56 | translate([0,5,0]) translate([0,-11.5,-1]) rotate([0,0,-45]) translate([0,-15,0]) cube([30,30,20]); 57 | // Bottom ĺeft corner 58 | translate([-33,5,0]) translate([0,-11.5,-1]) rotate([0,0,-135]) translate([0,-15,0]) cube([30,30,20]); 59 | // Top left corner 60 | translate([-33-13.5,-5,0]) translate([0,45+11.5,-1]) rotate([0,0,135]) translate([0,-15,0]) cube([30,30,20]); 61 | } 62 | 63 | // Final part 64 | module x_carriage(){ 65 | difference(){ 66 | x_carriage_base(); 67 | x_carriage_beltcut(); 68 | x_carriage_holes(); 69 | x_carriage_fancy(); 70 | } 71 | } 72 | 73 | x_carriage(); 74 | -------------------------------------------------------------------------------- /box_frame/inc/conf_bushing.scad: -------------------------------------------------------------------------------- 1 | // PRUSA iteration3 2 | // Bushing and bering dimensions 3 | // GNU GPL v3 4 | // Václav 'ax' Hůla 5 | // http://www.reprap.org/wiki/Prusa_Mendel 6 | // http://github.com/josefprusa/Prusa3 7 | // 8 | 9 | // each config is in form[r_rod, r, h, type, name] where: 10 | // r_rod is smooth rod radius [0] 11 | // r is outer bushing radius needed for tight fit or bearing radius with loose fit [1] 12 | // h is barrel length [2] 13 | // type is 0 for linear bearings, 1 is for bushings which needs to be enclosed fully. [3] 14 | // type 1 may have flange, but type 0 not 15 | // name is human readable name [4] 16 | 17 | //bushings 18 | conf_b_bushing8 = [4, 5.1, 10, 1, "Tube shaped bushing like igus J(V)FM 0810-10"]; 19 | conf_b_bushing10 = [5, 6.1, 10, 1, "Tube shaped bushing with id=10mm, od=12mm and length of at least 10mm, like J(V)FM 1012-10"]; 20 | conf_b_bushing12 = [6, 7.1, 15, 1, "Tube shaped bushing with id=12mm, od=14mm and length of at least 15mm, like SF-1 1215"]; 21 | 22 | conf_b_bronze8 = [4, 8, 11, 1, "bronze self-aligning bushing, 8mm"]; 23 | 24 | //shorter beaings (two on each Z axis) 25 | conf_b_lm8uu = [4, 7.7, 24, 0, "lm8uu bearing (standard)"]; 26 | conf_b_lm10uu = [5, 9.7, 29, 0, "lm10uu bearing (10mm smooth rod)"]; 27 | conf_b_lme8uu =[4, 8.2, 25, 0, "lme8uu bearing"]; 28 | conf_b_lm12uu = [6, 10.6, 30, 0, "lm12uu bearing (12mm smooth rod)"]; 29 | 30 | //longer bearings 31 | conf_b_lm8luu = [4, 7.7, 45, 0, "lm8luu bearing (double length)"]; 32 | conf_b_lm10luu = [5, 9.7, 55, 0, "lm10luu bearing (10mm smooth rod, long)"]; 33 | conf_b_lm12luu = [6, 10.6, 57, 0, "lm12luu bearing (12mm, double length)"]; 34 | 35 | 36 | // Select idler bearing size ************************************************** 37 | // [outer_diameter, width, inner_diameter, uses_guide] 38 | 39 | // roughly sorted by desirability 40 | 41 | // one bearing with guides 42 | // Select by availability, smaller is better. 43 | bearing_623 = [10, 4, 3, 1, "623 bearing"]; 44 | bearing_624 = [13, 5, 4, 1, "624 bearing"]; 45 | bearing_625 = [16, 5, 5, 1, "625 bearing"]; 46 | 47 | // two bearings side by side - for use without bearing guides. 48 | // Not recomended anymore 49 | bearing_625_double = [16, 10, 5, 0, "625 bearing x2"]; 50 | bearing_624_double = [13, 10, 4, 0, "624 bearing x2"]; 51 | bearing_623_double = [10, 8, 3, 0, "623 bearing"]; 52 | 53 | // 608 [standard skate bearings] with bearing guide 54 | bearing_608 = [22, 7, 8, 1, "608 bearing"]; 55 | // 608 bearings with fender washers. 56 | // the belt brushes both against the carriage and the washers. 57 | bearing_608_washers = [22, 10, 8, 0, "608 bearing"]; 58 | 59 | -------------------------------------------------------------------------------- /box_frame/y-axis-corner.scad: -------------------------------------------------------------------------------- 1 | // PRUSA iteration3 2 | // Y frame corners 3 | // GNU GPL v3 4 | // Josef Průša 5 | // Václav 'ax' Hůla 6 | // http://www.reprap.org/wiki/Prusa_Mendel 7 | // http://github.com/josefprusa/Prusa3 8 | 9 | // ThingDoc entry 10 | /** 11 | * @id yCorner 12 | * @name Y Axis Corner 13 | * @category Printed 14 | */ 15 | 16 | include 17 | use 18 | 19 | module nutrod(r=4.4){ 20 | //threared rods 21 | rotate([0,90,0]){ 22 | translate([0,0,-5]) cylinder(h = 270, r=r, $fn=30); 23 | } 24 | } 25 | 26 | 27 | // 20 mm betwenn the front threaded rods 28 | // 25 mm between the side threaded and smooth rod 29 | 30 | 31 | module leftfront(thru = false){ 32 | y_end_plug=2; 33 | // translate so the rod is on x = 0 34 | translate([-11,-y_end_plug,0]) 35 | 36 | difference(){ 37 | if (thru == false) { 38 | translate([0,0,12-board_thickness]) cube_fillet([22, 22, 40 + board_thickness + xy_delta], vertical=[4,4,4,4], top=[2,6,6,6], fn=8); 39 | } else { 40 | translate([0,0,12-board_thickness]) cube_fillet([22, 22, 41.5 + board_thickness + xy_delta], vertical=[4,4,4,4], top=[2,4,9,4], fn=8); 41 | } 42 | 43 | //threaded rods across (short) 44 | translate([0,11,10]) rotate([0,0,0]) nutrod(); 45 | translate([0,11,30]) rotate([0,0,0]) nutrod(); 46 | //threaded rod along (long, M10) 47 | translate([11, 0, 14.6 + y_threaded_rod_long_r]) rotate([0,0,90]) nutrod(r=y_threaded_rod_long_r); 48 | 49 | if(thru==false){ 50 | //Leave space on part top thru which the rod is inserted, but not too big so it still snaps in 51 | translate([11, 15 + y_end_plug, 48 + bushing_xy[0] * 0.75 + xy_delta]) cube([bushing_xy[0] * 2.05, 30, 4], center=true); 52 | //Actual smoooth rod 53 | translate([11, y_end_plug, 48 + xy_delta]) rotate([0, 90, 90]) cylinder(h = 270, r=bushing_xy[0]); 54 | }else{ 55 | translate([11, 17-5, 48 + 2.05 + xy_delta]) cube([8.2, 30, 4.1], center=true); 56 | translate([11, -3, 48 + xy_delta]) rotate([0, 90, 90]) cylinder(h = 270, r=4.0); 57 | } 58 | 59 | } 60 | } 61 | 62 | leftfront(); 63 | translate([40,0,0]) mirror([1,0,0]) leftfront(); 64 | //translate([12,2,28]) rotate([0,0,0]) cube([10,4,1], center=true); 65 | 66 | translate([0,40,0]) { 67 | leftfront(); 68 | translate([40,0,0]) mirror([1,0,0]) leftfront(); 69 | //translate([12,2,28]) rotate([0,0,0]) cube([10,4,1], center=true); 70 | } 71 | -------------------------------------------------------------------------------- /box_frame/y-axis-bracket.scad: -------------------------------------------------------------------------------- 1 | // PRUSA iteration3 2 | // Y frame brackets 3 | // GNU GPL v3 4 | // Josef Průša 5 | // Václav 'ax' Hůla 6 | // http://www.reprap.org/wiki/Prusa_Mendel 7 | // http://github.com/josefprusa/Prusa3 8 | 9 | // ThingDoc entry 10 | /** 11 | * @id yFrameBracket 12 | * @name Y Axis Frame Bracket 13 | * @category Printed 14 | */ 15 | 16 | include 17 | 18 | module bolt_track(width, length, height) { 19 | hwidth = width / 2; 20 | hdiff = hwidth - height; 21 | union() { 22 | difference() { 23 | rotate([90, 0, 0]) 24 | translate([hwidth, height, -length]) 25 | cylinder(h=length, r=hwidth, $fn=$fn); 26 | 27 | if (height < hwidth) { 28 | translate([0, -1, height - hwidth - 1]) 29 | cube([width, length + 2, hdiff + 1]); 30 | } 31 | } 32 | cube([width, length, height]); 33 | } 34 | } 35 | 36 | function bracket_width(screw_area) = screw_area * 2 + y_threaded_rod_long_r * 2; 37 | function bracket_depth(lip_thickness, screw_area) = screw_area * 2 + lip_thickness; 38 | function bracket_height(lip_length=0) = y_threaded_rod_long_r * 2 + 6 * layer_height + lip_length; 39 | 40 | module yrodbracket(screw_area, lip_thickness, lip_length, bevel_size=2.0) { 41 | inner_radius = threaded_rod_diameter / 2; 42 | screw_center = screw_area / 2; 43 | 44 | width = bracket_width(screw_area); 45 | depth = bracket_depth(lip_thickness, screw_area); 46 | height = bracket_height(lip_length); 47 | 48 | difference() { 49 | translate([0, 0, -lip_length]) 50 | cube_fillet([width, depth, height], bevel_size, top=[2, 2, 2, 2]); 51 | translate([screw_area, -1, -lip_length - lip_thickness]) 52 | bolt_track(y_threaded_rod_long_r * 2, depth + 2, lip_length + lip_thickness + inner_radius); 53 | 54 | translate([-1, lip_thickness, -lip_length - 1]) 55 | cube([width + 2, depth, lip_length + 1]); 56 | 57 | // screw holes 58 | for (x = [screw_center, width - screw_center]) { 59 | for (y = [lip_thickness + screw_center, screw_area + lip_thickness + screw_center]) { 60 | translate([x, y, bracket_height() + 0.1]) 61 | rotate([180, 0, 0]) 62 | screw(head_drop=3, r_head=4.5); 63 | } 64 | } 65 | } 66 | } 67 | 68 | rotate([90, 0, 0]) { 69 | for (x = [0, bracket_width(12) + 5]) { 70 | for (y = [0, bracket_height(3) + 5]) { 71 | translate([x, 0, y]) 72 | yrodbracket(12, 3, 3); 73 | } 74 | } 75 | } 76 | -------------------------------------------------------------------------------- /old_single_plate/src/inc/roundCornersCube.scad: -------------------------------------------------------------------------------- 1 | /* 2 | http://codeviewer.org/view/code:1b36 3 | Copyright (C) 2011 Sergio Vilches 4 | 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 3 of the License, or (at your option) any later version. 5 | 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, see . 6 | Contact: s.vilches.e@gmail.com 7 | 8 | 9 | ----------------------------------------------------------- 10 | Round Corners Cube (Extruded) 11 | roundCornersCube(x,y,z,r) Where: 12 | - x = Xdir width 13 | - y = Ydir width 14 | - z = Height of the cube 15 | - r = Rounding radious 16 | 17 | Example: roundCornerCube(10,10,2,1); 18 | *Some times it's needed to use F6 to see good results! 19 | ----------------------------------------------------------- 20 | */ 21 | // Test it! 22 | // roundCornersCube(10,5,2,1); 23 | 24 | 25 | module createMeniscus(h,radius) // This module creates the shape that needs to be substracted from a cube to make its corners rounded. 26 | difference(){ //This shape is basicly the difference between a quarter of cylinder and a cube 27 | translate([radius/2+0.1,radius/2+0.1,0]){ 28 | cube([radius+0.2,radius+0.1,h+0.2],center=true); // All that 0.x numbers are to avoid "ghost boundaries" when substracting 29 | } 30 | 31 | cylinder(h=h+0.2,r=radius,$fn = 25,center=true); 32 | } 33 | 34 | 35 | module roundCornersCube(x,y,z,r) // Now we just substract the shape we have created in the four corners 36 | difference(){ 37 | cube([x,y,z], center=true); 38 | 39 | translate([x/2-r,y/2-r]){ // We move to the first corner (x,y) 40 | rotate(0){ 41 | createMeniscus(z,r); // And substract the meniscus 42 | } 43 | } 44 | translate([-x/2+r,y/2-r]){ // To the second corner (-x,y) 45 | rotate(90){ 46 | createMeniscus(z,r); // But this time we have to rotate the meniscus 90 deg 47 | } 48 | } 49 | translate([-x/2+r,-y/2+r]){ // ... 50 | rotate(180){ 51 | createMeniscus(z,r); 52 | } 53 | } 54 | translate([x/2-r,-y/2+r]){ 55 | rotate(270){ 56 | createMeniscus(z,r); 57 | } 58 | } 59 | } 60 | 61 | 62 | 63 | 64 | 65 | -------------------------------------------------------------------------------- /old_single_plate/src/z-axis-bottom.scad: -------------------------------------------------------------------------------- 1 | // PRUSA iteration3 2 | // Z axis bottom holder 3 | // GNU GPL v3 4 | // Josef Průša and contributors 5 | // http://www.reprap.org/wiki/Prusa_Mendel 6 | // http://prusamendel.org 7 | 8 | module z_bottom_base(){ 9 | translate([0,0,0]) cube([8,40,16+25]); // plate touching the base 10 | translate([0,-5,0]) cube([30,5.01,22]); // plate touching the base 11 | translate([0,-5,0]) cube([50,15,5]); // plate touching the base 12 | translate([0,-5,0]) cube([18,50,5]); 13 | } 14 | 15 | module z_bottom_fancy(){ 16 | // corner cutouts 17 | translate([0.5,-2.5,0]) rotate([0,0,-45-180]) translate([-15,0,-1]) cube([30,30,51]); 18 | translate([0.5,40-0.5,0]) rotate([0,0,-45+90]) translate([-15,0,-1]) cube([30,30,51]); 19 | //translate([-4,40+5,5]) rotate([0,0,-35-0]) translate([0,0,0.1]) cube([30,30,51]); 20 | translate([-4+11,40+5+5,0]) rotate([0,0,-45-0]) translate([0,0,-1]) cube([30,30,51]); 21 | translate([8,0,12+20+6]) rotate([0,-90,0]) translate([0,-5,0]) cube([30,50,30]); 22 | translate([20,-2,12+8]) rotate([45,0,0]) rotate([0,-90,0]) translate([0,-5,0]) cube([30,50,30]); 23 | translate([8,20,12+30]) rotate([-45,0,0]) rotate([0,-90,0]) translate([0,-5,0]) cube([30,50,30]); 24 | translate([50-2.5,-5+2.5,0]) rotate([0,0,-45-90]) translate([-15,0,-1]) cube([30,30,51]); 25 | translate([50-1.5,10-1.5,0]) rotate([0,0,-45]) translate([-15,0,-1]) cube([30,30,51]); 26 | //translate([0,0,5]) rotate([45+180,0,0]) rotate([0,0,-45+90]) translate([0,0,-15]) cube([30,30,30]); 27 | // Stiffner cut out 28 | translate([30,0,5.5]) rotate([0,-45,0]) translate([0,-5,0]) cube([30,50,30]); 29 | } 30 | 31 | module z_bottom_holes(){ 32 | // Frame mounting screw holes 33 | translate([-1,10,10+5]) rotate([0,90,0]) cylinder(h = 20, r=1.8, $fn=30); 34 | translate([-1,10+20,10+5]) rotate([0,90,0]) cylinder(h = 20, r=1.8, $fn=30); 35 | translate([-1,10+10,10+20+5]) rotate([0,90,0]) cylinder(h = 20, r=1.8, $fn=30); 36 | 37 | // Frame mounting screw head holes 38 | translate([4,10,10+5]) rotate([0,90,0]) cylinder(h = 20, r=3.1, $fn=30); 39 | translate([4,10+20,10+5]) rotate([0,90,0]) cylinder(h = 20, r=3.1, $fn=30); 40 | translate([4,10+10,10+20+5]) rotate([0,90,0]) cylinder(h = 20, r=3.1, $fn=30); 41 | translate([4,10+10-3.1,10+20+5]) cube([10,6.2,10]); 42 | 43 | // Z rod holder 44 | translate([25+4.3,4.2,-1]) rotate([0,0,0]) cylinder(h = 50, r=4.1, $fn=15); 45 | translate([25+4.3-1,3,0.6]) cube([2,10,7]); // it's bit up because it helps with printing 46 | 47 | // motor mounting 48 | translate([25+4.3,21,-1]){ 49 | //translate([15.5,15.5,-1]) cylinder(h = 20, r=1.8, $fn=30); 50 | 51 | translate([15.5,-15.5,-1]) cylinder(h = 20, r=1.8, $fn=30); 52 | translate([-15.5,15.5,-1]) cylinder(h = 20, r=1.8, $fn=30); 53 | translate([-15.5,-15.5,-1]) cylinder(h = 20, r=1.8, $fn=30); 54 | } 55 | 56 | } 57 | 58 | // Final part 59 | module z_bottom_holder(){ 60 | difference(){ 61 | z_bottom_base(); 62 | z_bottom_fancy(); 63 | z_bottom_holes(); 64 | } 65 | translate([0,-13,0]) mirror([0,1,0]) difference(){ 66 | z_bottom_base(); 67 | z_bottom_fancy(); 68 | z_bottom_holes(); 69 | } 70 | } 71 | 72 | z_bottom_holder(); 73 | -------------------------------------------------------------------------------- /old_single_plate/src/inc/nuts_and_bolts.scad: -------------------------------------------------------------------------------- 1 | // Copyright 2010 D1plo1d 2 | 3 | // This library is dual licensed under the GPL 3.0 and the GNU Lesser General Public License as per http://creativecommons.org/licenses/LGPL/2.1/ . 4 | 5 | //testNutsAndBolts(); 6 | 7 | module SKIPtestNutsAndBolts() 8 | { 9 | $fn = 360; 10 | translate([0,15])nutHole(3, proj=2); 11 | boltHole(3, length= 30, proj=2); 12 | } 13 | 14 | MM = "mm"; 15 | INCH = "inch"; //Not yet supported 16 | 17 | //Based on: http://www.roymech.co.uk/Useful_Tables/Screws/Hex_Screws.htm 18 | METRIC_NUT_AC_WIDTHS = 19 | [ 20 | -1, //0 index is not used but reduces computation 21 | -1, 22 | -1, 23 | 6.40,//m3 24 | 8.10,//m4 25 | 9.20,//m5 26 | 11.50,//m6 27 | -1, 28 | 15.00,//m8 29 | -1, 30 | 19.60,//m10 31 | -1, 32 | 22.10,//m12 33 | -1, 34 | -1, 35 | -1, 36 | 27.70,//m16 37 | -1, 38 | -1, 39 | -1, 40 | 34.60,//m20 41 | -1, 42 | -1, 43 | -1, 44 | 41.60,//m24 45 | -1, 46 | -1, 47 | -1, 48 | -1, 49 | -1, 50 | 53.1,//m30 51 | -1, 52 | -1, 53 | -1, 54 | -1, 55 | -1, 56 | 63.5//m36 57 | ]; 58 | METRIC_NUT_THICKNESS = 59 | [ 60 | -1, //0 index is not used but reduces computation 61 | -1, 62 | -1, 63 | 2.40,//m3 64 | 3.20,//m4 65 | 4.00,//m5 66 | 5.00,//m6 67 | -1, 68 | 6.50,//m8 69 | -1, 70 | 8.00,//m10 71 | -1, 72 | 10.00,//m12 73 | -1, 74 | -1, 75 | -1, 76 | 13.00,//m16 77 | -1, 78 | -1, 79 | -1, 80 | 16.00//m20 81 | -1, 82 | -1, 83 | -1, 84 | 19.00,//m24 85 | -1, 86 | -1, 87 | -1, 88 | -1, 89 | -1, 90 | 24.00,//m30 91 | -1, 92 | -1, 93 | -1, 94 | -1, 95 | -1, 96 | 29.00//m36 97 | ]; 98 | 99 | COURSE_METRIC_BOLT_MAJOR_THREAD_DIAMETERS = 100 | [//based on max values 101 | -1, //0 index is not used but reduces computation 102 | -1, 103 | -1, 104 | 2.98,//m3 105 | 3.978,//m4 106 | 4.976,//m5 107 | 5.974,//m6 108 | -1, 109 | 7.972,//m8 110 | -1, 111 | 9.968,//m10 112 | -1, 113 | 11.966,//m12 114 | -1, 115 | -1, 116 | -1, 117 | 15.962,//m16 118 | -1, 119 | -1, 120 | -1, 121 | 19.958,//m20 122 | -1, 123 | -1, 124 | -1, 125 | 23.952,//m24 126 | -1, 127 | -1, 128 | -1, 129 | -1, 130 | -1, 131 | 29.947,//m30 132 | -1, 133 | -1, 134 | -1, 135 | -1, 136 | -1, 137 | 35.940//m36 138 | ]; 139 | 140 | module nutHole(size, units=MM, tolerance = +0.0001, proj = -1) 141 | { 142 | //takes a metric screw/nut size and looksup nut dimensions 143 | radius = METRIC_NUT_AC_WIDTHS[size]/2+tolerance; 144 | height = METRIC_NUT_THICKNESS[size]+tolerance; 145 | if (proj == -1) 146 | { 147 | cylinder(r= radius, h=height, $fn = 6, center=[0,0]); 148 | } 149 | if (proj == 1) 150 | { 151 | circle(r= radius, $fn = 6); 152 | } 153 | if (proj == 2) 154 | { 155 | translate([-radius/2, 0]) 156 | square([radius*2, height]); 157 | } 158 | } 159 | 160 | module boltHole(size, units=MM, length, tolerance = +0.0001, proj = -1) 161 | { 162 | radius = COURSE_METRIC_BOLT_MAJOR_THREAD_DIAMETERS[size]/2+tolerance; 163 | //TODO: proper screw cap values 164 | capHeight = METRIC_NUT_THICKNESS[size]+tolerance; //METRIC_BOLT_CAP_HEIGHTS[size]+tolerance; 165 | capRadius = METRIC_NUT_AC_WIDTHS[size]/2+tolerance; //METRIC_BOLT_CAP_RADIUS[size]+tolerance; 166 | 167 | if (proj == -1) 168 | { 169 | translate([0, 0, -capHeight]) 170 | cylinder(r= capRadius, h=capHeight); 171 | cylinder(r = radius, h = length); 172 | } 173 | if (proj == 1) 174 | { 175 | circle(r = radius); 176 | } 177 | if (proj == 2) 178 | { 179 | translate([-capRadius/2, -capHeight]) 180 | square([capRadius*2, capHeight]); 181 | square([radius*2, length]); 182 | } 183 | } 184 | -------------------------------------------------------------------------------- /box_frame/extras/wade-gears.scad: -------------------------------------------------------------------------------- 1 | // Herringbone extruder gears 2 | // GNU GPL v3 3 | // Václav 'ax' Hůla 4 | // Josef Průša 5 | 6 | // ThingDoc entry 7 | /** 8 | * @name Greg's Large Gear 9 | * @id large-gear 10 | */ 11 | 12 | /** 13 | * @name Greg's Small Gear 14 | * @id small-gear 15 | */ 16 | 17 | include <../configuration.scad> 18 | use 19 | 20 | gear_distance = 40; 21 | 22 | small(); 23 | %translate([gear_distance, 0, 0]) rotate([0, 180, 92]) big(); //this should touch, teeth should mesh 24 | translate([-gear_distance - 10, 10, 0]) big(); 25 | 26 | gear_width=12; 27 | teeth_small=15; 28 | teeth_big=49; 29 | teeth_twist=400; 30 | circular_pitch = (gear_distance * 180 * 2) / (teeth_small + teeth_big); 31 | echo (circular_pitch); 32 | 33 | module small(){ 34 | difference() { 35 | union() { 36 | mirror([0, 0, 1 ]) gear (number_of_teeth=teeth_small, 37 | circular_pitch=circular_pitch, 38 | gear_thickness = gear_width/2, 39 | rim_thickness = gear_width/2, 40 | hub_thickness = 0, 41 | hub_diameter = 18, 42 | bore_diameter = 5.25, 43 | circles=0, 44 | twist = teeth_twist/teeth_small); 45 | gear (number_of_teeth=teeth_small, 46 | circular_pitch=circular_pitch, 47 | gear_thickness = gear_width/2, 48 | rim_thickness = gear_width, 49 | hub_thickness = 0, 50 | hub_diameter = 18, 51 | bore_diameter = 5.25, 52 | circles=0, 53 | twist = teeth_twist/teeth_small*2); 54 | //hub. Two part to make it thicker 55 | translate([0, 0, gear_width / 2 + 0.5]) { 56 | cylinder(r1=8, r2=11, h=2.5); 57 | } 58 | translate([0, 0, gear_width / 2 + 3]) { 59 | cylinder(r=11, h=6); 60 | } 61 | } 62 | //bore 63 | translate([0, 0, -gear_width / 2 + 0.1]) cylinder(r=5.25 / 2, h=gear_width + 9.2); 64 | 65 | translate([0, 0, gear_width / 2 + 4.5]) rotate([0, 90, 0]) { 66 | cylinder(r=m3_diameter / 2, h=20); 67 | translate([0, 0, 5]) nut(m3_nut_diameter, 2.5, false); 68 | translate([-10, -m3_nut_diameter / 2, 5]) cube([10, m3_nut_diameter, 2.5]); 69 | } 70 | } 71 | } 72 | 73 | hole_size=6.6; 74 | 75 | module big(){ 76 | difference() { 77 | union(){ 78 | mirror([0, 0, 1]) gear (number_of_teeth=teeth_big, 79 | circular_pitch=circular_pitch, 80 | gear_thickness = gear_width/2, 81 | rim_thickness = gear_width/2, 82 | hub_thickness = 0, 83 | hub_diameter = 0, 84 | bore_diameter = 0, 85 | circles=0, 86 | twist = teeth_twist/teeth_big); 87 | gear (number_of_teeth=teeth_big, 88 | circular_pitch=circular_pitch, 89 | gear_thickness = gear_width/2, 90 | rim_thickness = gear_width/2, 91 | hub_thickness = 0, 92 | hub_diameter = 18, 93 | bore_diameter = 18, 94 | circles=0, 95 | twist = teeth_twist/teeth_big); 96 | } 97 | //reduce mass 98 | translate([0, 0, 3 - gear_width / 2]) rotate([0, 0, 90]) 99 | cylinder(r1=24, r2=28, h=gear_width - layer_height * 9 + 1, $fn=36); 100 | //bore 101 | translate([0, 0, -gear_width / 2 - 0.1]) cylinder(r=m8_diameter / 2, h=gear_width + 9.2); 102 | for (hole=[0:5]) { 103 | rotate([0, 0, 360 / 6 * hole + 30]) translate([17,0,-10]) rotate(12) { 104 | cylinder(r=hole_size, h=20); 105 | cube([hole_size, hole_size, 20]); 106 | } 107 | } 108 | 109 | } 110 | //threaded bolt trap 111 | difference(){ 112 | translate([0, 0, -gear_width / 2]) cylinder(r=10, h=7 + layer_height * 9); 113 | translate([0, 0, -gear_width / 2 + layer_height * 6 + 2]) nut(13.1, h=10); 114 | translate([0, 0, -gear_width / 2 - 0.1]) cylinder(r=m8_diameter / 2, h=gear_width + 9.2); 115 | } 116 | 117 | } 118 | -------------------------------------------------------------------------------- /box_frame/y-drivetrain.scad: -------------------------------------------------------------------------------- 1 | // PRUSA iteration3 2 | // Y drivetrain (idler and stepper holders) 3 | // GNU GPL v3 4 | // Josef Průša 5 | // Václav 'ax' Hůla 6 | // http://www.reprap.org/wiki/Prusa_Mendel 7 | // http://github.com/josefprusa/Prusa3 8 | 9 | // ThingDoc entry 10 | /** 11 | * @id yMotorHolder 12 | * @name Y Axis Motor Holder 13 | * @category Printed 14 | */ 15 | 16 | /** 17 | * @id yIdler 18 | * @name Y Axis Belt Idler 19 | * @category Printed 20 | */ 21 | 22 | include 23 | use 24 | 25 | module motorholder(thickness=10){ 26 | difference(){ 27 | union(){ 28 | // Motor holding part 29 | translate([29, -21 + 50, 0]) 30 | { 31 | difference(){ 32 | union(){ 33 | translate([-21 + 4.5, 0, 5]) cube([9, 31, thickness], center=true); 34 | nema17([0, 1, 1, 0], thickness=thickness, shadow=false); 35 | mirror([0, 0, 1]) translate([0, 0, -10]) nema17([0, 1, 1, 0], thickness=thickness, shadow=7); 36 | // Parts joining part 37 | translate([-29, -21, 0]) cube([14, 30, thickness]); 38 | } 39 | // Motor mounting holes 40 | translate([0, 0, thickness]) mirror([0, 0, 1]) nema17([0, 1, 1, 0], thickness=thickness, holes=true); 41 | } 42 | } 43 | 44 | // Front holding part 45 | translate([0, 10, 0]) cylinder(h = thickness, r=8); 46 | translate([0, 20, 5]) cube([16, 20, thickness], center=true); 47 | translate([0, 30, 0]) cylinder(h = thickness, r=8); 48 | } 49 | translate([0, 10, -1]) cylinder(h = 12, r=4.5, $fn=32); 50 | translate([0, 30, -1]) cylinder(h = 12, r=4.5, $fn=32); 51 | } 52 | } 53 | 54 | module oval(r=4, l=14, h=2){ 55 | intersection() { 56 | union() { 57 | translate([l / 2, 0, 0]) cylinder(r=r, h=h, $fn=4); 58 | //translate([-l / 2, 0, 0]) cylinder(r=r, h=h, $fn=4); 59 | translate([0, 0, h / 2]) cube([l, r * 2, h], center=true); 60 | } 61 | translate([0, 0, h / 2]) cube([l + r * 1.2, r * 2, h], center=true); 62 | } 63 | } 64 | 65 | module idlermount(len=45, narrow_len=0, narrow_width=0, rod=threaded_rod_diameter_horizontal / 2, idler_height=16){ 66 | difference(){ 67 | union(){ 68 | //wide part holding bearing 69 | translate([- (10 + idler_width) / 2, -25 + narrow_len, 0] ) cube_fillet([10 + idler_width, len + idler_bearing[2] * 1.1 - narrow_len, idler_height]); 70 | //For X there is narrow part inside the x-idler 71 | if (narrow_len > 0){ 72 | translate([-narrow_width / 2, -25, 0] ) cube_fillet([narrow_width, len + idler_bearing[2], idler_height], vertical=[0, 0, 2, 2]); 73 | mirror([1, 0, 0]) translate([-narrow_width / 2, narrow_len -25, idler_height / 2 ]) fillet(1.5, idler_height - 0.04, $fn=8); 74 | translate([-narrow_width / 2, narrow_len -25, idler_height / 2]) fillet(1.5, idler_height - 0.04, $fn=8); 75 | } 76 | } 77 | translate([-12, -8, idler_height / 2]) rotate([90, 0, 90]) oval(r=rod + 0.01, l=12, h=25); 78 | translate([0, -13 - single_wall_width*2, idler_height / 2]) { 79 | // nut for tensioning screw 80 | translate([0,0,0]) rotate([90, 0, 0]) cylinder(r=m4_nut_diameter_horizontal / 2, h=3.8, $fn=6); 81 | // nut insert 82 | translate([-2, -3.8, -m4_diameter * 1.5 / 2]) cube([20, 3.8, m4_diameter * 1.5+0.3]); 83 | } 84 | 85 | // tensioning screw goes here 86 | translate([0, -19, idler_height / 2]) rotate([90, 90, 0]) cylinder(r=m4_diameter / 2, h=15, $fn=small_hole_segments, center=true); 87 | // bearing goes there 88 | translate([0, len + idler_bearing[2] - 35, idler_height / 2]) { 89 | rotate([0, 90, 0]) idler_assy(idler_bearing); 90 | translate([0, 10, 0]) cube([idler_width + 1, 20, idler_height + 2], center=true); 91 | } 92 | 93 | } 94 | } 95 | 96 | 97 | motorholder(); 98 | translate([32, 25, 0]) idlermount(); 99 | 100 | if (idler_bearing[3] == 1) { 101 | translate([0, -12 - idler_bearing[0] / 2, 0]) { 102 | render() bearing_assy(); 103 | } 104 | } 105 | -------------------------------------------------------------------------------- /box_frame/common.tdoc: -------------------------------------------------------------------------------- 1 | /** 2 | * 10mm threaded rod or 3/8 to 7/16 in imperial variant 3 | * @name M10 Threaded Rod 4 | * @common 5 | * @category Vitamins 6 | * @id m10threadedRod 7 | */ 8 | 9 | /** 10 | * Simple M10 nut or 3/8 to 7/16 in imperial variant 11 | * @common 12 | * @name M10 nut 13 | * @category Vitamins 14 | * @id m10nut 15 | */ 16 | 17 | /** 18 | * @name M10 washer 19 | * @common 20 | * @category Vitamins 21 | * @id m10washer 22 | */ 23 | 24 | /** 25 | * Simple M8 nut or 5/16 in imperial variant. 26 | * also can be used for other screwing things :-D 27 | * @common 28 | * @name M8 nut 29 | * @category Vitamins 30 | * @id m8nut 31 | */ 32 | 33 | /** 34 | * @name M8 washer 35 | * @common 36 | * @category Vitamins 37 | * @id m8washer 38 | */ 39 | 40 | /** 41 | * @name M8 washer mudguard 42 | * @common 43 | * @category Vitamins 44 | * @id m8washer-big 45 | */ 46 | 47 | /** 48 | * @name M8 spring 49 | * @common 50 | * @category Vitamins 51 | * @id m8spring 52 | */ 53 | 54 | /** 55 | * 8mm threaded rod or 5/16 in imperial variant 56 | * @name M8 Threaded Rod 57 | * @common 58 | * @category Vitamins 59 | * @id m8threadedRod 60 | */ 61 | 62 | /** 63 | * @name M8 Smooth Rod 64 | * @common 65 | * @category Vitamins 66 | * @id m8smoothRod 67 | */ 68 | 69 | /** 70 | * @name M8 30mm screw 71 | * @common 72 | * @category Vitamins 73 | * @id m8x30 74 | */ 75 | 76 | 77 | /** 78 | * @name M3 nut 79 | * @common 80 | * @category Vitamins 81 | * @id m3nut 82 | */ 83 | 84 | /** 85 | * @name M4 nut 86 | * @common 87 | * @category Vitamins 88 | * @id m4nut 89 | */ 90 | 91 | /** 92 | * @name M3 washer 93 | * @common 94 | * @category Vitamins 95 | * @id m3washer 96 | */ 97 | 98 | /** 99 | * @name M3 10mm screw 100 | * @common 101 | * @category Vitamins 102 | * @id m3x10 103 | */ 104 | 105 | /** 106 | * @name M3 10mm screw with hex head 107 | * @common 108 | * @category Vitamins 109 | * @id m3x10xhex 110 | */ 111 | 112 | /** 113 | * @name M3 grub screw 114 | * @common 115 | * @category Vitamins 116 | * @id m3xgrubscrew 117 | */ 118 | 119 | /** 120 | * @name M3 10mm screw with flat head 121 | * @common 122 | * @category Vitamins 123 | * @id m3x10xflat 124 | */ 125 | 126 | /** 127 | * @name M3 20mm screw 128 | * @common 129 | * @category Vitamins 130 | * @id m3x20 131 | */ 132 | 133 | /** 134 | * @name M3 40mm screw 135 | * @common 136 | * @category Vitamins 137 | * @id m3x40 138 | */ 139 | 140 | /** 141 | * @name M3 20mm screw with hex head 142 | * @common 143 | * @category Vitamins 144 | * @id m3x20xhex 145 | */ 146 | 147 | /** 148 | * @name M3 25mm screw 149 | * @common 150 | * @category Vitamins 151 | * @id m3x25 152 | */ 153 | 154 | /** 155 | * @name M3 25mm screw with HEX head 156 | * @common 157 | * @category Vitamins 158 | * @id m3x25xhex 159 | */ 160 | 161 | /** 162 | * @name M3 15mm screw with HEX head 163 | * @common 164 | * @category Vitamins 165 | * @id m3x15xhex 166 | */ 167 | 168 | /** 169 | * @name M4 25mm screw 170 | * @common 171 | * @category Vitamins 172 | * @id m4x25 173 | */ 174 | 175 | /** 176 | * 608 Bearing. When you have troubles finding it, try your local skateshop, because its used in skateboards. 177 | * @name 608 skate bearing 178 | * @common 179 | * @image common/608.jpg 180 | * @category Vitamins 181 | * @id bearing-608 182 | */ 183 | 184 | /** 185 | * @name NEMA17 stepper motor 186 | * @common 187 | * @category Power Transmission 188 | * @id NEMA17 189 | */ 190 | 191 | /** 192 | * @name Belt Pulley 193 | * @id beltPulley 194 | * @category Power Transmission 195 | */ 196 | 197 | /** 198 | * @name Timing Belt 199 | * @category Power Transmission 200 | * @id belt 201 | */ 202 | 203 | /** 204 | * @name Linear Bearing 205 | * @category Vitamins 206 | * @id lm8uu 207 | */ 208 | 209 | /** 210 | * @name 5mm Vinyl Tubing 211 | * @category Power Transmission 212 | * @id couplerTubing 213 | */ 214 | 215 | /** 216 | * @name Controller Electronics 217 | * @category Electronics 218 | * @id electronics 219 | */ 220 | 221 | /** 222 | * @name M3.5x20 Wood Screw 223 | * @id woodScrew 224 | * @category Vitamins 225 | */ 226 | 227 | /** 228 | * @name 3mm thick spacer 229 | * @category Miscellaneous 230 | * @id spacer 231 | */ 232 | 233 | /** 234 | * @name 45cm x 10cm x 12mm plate 235 | * @category Wood 236 | * @id plate 237 | */ 238 | 239 | /** 240 | * @name 47.5cm x 10cm x 12mm plate 241 | * @category Wood 242 | * @id longPlate 243 | */ 244 | 245 | /** 246 | * @name 23x23cm 12mm plate 247 | * @category Wood 248 | * @id buildPlatform 249 | */ 250 | 251 | /** 252 | * @name 20x20cm 4mm glass plate 253 | * @category Glass 254 | * @id buildSurface 255 | */ 256 | 257 | 258 | -------------------------------------------------------------------------------- /box_frame/doc/complete-printer.scad: -------------------------------------------------------------------------------- 1 | // PRUSA iteration3 2 | // Complete printer visualisation 3 | // GNU GPL v3 4 | // Greg Frost 5 | // http://www.reprap.org/wiki/Prusa_Mendel 6 | // http://github.com/josefprusa/Prusa3 7 | 8 | include <../configuration.scad> 9 | use <../y-drivetrain.scad> 10 | use <../y-axis-corner.scad> 11 | use <../z-axis.scad> 12 | use <../x-end.scad> 13 | use <../x-carriage.scad> 14 | 15 | module nutwasher(){ 16 | color("silver") 17 | difference(){ 18 | union(){ 19 | translate([0,0,2])cylinder(r=15/2,h=7,$fn=6); 20 | translate([0,0,0.5])cylinder(r=8.5,h=1); 21 | } 22 | translate([0,0,-1])cylinder(r=8/2,h=12); 23 | } 24 | } 25 | 26 | // y motor mount 27 | translate([56-yrodseparation/2,-y_smooth_rod_length/2+9,0]) 28 | { 29 | rotate([0,90,0]) rotate([0,0,90]) motorholder(); 30 | translate([10,0,30])rotate([0,90,0])nutwasher(); 31 | translate([0,0,30])rotate([0,90,180])nutwasher(); 32 | translate([10,0,10])rotate([0,90,0])nutwasher(); 33 | translate([0,0,10])rotate([0,90,180])nutwasher(); 34 | } 35 | 36 | // y idler mount 37 | translate([70-yrodseparation/2,y_smooth_rod_length/2-9,30]) 38 | { 39 | translate([0,0-33,-8]) 40 | rotate([0,-90,0]) idlermount(); 41 | translate([0,0,0])rotate([0,90,0])nutwasher(); 42 | translate([-20,0,0])rotate([0,90,180])nutwasher(); 43 | } 44 | 45 | yrodseparation=100; 46 | 47 | module yfront() 48 | { 49 | // corners 50 | leftfront(); 51 | translate([yrodseparation,0,0]) mirror([1,0,0]) leftfront(); 52 | 53 | // front bottom threaded rod 54 | color("Aqua") 55 | translate([-20,9,10]) rotate([0,90,0]) cylinder(h = 140, r=4); 56 | 57 | translate([yrodseparation+11,9,10])rotate([0,90,0])nutwasher(); 58 | translate([yrodseparation-11,9,10])rotate([0,90,180])nutwasher(); 59 | 60 | translate([-11,9,10])rotate([0,90,180])nutwasher(); 61 | translate([11,9,10])rotate([0,90,0])nutwasher(); 62 | 63 | // front top threaded rod 64 | color("Aqua") 65 | translate([-20,9,30]) rotate([0,90,0]) cylinder(h = 140, r=4); 66 | 67 | % translate([-11,9,30])rotate([0,90,180])nutwasher(); 68 | % translate([11,9,30])rotate([0,90,0])nutwasher(); 69 | 70 | % translate([yrodseparation-11,9,30])rotate([0,90,180])nutwasher(); 71 | % translate([yrodseparation+11,9,30])rotate([0,90,0])nutwasher(); 72 | } 73 | 74 | translate([-yrodseparation/2,-y_smooth_rod_length/2]) 75 | { 76 | yfront(); 77 | translate([0,y_smooth_rod_length,0]) 78 | mirror([0,1,0]) 79 | yfront(); 80 | } 81 | 82 | module yside() 83 | { 84 | translate([-yrodseparation/2,0]) 85 | { 86 | // left top rod 87 | color("MediumBlue") 88 | translate([0,0,45]) rotate([0,90,90]) cylinder(h = y_smooth_rod_length, r=4,center=true); 89 | //left bottom rod 90 | color("Aqua") 91 | translate([0,0,20]) rotate([0,90,90]) cylinder(h = 430, r=4,center=true); 92 | // middle nuts 93 | translate([0,0,20])rotate([0,-90,90])nutwasher(); 94 | translate([0,board_thickness,20])rotate([0,90,90])nutwasher(); 95 | 96 | // back nuts 97 | translate([0,y_smooth_rod_length/2+2,20])rotate([0,90,90])nutwasher(); 98 | translate([0,y_smooth_rod_length/2+2-22,20])rotate([0,90,-90])nutwasher(); 99 | // front nuts 100 | translate([0,-y_smooth_rod_length/2-2,20])rotate([0,90,-90])nutwasher(); 101 | translate([0,-y_smooth_rod_length/2-2+22,20])rotate([0,90,90])nutwasher(); 102 | } 103 | } 104 | 105 | yside(); 106 | translate([yrodseparation,0,0])yside(); 107 | 108 | // heat bed 109 | color("Lime",0.25) 110 | translate([0,0,58]) cube([bed_x_size,bed_y_size,6], center=true); 111 | 112 | board_sides=50; 113 | board_w=bed_x_size+10+2*board_sides; 114 | 115 | // XZ board 116 | translate([0,board_thickness/2,150]) 117 | %difference() 118 | { 119 | cube([board_w,board_thickness,300],true); 120 | translate([0,0,-15]) 121 | cube([bed_x_size+10,board_thickness+2,200],true); 122 | } 123 | 124 | 125 | // Z motor mounts 126 | translate([-board_w/2-5,0,42]) 127 | rotate(-90) 128 | zmotorholder(); 129 | 130 | translate([board_w/2+5,0,42]) 131 | rotate(-90) 132 | mirror([0,1,0]) 133 | zmotorholder(); 134 | 135 | // Z rod mounts 136 | translate([-board_w/2-5,0,260]) 137 | rotate(-90) 138 | zrodholder(); 139 | 140 | translate([board_w/2+5,0,260]) 141 | rotate(-90) 142 | mirror([0,1,0]) 143 | zrodholder(); 144 | 145 | // Z rods 146 | module z_rods() 147 | { 148 | color("MediumBlue") 149 | translate([board_w/2-4,-26,42])cylinder(h=z_smooth_rod_length,r=4); 150 | } 151 | 152 | z_rods(); 153 | mirror([1,0,0])z_rods(); 154 | 155 | // X ends 156 | translate([-board_w/2+4,-26,200]) 157 | rotate([0,0,90]) 158 | rotate([0,180,0]) 159 | x_end_motor(); 160 | 161 | translate([board_w/2-4,-26,200]) 162 | rotate(90) 163 | rotate([0,180,0]) 164 | x_end_idler(); 165 | 166 | // X rods 167 | for(i=[0:1]) 168 | color("MediumBlue") 169 | translate([0,-12,149+i*45])rotate([0,90,0])cylinder(h=300,r=4,center=true); 170 | 171 | // X carriage 172 | translate([0,-12,149]) 173 | rotate([0,90,0]) 174 | x_carriage(); -------------------------------------------------------------------------------- /box_frame/configuration.scad.dist: -------------------------------------------------------------------------------- 1 | // PRUSA iteration3 2 | // Configuration file 3 | // GNU GPL v3 4 | // Josef Průša 5 | // Václav 'ax' Hůla 6 | // http://www.reprap.org/wiki/Prusa_Mendel 7 | // http://github.com/josefprusa/Prusa3 8 | 9 | include ; 10 | include ; 11 | 12 | // Custom settings here, tailor to your supplies and print settings 13 | 14 | // Extruder settings ********************************************************** 15 | // Don't forget to set your slicer's extruder settings to match the values you 16 | // enter here. 17 | 18 | layer_height = 0.3; 19 | // Width over thickness determines how wide the plastic will be when extruded 20 | // onto the object that is being printed. width_over_thickness is multiplied 21 | // by the layer_height to calculate this width. i.e. If your layer_height is 22 | // set to 0.3 mm and your width_over_thickness is set to 2.2, the resulting 23 | // width will be 0.66 mm. 24 | width_over_thickness = 2.2; 25 | 26 | // Select your belt type ****************************************************** 27 | 28 | // T2.5 29 | //belt_width = 6.5; //add 0.5 to actual width 30 | //belt_tooth_distance = 2.5; 31 | //belt_tooth_ratio = 0.75; 32 | //belt_thickness = 0.8; 33 | 34 | // T5 (strongly discouraged) 35 | //belt_width = 6.5; 36 | //belt_tooth_distance = 5; 37 | //belt_tooth_ratio = 0.75; 38 | //belt_thickness = 0.8; 39 | 40 | // HTD3 41 | //belt_width = 9.5; 42 | //belt_tooth_distance = 3; 43 | //belt_tooth_ratio = 0.75; 44 | //belt_thickness = 1.75; 45 | 46 | // MXL 47 | //belt_width = 6.5; 48 | //belt_tooth_distance = 2.032; 49 | //belt_tooth_ratio = 0.64; 50 | //belt_thickness = i have no idea; 51 | 52 | // GT2 53 | // there is bunch of GT2 belts with different tooth-to-tooth distance 54 | // this one is most common in reprap world 55 | // adjust to your needs. 56 | belt_width = 6.5; 57 | belt_tooth_distance = 2; 58 | belt_tooth_ratio = 0.5; 59 | belt_thickness = 0.8; 60 | 61 | // Choose bearing/bushing configuration *************************************** 62 | // conf_b_* are in inc/conf_bushing.scad 63 | 64 | bushing_xy = conf_b_lm8uu; 65 | bushing_z = conf_b_lm8uu; 66 | // for longer bearings use one shorter in x-carriage to make place for belt attachment 67 | // by default use same as xy 68 | bushing_carriage = bushing_xy; 69 | 70 | 71 | // Select idler bearing size ************************************************** 72 | // bearing_* are in inc/conf_bushing.scad 73 | 74 | idler_bearing = bearing_623; 75 | 76 | // Select carriage lenght ****************************************************** 77 | // 30 for single carriage extruder (two holes with centers 30mm apart) 78 | // 50 for wade or single with fan (three holes, 30-20) 79 | // 80 for full length carriage (four holes, 30-20-30) 80 | 81 | carriage_l_base = 50; 82 | 83 | 84 | // Fillets ******************************************************************** 85 | // fillets are rounded corners of boxes. The right engineering term is probably radius 86 | // but cad software calls it fillet. 87 | // mostly cosmetic, except z axis. 88 | // 0 = no fillets 89 | // 1 = fillet 90 | // 2 = chamfer (cut the edges at 45deg. angle) 91 | // Please do put only parts with fillets on sale, other options are not really tested 92 | 93 | use_fillets = 1; 94 | 95 | // set to 0 for single plate (affects z axis and screws that attach RP parts to frame) 96 | i_am_box = 0; 97 | 98 | // if you do your own plate and can move bottom Z screws 5mm up set this to 0 to 99 | // get stronger motor mount. Only for i_am_box = 0 100 | i_want_to_use_single_plate_dxf_and_make_my_z_weaker = 1; 101 | 102 | 103 | // Radius of long threaded rod on Y frame 104 | 105 | // Affects y-axis-corner (both box and single plate) 106 | // and y-axis-bracket (box only) 107 | 108 | //Use 5.4 for M10 or 4.4 for M8 109 | y_threaded_rod_long_r = 5.4; 110 | 111 | 112 | // Thickness of the boards that make the box frame. 113 | 114 | // in y-axis-corner it governs the height of the corners by adjusting the 115 | // distance between ground and M10 threaded rod. (both box and single plate) 116 | 117 | // For box model, the parts that hold Z smooth rod have one hole from front 118 | // and one from side, and this setting makes sure that the screw from side 119 | // is in the center of the plank. 120 | 121 | // Use 12 for single plate 122 | // or 20 if you want to use the Y lm8uu holders 123 | // (extras/bearing-holder-single-plate-y) 124 | board_thickness = 12; 125 | 126 | // Segments of small holes. some poeple claim that a low value makes them easier to print. 127 | small_hole_segments=7; 128 | 129 | // functions 130 | include ; 131 | include ; 132 | 133 | // These constants define the geometry of the doc/complete-printer.scad 134 | bed_x_size=225; 135 | bed_y_size=225; 136 | x_smooth_rod_length=380+board_thickness*2; 137 | y_smooth_rod_length=400; 138 | z_smooth_rod_length=320; 139 | -------------------------------------------------------------------------------- /box_frame/sample_stls/big_htd3_lm12luu/configuration.scad: -------------------------------------------------------------------------------- 1 | // PRUSA iteration3 2 | // Configuration file 3 | // GNU GPL v3 4 | // Josef Průša 5 | // Václav 'ax' Hůla 6 | // http://www.reprap.org/wiki/Prusa_Mendel 7 | // http://github.com/josefprusa/Prusa3 8 | 9 | include ; 10 | include ; 11 | 12 | // Custom settings here, tailor to your supplies and print settings 13 | 14 | // Extruder settings ********************************************************** 15 | // Don't forget to set your slicer's extruder settings to match the values you 16 | // enter here. 17 | 18 | layer_height = 0.3; 19 | // Width over thickness determines how wide the plastic will be when extruded 20 | // onto the object that is being printed. width_over_thickness is multiplied 21 | // by the layer_height to calculate this width. i.e. If your layer_height is 22 | // set to 0.3 mm and your width_over_thickness is set to 2.2, the resulting 23 | // width will be 0.66 mm. 24 | width_over_thickness = 2.2; 25 | 26 | // Select your belt type ****************************************************** 27 | 28 | // T2.5 29 | //belt_width = 6.5; //add 0.5 to actual width 30 | //belt_tooth_distance = 2.5; 31 | //belt_tooth_ratio = 0.75; 32 | //belt_thickness = 0.8; 33 | 34 | // T5 (strongly discouraged) 35 | //belt_width = 6.5; 36 | //belt_tooth_distance = 5; 37 | //belt_tooth_ratio = 0.75; 38 | //belt_thickness = 0.8; 39 | 40 | // HTD3 41 | belt_width = 9.5; 42 | belt_tooth_distance = 3; 43 | belt_tooth_ratio = 0.75; 44 | belt_thickness = 1.75; 45 | 46 | // MXL 47 | //belt_width = 6.5; 48 | //belt_tooth_distance = 2.032; 49 | //belt_tooth_ratio = 0.64; 50 | //belt_thickness = i have no idea; 51 | 52 | // GT2 53 | // there is bunch of GT2 belts with different tooth-to-tooth distance 54 | // this one is most common in reprap world 55 | // adjust to your needs. 56 | //belt_width = 6.5; 57 | //belt_tooth_distance = 2; 58 | //belt_tooth_ratio = 0.5; 59 | //belt_thickness = 0.8; 60 | 61 | // Choose bearing/bushing configuration *************************************** 62 | // conf_b_* are in inc/conf_bushing.scad 63 | 64 | bushing_xy = conf_b_lm12luu; 65 | bushing_z = conf_b_lm12luu; 66 | // for longer bearings use one shorter in x-carriage to make place for belt attachment 67 | // by default use same as xy 68 | bushing_carriage = conf_b_lm12uu; 69 | 70 | // Select idler bearing size ************************************************** 71 | // bearing_* are in inc/conf_bushing.scad 72 | 73 | idler_bearing = bearing_623; 74 | 75 | // Select carriage lenght ****************************************************** 76 | // 30 for single carriage extruder (two holes with centers 30mm apart) 77 | // 50 for wade or single with fan (three holes, 30-20) 78 | // 80 for full length carriage (four holes, 30-20-30) 79 | 80 | carriage_l_base = 80; 81 | 82 | 83 | // Fillets ******************************************************************** 84 | // fillets are rounded corners of boxes. The right engineering term is probably radius 85 | // but cad software calls it fillet. 86 | // mostly cosmetic, except z axis. 87 | // 0 = no fillets 88 | // 1 = fillet 89 | // 2 = chamfer (cut the edges at 45deg. angle) 90 | // Please do put only parts with fillets on sale, other options are not really tested 91 | 92 | use_fillets = 1; 93 | 94 | // set to 0 for single plate (affects z axis and screws that attach RP parts to frame) 95 | i_am_box = 1; 96 | 97 | // if you do your own plate and can move bottom Z screws 5mm up set this to 0 to 98 | // get stronger motor mount. Only for i_am_box = 0 99 | i_want_to_use_single_plate_dxf_and_make_my_z_weaker = 1; 100 | 101 | 102 | // Radius of long threaded rod on Y frame 103 | 104 | // Affects y-axis-corner (both box and single plate) 105 | // and y-axis-bracket (box only) 106 | 107 | //Use 5.4 for M10 or 4.4 for M8 108 | y_threaded_rod_long_r = 5.4; 109 | 110 | 111 | // Thickness of the boards that make the box frame. 112 | 113 | // in y-axis-corner it governs the height of the corners by adjusting the 114 | // distance between ground and M10 threaded rod. (both box and single plate) 115 | 116 | // For box model, the parts that hold Z smooth rod have one hole from front 117 | // and one from side, and this setting makes sure that the screw from side 118 | // is in the center of the plank. 119 | 120 | // Use 12 for single plate 121 | // or 20 if you want to use the Y lm8uu holders 122 | // (extras/bearing-holder-single-plate-y) 123 | board_thickness = 18; 124 | 125 | // Segments of small holes. some poeple claim that a low value makes them easier to print. 126 | small_hole_segments=7; 127 | 128 | // functions 129 | include ; 130 | include ; 131 | 132 | // These constants define the geometry of the doc/complete-printer.scad 133 | bed_x_size=305; 134 | bed_y_size=305; 135 | x_smooth_rod_length=600+board_thickness*2; 136 | y_smooth_rod_length=490; 137 | z_smooth_rod_length=405; 138 | -------------------------------------------------------------------------------- /box_frame/sample_stls/single_plate_gt2_lm8uu/configuration.scad: -------------------------------------------------------------------------------- 1 | // PRUSA iteration3 2 | // Configuration file 3 | // GNU GPL v3 4 | // Josef Průša 5 | // Václav 'ax' Hůla 6 | // http://www.reprap.org/wiki/Prusa_Mendel 7 | // http://github.com/josefprusa/Prusa3 8 | 9 | include ; 10 | include ; 11 | 12 | // Custom settings here, tailor to your supplies and print settings 13 | 14 | // Extruder settings ********************************************************** 15 | // Don't forget to set your slicer's extruder settings to match the values you 16 | // enter here. 17 | 18 | layer_height = 0.3; 19 | // Width over thickness determines how wide the plastic will be when extruded 20 | // onto the object that is being printed. width_over_thickness is multiplied 21 | // by the layer_height to calculate this width. i.e. If your layer_height is 22 | // set to 0.3 mm and your width_over_thickness is set to 2.2, the resulting 23 | // width will be 0.66 mm. 24 | width_over_thickness = 2.2; 25 | 26 | // Select your belt type ****************************************************** 27 | 28 | // T2.5 29 | //belt_width = 6.5; //add 0.5 to actual width 30 | //belt_tooth_distance = 2.5; 31 | //belt_tooth_ratio = 0.75; 32 | //belt_thickness = 0.8; 33 | 34 | // T5 (strongly discouraged) 35 | //belt_width = 6.5; 36 | //belt_tooth_distance = 5; 37 | //belt_tooth_ratio = 0.75; 38 | //belt_thickness = 0.8; 39 | 40 | // HTD3 41 | //belt_width = 9.5; 42 | //belt_tooth_distance = 3; 43 | //belt_tooth_ratio = 0.75; 44 | //belt_thickness = 1.75; 45 | 46 | // MXL 47 | //belt_width = 6.5; 48 | //belt_tooth_distance = 2.032; 49 | //belt_tooth_ratio = 0.64; 50 | //belt_thickness = i have no idea; 51 | 52 | // GT2 53 | // there is bunch of GT2 belts with different tooth-to-tooth distance 54 | // this one is most common in reprap world 55 | // adjust to your needs. 56 | belt_width = 6.5; 57 | belt_tooth_distance = 2; 58 | belt_tooth_ratio = 0.5; 59 | belt_thickness = 0.8; 60 | 61 | // Choose bearing/bushing configuration *************************************** 62 | // conf_b_* are in inc/conf_bushing.scad 63 | 64 | bushing_xy = conf_b_lm8uu; 65 | bushing_z = conf_b_lm8uu; 66 | // for longer bearings use one shorter in x-carriage to make place for belt attachment 67 | // by default use same as xy 68 | bushing_carriage = bushing_xy; 69 | 70 | 71 | // Select idler bearing size ************************************************** 72 | // bearing_* are in inc/conf_bushing.scad 73 | 74 | idler_bearing = bearing_623; 75 | 76 | // Select carriage lenght ****************************************************** 77 | // 30 for single carriage extruder (two holes with centers 30mm apart) 78 | // 50 for wade or single with fan (three holes, 30-20) 79 | // 80 for full length carriage (four holes, 30-20-30) 80 | 81 | carriage_l_base = 50; 82 | 83 | 84 | // Fillets ******************************************************************** 85 | // fillets are rounded corners of boxes. The right engineering term is probably radius 86 | // but cad software calls it fillet. 87 | // mostly cosmetic, except z axis. 88 | // 0 = no fillets 89 | // 1 = fillet 90 | // 2 = chamfer (cut the edges at 45deg. angle) 91 | // Please do put only parts with fillets on sale, other options are not really tested 92 | 93 | use_fillets = 1; 94 | 95 | // set to 0 for single plate (affects z axis and screws that attach RP parts to frame) 96 | i_am_box = 0; 97 | 98 | // if you do your own plate and can move bottom Z screws 5mm up set this to 0 to 99 | // get stronger motor mount. Only for i_am_box = 0 100 | i_want_to_use_single_plate_dxf_and_make_my_z_weaker = 1; 101 | 102 | 103 | // Radius of long threaded rod on Y frame 104 | 105 | // Affects y-axis-corner (both box and single plate) 106 | // and y-axis-bracket (box only) 107 | 108 | //Use 5.4 for M10 or 4.4 for M8 109 | y_threaded_rod_long_r = 5.4; 110 | 111 | 112 | // Thickness of the boards that make the box frame. 113 | 114 | // in y-axis-corner it governs the height of the corners by adjusting the 115 | // distance between ground and M10 threaded rod. (both box and single plate) 116 | 117 | // For box model, the parts that hold Z smooth rod have one hole from front 118 | // and one from side, and this setting makes sure that the screw from side 119 | // is in the center of the plank. 120 | 121 | // Use 12 for single plate 122 | // or 20 if you want to use the Y lm8uu holders 123 | // (extras/bearing-holder-single-plate-y) 124 | board_thickness = 20; 125 | 126 | // Segments of small holes. some poeple claim that a low value makes them easier to print. 127 | small_hole_segments=7; 128 | 129 | // functions 130 | include ; 131 | include ; 132 | 133 | // These constants define the geometry of the doc/complete-printer.scad 134 | bed_x_size=225; 135 | bed_y_size=225; 136 | x_smooth_rod_length=380+board_thickness*2; 137 | y_smooth_rod_length=400; 138 | z_smooth_rod_length=320; 139 | -------------------------------------------------------------------------------- /box_frame/sample_stls/default_box_gt2_lm10uu/configuration.scad: -------------------------------------------------------------------------------- 1 | // PRUSA iteration3 2 | // Configuration file 3 | // GNU GPL v3 4 | // Josef Průša 5 | // Václav 'ax' Hůla 6 | // http://www.reprap.org/wiki/Prusa_Mendel 7 | // http://github.com/josefprusa/Prusa3 8 | 9 | include ; 10 | include ; 11 | 12 | // Custom settings here, tailor to your supplies and print settings 13 | 14 | // Extruder settings ********************************************************** 15 | // Don't forget to set your slicer's extruder settings to match the values you 16 | // enter here. 17 | 18 | layer_height = 0.3; 19 | // Width over thickness determines how wide the plastic will be when extruded 20 | // onto the object that is being printed. width_over_thickness is multiplied 21 | // by the layer_height to calculate this width. i.e. If your layer_height is 22 | // set to 0.3 mm and your width_over_thickness is set to 2.2, the resulting 23 | // width will be 0.66 mm. 24 | width_over_thickness = 2.2; 25 | 26 | // Select your belt type ****************************************************** 27 | 28 | // T2.5 29 | //belt_width = 6.5; //add 0.5 to actual width 30 | //belt_tooth_distance = 2.5; 31 | //belt_tooth_ratio = 0.75; 32 | //belt_thickness = 0.8; 33 | 34 | // T5 (strongly discouraged) 35 | //belt_width = 6.5; 36 | //belt_tooth_distance = 5; 37 | //belt_tooth_ratio = 0.75; 38 | //belt_thickness = 0.8; 39 | 40 | // HTD3 41 | //belt_width = 9.5; 42 | //belt_tooth_distance = 3; 43 | //belt_tooth_ratio = 0.75; 44 | //belt_thickness = 1.75; 45 | 46 | // MXL 47 | //belt_width = 6.5; 48 | //belt_tooth_distance = 2.032; 49 | //belt_tooth_ratio = 0.64; 50 | //belt_thickness = i have no idea; 51 | 52 | // GT2 53 | // there is bunch of GT2 belts with different tooth-to-tooth distance 54 | // this one is most common in reprap world 55 | // adjust to your needs. 56 | belt_width = 6.5; 57 | belt_tooth_distance = 2; 58 | belt_tooth_ratio = 0.5; 59 | belt_thickness = 0.8; 60 | 61 | // Choose bearing/bushing configuration *************************************** 62 | // conf_b_* are in inc/conf_bushing.scad 63 | 64 | bushing_xy = conf_b_lm10uu; 65 | bushing_z = conf_b_lm10uu; 66 | // for longer bearings use one shorter in x-carriage to make place for belt attachment 67 | // by default use same as xy 68 | bushing_carriage = bushing_xy; 69 | 70 | 71 | // Select idler bearing size ************************************************** 72 | // bearing_* are in inc/conf_bushing.scad 73 | 74 | idler_bearing = bearing_623; 75 | 76 | // Select carriage lenght ****************************************************** 77 | // 30 for single carriage extruder (two holes with centers 30mm apart) 78 | // 50 for wade or single with fan (three holes, 30-20) 79 | // 80 for full length carriage (four holes, 30-20-30) 80 | 81 | carriage_l_base = 50; 82 | 83 | 84 | // Fillets ******************************************************************** 85 | // fillets are rounded corners of boxes. The right engineering term is probably radius 86 | // but cad software calls it fillet. 87 | // mostly cosmetic, except z axis. 88 | // 0 = no fillets 89 | // 1 = fillet 90 | // 2 = chamfer (cut the edges at 45deg. angle) 91 | // Please do put only parts with fillets on sale, other options are not really tested 92 | 93 | use_fillets = 1; 94 | 95 | // set to 0 for single plate (affects z axis and screws that attach RP parts to frame) 96 | i_am_box = 1; 97 | 98 | // if you do your own plate and can move bottom Z screws 5mm up set this to 0 to 99 | // get stronger motor mount. Only for i_am_box = 0 100 | i_want_to_use_single_plate_dxf_and_make_my_z_weaker = 1; 101 | 102 | 103 | // Radius of long threaded rod on Y frame 104 | 105 | // Affects y-axis-corner (both box and single plate) 106 | // and y-axis-bracket (box only) 107 | 108 | //Use 5.4 for M10 or 4.4 for M8 109 | y_threaded_rod_long_r = 5.4; 110 | 111 | 112 | // Thickness of the boards that make the box frame. 113 | 114 | // in y-axis-corner it governs the height of the corners by adjusting the 115 | // distance between ground and M10 threaded rod. (both box and single plate) 116 | 117 | // For box model, the parts that hold Z smooth rod have one hole from front 118 | // and one from side, and this setting makes sure that the screw from side 119 | // is in the center of the plank. 120 | 121 | // Use 12 for single plate 122 | // or 20 if you want to use the Y lm8uu holders 123 | // (extras/bearing-holder-single-plate-y) 124 | board_thickness = 18; 125 | 126 | // Segments of small holes. some poeple claim that a low value makes them easier to print. 127 | small_hole_segments=7; 128 | 129 | // functions 130 | include ; 131 | include ; 132 | 133 | // These constants define the geometry of the doc/complete-printer.scad 134 | bed_x_size=225; 135 | bed_y_size=225; 136 | x_smooth_rod_length=450+board_thickness*2; 137 | y_smooth_rod_length=400; 138 | z_smooth_rod_length=400; 139 | -------------------------------------------------------------------------------- /old_single_plate/src/dual-extruder.scad: -------------------------------------------------------------------------------- 1 | // PRUSA iteration3 2 | // Compact extruder 3 | // GNU GPL v3 4 | // Josef Průša and contributors 5 | // http://www.reprap.org/wiki/Prusa_Mendel 6 | // http://prusamendel.org 7 | 8 | 9 | 10 | 11 | module motor_dummy(){ 12 | translate([-22,-22,-5]) %cube([44,44,5]); 13 | translate([18,18,-5]) %cylinder(r=2, h=24); 14 | translate([18,-18,-5]) %cylinder(r=2, h=24); 15 | translate([-18,18,-5]) %cylinder(r=2, h=24); 16 | translate([-18,-18,-5]) %cylinder(r=2, h=24); 17 | translate([-22+2.5+10,0,-5]) %cylinder(r=2.5, h=7); 18 | 19 | } 20 | 21 | module extruder_base(){ 22 | // Main body 23 | translate([-1-22,-2,0]) cube([22+22,56,24]); 24 | // Extruder plate mount 25 | translate([-16-28,49-5-8,0]) cube([59+28,18,24]); 26 | // Carriage mount cylinders 27 | translate([11,25,0]){ 28 | //translate([-12,24,0]) cylinder(r=5, h=24); 29 | //translate([12,24,0]) cylinder(r=5, h=24); 30 | } 31 | } 32 | 33 | module extruder_holes(){ 34 | // 1st extruder 35 | translate([11,25,0]){ // Translate to center of the main block 36 | // Main shaft opening 37 | translate([0,-2,-1]) cylinder(r=6.5, h=26); 38 | 39 | // Lower motor mount hole 40 | translate([-8.5,18-2,-1]) cylinder(r=2, h=35); 41 | translate([-8.5,18-2,21]) cylinder(r=3.1, h=35); 42 | // Upper motor mount hole 43 | translate([-8.5,-18-2,-1]) cylinder(r=2, h=35); 44 | translate([-8.5,-18-2,21]) cylinder(r=3.1, h=35); 45 | // Idler motor mount hole 46 | translate([-8.5+36,18-2,-1]) cylinder(r=2, h=35); 47 | translate([-8.5+36,18-2,21]) cylinder(r=3.1, h=35); 48 | 49 | //Idler place 50 | 51 | translate([10,-11,1]) cube([13,30,22]); 52 | 53 | // Carriage mount right screw head hole 54 | translate([-12-12,24,-3]) cylinder(r=3.5, h=23); 55 | // Carriage mount left screw head hole 56 | translate([12-12,24,-3]) cylinder(r=3.5, h=23); 57 | // Carriage mount right screw hole 58 | translate([-12-12,24,20.5]) cylinder(r=2, h=23); 59 | // Carriage mount left screw head hole 60 | translate([12-12,24,20.5]) cylinder(r=2, h=23); 61 | // Idler bearing cutout 62 | translate([11,0-2,-4.5+10]) cylinder(r=11, h=20); 63 | } 64 | 65 | // Filament path 66 | translate([1.5+11+3.5,65,11]) rotate([90,0,0]) cylinder(r=2, h=70); 67 | 68 | mirror([1,0,0])translate([1.5+11+3.51+1,65,11]) rotate([90,0,0]) cylinder(r=2, h=70); 69 | 70 | // 2nd extruder 71 | translate([-1,0,0]) mirror([1,0,0]) translate([11,25,0]){ // Translate to center of the main block 72 | // Main shaft opening 73 | translate([0,-2,-1]) cylinder(r=6.5, h=26); 74 | 75 | // Lower motor mount hole 76 | translate([-8.5,18-2,-1]) cylinder(r=2, h=35); 77 | translate([-8.5,18-2,21]) cylinder(r=3.1, h=35); 78 | // Upper motor mount hole 79 | translate([-8.5,-18-2,-1]) cylinder(r=2, h=35); 80 | translate([-8.5,-18-2,21]) cylinder(r=3.1, h=35); 81 | // Idler motor mount hole 82 | translate([-8.5+36,18-2,-1]) cylinder(r=2, h=35); 83 | translate([-8.5+36,18-2,21]) cylinder(r=3.1, h=35); 84 | 85 | translate([10,-11,1]) cube([13,30,22]); 86 | 87 | // Idler bearing cutout 88 | translate([11,0-2,-4.5+10]) cylinder(r=11, h=20); 89 | } 90 | 91 | 92 | // Left extruder plate mounting hole 93 | translate([25,65,11]) rotate([90,0,0]) cylinder(r=1.8, h=70); 94 | translate([25,47,11]) rotate([90,0,0]) cylinder(r=3.1, h=70, $fn=6); 95 | // Right extruder plate mounting hole 96 | 97 | translate([-26,65,11]) rotate([90,0,0]) cylinder(r=1.8, h=70); 98 | translate([-26,47,11]) rotate([90,0,0]) cylinder(r=3.1, h=70, $fn=6); 99 | 100 | // Idler mounting holse 101 | translate([11,25,10]){ 102 | // Nut traps 103 | translate([-3,-32,6-5.5/2]) cube([2.7,14,5.5]); 104 | translate([-3,-32,-4-5.5/2]) cube([2.7,14,5.5]); 105 | 106 | translate([-3-20,-32,6-5.5/2]) cube([2.7,14,5.5]); 107 | translate([-3-20,-32,-4-5.5/2]) cube([2.7,14,5.5]); 108 | // Screws 109 | translate([-50,-22,-4]) rotate([0,90,0]) cylinder(r=2, h=80); 110 | translate([-50,-22,6]) rotate([0,90,0]) cylinder(r=2, h=80); 111 | } 112 | } 113 | 114 | module extruder_idler_base(){ 115 | translate([0.25,0,0]) cube([19.5,45.5,8+3]); 116 | 117 | } 118 | 119 | module extruder_idler_holes(){ 120 | translate([10,25,0]){ 121 | // Main cutout 122 | cube([10,23,25], center= true); 123 | // Idler shaft 124 | translate([-12,0,4.1+2])rotate([0,90,0])cylinder(r=4.1, h=24); 125 | // Screw holes 126 | translate([5,-20,-1])cylinder(r=2.2, h=24); 127 | translate([-5,-20,-1])cylinder(r=2.2, h=24); 128 | } 129 | } 130 | 131 | 132 | // Idler final part 133 | module idler(){ 134 | difference(){ 135 | extruder_idler_base(); 136 | extruder_idler_holes(); 137 | } 138 | } 139 | 140 | //translate([10,0,1]) rotate([0,-90,0]) idler(); 141 | translate([-68,-8,0]) idler(); 142 | // Extruder final part 143 | module extruder(){ 144 | translate([-23,2,0])difference(){ 145 | extruder_base(); 146 | extruder_holes(); 147 | } 148 | } 149 | 150 | extruder(); 151 | translate([-2.5,25,0]) motor_dummy(); 152 | -------------------------------------------------------------------------------- /old_single_plate/src/compact-extruder.scad: -------------------------------------------------------------------------------- 1 | // PRUSA iteration3 2 | // Compact extruder 3 | // GNU GPL v3 4 | // Josef Průša and contributors 5 | // http://www.reprap.org/wiki/Prusa_Mendel 6 | // http://prusamendel.org 7 | 8 | include <../configuration.scad> 9 | 10 | 11 | 12 | module motor_dummy(){ 13 | translate([-22,-22,-5]) %cube([44,44,5]); 14 | translate([18,18,-5]) %cylinder(r=2, h=24); 15 | translate([18,-18,-5]) %cylinder(r=2, h=24); 16 | translate([-18,18,-5]) %cylinder(r=2, h=24); 17 | translate([-18,-18,-5]) %cylinder(r=2, h=24); 18 | translate([-22+2.5+10,0,-5]) %cylinder(r=2.5, h=7); 19 | 20 | } 21 | 22 | module extruder_base(){ 23 | // Main body 24 | translate([-1,-2,0]) cube([22,56,24]); 25 | // Extruder plate mount 26 | if (hotend_mount == 1) { // groove-mount 27 | translate([-16,49,0]) cube([55,5 + hotend_groovemount_depth - 1.5,24]); 28 | } else { 29 | translate([-16,49,0]) cube([55,5,24]); 30 | } 31 | 32 | // Carriage mount cylinders 33 | translate([11,25,0]){ 34 | //translate([-12,24,0]) cylinder(r=5, h=24); 35 | //translate([12,24,0]) cylinder(r=5, h=24); 36 | } 37 | 38 | // Smoother join 39 | translate([1,38,0]) rotate([0,0,45]) cube([10,10,24]); 40 | } 41 | 42 | module extruder_holes(){ 43 | translate([11,25,0]){ // Translate to center of the main block 44 | // Main shaft opening 45 | translate([0,-2,-1]) cylinder(r=6.5, h=26); 46 | 47 | // Lower motor mount hole 48 | translate([-8.5,18-2,-1]) cylinder(r=2, h=35); 49 | translate([-8.5,18-2,21]) cylinder(r=3.1, h=35); 50 | // Upper motor mount hole 51 | translate([-8.5,-18-2,-1]) cylinder(r=2, h=35); 52 | translate([-8.5,-18-2,21]) cylinder(r=3.1, h=35); 53 | // Idler motor mount hole 54 | translate([-8.5+36,18-2,-1]) cylinder(r=2, h=35); 55 | translate([-8.5+36,18-2,21]) cylinder(r=3.1, h=35); 56 | 57 | // Carriage mount right screw head hole 58 | translate([-12,24,-3]) cylinder(r=3.5, h=23); 59 | // Carriage mount left screw head hole 60 | translate([12,24,-3]) cylinder(r=3.5, h=23); 61 | // Carriage mount right screw hole 62 | translate([-12,24,20.5]) cylinder(r=2, h=23); 63 | // Carriage mount left screw head hole 64 | translate([12,24,20.5]) cylinder(r=2, h=23); 65 | // Idler bearing cutout 66 | translate([11,0-2,-4.5+10]) cylinder(r=11, h=20); 67 | } 68 | // Filament path 69 | translate([1.5+11+3.5,65,11]) rotate([90,0,0]) cylinder(r=2, h=70); 70 | if (hotend_mount == 1) { 71 | // Hole for hotend 72 | translate([1.5+11+3.5,65,11]) rotate([90,0,0]) cylinder(r=hotend_groovemount_diameter/2, h=12.5); 73 | } 74 | // Hole for drive gear check 75 | translate([1.5+11+3.5-30,25,11]) rotate([90,0,90]) cylinder(r=4, h=70, $fn=20); 76 | translate([1.5+11+3.5-30,23,11]) rotate([90,0,90]) cylinder(r=4, h=70, $fn=20); 77 | translate([1.5+11+3.5-30,21,11]) rotate([90,0,90]) cylinder(r=4, h=70, $fn=20); 78 | 79 | // Left extruder plate mounting hole 80 | translate([1.5+11+3.5+15,65,11]) rotate([90,0,0]) cylinder(r=1.8, h=70); 81 | translate([1.5+11+3.5+15,47,11]) rotate([90,0,0]) cylinder(r=3.1, h=70, $fn=6); 82 | // Right extruder plate mounting hole 83 | translate([1.5+11+3.5-25,65,11]) rotate([90,0,0]) cylinder(r=1.8, h=70); 84 | translate([1.5+11+3.5-25,47,11]) rotate([90,0,0]) cylinder(r=3.1, h=70, $fn=6); 85 | 86 | // Idler mounting holse 87 | translate([11,25,10]){ 88 | // Nut traps 89 | translate([-30,15,-5]) rotate([0,90,0]) rotate([0,0,30]) cylinder(r=3.3, h=30, $fn=6); 90 | translate([-30,-15,-5]) rotate([0,90,0]) rotate([0,0,30]) cylinder(r=3.3, h=30, $fn=6); 91 | translate([-30,15,5]) rotate([0,90,0]) rotate([0,0,30]) cylinder(r=3.3, h=30, $fn=6); 92 | translate([-30,-15,5]) rotate([0,90,0]) rotate([0,0,30]) cylinder(r=3.3, h=30, $fn=6); 93 | // Screws 94 | translate([-30,-22,-4]) rotate([0,90,0]) cylinder(r=2, h=70); 95 | translate([-30,-22,6]) rotate([0,90,0]) cylinder(r=2, h=70); 96 | } 97 | 98 | translate([46,46,-1]) rotate([0,0,45]) cube([20,20,26]); 99 | translate([46,13,-1]) rotate([0,0,45]) cube([20,20,26]); 100 | translate([-22,46,-1]) rotate([0,0,45]) cube([20,20,26]); 101 | translate([-22,24,-1]) rotate([0,0,45]) cube([20,20,26]); 102 | translate([-8,-20,-1]) rotate([0,0,45]) cube([20,20,26]); 103 | translate([30,-20,-1]) rotate([0,0,45]) cube([20,20,26]); 104 | } 105 | 106 | module extruder_idler_base(){ 107 | translate([0.25,0,0]) cube([19.5,45.5,8+3]); 108 | 109 | } 110 | 111 | module extruder_idler_holes(){ 112 | translate([10,25,0]){ 113 | // Main cutout 114 | cube([10,23,25], center= true); 115 | // Idler shaft 116 | translate([-12,0,4.1+2])rotate([0,90,0])cylinder(r=4.1, h=24); 117 | // Screw holes 118 | translate([5,-20,-1])cylinder(r=2.2, h=24); 119 | translate([-5,-20,-1])cylinder(r=2.2, h=24); 120 | } 121 | } 122 | 123 | 124 | // Idler final part 125 | module idler(){ 126 | difference(){ 127 | extruder_idler_base(); 128 | extruder_idler_holes(); 129 | } 130 | } 131 | 132 | //translate([10,0,1]) rotate([0,-90,0]) idler(); 133 | //translate([-47,-2,0]) idler(); 134 | // Extruder final part 135 | module extruder(){ 136 | translate([-23,2,0])difference(){ 137 | extruder_base(); 138 | extruder_holes(); 139 | } 140 | } 141 | 142 | extruder(); 143 | translate([-2.5,25,0]) motor_dummy(); 144 | -------------------------------------------------------------------------------- /mini/extruder/greg-wade/greg-adapter.scad: -------------------------------------------------------------------------------- 1 | //Greg adapter for i3 vertical carriage 2 | use ; 3 | 4 | 5 | //params 6 | tollerance = 0.2; 7 | screw_tollerance = 0.6; 8 | 9 | //hotend params 10 | groove_dia = 12+tollerance; 11 | groove_thickness = 4.40; 12 | hotend_dia = 16+tollerance; 13 | 14 | //greg params 15 | greg_width = 31.5; 16 | greg_length = 76-tollerance; 17 | greg_screws = 4+screw_tollerance; 18 | wheels_offset = 12.5; 19 | hole_0_1 = 34; 20 | hole_0_2 = 15.5; 21 | hole_1_1 = 9.5; 22 | hole_1_2 = 15.2; 23 | hole_2_1 = 59; 24 | hole_2_2 = hole_1_2; 25 | 26 | //adapter body param 27 | front_plate_top_screw_offset = 2.5; 28 | front_plate_width_up = 33.3; 29 | front_plate_width_down = 58; 30 | front_plate_height_up = 45; 31 | front_plate_height_down = 23; 32 | front_plate_thickness = 5; 33 | belt_spacing = 2.5; 34 | body_screws = 3+screw_tollerance; 35 | front_plate_height = body_screws/2 + front_plate_height_down + front_plate_top_screw_offset + 8; 36 | plate_thickness = 6; 37 | plate_width = greg_width + wheels_offset; 38 | plate_length = greg_length; 39 | side_locks_width = 17; 40 | side_locks_length = (plate_length - front_plate_width_up) /2; 41 | side_locks_height = front_plate_height-front_plate_height_down; 42 | wall_thickness = 4; 43 | r_support = 28; 44 | hole_distance = 25.2; 45 | hole_h1 = 8.5; 46 | wall_angle = 70; 47 | fan_height = 0; 48 | fan_screw = 0; 49 | 50 | //module adapter_body 51 | module adapter_body(){ 52 | 53 | //extruder plate 54 | translate([0,0,0]) cube([plate_length,plate_width,plate_thickness]); 55 | 56 | //front plate 57 | translate([0,0,0]) cube([plate_length,front_plate_thickness,front_plate_height]); 58 | 59 | //side locks 60 | translate([0,-side_locks_width,0]) cube([side_locks_length,side_locks_width,side_locks_height]); 61 | translate([plate_length-side_locks_length,-side_locks_width,0]) cube([side_locks_length,side_locks_width,side_locks_height]); 62 | 63 | //side walls 64 | difference(){ 65 | translate([0,0,0]) { 66 | translate([0,0,0])cube([wall_thickness,plate_width,front_plate_height]); 67 | translate([plate_length-wall_thickness,0,0]) cube([wall_thickness,plate_width,front_plate_height]); 68 | } 69 | translate ([0,plate_width,plate_thickness])rotate(a=[wall_angle,0,0]) cube([30,34,60]); 70 | translate ([plate_length-wall_thickness,plate_width,plate_thickness])rotate(a=[wall_angle,0,0]) cube([30,34,60]); 71 | } 72 | 73 | //corner support 74 | difference() { 75 | translate([wall_thickness,front_plate_thickness,plate_thickness]) cube([plate_length-2*wall_thickness-fan_height,r_support/2,r_support/2]); 76 | //corner support smoothing 77 | translate ([wall_thickness-0.01,r_support/2+front_plate_thickness,r_support/2+plate_thickness]) rotate(a=[0,90,0]) cylinder(r=r_support/2, h=plate_length-2*wall_thickness-fan_height+0.02, $fn=60); 78 | } 79 | 80 | //opto flag 81 | translate([-12,plate_width-32,0]) cube([12,2,7]); 82 | 83 | } 84 | 85 | 86 | 87 | module adapter_holes(){ 88 | 89 | //groove hole 90 | translate([hole_0_1,plate_width-hole_0_2,0]) cylinder(r=groove_dia/2, h=groove_thickness, $fn=60); 91 | 92 | //groove channel 93 | translate([hole_0_1-groove_dia/2,plate_width-hole_0_2,0]) #cube([groove_dia,hole_0_2, groove_thickness]); 94 | 95 | //hotend hole 96 | translate([hole_0_1,plate_width-hole_0_2,groove_thickness]) cylinder(r=hotend_dia/2, h=plate_thickness-groove_thickness+20, $fn=60); 97 | 98 | //hotend channel 99 | translate([hole_0_1-hotend_dia/2,plate_width-hole_0_2,groove_thickness])cube([hotend_dia,hole_0_2,plate_thickness- groove_thickness+20]); 100 | 101 | //greg mounting holes 102 | translate([hole_1_1,plate_width-hole_1_2,0]) cylinder(r=greg_screws/2, h=plate_thickness, $fn=60); 103 | translate([hole_2_1,plate_width-hole_2_2,0]) cylinder(r=greg_screws/2, h=plate_thickness, $fn=60); 104 | 105 | //adapter mounting holes 106 | translate ([plate_length/2-hole_distance/2,-0.01,side_locks_height-hole_h1]) rotate(a=[-90,00,0]) cylinder(r=body_screws/2, h=25, $fn=60); 107 | translate ([plate_length/2+hole_distance/2,-0.01,side_locks_height-hole_h1]) rotate(a=[-90,0,0]) cylinder(r=body_screws/2, h=25, $fn=60); 108 | 109 | //nut traps 110 | translate ([plate_length/2-hole_distance/2,10,side_locks_height-hole_h1]) rotate(a=[-90,90,0]) nutHole(3.40); 111 | translate ([plate_length/2+hole_distance/2,10,side_locks_height-hole_h1]) rotate(a=[-90,90,0]) nutHole(3.40); 112 | translate ([plate_length/2-hole_distance/2-2.9,9.8,side_locks_height-hole_h1-30]) cube([6,3,30]); 113 | translate ([plate_length/2+hole_distance/2-2.9,9.8,side_locks_height-hole_h1-30]) cube([6,3,30]); 114 | 115 | //belt spacing 116 | translate([0,-side_locks_width,side_locks_height-belt_spacing]) cube([plate_length,9,belt_spacing]); 117 | 118 | //side lock corners 119 | rotate(a=[0,0,-135]) cube([plate_width,plate_width,30]); 120 | translate ([plate_length,0,0]) rotate(a=[0,0,-135]) cube([plate_width,plate_width,30]); 121 | 122 | //front plate corners 123 | translate ([(plate_length-front_plate_width_down)/2+5.5,0,front_plate_height])rotate(a=[0,-90-45,0]) cube([plate_width,3*front_plate_thickness,30]); 124 | translate ([plate_length-(plate_length-front_plate_width_down)/2-5.5,0,front_plate_height]) rotate(a=[0,45,-0]) cube([plate_width,3*front_plate_thickness,30]); 125 | 126 | } 127 | 128 | 129 | 130 | module adapter(){ 131 | difference(){ 132 | adapter_body(); 133 | adapter_holes(); 134 | } 135 | } 136 | 137 | adapter(); -------------------------------------------------------------------------------- /box_frame/x-carriage.scad: -------------------------------------------------------------------------------- 1 | // PRUSA iteration3 2 | // X carriage 3 | // GNU GPL v3 4 | // Josef Průša 5 | // Václav 'ax' Hůla 6 | // http://www.reprap.org/wiki/Prusa_Mendel 7 | // http://github.com/josefprusa/Prusa3 8 | 9 | // ThingDoc entry 10 | /** 11 | * @id xCarriage 12 | * @name X Axis Extruder Carriage 13 | * @category Printed 14 | */ 15 | 16 | include 17 | use 18 | // mounting plate 19 | use 20 | 21 | 22 | //Use 30 for single extruder, 50 for wades, 80 for dual extruders (moved to config file) 23 | //carriage_l_base = 80; 24 | //check if we need to extend carriage to fit bearings 25 | carriage_l_adjusted = max(adjust_bushing_len(bushing_xy, carriage_l_base, layer_height * 9), adjust_bushing_len(bushing_carriage, carriage_l_base, layer_height * 9)); 26 | //For bearings 30mm long or shorter enforce double len 27 | carriage_l_real = max((bushing_xy[2] > 30 ? carriage_l_adjusted : (2 * bushing_xy[2] + 6)), carriage_l_adjusted); 28 | // if the carriage was extended, we want to increase carriage_hole_to_side 29 | carriage_hole_to_side = max(3, ((carriage_l_real - carriage_l_base) / 2)); 30 | echo(carriage_hole_to_side); 31 | carriage_l = carriage_l_base + 2 * carriage_hole_to_side; 32 | 33 | 34 | bushing_carriage_len = adjust_bushing_len(bushing_carriage, 21, layer_height * 9); 35 | 36 | module x_carriage(){ 37 | mirror([1,0,0]) { 38 | difference() { 39 | union() { 40 | //upper bearing 41 | rotate([0, 0, 90]) linear(bushing_carriage); 42 | //lower bearing 43 | translate([xaxis_rod_distance,0,0]) rotate([0, 0, 90]) linear(bushing_xy, carriage_l); 44 | 45 | //This block moves with varying bearing thickness to ensure the front side is flat 46 | translate([0, -bushing_foot_len(bushing_xy), 0]) { 47 | // main plate 48 | translate([4, -1, 0]) cube_fillet([xaxis_rod_distance + 4, 6, carriage_l], radius=2); 49 | translate([-8, -1, 0]) cube_fillet([xaxis_rod_distance + 16, 6, bushing_carriage_len + 3], radius=2); 50 | } 51 | 52 | translate([45/2,0,0]){ 53 | 54 | //fill the space where the belt is, as it will be substracted at later point and we want it stiff here. 55 | //belt smooth side 56 | translate([-13.5 - belt_thickness, -8.5, 0]) cube_fillet([5, 15, carriage_l], vertical = [2, 2, 0, 0]); 57 | //belt teethed side, with cutouts for belt ends. 58 | difference(){ 59 | union() { 60 | translate([-3, -1, carriage_l/2]) cube_fillet([11, 16, carriage_l], vertical = [2, 2, 0, 0], center = true); 61 | translate([-13, -10, 0]) cube([8, 10, carriage_l]); 62 | } 63 | translate([-3.5, 0, 67 + carriage_hole_to_side]) cube([13, 10, 8], center = true); 64 | translate([-3.5, 0, 40 + carriage_hole_to_side]) cube([13, 10, 8], center = true); 65 | translate([-3.5, 0, 15 + carriage_hole_to_side]) cube([13, 10, 8], center = true); 66 | if (carriage_l_base == 30) { 67 | //more space for belt ends, as there is only one cutout 68 | translate([-3.5, 0, 15 + carriage_hole_to_side]) cube([13, 10, 14], center = true); 69 | } 70 | } 71 | 72 | } 73 | } 74 | //Ensure upper bearing can be inserted cleanly 75 | rotate([0, 0, 90]) { 76 | linear_negative(bushing_carriage, carriage_l); 77 | } 78 | //Same for lower bearing 79 | translate([xaxis_rod_distance, 0, 0]) rotate([0, 0, 90]) { 80 | linear_negative(bushing_xy, carriage_l); 81 | } 82 | // extruder mounts 83 | translate([20, -2, carriage_hole_to_side]) { 84 | rotate([90, 0, 0]) cylinder(r=1.8, h=32, center=true,$fn=small_hole_segments); 85 | translate([0, 7, 0]) rotate([90, 60, 0]) cylinder(r=3.4, h=5, $fn=6, center=true); 86 | } 87 | translate([20, -2, carriage_hole_to_side + 30]) { 88 | rotate([90, 0, 0]) cylinder(r=1.8, h=32, center=true,$fn=small_hole_segments); 89 | translate([0, 7, 0]) rotate([90, 60, 0]) cylinder(r=3.4, h=5, $fn=6, center=true); 90 | } 91 | if (carriage_l >= 50 + 2 * carriage_hole_to_side) { 92 | translate([20, -2, carriage_hole_to_side + 30 + 20]) { 93 | rotate([90, 0, 0]) cylinder(r=1.8, h=32, center=true,$fn=small_hole_segments); 94 | translate([0, 7, 0]) rotate([90, 60, 0]) cylinder(r=3.4, h=5, $fn=6, center=true); 95 | } 96 | } 97 | if (carriage_l >= 80 + 2 * carriage_hole_to_side) { 98 | translate([20, -2, carriage_hole_to_side + 30 + 20 + 30]) { 99 | rotate([90, 0, 0]) cylinder(r=1.8, h=32, center=true,$fn=small_hole_segments); 100 | translate([0, 7, 0]) rotate([90, 60, 0]) cylinder(r=3.4, h=5, $fn=6, center=true); 101 | } 102 | } 103 | //belt insert 104 | translate([-8.5 + 45 / 2, 0, 0]) mirror([1, 0, 0]) { 105 | belt(carriage_l, 5); 106 | %belt(carriage_l); 107 | } 108 | } 109 | } 110 | } 111 | 112 | x_carriage(); 113 | -------------------------------------------------------------------------------- /box_frame/z-axis.scad: -------------------------------------------------------------------------------- 1 | // PRUSA iteration3 2 | // Z axis 3 | // GNU GPL v3 4 | // Josef Průša 5 | // Václav 'ax' Hůla 6 | // http://www.reprap.org/wiki/Prusa_Mendel 7 | // http://github.com/josefprusa/Prusa3 8 | 9 | // ThingDoc entries 10 | /** 11 | * @id zMotorHolder 12 | * @name Z Axis Motor Holder 13 | * @category Printed 14 | */ 15 | 16 | /** 17 | * @id zRodHolder 18 | * @name Z Axis Rod Holder 19 | * @category Printed 20 | */ 21 | 22 | include 23 | 24 | module zmotorholder(thickness=(i_am_box == 0 ? 38 : 23), bottom_thickness=5){ 25 | difference(){ 26 | union(){ 27 | // Motor holding part 28 | difference(){ 29 | union(){ 30 | zrodholder(thickness=thickness, xlen=45, ylen=44, zdelta=((i_want_to_use_single_plate_dxf_and_make_my_z_weaker == 0) ? 0 : 5)); 31 | translate([board_to_xz_distance, board_to_xz_distance, 0]) { 32 | nema17(places=[0, 1, 1, 1], h=bottom_thickness + layer_height, $fn=23, shadow=layer_height + 2); 33 | } 34 | } 35 | 36 | // motor screw holes 37 | translate([board_to_xz_distance, board_to_xz_distance, thickness]) { 38 | mirror([0, 0, 1]) translate([0, 0, thickness-8]) 39 | nema17(places=[0, 1, 1, 1], holes=true, h=bottom_thickness + 1, $fn=small_hole_segments); 40 | //shadow=-6 + layer_height); 41 | } 42 | } 43 | } 44 | } 45 | } 46 | 47 | 48 | module zrodholder(thickness=(i_am_box == 0 ? 14 : 15), bottom_thickness=5, ylen=44, xlen=34, zdelta=0){ 49 | holder_inner_r = 9; 50 | holder_inner_r2 = 2; 51 | difference(){ 52 | union(){ 53 | difference(){ 54 | union(){ 55 | //piece along the flat side of a board 56 | cube_fillet([14, ylen, bottom_thickness], vertical=[8, 3, 0, 0]); 57 | cube_fillet([5, ylen, thickness], vertical=[3, 3, 0, 0], top = [thickness / 1.7, 0, 0, 5]); 58 | //hole for Z axis is thru this 59 | cube_fillet([xlen, 14, bottom_thickness], vertical=[3, 0, 0, 3]); 60 | translate([14, 14, 0]) { 61 | //large fillet that makes it stiffer by lot. Thanks to Marcus Wolschon 62 | difference(){ 63 | cube([holder_inner_r, holder_inner_r, bottom_thickness]); 64 | translate([holder_inner_r, holder_inner_r, -0.5]) 65 | cylinder(r=holder_inner_r, h=bottom_thickness + 1); 66 | } 67 | } 68 | translate([5, 5, 0]) { 69 | difference(){ 70 | cube([holder_inner_r2, holder_inner_r2, thickness - 5.5]); 71 | translate([holder_inner_r2, holder_inner_r2, -0.5]) 72 | cylinder(r=holder_inner_r2, h=thickness + 1, $fn=20); 73 | } 74 | } 75 | //piece along cut side of the board 76 | if (i_am_box == 1) { 77 | translate([-board_thickness, 0, 0]) 78 | cube_fillet([board_thickness + board_to_xz_distance + bushing_z[0], 5, thickness], radius=2, top = [0, 0, 0, thickness], $fn=99); 79 | } else { 80 | translate([-board_thickness/2, 0, 0]) 81 | cube_fillet([board_thickness/2 + board_to_xz_distance + bushing_z[0], 5, thickness], radius=2, top = [0, 0, 0, thickness], $fn=99); 82 | } 83 | //smooth rod insert 84 | translate([board_to_xz_distance - z_delta, 9, 0]) 85 | cylinder(h=bottom_thickness / 2, r=(bushing_z[0] + 5 * single_wall_width)); 86 | } 87 | //smooth rod hole 88 | translate([board_to_xz_distance - z_delta, 9, -1]) cylinder(h=board_thickness+20, r=bushing_z[0] + single_wall_width / 4); 89 | //inside rouned corner 90 | translate([0, 5, -1]) cylinder(r=0.8, h=100, $fn=8); 91 | //side screw 92 | //translate([-board_thickness/2, 0, thickness/2-1.5]) rotate([-90, 0, 0]) screw(h=30, r_head=4); 93 | //front screws 94 | if (i_am_box != 1) { 95 | //single plate has both screws on front 96 | translate([16, 35, bottom_thickness + 4.5 + zdelta]) rotate([0, -90, 0]) { 97 | plate_screw(); 98 | } 99 | translate([16, 15, bottom_thickness + 4.5 + zdelta]) rotate([0, -90, 0]) { 100 | plate_screw(); 101 | } 102 | //motor mount has third screw 103 | translate([16, 25, bottom_thickness + 4.5 + zdelta + 20]) rotate([0, -90, 0]) { 104 | plate_screw(); 105 | } 106 | } else { 107 | translate([16, 30, bottom_thickness+4]) rotate([0, -90, 0]) { 108 | plate_screw(); 109 | } 110 | //side screw 111 | translate([-board_thickness/2, -11, thickness/2]) rotate([-90, 0, 0]) plate_screw(); 112 | } 113 | } 114 | } 115 | } 116 | } 117 | translate([10, -50, 0]) zmotorholder(); 118 | translate([0, 50, 0]) mirror([0, 1, 0]) zmotorholder(); 119 | translate([67, 14, 0]) rotate([0,0,90]) zrodholder(); 120 | translate([77, -14, 0]) rotate([0, 0, -90]) mirror([0, 1, 0]) zrodholder(); 121 | -------------------------------------------------------------------------------- /box_frame/x-end.scad: -------------------------------------------------------------------------------- 1 | // PRUSA iteration3 2 | // X ends 3 | // GNU GPL v3 4 | // Josef Průša 5 | // Václav 'ax' Hůla 6 | // http://www.reprap.org/wiki/Prusa_Mendel 7 | // http://github.com/josefprusa/Prusa3 8 | 9 | // ThingDoc entry 10 | /** 11 | * @id xMotorEnd 12 | * @name X Axis Motor End 13 | * @category Printed 14 | */ 15 | 16 | /** 17 | * @id xIdlerEnd 18 | * @name X Axis Idler End 19 | * @category Printed 20 | */ 21 | 22 | include 23 | use 24 | use 25 | use 26 | 27 | //height and width of the x blocks depend on x smooth rod radius 28 | x_box_height = 52 + 2 * bushing_xy[0]; 29 | x_box_width = (bushing_xy[0] <= 4) ? 17.5 : bushing_xy[0] * 2 + 9.5; 30 | bearing_height = max ((bushing_z[2] > 30 ? x_box_height : (2 * bushing_z[2] + 8)), x_box_height); 31 | 32 | module x_end_motor(){ 33 | 34 | mirror([0, 1, 0]) { 35 | 36 | x_end_base([3, 3, min((bushing_xy[0] - 3) * 2, 3), 2], len=42, offset=-5, thru=false); 37 | 38 | 39 | translate([0, -z_delta - 2, 0]) difference(){ 40 | union(){ 41 | intersection() { 42 | translate([-15, -34, 30]) cube([20, 60, x_box_height], center = true); 43 | union() { 44 | translate([-14, -16 + z_delta / 2, 24]) cube_fillet([17.5, 10.5 + z_delta, 55], center = true, vertical=[0, 0, 3, 3], top=[0, 3, 6, 3], $fn=16); 45 | //lower arm holding outer stepper screw 46 | translate([-10.25, -34, 9]) intersection(){ 47 | translate([0, 0, -5]) cube_fillet([10, 37, 28], center = true, vertical=[0, 0, 0, 0], top=[0, 3, 5, 3]); 48 | translate([-10/2, 10, -26]) rotate([45, 0, 0]) cube_fillet([10, 60, 60], radius=2); 49 | } 50 | } 51 | } 52 | translate([-16, -32, 30.25]) rotate([90, 0, 0]) rotate([0, 90, 0]) nema17(places=[1, 0, 1, 1], h=11); 53 | } 54 | 55 | // motor screw holes 56 | translate([21-5, -21-11, 30.25]){ 57 | // belt hole 58 | translate([-30, 11, -0.25]) cube_fillet([11, 36, 22], vertical=0, top=[0, 1, 0, 1], bottom=[0, 1, 0, 1], center = true, $fn=4); 59 | //motor mounting holes 60 | translate([-29.5, 0, 0]) rotate([0, 0, 0]) rotate([0, 90, 0]) nema17(places=[1, 1, 0, 1], holes=true, shadow=5.5, $fn=small_hole_segments, h=8); 61 | } 62 | } 63 | //smooth rod caps 64 | //translate([-22, -10, 0]) cube([17, 2, 15]); 65 | //translate([-22, -10, 45]) cube([17, 2, 10]); 66 | } 67 | } 68 | 69 | module x_end_base(vfillet=[3, 3, 3, 3], thru=true, len=40, offset=0){ 70 | 71 | difference(){ 72 | union(){ 73 | translate([-10 - bushing_xy[0], -10 + len / 2 + offset, 30]) cube_fillet([x_box_width, len, x_box_height], center=true, vertical=vfillet, top=[5, 3, 5, 3]); 74 | 75 | translate([0, 0, 4 - bushing_xy[0]]) { 76 | //rotate([0, 0, 0]) translate([0, -9.5, 0]) 77 | translate([z_delta, 0, 0]) render(convexity = 5) linear(bushing_z, bearing_height); 78 | // Nut trap 79 | translate([-2, 18, 5]) cube_fillet([20, 14, 10], center = true, vertical=[8, 0, 0, 5]); 80 | //} 81 | } 82 | } 83 | // here are bushings/bearings 84 | translate([z_delta, 0, 4 - bushing_xy[0]]) linear_negative(bushing_z, bearing_height); 85 | 86 | // belt hole 87 | translate([-14 - xy_delta / 2, 22 - 9 + offset, 30]) cube_fillet([max(idler_width + 2, 11), 55, 27], center = true, vertical=0, top=[0, 1, 0, 1], bottom=[0, 1, 0, 1], $fn=4); 88 | 89 | //smooth rods 90 | translate([-10 - bushing_xy[0], offset, 0]) { 91 | if(thru == true){ 92 | translate([0, -11, 6]) rotate([-90, 0, 0]) pushfit_rod(bushing_xy[0] * 2 + 0.2, 50); 93 | translate([0, -11, xaxis_rod_distance+6]) rotate([-90, 0, 0]) pushfit_rod(bushing_xy[0] * 2 + 0.2, 50); 94 | } else { 95 | translate([0, -7, 6]) rotate([-90, 0, 0]) pushfit_rod(bushing_xy[0] * 2 + 0.2, 50); 96 | translate([0, -7, xaxis_rod_distance+6]) rotate([-90, 0, 0]) pushfit_rod(bushing_xy[0] * 2 + 0.2, 50); 97 | } 98 | } 99 | translate([0, 0, 5 - bushing_xy[0]]) { // m5 nut insert 100 | translate([0, 17, 0]) rotate([0, 0, 10]){ 101 | //rod 102 | translate([0, 0, -1]) cylinder(h=(4.1 / 2 + 5), r=3, $fn=32); 103 | //nut 104 | translate([0, 0, 9]) cylinder(r=4.6, h=14.1, center = true, $fn=6); 105 | 106 | } 107 | } 108 | } 109 | //threaded rod 110 | translate([0, 17, 0]) %cylinder(h = 70, r=2.5+0.2); 111 | } 112 | 113 | module x_end_idler(){ 114 | difference() { 115 | x_end_base(len=48 + z_delta / 3, offset=-10 - z_delta / 3); 116 | // idler hole 117 | translate([-20, -15 - z_delta / 2, 30]) { 118 | rotate([0, 90, 0]) cylinder(r=m4_diameter / 2, h=33, center=true, $fn=small_hole_segments); 119 | translate([15 - 2 * single_wall_width, 0, 0]) rotate([90, 0, 90]) cylinder(r=m4_nut_diameter_horizontal / 2, h=3, $fn=6); 120 | 121 | } 122 | translate([-6 - x_box_width, 11, 29.5 - (max(idler_width, 16) / 2)]) cube([x_box_width + 1, 12, 1.5 + max(idler_bearing[0], 16)]); 123 | } 124 | %translate([-14 - xy_delta / 2, -9, 30.5 - (max(idler_width, 16) / 2)]) x_tensioner(); 125 | } 126 | 127 | module x_tensioner(len=68, idler_height=max(idler_bearing[0], 16)) { 128 | idlermount(len=len, rod=m4_diameter / 2 + 0.5, idler_height=idler_height, narrow_len=47, narrow_width=idler_width + 2 - single_wall_width); 129 | } 130 | 131 | 132 | translate([-40, 0, 4 - bushing_xy[0]]) x_tensioner(); 133 | translate([0, -80, 0]) mirror([1, 0, 0]) x_end_idler(thru=true); 134 | translate([-50, 0, 0]) mirror([1, 0, 0]) translate([-50, 0, 0]) 135 | x_end_motor(); 136 | 137 | module pushfit_rod(diameter, length){ 138 | cylinder(h = length, r=diameter/2, $fn=30); 139 | translate([0, -diameter/4, length/2]) cube_fillet([diameter, diameter/2, length], vertical = [0, 0, 1, 1], center = true, $fn=4); 140 | 141 | translate([0, -diameter/2-1.2, length/2]) cube([diameter - 1, 1, length], center = true); 142 | } 143 | 144 | 145 | if (idler_bearing[3] == 1) { // bearing guides 146 | translate([-39, -60 - idler_bearing[0] / 2, 4 - bushing_xy[0]]) rotate([0, 0, 55]) { 147 | render() bearing_assy(); 148 | } 149 | } 150 | -------------------------------------------------------------------------------- /box_frame/inc/functions.scad: -------------------------------------------------------------------------------- 1 | // PRUSA iteration3 2 | // Functions used in many files 3 | // GNU GPL v3 4 | // Josef Průša 5 | // Václav 'ax' Hůla 6 | // Vlnofka <> 7 | // http://www.reprap.org/wiki/Prusa_Mendel 8 | // http://github.com/josefprusa/Prusa3 9 | 10 | 11 | module nut(d,h,horizontal=true){ 12 | cornerdiameter = (d / 2) / cos (180 / 6); 13 | cylinder(h = h, r = cornerdiameter, $fn = 6); 14 | if(horizontal){ 15 | for(i = [1:6]){ 16 | rotate([0,0,60*i]) translate([-cornerdiameter-0.2,0,0]) rotate([0,0,-45]) cube([2,2,h]); 17 | } 18 | } 19 | } 20 | 21 | module fillet(radius, height=100, $fn=0) { 22 | //this creates acutal fillet 23 | translate([-radius, -radius, -height / 2 - 0.02]) difference() { 24 | cube([radius * 2, radius * 2, height + 0.04]); 25 | if ($fn == 0 && (radius == 2 || radius == 3 || radius == 4)) { 26 | cylinder(r=radius, h=height + 0.04, $fn=4 * radius); 27 | } else { 28 | cylinder(r=radius, h=height + 0.04, $fn=$fn); 29 | } 30 | 31 | } 32 | } 33 | 34 | module cube_fillet(size, radius=-1, vertical=[3,3,3,3], top=[0,0,0,0], bottom=[0,0,0,0], center=false, $fn=0){ 35 | // 36 | if (use_fillets == 1) { 37 | if (center) { 38 | cube_fillet_inside(size, radius, vertical, top, bottom, $fn); 39 | } else { 40 | translate([size[0]/2, size[1]/2, size[2]/2]) 41 | cube_fillet_inside(size, radius, vertical, top, bottom, $fn); 42 | } 43 | } else { 44 | if (use_fillets == 2) { 45 | if (center) { 46 | cube_fillet_inside(size, radius, vertical, top, bottom, 4); 47 | } else { 48 | translate([size[0]/2, size[1]/2, size[2]/2]) 49 | cube_fillet_inside(size, radius, vertical, top, bottom, 4); 50 | } 51 | 52 | } else { 53 | cube(size, center); 54 | } 55 | } 56 | 57 | } 58 | 59 | module cube_negative_fillet(size, radius=-1, vertical=[3,3,3,3], top=[0,0,0,0], bottom=[0,0,0,0], $fn=0){ 60 | 61 | j=[1,0,1,0]; 62 | 63 | for (i=[0:3]) { 64 | if (radius > -1) { 65 | rotate([0, 0, 90*i]) translate([size[1-j[i]]/2, size[j[i]]/2, 0]) fillet(radius, size[2], $fn=$fn); 66 | } else { 67 | rotate([0, 0, 90*i]) translate([size[1-j[i]]/2, size[j[i]]/2, 0]) fillet(vertical[i], size[2], $fn=$fn); 68 | } 69 | rotate([90*i, -90, 0]) translate([size[2]/2, size[j[i]]/2, 0 ]) fillet(top[i], size[1-j[i]], $fn=$fn); 70 | rotate([90*(4-i), 90, 0]) translate([size[2]/2, size[j[i]]/2, 0]) fillet(bottom[i], size[1-j[i]], $fn=$fn); 71 | 72 | } 73 | } 74 | 75 | module cube_fillet_inside(size, radius=-1, vertical=[3,3,3,3], top=[0,0,0,0], bottom=[0,0,0,0], $fn=0){ 76 | //makes CENTERED cube with round corners 77 | // if you give it radius, it will fillet vertical corners. 78 | //othervise use vertical, top, bottom arrays 79 | //when viewed from top, it starts in upper right corner (+x,+y quadrant) , goes counterclockwise 80 | //top/bottom fillet starts in direction of Y axis and goes CCW too 81 | 82 | 83 | if (radius == 0) { 84 | cube(size, center=true); 85 | } else { 86 | difference() { 87 | cube(size, center=true); 88 | cube_negative_fillet(size, radius, vertical, top, bottom, $fn); 89 | } 90 | } 91 | } 92 | 93 | 94 | module nema17(places=[1,1,1,1], size=15.5, h=10, holes=false, shadow=false, $fn=24){ 95 | for (i=[0:3]) { 96 | if (places[i] == 1) { 97 | rotate([0, 0, 90*i]) translate([size, size, 0]) { 98 | if (holes) { 99 | rotate([0, 0, -90*i]) translate([0,0,-10]) screw(r=1.7, slant=false, head_drop=13, $fn=$fn, h=h+12); 100 | } else { 101 | rotate([0, 0, -90*i]) cylinder(h=h, r=5.5, $fn=$fn); 102 | } 103 | } 104 | } 105 | } 106 | if (shadow != false) { 107 | %translate ([0, 0, shadow+21+3]) cube([42,42,42], center = true); 108 | //flange 109 | %translate ([0, 0, shadow+21+3-21-1]) cylinder(r=11,h=2, center = true, $fn=20); 110 | //shaft 111 | %translate ([0, 0, shadow+21+3-21-7]) cylinder(r=2.5,h=14, center = true); 112 | } 113 | } 114 | 115 | module screw(h=20, r=2, r_head=3.5, head_drop=0, slant=i_am_box, poly=false, $fn=0){ 116 | //makes screw with head 117 | //for substraction as screw hole 118 | if (poly) { 119 | cylinder_poly(h=h, r=r, $fn=$fn); 120 | } else { 121 | cylinder(h=h, r=r, $fn=$fn); 122 | } 123 | if (slant) { 124 | translate([0, 0, head_drop-0.01]) cylinder(h=r_head, r2=0, r1=r_head, $fn=$fn); 125 | } 126 | 127 | if (head_drop > 0) { 128 | translate([0, 0, -0.01]) cylinder(h=head_drop+0.01, r=r_head, $fn=$fn); 129 | } 130 | } 131 | 132 | module plate_screw(long=0) { 133 | if (i_am_box == 0) { 134 | translate([0, 0, -long]) screw(head_drop=14 + long, h=30 + long, r_head=3.6, r=1.7, $fn=24, slant=false); 135 | } else { 136 | translate([0, 0, -2 - long]) screw(head_drop=14 + long, h=30 + long, r_head=4.5, r=2, $fn=24, slant=true); 137 | } 138 | } 139 | 140 | //radius of the idler assembly (to surface that touches belt, ignoring guide walls) 141 | function idler_assy_r_inner(idler_bearing) = (idler_bearing[0] / 2) + (6 * single_wall_width + 0.2) * idler_bearing[3]; 142 | //outer radius of the idler assembly (to smooth side of belt) 143 | function idler_assy_r_outer(idler_bearing) = idler_assy_r_inner(idler_bearing) + belt_thickness + 1; 144 | 145 | 146 | module idler_assy(idler_bearing = [22, 7, 8, 1]) { 147 | 148 | //bearing axle 149 | translate([0,0,-1]) cylinder(h = 120, r=(idler_bearing[2] + 1) / 2, $fn=small_hole_segments, center=true); 150 | //bearing shadow 151 | %cylinder(h = idler_bearing[1], r=idler_bearing[0]/2, center=true); 152 | //belt shadow 153 | %cylinder(h = belt_width, r=idler_assy_r_outer(idler_bearing), center=true); 154 | 155 | cylinder(h = idler_width + 1, r=idler_assy_r_outer(idler_bearing) + 0.5, center=true); 156 | } 157 | 158 | module belt(len, side = 0){ 159 | //belt. To be substracted from model 160 | //len is in +Z, smooth side in +X, Y centered 161 | translate([-0.5, 0, 0]) maketeeth(len); 162 | translate([0, -4.5, -0.01]) cube([belt_thickness, 9, len + 0.02]); 163 | if (side != 0) { 164 | translate([0, -4.5 + side, -0.01]) cube_fillet([belt_thickness, 9, len + 0.02], vertical = [3, 0, 0, 0]); 165 | } 166 | } 167 | 168 | 169 | module maketeeth(len){ 170 | //Belt teeth. 171 | for (i = [0 : len / belt_tooth_distance]) { 172 | translate([0, 0, i * belt_tooth_distance]) cube([2, 9, belt_tooth_distance * belt_tooth_ratio], center = true); 173 | } 174 | } 175 | -------------------------------------------------------------------------------- /box_frame/bushing.scad: -------------------------------------------------------------------------------- 1 | // PRUSA iteration3 2 | // Bushing/bearing housings 3 | // GNU GPL v3 4 | // Josef Průša 5 | // Václav 'ax' Hůla 6 | // http://www.reprap.org/wiki/Prusa_Mendel 7 | // http://github.com/josefprusa/Prusa3 8 | 9 | // ThingDoc entry 10 | /** 11 | * @id yBearingHolder 12 | * @name Y Axis Bearing Holder 13 | * @category Printed 14 | */ 15 | 16 | include 17 | 18 | // ensure that the part length is at least the length of bushing barrel plus add 19 | function adjust_bushing_len(conf_b, h, add=layer_height*2) = ((conf_b[2]+add) > h) ? conf_b[2]+add : h; 20 | 21 | //distance from the flat side of bushing holder to rod center 22 | function bushing_foot_len(conf_b, h=10.5, add=4*single_wall_width) = ((conf_b[1]+add) > h) ? conf_b[1]+add : h; 23 | 24 | function bushing_outer_radius(conf_b) = conf_b[1] + 4*single_wall_width; 25 | 26 | // basic building blocks, housings for 1 bushing/bearing 27 | // at [0,0] there is center of the smooth rod, pointing in Z 28 | 29 | module linear_bushing_negative_single(conf_b=bushing_xy, h=0){ 30 | // barrel with the dimensions of a bushing/bearing 31 | // to be substracted as needed 32 | translate([0, 0, -0.01]) cylinder(r = conf_b[1], h = adjust_bushing_len(conf_b, h) + 0.02); 33 | } 34 | 35 | module linear_bearing_negative_single(conf_b=bushing_xy, h=0, shadow=false){ 36 | // barrel with the dimensions of the bearing 37 | translate([0, 0, -0.01 + 3 * layer_height]) cylinder(r = conf_b[1], h = adjust_bushing_len(conf_b, h) + 0.02); 38 | if (shadow == false) { 39 | translate([0, -conf_b[1]+1, -0.01 + 3 * layer_height]) cube([30, 2 * conf_b[1] - 2, adjust_bushing_len(conf_b, h) + 0.02]); 40 | } 41 | } 42 | 43 | module linear_bushing_single(conf_b=bushing_xy, h=0) { 44 | // This is the printed barrel around bushing 45 | // with foot pointing to -x 46 | translate([-bushing_foot_len(conf_b), -7, 0]) cube([bushing_foot_len(conf_b), 14, adjust_bushing_len(conf_b, h)]); 47 | cylinder(r=bushing_outer_radius(conf_b), h=adjust_bushing_len(conf_b, h)); 48 | } 49 | 50 | module linear_bushing_negative(conf_b=bushing_xy, h=0){ 51 | // return simple negative stretched all along and a smooth rod 52 | translate([0,0,-0.1]) cylinder(r = conf_b[0] + single_wall_width, h=adjust_bushing_len(conf_b, h)+0.2); 53 | linear_bushing_negative_single(conf_b, h=adjust_bushing_len(conf_b, h)); 54 | } 55 | 56 | module linear_bearing_negative(conf_b = bushing_xy, h = 0, shadow=false){ 57 | //same as linear_bushing_negative, but with z direction constrained parts 58 | translate([0,0,-0.1]) cylinder(r = conf_b[0] + single_wall_width, h=adjust_bushing_len(conf_b, h, 8*layer_height)+0.2); 59 | //lower bearing 60 | linear_bearing_negative_single(conf_b, 0, shadow); 61 | if (h > 2*conf_b[2] + 9*layer_height){ 62 | translate([0,0,h]) mirror([0,0,1]) linear_bearing_negative_single(conf_b, 0, shadow); 63 | } 64 | } 65 | 66 | module linear_negative_preclean(conf_b = bushing_xy) { 67 | // makes sure there is nothing interfering 68 | // to be substracted before linear() 69 | cylinder(r = conf_b[1] + single_wall_width, h=300, center=true); 70 | } 71 | 72 | module linear_bushing_sloped(conf_b=bushing_xy, h= 100){ 73 | // cut the bushing at angle, so it can be printed upside down 74 | intersection(){ 75 | linear_bushing_single(conf_b, h = h); 76 | // hardcoded, may need fixing for different barelled bushings 77 | // atm there is only one and I am too lazy 78 | translate([0, 0, -2]) rotate([0,-50,0]) cube([30, 40, 80], center=true); 79 | } 80 | } 81 | 82 | module linear_bushing(conf_b=bushing_xy, h=0){ 83 | // this is the function to be used for type 1 linears (barrel holder) 84 | // It has bushing on bottom and for parts longer than 3x the barel length on top too 85 | difference() { 86 | union() { 87 | translate([-bushing_foot_len(conf_b), -7, 0]) cube([2, 14, adjust_bushing_len(conf_b, h)]); 88 | linear_bushing_single(conf_b); 89 | if (h>3*conf_b[2]) { 90 | translate([0,0,h]) mirror([0,0,1]) linear_bushing_sloped(conf_b); 91 | } 92 | } 93 | linear_bushing_negative(conf_b, h); 94 | } 95 | } 96 | 97 | module linear_bearing(conf_b=bushing_xy, h=0){ 98 | difference() { 99 | union() { 100 | difference(){ 101 | union(){ 102 | //main block 103 | //translate([-bushing_foot_len(conf_b), -7, 0]) cube([4, 14, adjust_bushing_len(conf_b, h, 9*layer_height)]); <- removed for duplicity:) 104 | translate([0,0,0]) cylinder(h = adjust_bushing_len(conf_b, h, 9*layer_height), r=bushing_outer_radius(conf_b), $fn=60); 105 | } 106 | //smooth entry cut 107 | translate([12,0,-1]) rotate([0,0,45]) cube([20, 20, 200], center=true); 108 | } 109 | intersection(){ 110 | translate([0, -(bushing_outer_radius(conf_b)), 0]) cube([30, 2*bushing_outer_radius(conf_b) , max(h, conf_b[2] + 9 * layer_height)]); 111 | union() { 112 | // upper clamp for long holders 113 | if (h > 2*conf_b[2] + 9*layer_height || conf_b[2] > 45){ 114 | translate ([0,0, max(h, conf_b[2]) - 8 ]) bearing_clamp(conf_b, 2*(bushing_outer_radius(conf_b))); 115 | } 116 | //lower clamp 117 | translate ([0, 0, 10]) bearing_clamp(conf_b, 2*(bushing_outer_radius(conf_b))); 118 | } 119 | } 120 | } 121 | //main axis 122 | translate([0,0,-2]) cylinder(h = adjust_bushing_len(conf_b, h)+10, r=conf_b[1]); 123 | //main cut 124 | translate([0, -conf_b[1]+1, -1]) cube([30, 2*conf_b[1]-2, 200]); 125 | } 126 | difference() { 127 | translate([-bushing_foot_len(conf_b), -7, 0]) cube([4, 14, adjust_bushing_len(conf_b, h, 9*layer_height)]); 128 | linear_negative(conf_b, h); 129 | } 130 | } 131 | 132 | // this should be more parametric 133 | module firm_foot(conf_b = conf_b_lm8uu){ 134 | difference(){ 135 | union() { 136 | translate([8.5/2,0,0]) cube_fillet([8.5, 42 + xy_delta * 2, 20], top=[11, 0, 11, 0], center=true); 137 | } 138 | translate([9, 14.5 + xy_delta, 0]) rotate([0, -90, 0]) screw(head_drop=1, $fn=small_hole_segments); 139 | translate([9,-14.5 - xy_delta, 0]) rotate([0,-90,0]) screw(head_drop=1,$fn=small_hole_segments); 140 | } 141 | } 142 | 143 | module y_bearing(conf_b=bushing_xy){ 144 | 145 | difference() { 146 | union() { 147 | difference() { 148 | union() { 149 | translate([-bushing_foot_len(conf_b), 0, 10]) firm_foot(); 150 | if (bushing_xy[2] > 45) { 151 | translate([-bushing_foot_len(conf_b), 0, adjust_bushing_len(bushing_xy, 45) - 8]) mirror([0, 0, 1]) firm_foot(); 152 | } 153 | } 154 | linear_negative_preclean(); 155 | } 156 | linear(); 157 | } 158 | //linear_negative(bushing_xy, 20); 159 | } 160 | } 161 | 162 | module bearing_clamp_brick(conf_b, h){ 163 | translate([-(m4_nut_diameter/2+conf_b[1]), 0, 0]) 164 | cube([m4_nut_diameter + 2 * conf_b[1], m4_nut_diameter + 1, h], center = true); 165 | } 166 | 167 | module bearing_clamp(conf_b=bushing_xy, h=0){ 168 | // inspired by John Ridley and Jonas Kühling 169 | rotate([90, 0, 0]) { 170 | difference(){ 171 | union(){ 172 | translate([m3_diameter / 2 + conf_b[1] + 0.3, 0, 0]) 173 | cylinder(h=h, r = m4_nut_diameter / 2 + 0.5, center = true); 174 | translate([m3_diameter / 2 + conf_b[1] + 0.3, 0, 0]) { 175 | bearing_clamp_brick(conf_b, h); 176 | rotate([0,0,35]) 177 | bearing_clamp_brick(conf_b, h); 178 | } 179 | } 180 | translate([m3_diameter / 2 + conf_b[1] + 0.3, 0, 0]) { 181 | cylinder(r=m3_diameter / 2, h=h+2, center=true,$fn=small_hole_segments); 182 | %cylinder(r=m3_diameter / 2, h=h+2, center=true,$fn=small_hole_segments); 183 | } 184 | } 185 | } 186 | } 187 | 188 | 189 | module linear_negative(conf_b = bushing_xy, h = 0, shadow=false){ 190 | //selects right negative based on type 191 | if (conf_b[3] == 0) { 192 | linear_bearing_negative(conf_b, h, shadow); 193 | } else { 194 | linear_bushing_negative(conf_b, h, shadow); 195 | } 196 | } 197 | 198 | module linear(conf_b = bushing_xy, h = 0){ 199 | //selects right model based on type 200 | if (conf_b[3] == 0) { 201 | linear_bearing(conf_b, h); 202 | } else { 203 | linear_bushing(conf_b, h); 204 | } 205 | %linear_negative(conf_b, h, true); 206 | } 207 | 208 | if (i_am_box == 1) { 209 | %cylinder(r=bushing_xy[0], h=90); 210 | 211 | y_bearing(); 212 | translate([0,52,0]) y_bearing(); 213 | 214 | if (bushing_xy[2] < 45) { 215 | translate ([-30,23,0]) mirror([1,0,0]) y_bearing(); 216 | } 217 | } else { 218 | cube([0.1, 0.1, 0.1]); 219 | } 220 | -------------------------------------------------------------------------------- /box_frame/doc/manual.txt: -------------------------------------------------------------------------------- 1 | Assembly 2 | 3 | This document will guide you through putting together your Prusa i3. 4 | Please read it through briefly before starting your build, and make sure you have everything you need to continue. 5 | It's frustrating to be stuck with a half-finished machine because you are missing a part or tool. 6 | It's recommended to do the assembly with 2 or more people. If you are doing this alone, do the instructions in order. 7 | If there are two of you, each step is marked P1 or P2. Decide which one of you is Player 1 and act accordingly. 8 | If there are more than two of you, split into two teams. 9 | 10 | 11 | ===Assemble the extruder (P1)=== 12 | There are multiple forms of extruder. These instructions cover two common variants. 13 | 14 | ==The gregstruder== 15 | Plastic parts needed: 16 | -Extruder body 17 | -Extruder idler 18 | -Extruder large gear 19 | -Extruder small gear 20 | Other parts needed: 21 | -1 NEMA17 motor 22 | -1 hotend 23 | -1 M3x8 grub screw 24 | -6 M3 nuts 25 | -3 M3x40 bolts 26 | -1 M8x20 grub screw 27 | -1 M8 hobbed bolt 28 | -4 M8 washers 29 | -2 M8 nuts 30 | -3 608 skateboard bearings 31 | -3 M3x10 bolts 32 | (optional) 2 short, stiff springs or silicone pads 33 | Tools needed 34 | -Wrench/spanner to fit M8 (preferably 2) 35 | -Soldering iron 36 | -Drill with 8mm and 3mm bits 37 | -File 38 | -Screwdriver or allen key to fit your M3 bolt heads and the M3 grub screw 39 | 40 | Take the extruder body and snap off the small support piece attached to it. It should separate easily. If it leaves a messy surface, clean the surface up. 41 | Use the drill to drill through the 8mm hole in the extruder body, the 3mm holes for the motor bolts, the 2 3mm mounting holes on the bottom and the 3mm hole for the idler (where the support piece was). 42 | Melt two M3 nuts into the nut traps over the mounting holes. 43 | Drill through the filament channel to make sure it's clear. 44 | Place 1 608 bearing on the M8x20 grub screw and push it into the idler. It will only fit if the bearing is on the middle of the grub screw. It will click in place. 45 | Attach the idler to the extruder body and fix it with the M3x40 bolt. Make sure the bolt head is on the FLAT side of the extruder body. You can put a nut on the bolt if you want, but don't tighten it very tightly. 46 | Place an M3 nut in the small gear and fix it in place with the M3x8 grub screw. Slide the gear onto the motor shaft and fix it in place with the grub screw. Do not overtighten, and make sure the motor can turn freely with the gear in place. 47 | Attach the motor to the extruder body with the 3 M3x10 bolts. The bolt heads go on the FLAT side of the extruder body. 48 | Place 2 608 bearings in the recesses in the extruder body. 49 | Place the hobbed bolt in the large gear. If it's too loose, pad it a bit until it sits tight. Place two washers on the opposite (flat) side of the gear and slide the hobbed bolt through the two bearings into the extruder body. The gear teeth will mesh with the small gear already there. If they don't, adjust the position of the motor and/or the gear on the motor shaft until they do. Make sure the bobbing on the bolt aligns with the filament channel. If necessary, add another washer between the gear and the extruder body. Place a washer followed by 2 M8 nuts on the opposite side of the extruder body to fix the bolt in place. 50 | If you are using springs or silicone pads, place those on the remaining two M3x40 bolts. Place two nuts into the nut recesses above the two bearings. Use the M3x40 bolts to fix the idler in place. You will adjust the tension later when you insert filament, so don't worry about that for now. 51 | Assemble your hotend according to your specific hotend's assembly instructions. I am assuming you have a hotend that is matched to your extruder body. 52 | Attach the hotend to the extruder. If your hotend has a flat mounting plate, make sure the holes on it align with the holes on the extruder body so that the filament channel leads into the hotend. Redrill holes as necessary if something does not fit. 53 | 54 | ==The raldrich geared stepper extruder== 55 | 56 | Plastic parts needed: 57 | -Extruder body 58 | -Extruder idler 59 | -Extruder body spacer 60 | Other parts needed: 61 | -1 geared stepper motor 62 | -1 hotend 63 | -2 M3x30 bolt 64 | -6 M3 nuts 65 | -1 filament drive gear 66 | -1 M3x8 grub screw 67 | -1 M4 x20 bolt 68 | -1 624 bearing 69 | -4 M3x40 bolts 70 | -4 M3 washers 71 | (optional) 4 short, stiff springs or silicone pads 72 | Tools needed 73 | -Soldering iron 74 | -Drill with 8mm and 3mm bits 75 | -File 76 | -Screwdriver or allen key to fit your M3 and M4 bolt heads and the M3 grub screw 77 | 78 | Use the drill to drill through the 3mm holes for the motor bolts, the 2 3mm mounting holes on the bottom and the 4mm hole in the idler. 79 | Drill through the filament channel to make sure it's clear. 80 | Place the 624 bearing in the idler and fix it with the M4x20 bolt. 81 | Place the spacer on the motor and make sure it aligns correctly with the extruder body. 82 | Attach the drive gear to the motor shaft with the grub screw. Adjust the position of the drive gear to align with the filament channel. 83 | Use the M3x30 bolts and the M3 nuts to fix the extruder body to the motor, sandwiching the spacer plate between them. 84 | Place washers on the M3x40 bolts. 85 | If you are using springs or silicone pads, place those on the remaining M3x40 bolts. 86 | Place M3 nuts into the nut traps of the extruder body. 87 | Attach the idler to the extruder body, so that the bearing presses against the drive gear. 88 | Assemble your hotend according to your specific hotend's assembly instructions. I am assuming you have a hotend that is matched to your extruder body. 89 | Attach the hotend to the extruder. If your hotend has a flat mounting plate, make sure the holes on it align with the holes on the extruder body so that the filament channel leads into the hotend. Redrill holes as necessary if something does not fit. 90 | 91 | 92 | ===Assemble the X axis (P2)=== 93 | Plastic parts needed: 94 | -x axis motor end 95 | -x axis idler end 96 | -x carriage 97 | Other parts needed: 98 | -1 NEMA17 stepper motor 99 | -1 T2.5 belt 100 | -3 M3x10 bolt 101 | -1 belt drive pulley 102 | -1 M3x8 grub screw 103 | -1 ??? bolt 104 | -1 ??? bearing 105 | -7 linear bearings 106 | -7 M3x25 bolt with nut and washers 107 | -2 smooth rods 108 | Tools needed 109 | -Screwdriver or allen key to fit your M3 bolt heads and the M3 grub screw 110 | 111 | The X axis consists of 3 parts - the motor end, the idler end, and the carriage. 112 | Insert four linear bearings (two per part) into the motor and idler ends of the x axis, gently fix them in place with M3x25 screw 113 | Slide a smooth rod through each pair of linear bearings to make sure they slide smoothly and don't move around. If they do move around, tighten the screw. Remove the smooth rods 114 | Insert two smooth rods into the motor end of the X axis (the one with the three mounting points for the motor). Push them in as far as they will go. 115 | Insert three linear bearings into the carriage. Slide the carriage onto the smooth rods and fix them with screws as with x ends. 116 | Attach the idler bearing onto the idler end using an ??? bolt. 117 | Push the idler onto the smooth rods, trapping the carriage in. Make sure the carriage can move along the rods with minimal effort. 118 | Attach a NEMA17 motor to the motor end using 3 M3x10 bolts. The bolt heads will sink into the part, and the motor will be on the side opposite the linear bearings. 119 | Place a pulley on the motor and fasten it to the shaft using a grub screw. Make sure the belt path is aligned with the gap in the x end pieces. 120 | Insert a belt into the carriage belt holder such that it meshes with the printed teeth. 121 | Thread the belt through the motor and idler ends, so that it runs over the bearing and the pulley. Insert the other end of the belt into the belt holder. 122 | Do not cut the belt to size yet, as we will still have to adjust the location of the idler end along the smooth rods. 123 | 124 | ===Assemble the Y axis(P2)=== 125 | Plastic parts needed: 126 | -y axis motor holder 127 | -4 y corners 128 | -y axis idler 129 | -y belt clamp 130 | -3 y bearing holders 131 | Other parts needed: 132 | -1 23x23cm 12mm plate (9"x9" 1/2" thick for people in inchy countries) (may be thinner) 133 | -1 heated bed PCB, with wires attached 134 | -1 glass plate covered with Kapton or PET tape 135 | -1 NEMA17 stepper motor 136 | -1 T2.5 belt 137 | -2 M3x10 bolt 138 | -1 belt drive pulley 139 | -1 M3x8 grub screw 140 | -1 ??? bolt 141 | -1 ??? bearing 142 | -3 linear bearings 143 | -3 M3x25 bolt with nut and washers 144 | -2 405mm smooth rods 145 | -22 M8 nuts (substitute 5/16" for M8 in inchland) 146 | -22 M8 washers 147 | -12 M10 nuts (?? in inchland) 148 | -12 M10 washers 149 | -4 140mm M8 (5/16") threaded rod (longer is ok) 150 | -2 430mm M10 (??/16") threaded rod (longer is ok) 151 | -9 3.5x12mm wood screws (or shorter if your plate is thinner) 152 | Tools needed: 153 | -Screwdriver to fit your wood screws 154 | -Screwdriver or allen key to fit your M3 bolt heads and the M3 grub screw 155 | -13mm wrench 156 | -Another 13mm wrench (optional but violently recommended) 157 | -17mm wrench 158 | -Another 17mm wrench (optional, but...) 159 | -Pencil or marker that is visible on the plate material 160 | -Drill with 3.2mm (1/8") or 3mm drill bit 161 | -Tape for holding things in place 162 | 163 | Place the belt drive pulley on the motor shaft and tighten it with the grub screw. 164 | Attach the motor to the y axis motor holder using two M3x10 bolts. (ystep1.png) 165 | Thread two of the 140mm threaded rods through the motor holder. It should sit about 1/3 along the length of the rods, so that the motor is approximately centered. 166 | Use 4 M8 washers and nuts to fix the motor holder in place on the rods. (ystep2.png) 167 | Place a ??? bearing in the idler and fix it with the ??? bolt. 168 | Attach the idler to one of the remaining 140mm rods. Fix it with a nut and washer on each side. (ystep3.png) 169 | Place a pair of washers surrounded by nuts around the middle of each of the 430mm threaded rods. 170 | Place a nut and a washer on one end of each of the 430mm threaded rods. (ystep4.png) 171 | Snap a smooth rod into one of the y corners. 172 | Thread one end of the 430mm threaded rod through the y corner piece so it goes parallel to the smooth rod with the nut and washer against the plastic part. 173 | Put a washer and a nut on the outside of the plastic piece, fixing it to the threaded rod. (ystep5.png) 174 | Put a nut followed by a washer onto the other end of the threaded rod. 175 | Add another plastic y corner to the smooth and threaded rod's other end. 176 | Put a washer and a nut on the outside of the plastic piece, fixing it to the threaded rod. 177 | Adjust the inner nut so the smooth rod is snugly held in place.(ystep6.png) 178 | Repeat this procedure for the other 430mm threaded rod.(ystep7.png) 179 | Place a nut and a washer on one end of each of the 140mm threaded rods. (ystep8.png) 180 | Place the assembled smooth and threaded rods on the ends of the 140mm rods. Adjust the motor and idler position if necessary. (ystep9.png) 181 | Place a nut and washer on the outside end of each of the 140mm rods. Do not tighten yet. (ystep10.png) 182 | Place an object of 10cm width between the smooth rods. One of the frame panels might be useful for this. 183 | Using the 10cm reference, make sure the distance between smooth rods is the same on both ends. 184 | Measure as close as you can to the motor, and as close as you can to the idler. 185 | Adjust the inner nuts and tighten the outer nuts, while checking the distance repeatedly. 186 | Use two wrenches to tighten the nuts without moving the plastic part along the rod. 187 | Once done, pop the smooth rods out of the plastic parts. (ystep11.png) 188 | Place the linear bearings in the linear bearing holders, fix them firmly with M3x25 screws 189 | Slide them onto the rods. Two on one rod, one on the other. 190 | Place your heated bed PCB on the plate and tape it down so it doesn't move around. 191 | Mark and drill the 4 corner holes of the PCB with a 3.2mm (1/8") or 3mm drill. 192 | Remove the heated bed PCB from the plate and place the plate on a flat surface. 193 | Pop the smooth rods, with linear bearings attached, back into the plastic parts. 194 | The rod with two linear bearings on it should go on the side where the motor pulley is. 195 | Place the entire assembly, upside down, onto the plate. Align it so the smooth rods are parallel to the plate edges and the assembly is approximately centered. 196 | Position the two linear bearings that share a rod so that they are both in the middle third of the plate. 197 | Position the last linear bearing so it's between the other two. 198 | Mark each linear bearing holder mounting hole. 199 | Drill all the holes and screw the linear bearing holders in with the wood screws. 200 | Place one end of the belt into the belt clamp. Run the belt along its path over the pulley and idler and back to the belt clamp. 201 | Place the belt clamp in the middle of the plate along the belt path. 202 | Mark and drill the belt clamp mounting holes and screw the belt clamp down. 203 | Pull the belt tight and place the end into the belt clamp. Your Y axis is done. 204 | 205 | 206 | ===Assemble the frame (P1)=== 207 | The frame can be either one custom-cut plate or a box section composed of several precut pieces (you can have them cut to size at the hardware store). 208 | If you have a custom-cut plate, skip this step and move on to the Z axis below. 209 | 210 | Other parts needed: 211 | -6 45x10cm 12mm plate (18"x4" 1/2" thick plate for you non-metric people) 212 | -1 47.5x10cm 12mm plate (19"x4" 1/2" thick) (optional, needed only if you want to mount a spool on top of the machine.) 213 | -Box of 3.5x20mm wood screws 214 | Tools needed 215 | -Drill with 3mm or 3.2mm bit 216 | -Countersink bit 217 | -Screwdriver or power screwdriver to match the wood screws 218 | -Clamps (optional but highly recommended, can be replaced by helpful friend) 219 | -Pencil 220 | -A shim/spacer, 3mm wide 221 | 222 | Place two of the 45x10 plates against each other on a flat surface, one standing up. 223 | Make sure the ends are aligned exactly by pressing another plate against them. Clamp them down in this position (or have your friend hold them). 224 | Drill through the plate that is standing up into the side of the plate that is lying on the table, approximately halfway along the length of the plate. 225 | Countersink the hole and add a screw. Add two more screws about 3cm from each end of the plate. 226 | Repeat this for another pair of plates. 227 | Lay the two pairs on the table and put another 45x10 plate between them. Align the new plate with one of the edges. 228 | Clamp the plates down and use 6 screws to attach the cross plate to the two corners. 229 | Place the 3mm spacer on the table, and put the last remaining 45x10 on top of it. 230 | Stand the remaining plates on end, and place them on top of the new plate. Use 8 screws to secure the bottom plate to the rest of the frame. 231 | If you want to, place the 47.5x10 plate on top of the entire structure and attach it with 6 screws. This is a convenient place to mount accessories, such as a filament roll holder. 232 | 233 | 234 | ===Assemble the Z axis(P1)=== 235 | -------------------------------------------------------------------------------- /box_frame/extras/inc/parametric_involute_gear_v5.0.scad: -------------------------------------------------------------------------------- 1 | // Parametric Involute Bevel and Spur Gears by GregFrost 2 | // It is licensed under the Creative Commons - GNU GPL license. 3 | // © 2010 by GregFrost 4 | // http://www.thingiverse.com/thing:3575 5 | 6 | // Simple Test: 7 | //gear (circular_pitch=700, 8 | // gear_thickness = 12, 9 | // rim_thickness = 15, 10 | // hub_thickness = 17, 11 | // circles=8); 12 | 13 | //Complex Spur Gear Test: 14 | //test_gears (); 15 | 16 | // Meshing Double Helix: 17 | //meshing_double_helix (); 18 | 19 | // Demonstrate the backlash option for Spur gears. 20 | //test_backlash (); 21 | 22 | // Demonstrate how to make meshing bevel gears. 23 | bevel_gear_pair (); 24 | 25 | pi=3.1415926535897932384626433832795; 26 | 27 | //================================================== 28 | // Bevel Gears: 29 | // Two gears with the same cone distance, circular pitch (measured at the cone distance) 30 | // and pressure angle will mesh. 31 | 32 | module bevel_gear_pair ( 33 | gear1_teeth = 41, 34 | gear2_teeth = 7, 35 | axis_angle = 90, 36 | outside_circular_pitch=1000) 37 | { 38 | outside_pitch_radius1 = gear1_teeth * outside_circular_pitch / 360; 39 | outside_pitch_radius2 = gear2_teeth * outside_circular_pitch / 360; 40 | pitch_apex1=outside_pitch_radius2 * sin (axis_angle) + 41 | (outside_pitch_radius2 * cos (axis_angle) + outside_pitch_radius1) / tan (axis_angle); 42 | cone_distance = sqrt (pow (pitch_apex1, 2) + pow (outside_pitch_radius1, 2)); 43 | pitch_apex2 = sqrt (pow (cone_distance, 2) - pow (outside_pitch_radius2, 2)); 44 | echo ("cone_distance", cone_distance); 45 | pitch_angle1 = asin (outside_pitch_radius1 / cone_distance); 46 | pitch_angle2 = asin (outside_pitch_radius2 / cone_distance); 47 | echo ("pitch_angle1, pitch_angle2", pitch_angle1, pitch_angle2); 48 | echo ("pitch_angle1 + pitch_angle2", pitch_angle1 + pitch_angle2); 49 | 50 | rotate([0,0,90]) 51 | translate ([0,0,pitch_apex1+20]) 52 | { 53 | translate([0,0,-pitch_apex1]) 54 | bevel_gear ( 55 | number_of_teeth=gear1_teeth, 56 | cone_distance=cone_distance, 57 | pressure_angle=30, 58 | outside_circular_pitch=outside_circular_pitch); 59 | 60 | rotate([0,-(pitch_angle1+pitch_angle2),0]) 61 | translate([0,0,-pitch_apex2]) 62 | bevel_gear ( 63 | number_of_teeth=gear2_teeth, 64 | cone_distance=cone_distance, 65 | pressure_angle=30, 66 | outside_circular_pitch=outside_circular_pitch); 67 | } 68 | } 69 | 70 | //Bevel Gear Finishing Options: 71 | bevel_gear_flat = 0; 72 | bevel_gear_back_cone = 1; 73 | 74 | module bevel_gear ( 75 | number_of_teeth=11, 76 | cone_distance=100, 77 | face_width=20, 78 | outside_circular_pitch=1000, 79 | pressure_angle=30, 80 | clearance = 0.2, 81 | bore_diameter=5, 82 | gear_thickness = 15, 83 | backlash = 0, 84 | involute_facets=0, 85 | finish = -1) 86 | { 87 | echo ("bevel_gear", 88 | "teeth", number_of_teeth, 89 | "cone distance", cone_distance, 90 | face_width, 91 | outside_circular_pitch, 92 | pressure_angle, 93 | clearance, 94 | bore_diameter, 95 | involute_facets, 96 | finish); 97 | 98 | // Pitch diameter: Diameter of pitch circle at the fat end of the gear. 99 | outside_pitch_diameter = number_of_teeth * outside_circular_pitch / 180; 100 | outside_pitch_radius = outside_pitch_diameter / 2; 101 | 102 | // The height of the pitch apex. 103 | pitch_apex = sqrt (pow (cone_distance, 2) - pow (outside_pitch_radius, 2)); 104 | pitch_angle = asin (outside_pitch_radius/cone_distance); 105 | 106 | echo ("Num Teeth:", number_of_teeth, " Pitch Angle:", pitch_angle); 107 | 108 | finish = (finish != -1) ? finish : (pitch_angle < 45) ? bevel_gear_flat : bevel_gear_back_cone; 109 | 110 | apex_to_apex=cone_distance / cos (pitch_angle); 111 | back_cone_radius = apex_to_apex * sin (pitch_angle); 112 | 113 | // Calculate and display the pitch angle. This is needed to determine the angle to mount two meshing cone gears. 114 | 115 | // Base Circle for forming the involute teeth shape. 116 | base_radius = back_cone_radius * cos (pressure_angle); 117 | 118 | // Diametrial pitch: Number of teeth per unit length. 119 | pitch_diametrial = number_of_teeth / outside_pitch_diameter; 120 | 121 | // Addendum: Radial distance from pitch circle to outside circle. 122 | addendum = 1 / pitch_diametrial; 123 | // Outer Circle 124 | outer_radius = back_cone_radius + addendum; 125 | 126 | // Dedendum: Radial distance from pitch circle to root diameter 127 | dedendum = addendum + clearance; 128 | dedendum_angle = atan (dedendum / cone_distance); 129 | root_angle = pitch_angle - dedendum_angle; 130 | 131 | root_cone_full_radius = tan (root_angle)*apex_to_apex; 132 | back_cone_full_radius=apex_to_apex / tan (pitch_angle); 133 | 134 | back_cone_end_radius = 135 | outside_pitch_radius - 136 | dedendum * cos (pitch_angle) - 137 | gear_thickness / tan (pitch_angle); 138 | back_cone_descent = dedendum * sin (pitch_angle) + gear_thickness; 139 | 140 | // Root diameter: Diameter of bottom of tooth spaces. 141 | root_radius = back_cone_radius - dedendum; 142 | 143 | half_tooth_thickness = outside_pitch_radius * sin (360 / (4 * number_of_teeth)) - backlash / 4; 144 | half_thick_angle = asin (half_tooth_thickness / back_cone_radius); 145 | 146 | face_cone_height = apex_to_apex-face_width / cos (pitch_angle); 147 | face_cone_full_radius = face_cone_height / tan (pitch_angle); 148 | face_cone_descent = dedendum * sin (pitch_angle); 149 | face_cone_end_radius = 150 | outside_pitch_radius - 151 | face_width / sin (pitch_angle) - 152 | face_cone_descent / tan (pitch_angle); 153 | 154 | // For the bevel_gear_flat finish option, calculate the height of a cube to select the portion of the gear that includes the full pitch face. 155 | bevel_gear_flat_height = pitch_apex - (cone_distance - face_width) * cos (pitch_angle); 156 | 157 | // translate([0,0,-pitch_apex]) 158 | difference () 159 | { 160 | intersection () 161 | { 162 | union() 163 | { 164 | rotate (half_thick_angle) 165 | translate ([0,0,pitch_apex-apex_to_apex]) 166 | cylinder ($fn=number_of_teeth*2, r1=root_cone_full_radius,r2=0,h=apex_to_apex); 167 | for (i = [1:number_of_teeth]) 168 | // for (i = [1:1]) 169 | { 170 | rotate ([0,0,i*360/number_of_teeth]) 171 | { 172 | involute_bevel_gear_tooth ( 173 | back_cone_radius = back_cone_radius, 174 | root_radius = root_radius, 175 | base_radius = base_radius, 176 | outer_radius = outer_radius, 177 | pitch_apex = pitch_apex, 178 | cone_distance = cone_distance, 179 | half_thick_angle = half_thick_angle, 180 | involute_facets = involute_facets); 181 | } 182 | } 183 | } 184 | 185 | if (finish == bevel_gear_back_cone) 186 | { 187 | translate ([0,0,-back_cone_descent]) 188 | cylinder ( 189 | $fn=number_of_teeth*2, 190 | r1=back_cone_end_radius, 191 | r2=back_cone_full_radius*2, 192 | h=apex_to_apex + back_cone_descent); 193 | } 194 | else 195 | { 196 | translate ([-1.5*outside_pitch_radius,-1.5*outside_pitch_radius,0]) 197 | cube ([3*outside_pitch_radius, 198 | 3*outside_pitch_radius, 199 | bevel_gear_flat_height]); 200 | } 201 | } 202 | 203 | if (finish == bevel_gear_back_cone) 204 | { 205 | translate ([0,0,-face_cone_descent]) 206 | cylinder ( 207 | r1=face_cone_end_radius, 208 | r2=face_cone_full_radius * 2, 209 | h=face_cone_height + face_cone_descent+pitch_apex); 210 | } 211 | 212 | translate ([0,0,pitch_apex - apex_to_apex]) 213 | cylinder (r=bore_diameter/2,h=apex_to_apex); 214 | } 215 | } 216 | 217 | module involute_bevel_gear_tooth ( 218 | back_cone_radius, 219 | root_radius, 220 | base_radius, 221 | outer_radius, 222 | pitch_apex, 223 | cone_distance, 224 | half_thick_angle, 225 | involute_facets) 226 | { 227 | // echo ("involute_bevel_gear_tooth", 228 | // back_cone_radius, 229 | // root_radius, 230 | // base_radius, 231 | // outer_radius, 232 | // pitch_apex, 233 | // cone_distance, 234 | // half_thick_angle); 235 | 236 | min_radius = max (base_radius*2,root_radius*2); 237 | 238 | pitch_point = 239 | involute ( 240 | base_radius*2, 241 | involute_intersect_angle (base_radius*2, back_cone_radius*2)); 242 | pitch_angle = atan2 (pitch_point[1], pitch_point[0]); 243 | centre_angle = pitch_angle + half_thick_angle; 244 | 245 | start_angle = involute_intersect_angle (base_radius*2, min_radius); 246 | stop_angle = involute_intersect_angle (base_radius*2, outer_radius*2); 247 | 248 | res=(involute_facets!=0)?involute_facets:($fn==0)?5:$fn/4; 249 | 250 | translate ([0,0,pitch_apex]) 251 | rotate ([0,-atan(back_cone_radius/cone_distance),0]) 252 | translate ([-back_cone_radius*2,0,-cone_distance*2]) 253 | union () 254 | { 255 | for (i=[1:res]) 256 | { 257 | assign ( 258 | point1= 259 | involute (base_radius*2,start_angle+(stop_angle - start_angle)*(i-1)/res), 260 | point2= 261 | involute (base_radius*2,start_angle+(stop_angle - start_angle)*(i)/res)) 262 | { 263 | assign ( 264 | side1_point1 = rotate_point (centre_angle, point1), 265 | side1_point2 = rotate_point (centre_angle, point2), 266 | side2_point1 = mirror_point (rotate_point (centre_angle, point1)), 267 | side2_point2 = mirror_point (rotate_point (centre_angle, point2))) 268 | { 269 | polyhedron ( 270 | points=[ 271 | [back_cone_radius*2+0.1,0,cone_distance*2], 272 | [side1_point1[0],side1_point1[1],0], 273 | [side1_point2[0],side1_point2[1],0], 274 | [side2_point2[0],side2_point2[1],0], 275 | [side2_point1[0],side2_point1[1],0], 276 | [0.1,0,0]], 277 | triangles=[[0,1,2],[0,2,3],[0,3,4],[0,5,1],[1,5,2],[2,5,3],[3,5,4],[0,4,5]]); 278 | } 279 | } 280 | } 281 | } 282 | } 283 | 284 | module gear ( 285 | number_of_teeth=15, 286 | circular_pitch=false, diametral_pitch=false, 287 | pressure_angle=28, 288 | clearance = 0.2, 289 | gear_thickness=5, 290 | rim_thickness=8, 291 | rim_width=5, 292 | hub_thickness=10, 293 | hub_diameter=15, 294 | bore_diameter=5, 295 | circles=0, 296 | backlash=0, 297 | twist=0, 298 | involute_facets=0) 299 | { 300 | if (circular_pitch==false && diametral_pitch==false) 301 | echo("MCAD ERROR: gear module needs either a diametral_pitch or circular_pitch"); 302 | 303 | //Convert diametrial pitch to our native circular pitch 304 | circular_pitch = (circular_pitch!=false?circular_pitch:180/diametral_pitch); 305 | 306 | // Pitch diameter: Diameter of pitch circle. 307 | pitch_diameter = number_of_teeth * circular_pitch / 180; 308 | pitch_radius = pitch_diameter/2; 309 | echo ("Teeth:", number_of_teeth, " Pitch radius:", pitch_radius); 310 | 311 | // Base Circle 312 | base_radius = pitch_radius*cos(pressure_angle); 313 | 314 | // Diametrial pitch: Number of teeth per unit length. 315 | pitch_diametrial = number_of_teeth / pitch_diameter; 316 | 317 | // Addendum: Radial distance from pitch circle to outside circle. 318 | addendum = 1/pitch_diametrial; 319 | 320 | //Outer Circle 321 | outer_radius = pitch_radius+addendum; 322 | 323 | // Dedendum: Radial distance from pitch circle to root diameter 324 | dedendum = addendum + clearance; 325 | 326 | // Root diameter: Diameter of bottom of tooth spaces. 327 | root_radius = pitch_radius-dedendum; 328 | backlash_angle = backlash / pitch_radius * 180 / pi; 329 | half_thick_angle = (360 / number_of_teeth - backlash_angle) / 4; 330 | 331 | // Variables controlling the rim. 332 | rim_radius = root_radius - rim_width; 333 | 334 | // Variables controlling the circular holes in the gear. 335 | circle_orbit_diameter=hub_diameter/2+rim_radius; 336 | circle_orbit_curcumference=pi*circle_orbit_diameter; 337 | 338 | // Limit the circle size to 90% of the gear face. 339 | circle_diameter= 340 | min ( 341 | 0.70*circle_orbit_curcumference/circles, 342 | (rim_radius-hub_diameter/2)*0.9); 343 | 344 | difference () 345 | { 346 | union () 347 | { 348 | difference () 349 | { 350 | linear_extrude (height=rim_thickness, convexity=10, twist=twist) 351 | gear_shape ( 352 | number_of_teeth, 353 | pitch_radius = pitch_radius, 354 | root_radius = root_radius, 355 | base_radius = base_radius, 356 | outer_radius = outer_radius, 357 | half_thick_angle = half_thick_angle, 358 | involute_facets=involute_facets); 359 | 360 | if (gear_thickness < rim_thickness) 361 | translate ([0,0,gear_thickness]) 362 | cylinder (r=rim_radius,h=rim_thickness-gear_thickness+1); 363 | } 364 | if (gear_thickness > rim_thickness) 365 | cylinder (r=rim_radius,h=gear_thickness); 366 | if (hub_thickness > gear_thickness) 367 | translate ([0,0,gear_thickness]) 368 | cylinder (r=hub_diameter/2,h=hub_thickness-gear_thickness); 369 | } 370 | translate ([0,0,-1]) 371 | cylinder ( 372 | r=bore_diameter/2, 373 | h=2+max(rim_thickness,hub_thickness,gear_thickness)); 374 | if (circles>0) 375 | { 376 | for(i=[0:circles-1]) 377 | rotate([0,0,i*360/circles]) 378 | translate([circle_orbit_diameter/2,0,-1]) 379 | cylinder(r=circle_diameter/2,h=max(gear_thickness,rim_thickness)+3); 380 | } 381 | } 382 | } 383 | 384 | module gear_shape ( 385 | number_of_teeth, 386 | pitch_radius, 387 | root_radius, 388 | base_radius, 389 | outer_radius, 390 | half_thick_angle, 391 | involute_facets) 392 | { 393 | union() 394 | { 395 | rotate (half_thick_angle) circle ($fn=number_of_teeth*2, r=root_radius); 396 | 397 | for (i = [1:number_of_teeth]) 398 | { 399 | rotate ([0,0,i*360/number_of_teeth]) 400 | { 401 | involute_gear_tooth ( 402 | pitch_radius = pitch_radius, 403 | root_radius = root_radius, 404 | base_radius = base_radius, 405 | outer_radius = outer_radius, 406 | half_thick_angle = half_thick_angle, 407 | involute_facets=involute_facets); 408 | } 409 | } 410 | } 411 | } 412 | 413 | module involute_gear_tooth ( 414 | pitch_radius, 415 | root_radius, 416 | base_radius, 417 | outer_radius, 418 | half_thick_angle, 419 | involute_facets) 420 | { 421 | min_radius = max (base_radius,root_radius); 422 | 423 | pitch_point = involute (base_radius, involute_intersect_angle (base_radius, pitch_radius)); 424 | pitch_angle = atan2 (pitch_point[1], pitch_point[0]); 425 | centre_angle = pitch_angle + half_thick_angle; 426 | 427 | start_angle = involute_intersect_angle (base_radius, min_radius); 428 | stop_angle = involute_intersect_angle (base_radius, outer_radius); 429 | 430 | res=(involute_facets!=0)?involute_facets:($fn==0)?5:$fn/4; 431 | 432 | union () 433 | { 434 | for (i=[1:res]) 435 | assign ( 436 | point1=involute (base_radius,start_angle+(stop_angle - start_angle)*(i-1)/res), 437 | point2=involute (base_radius,start_angle+(stop_angle - start_angle)*i/res)) 438 | { 439 | assign ( 440 | side1_point1=rotate_point (centre_angle, point1), 441 | side1_point2=rotate_point (centre_angle, point2), 442 | side2_point1=mirror_point (rotate_point (centre_angle, point1)), 443 | side2_point2=mirror_point (rotate_point (centre_angle, point2))) 444 | { 445 | polygon ( 446 | points=[[0,0],side1_point1,side1_point2,side2_point2,side2_point1], 447 | paths=[[0,1,2,3,4,0]]); 448 | } 449 | } 450 | } 451 | } 452 | 453 | // Mathematical Functions 454 | //=============== 455 | 456 | // Finds the angle of the involute about the base radius at the given distance (radius) from it's center. 457 | //source: http://www.mathhelpforum.com/math-help/geometry/136011-circle-involute-solving-y-any-given-x.html 458 | 459 | function involute_intersect_angle (base_radius, radius) = sqrt (pow (radius/base_radius, 2) - 1) * 180 / pi; 460 | 461 | // Calculate the involute position for a given base radius and involute angle. 462 | 463 | function rotated_involute (rotate, base_radius, involute_angle) = 464 | [ 465 | cos (rotate) * involute (base_radius, involute_angle)[0] + sin (rotate) * involute (base_radius, involute_angle)[1], 466 | cos (rotate) * involute (base_radius, involute_angle)[1] - sin (rotate) * involute (base_radius, involute_angle)[0] 467 | ]; 468 | 469 | function mirror_point (coord) = 470 | [ 471 | coord[0], 472 | -coord[1] 473 | ]; 474 | 475 | function rotate_point (rotate, coord) = 476 | [ 477 | cos (rotate) * coord[0] + sin (rotate) * coord[1], 478 | cos (rotate) * coord[1] - sin (rotate) * coord[0] 479 | ]; 480 | 481 | function involute (base_radius, involute_angle) = 482 | [ 483 | base_radius*(cos (involute_angle) + involute_angle*pi/180*sin (involute_angle)), 484 | base_radius*(sin (involute_angle) - involute_angle*pi/180*cos (involute_angle)), 485 | ]; 486 | 487 | 488 | // Test Cases 489 | //=============== 490 | 491 | module test_gears() 492 | { 493 | translate([17,-15]) 494 | { 495 | gear (number_of_teeth=17, 496 | circular_pitch=500, 497 | circles=8); 498 | 499 | rotate ([0,0,360*4/17]) 500 | translate ([39.088888,0,0]) 501 | { 502 | gear (number_of_teeth=11, 503 | circular_pitch=500, 504 | hub_diameter=0, 505 | rim_width=65); 506 | translate ([0,0,8]) 507 | { 508 | gear (number_of_teeth=6, 509 | circular_pitch=300, 510 | hub_diameter=0, 511 | rim_width=5, 512 | rim_thickness=6, 513 | pressure_angle=31); 514 | rotate ([0,0,360*5/6]) 515 | translate ([22.5,0,1]) 516 | gear (number_of_teeth=21, 517 | circular_pitch=300, 518 | bore_diameter=2, 519 | hub_diameter=4, 520 | rim_width=1, 521 | hub_thickness=4, 522 | rim_thickness=4, 523 | gear_thickness=3, 524 | pressure_angle=31); 525 | } 526 | } 527 | 528 | translate ([-61.1111111,0,0]) 529 | { 530 | gear (number_of_teeth=27, 531 | circular_pitch=500, 532 | circles=5, 533 | hub_diameter=2*8.88888889); 534 | 535 | translate ([0,0,10]) 536 | { 537 | gear ( 538 | number_of_teeth=14, 539 | circular_pitch=200, 540 | pressure_angle=5, 541 | clearance = 0.2, 542 | gear_thickness = 10, 543 | rim_thickness = 10, 544 | rim_width = 15, 545 | bore_diameter=5, 546 | circles=0); 547 | translate ([13.8888888,0,1]) 548 | gear ( 549 | number_of_teeth=11, 550 | circular_pitch=200, 551 | pressure_angle=5, 552 | clearance = 0.2, 553 | gear_thickness = 10, 554 | rim_thickness = 10, 555 | rim_width = 15, 556 | hub_thickness = 20, 557 | hub_diameter=2*7.222222, 558 | bore_diameter=5, 559 | circles=0); 560 | } 561 | } 562 | 563 | rotate ([0,0,360*-5/17]) 564 | translate ([44.444444444,0,0]) 565 | gear (number_of_teeth=15, 566 | circular_pitch=500, 567 | hub_diameter=10, 568 | rim_width=5, 569 | rim_thickness=5, 570 | gear_thickness=4, 571 | hub_thickness=6, 572 | circles=9); 573 | 574 | rotate ([0,0,360*-1/17]) 575 | translate ([30.5555555,0,-1]) 576 | gear (number_of_teeth=5, 577 | circular_pitch=500, 578 | hub_diameter=0, 579 | rim_width=5, 580 | rim_thickness=10); 581 | } 582 | } 583 | 584 | module meshing_double_helix () 585 | { 586 | test_double_helix_gear (); 587 | 588 | mirror ([0,1,0]) 589 | translate ([58.33333333,0,0]) 590 | test_double_helix_gear (teeth=13,circles=6); 591 | } 592 | 593 | module test_double_helix_gear ( 594 | teeth=17, 595 | circles=8) 596 | { 597 | //double helical gear 598 | { 599 | twist=200; 600 | height=20; 601 | pressure_angle=30; 602 | 603 | gear (number_of_teeth=teeth, 604 | circular_pitch=700, 605 | pressure_angle=pressure_angle, 606 | clearance = 0.2, 607 | gear_thickness = height/2*0.5, 608 | rim_thickness = height/2, 609 | rim_width = 5, 610 | hub_thickness = height/2*1.2, 611 | hub_diameter=15, 612 | bore_diameter=5, 613 | circles=circles, 614 | twist=twist/teeth); 615 | mirror([0,0,1]) 616 | gear (number_of_teeth=teeth, 617 | circular_pitch=700, 618 | pressure_angle=pressure_angle, 619 | clearance = 0.2, 620 | gear_thickness = height/2, 621 | rim_thickness = height/2, 622 | rim_width = 5, 623 | hub_thickness = height/2, 624 | hub_diameter=15, 625 | bore_diameter=5, 626 | circles=circles, 627 | twist=twist/teeth); 628 | } 629 | } 630 | 631 | module test_backlash () 632 | { 633 | backlash = 2; 634 | teeth = 15; 635 | 636 | translate ([-29.166666,0,0]) 637 | { 638 | translate ([58.3333333,0,0]) 639 | rotate ([0,0,-360/teeth/4]) 640 | gear ( 641 | number_of_teeth = teeth, 642 | circular_pitch=700, 643 | gear_thickness = 12, 644 | rim_thickness = 15, 645 | rim_width = 5, 646 | hub_thickness = 17, 647 | hub_diameter=15, 648 | bore_diameter=5, 649 | backlash = 2, 650 | circles=8); 651 | 652 | rotate ([0,0,360/teeth/4]) 653 | gear ( 654 | number_of_teeth = teeth, 655 | circular_pitch=700, 656 | gear_thickness = 12, 657 | rim_thickness = 15, 658 | rim_width = 5, 659 | hub_thickness = 17, 660 | hub_diameter=15, 661 | bore_diameter=5, 662 | backlash = 2, 663 | circles=8); 664 | } 665 | 666 | color([0,0,128,0.5]) 667 | translate([0,0,-5]) 668 | cylinder ($fn=20,r=backlash / 4,h=25); 669 | } 670 | 671 | -------------------------------------------------------------------------------- /box_frame/doc/complete-printer-plus.scad: -------------------------------------------------------------------------------- 1 | // PRUSA iteration3 2 | // Complete printer visualisation 3 | // GNU GPL v3 4 | // Greg Frost 5 | // http://www.reprap.org/wiki/Prusa_Mendel 6 | // http://github.com/josefprusa/Prusa3 7 | 8 | include <../configuration.scad> 9 | use <../y-drivetrain.scad> 10 | use <../y-axis-corner.scad> 11 | use <../z-axis.scad> 12 | use <../x-end.scad> 13 | use <../x-carriage.scad> 14 | use <../y-axis-bracket.scad> 15 | use <../bushing.scad> 16 | use <../inc/bearing-guide.scad> 17 | module ybeltholder() { 18 | include <../y-belt-holder.scad> 19 | } 20 | module bearing_guide() { 21 | bearing_guide_inner(); 22 | translate([0,0,7+0.9*2])rotate([0,180,0])bearing_guide_outer(); 23 | } 24 | 25 | 26 | //-------------------------------------------------------------------------------------------------------------------------------- 27 | // screws, nuts, etc 28 | //-------------------------------------------------------------------------------------------------------------------------------- 29 | // wood (flat) screw 30 | module screw(depth=board_thickness*1.5){ 31 | module arrow(radiusmax=4, thickness=1, initialgap=0.5, radiusmin=0.5, depth=4) { 32 | union() { 33 | hull() { 34 | translate([0,0,initialgap/2-0.25])cube(size=[radiusmax,thickness,initialgap+0.5], center=true); 35 | translate([0,0,depth])cube(size=[radiusmin,radiusmin,radiusmin], center=true); 36 | } 37 | rotate([0,0,90]) hull() { 38 | translate([0,0,initialgap/2-0.25])cube(size=[radiusmax,thickness,initialgap+0.5], center=true); 39 | translate([0,0,depth])cube(size=[radiusmin,radiusmin,radiusmin], center=true); 40 | } 41 | } 42 | } 43 | 44 | color([1,1,0]) 45 | difference() { 46 | union() { 47 | cylinder(r1=4,r2=3.5/2,h=4); 48 | cylinder(r1=3.5/2,r2=3.5/2,h=depth-2); 49 | translate([0,0,depth-2])cylinder(r1=3.5/2,r2=0,h=2); 50 | } 51 | arrow(); 52 | } 53 | } 54 | module M3screw(depth=10) { 55 | difference() { 56 | union() { 57 | cylinder(r=1.5, h=2+depth); 58 | cylinder(r=2.5, h=2); 59 | } 60 | cube(size=[6,1,2],center=true); 61 | } 62 | } 63 | // M3 nut 64 | module M3nut(){ 65 | color("silver") 66 | difference(){ 67 | translate([0,0,2])cylinder(r=6/2,h=2.5,$fn=6); 68 | translate([0,0,-1])cylinder(r=3/2,h=12,$fn=10); 69 | } 70 | } 71 | // M8 nut + washer 72 | module nutwasher(){ 73 | color("silver") 74 | difference(){ 75 | union(){ 76 | translate([0,0,2])cylinder(r=15/2,h=7,$fn=6); 77 | translate([0,0,0.5])cylinder(r=8.5,h=1); 78 | } 79 | translate([0,0,-1])cylinder(r=8/2,h=12); 80 | } 81 | } 82 | //-------------------------------------------------------------------------------------------------------------------------------- 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | //-------------------------------------------------------------------------------------------------------------------------------- 93 | // Y axis 94 | //-------------------------------------------------------------------------------------------------------------------------------- 95 | // y motor mount 96 | translate([56-yrodseparation/2,-y_smooth_rod_length/2+9,board_thickness-12]) 97 | { 98 | rotate([0,90,0]) rotate([0,0,90]) motorholder(); 99 | translate([10,0,30])rotate([0,90,0])nutwasher(); 100 | translate([0,0,30])rotate([0,90,180])nutwasher(); 101 | translate([10,0,10])rotate([0,90,0])nutwasher(); 102 | translate([0,0,10])rotate([0,90,180])nutwasher(); 103 | } 104 | 105 | // y idler mount 106 | translate([70-yrodseparation/2,y_smooth_rod_length/2-9,30 + board_thickness-12]) 107 | { 108 | translate([0,0-33,-8]) 109 | rotate([0,-90,0]) idlermount(); 110 | translate([0,0,0])rotate([0,90,0])nutwasher(); 111 | translate([-20,0,0])rotate([0,90,180])nutwasher(); 112 | // bearing guide 113 | translate([-5,-33+8,-8+8]) 114 | rotate([0,-90,0]) bearing_guide(); 115 | } 116 | 117 | yrodseparation=140; 118 | 119 | module yfront() 120 | { 121 | // corners 122 | render(convexity=2) leftfront(); 123 | translate([yrodseparation,0,0]) mirror([1,0,0]) render(convexity=2) leftfront(); 124 | 125 | // front bottom threaded rod 126 | color("Aqua") 127 | translate([-20,9,10]) rotate([0,90,0]) cylinder(h = yrodseparation+40, r=4); 128 | 129 | translate([yrodseparation+11,9,10])rotate([0,90,0])nutwasher(); 130 | translate([yrodseparation-11,9,10])rotate([0,90,180])nutwasher(); 131 | 132 | translate([-11,9,10])rotate([0,90,180])nutwasher(); 133 | translate([11,9,10])rotate([0,90,0])nutwasher(); 134 | 135 | // front top threaded rod 136 | color("Aqua") 137 | translate([-20,9,30]) rotate([0,90,0]) cylinder(h = yrodseparation+40, r=4); 138 | 139 | translate([-11,9,30])rotate([0,90,180])nutwasher(); 140 | translate([11,9,30])rotate([0,90,0])nutwasher(); 141 | 142 | translate([yrodseparation-11,9,30])rotate([0,90,180])nutwasher(); 143 | translate([yrodseparation+11,9,30])rotate([0,90,0])nutwasher(); 144 | } 145 | 146 | translate([-yrodseparation/2,-y_smooth_rod_length/2,board_thickness-12]) 147 | { 148 | yfront(); 149 | translate([0,y_smooth_rod_length,0]) 150 | mirror([0,1,0]) 151 | yfront(); 152 | } 153 | 154 | module yside() 155 | { 156 | translate([-yrodseparation/2,0]) 157 | { 158 | // left top rod 159 | color("MediumBlue") 160 | translate([0,0,3+board_thickness + 30]) rotate([0,90,90]) cylinder(h = y_smooth_rod_length, r=bushing_xy[0],center=true); 161 | //left bottom rod 162 | color("Aqua") 163 | translate([0,0,3+board_thickness+4+1]) rotate([0,90,90]) cylinder(h = y_smooth_rod_length+22, r=y_threaded_rod_long_r ,center=true); 164 | 165 | 166 | // middle nuts 167 | // 100=default wood plank width (see pl function below) 168 | translate([0,board_thickness-4-3,8+board_thickness])rotate([0,-90,90])nutwasher(); 169 | translate([0,board_thickness+100-4+3,8+board_thickness])rotate([0,90,90])nutwasher(); 170 | 171 | 172 | 173 | // back nuts 174 | translate([0,y_smooth_rod_length/2+2,8+board_thickness])rotate([0,90,90])nutwasher(); 175 | translate([0,y_smooth_rod_length/2+2-22,8+board_thickness])rotate([0,90,-90])nutwasher(); 176 | // front nuts 177 | translate([0,-y_smooth_rod_length/2-2,8+board_thickness])rotate([0,90,-90])nutwasher(); 178 | translate([0,-y_smooth_rod_length/2-2+22,8+board_thickness])rotate([0,90,90])nutwasher(); 179 | } 180 | } 181 | 182 | yside(); 183 | translate([yrodseparation,0,0])yside(); 184 | 185 | // heat bed 186 | heatbed_height=board_thickness; 187 | color("Lime",0.25) 188 | translate([0,0,58-3+heatbed_height/2+5]) cube([bed_x_size,bed_y_size,heatbed_height], center=true); 189 | 190 | 191 | // Y belt holder 192 | translate([-yrodseparation/2+60.5 , 0, 58-3+5-2.8]) rotate([0,90,-90]) ybeltholder(); 193 | translate([-yrodseparation/2+60.5+12, -5, 58-3+0-2.8-1]) screw(heatbed_height/2+8); 194 | translate([-yrodseparation/2+60.5-12, -5, 58-3+0-2.8-1]) screw(heatbed_height/2+8); 195 | translate([-yrodseparation/2+60.5 ,-5-35, 58-3+0-2.8-1]) screw(heatbed_height/2+8); 196 | 197 | 198 | // bushings 199 | render(convexity=3) translate([yrodseparation/2 , -bed_y_size/4-10 , 50 -0.5]) rotate([0,90,90]) y_bearing(); 200 | translate([yrodseparation/2+14, -bed_y_size/4-10+10, 50+6.5-0.5-5]) screw(heatbed_height/2+8); 201 | translate([yrodseparation/2-14, -bed_y_size/4-10+10, 50+6.5-0.5-5]) screw(heatbed_height/2+8); 202 | 203 | render(convexity=3) mirror([0,1,0])translate([yrodseparation/2 , -bed_y_size/4-10 , 50 -0.5]) rotate([0,90,90]) y_bearing(); 204 | mirror([0,1,0])translate([yrodseparation/2+14, -bed_y_size/4-10+10, 50+6.5-0.5-5]) screw(heatbed_height/2+8); 205 | mirror([0,1,0])translate([yrodseparation/2-14, -bed_y_size/4-10+10, 50+6.5-0.5-5]) screw(heatbed_height/2+8); 206 | 207 | render(convexity=3) translate([-yrodseparation/2 , -10 , 50 -0.5]) rotate([0,90,90]) y_bearing(); 208 | translate([-yrodseparation/2+14, -10+10, 50+6.5-0.5-5]) screw(heatbed_height/2+8); 209 | translate([-yrodseparation/2-14, -10+10, 50+6.5-0.5-5]) screw(heatbed_height/2+8); 210 | 211 | //-------------------------------------------------------------------------------------------------------------------------------- 212 | 213 | 214 | 215 | 216 | 217 | 218 | 219 | 220 | //-------------------------------------------------------------------------------------------------------------------------------- 221 | // Z axis 222 | //-------------------------------------------------------------------------------------------------------------------------------- 223 | board_sides=120; 224 | board_w=bed_x_size+10+2*board_sides; 225 | 226 | //// aluminum XZ board 227 | //translate([0,board_thickness/2,150]) 228 | //%difference() 229 | //{ 230 | // cube([board_w,board_thickness,300],true); 231 | // translate([0,0,-15]) 232 | // cube([bed_x_size+10,board_thickness+2,200],true); 233 | //} 234 | 235 | 236 | // Z motor mounts 237 | translate([-board_w/2-5+12-board_thickness,12-board_thickness,50]) 238 | rotate(-90) mirror([0, 0, 1]) 239 | render(convexity=3) zmotorholder(); 240 | 241 | translate([-board_w/2-5+12-board_thickness-1, board_thickness / 2, 39]) 242 | rotate([-90,0,-90]) 243 | screw(25); 244 | translate([-board_w/2-5+12-board_thickness+30,12-board_thickness-15,41]) 245 | rotate([-90,0,0]) 246 | screw(25); 247 | translate([-board_w/2-5+12-board_thickness+10.5,12-board_thickness-10.5,42+7]) 248 | rotate([180,0,0]) 249 | M3screw(); 250 | translate([-board_w/2-5+12-board_thickness+41.5,12-board_thickness-10.5,42+7]) 251 | rotate([180,0,0]) 252 | M3screw(); 253 | translate([-board_w/2-5+12-board_thickness+10.5,12-board_thickness-10.5-31,42+7]) 254 | rotate([180,0,0]) 255 | M3screw(); 256 | 257 | 258 | translate([board_w/2+5-12+board_thickness,12-board_thickness,50]) 259 | rotate(-90) mirror([0, 0, 1]) 260 | mirror([0,1,0]) 261 | render(convexity=3) zmotorholder(); 262 | 263 | translate([board_w/2+5-12+board_thickness+1, board_thickness / 2, 39]) 264 | rotate([90,0,-90]) 265 | screw(25); 266 | translate([board_w/2+5-12+board_thickness-30,12-board_thickness-15,41]) 267 | rotate([-90,0,0]) 268 | screw(25); 269 | translate([board_w/2+5-12+board_thickness-10.5,12-board_thickness-10.5,42+7]) 270 | rotate([180,0,0]) 271 | M3screw(); 272 | translate([board_w/2+5-12+board_thickness-41.5,12-board_thickness-10.5,42+7]) 273 | rotate([180,0,0]) 274 | M3screw(); 275 | translate([board_w/2+5-12+board_thickness-10.5,12-board_thickness-10.5-31,42+7]) 276 | rotate([180,0,0]) 277 | M3screw(); 278 | 279 | 280 | 281 | // Z rod mounts 282 | //translate([-board_w/2-5,0,260]) 283 | translate([-board_w/2-5+12-board_thickness,12-board_thickness,430]) 284 | rotate(-90) 285 | render(convexity=3) zrodholder(); 286 | 287 | translate([-board_w/2-5+12-board_thickness-1, board_thickness / 2, 430+7.5]) 288 | rotate([0,90,0]) 289 | screw(25); 290 | translate([-board_w/2-5+12-board_thickness-1+34,12-board_thickness+8-23,430+6.5]) 291 | rotate([-90,90,0]) 292 | screw(25); 293 | 294 | 295 | //translate([board_w/2+5,0,260]) 296 | translate([board_w/2+5-12+board_thickness,12-board_thickness,430]) 297 | rotate(-90) 298 | mirror([0,1,0]) 299 | render(convexity=3) zrodholder(); 300 | 301 | translate([board_w/2+5-12+board_thickness+1, board_thickness / 2, 430+7.5]) 302 | rotate([0,-90,0]) 303 | mirror([0,1,0]) 304 | screw(25); 305 | translate([board_w/2+5-12+board_thickness+1-34,12-board_thickness+8-23,430+6.5]) 306 | rotate([-90,90,0]) 307 | mirror([0,1,0]) 308 | screw(25); 309 | 310 | // Z rods 311 | module z_rods() 312 | { 313 | color("MediumBlue") 314 | translate([board_w/2-4-12+board_thickness,-26+12-board_thickness,42])cylinder(h=z_smooth_rod_length,r=bushing_z[0]); 315 | echo (z_smooth_rod_length); 316 | color("Aqua") 317 | translate([board_w/2-4-12+board_thickness-17,-26+12-board_thickness,56])cylinder(h = 390, r=2.5); 318 | } 319 | 320 | z_rods(); 321 | mirror([1,0,0])z_rods(); 322 | //-------------------------------------------------------------------------------------------------------------------------------- 323 | 324 | 325 | 326 | 327 | 328 | 329 | 330 | 331 | 332 | 333 | //-------------------------------------------------------------------------------------------------------------------------------- 334 | // X axis 335 | //-------------------------------------------------------------------------------------------------------------------------------- 336 | 337 | // move the x-axis up 20cm (for visualization only) 338 | x_axis_height=200; 339 | x_smooth_rod_length=450+board_thickness*2+10; 340 | 341 | // X ends 342 | translate([-board_w/2+4+12-board_thickness,-26+12-board_thickness, 200+ x_axis_height]) 343 | rotate([0,0,90]) 344 | //rotate([0,180,0]) 345 | render(convexity=4) mirror([0, 0, 1]) x_end_motor(); 346 | 347 | translate([board_w/2-4-12+board_thickness,-26+12-board_thickness, 200 + x_axis_height]) 348 | rotate(90) 349 | //rotate([0,180,0]) 350 | render(convexity=4) mirror([0, 0, 1]) x_end_idler(); 351 | 352 | // bearing guide 353 | translate([board_w/2-4-12+board_thickness-27,-26+12-board_thickness-9-(10-(7+0.9*2))/2,140 + x_axis_height+27]) 354 | rotate([90,0,0]) 355 | bearing_guide(); 356 | 357 | // X rods 358 | for(i=[0:1]) 359 | color("MediumBlue") 360 | translate([1.5,-12+12-board_thickness-28,-3+149+i*45 + x_axis_height])rotate([0,90,0])cylinder(h=x_smooth_rod_length,r=4,center=true); 361 | 362 | // X carriage 363 | translate([0,-12+12-board_thickness-28,-3+149 + x_axis_height]) 364 | rotate([0,90,0]) 365 | translate([-45,0,75]) 366 | rotate([0,180,0]) 367 | render(convexity=3) x_carriage(); 368 | 369 | // small nuts 370 | translate([0,-12+12-board_thickness-28,-3+149 + x_axis_height]) 371 | rotate([0,90,0]) 372 | translate([-45+20,0+9,75-3]) 373 | rotate([90,0,0]) 374 | M3nut(); 375 | 376 | translate([0,-12+12-board_thickness-28,-3+149 + x_axis_height]) 377 | rotate([0,90,0]) 378 | translate([-45+20,0+9,75-33]) 379 | rotate([90,0,0]) 380 | M3nut(); 381 | 382 | translate([0,-12+12-board_thickness-28,-3+149 + x_axis_height]) 383 | rotate([0,90,0]) 384 | translate([-45+20,0+9,75-53]) 385 | rotate([90,0,0]) 386 | M3nut(); 387 | 388 | translate([0,-12+12-board_thickness-28,-3+149 + x_axis_height]) 389 | rotate([0,90,0]) 390 | translate([-45+20,0+9,75-83]) 391 | rotate([90,0,0]) 392 | M3nut(); 393 | 394 | // belt clamp 395 | translate([0-28,-12+12-board_thickness-28-10,-3+149 + x_axis_height-7]) 396 | rotate([0,90,0]) 397 | translate([-45,0,75]) 398 | rotate([0,90,0]) 399 | x_beltclamp(); 400 | 401 | // belt clamp 402 | translate([0-28-30,-12+12-board_thickness-28-10,-3+149 + x_axis_height-7]) 403 | rotate([0,90,0]) 404 | translate([-45,0,75]) 405 | rotate([0,90,0]) 406 | x_beltclamp(); 407 | 408 | //-------------------------------------------------------------------------------------------------------------------------------- 409 | 410 | 411 | 412 | 413 | 414 | 415 | 416 | 417 | 418 | 419 | 420 | 421 | 422 | 423 | 424 | 425 | 426 | 427 | 428 | 429 | 430 | 431 | //-------------------------------------------------------------------------------------------------------------------------------- 432 | // Frame (box style) 433 | //-------------------------------------------------------------------------------------------------------------------------------- 434 | module pl(x=100,y=100,z=board_thickness){ 435 | cube([x,y,z]); 436 | } 437 | module p3bscorner(){ 438 | translate([ board_thickness*1.5+3,-0.5-board_thickness,board_thickness/2])rotate([-90,0,0])screw(); 439 | translate([450-board_thickness*1.5 ,-0.5-board_thickness,board_thickness/2])rotate([-90,0,0])screw(); 440 | translate([450/2 ,-0.5-board_thickness,board_thickness/2])rotate([-90,0,0])screw(); 441 | color([0.5,0.5,0.5,0.8])pl(x=450); 442 | color([0.5,0.5,0.6,0.8])rotate([90,0,0])pl(x=450); 443 | } 444 | module p3bsgantry(){ 445 | separation=10; 446 | translate([450-separation,-100-separation ,board_thickness*2+1])mirror([0,0,1])screw(); 447 | translate([450-separation, 100+separation+50,board_thickness*2+1])mirror([0,0,1])screw(); 448 | translate([350+separation,-100-separation ,board_thickness*2+1])mirror([0,0,1])screw(); 449 | translate([350+separation, 100+separation+50,board_thickness*2+1])mirror([0,0,1])screw(); 450 | 451 | translate([350+separation,-200+separation ,board_thickness*2+1])mirror([0,0,1])screw(); 452 | translate([350+separation, 200-separation+50,board_thickness*2+1])mirror([0,0,1])screw(); 453 | color([0.5,0.5,0.6,0.9])translate([450,-200,board_thickness])rotate([0,0,90])pl(x=450); 454 | translate([0,-200,0])color([0,0,0,0.3])p3bscorner(); 455 | translate([0, 250,0])color([0,0,0,0.3])mirror([0,1,0])p3bscorner(); 456 | } 457 | module boxframe(top=false){ 458 | translate([300-board_thickness ,-200.5-board_thickness,board_thickness/2+3])rotate([-90,0, 0])screw(); 459 | translate([200+board_thickness+board_thickness/2 ,-200.5-board_thickness,board_thickness/2+3])rotate([-90,0, 0])screw(); 460 | translate([300-board_thickness , 250.5+board_thickness,board_thickness/2+3])rotate([ 90,0, 0])screw(); 461 | translate([200+board_thickness+board_thickness/2 , 250.5+board_thickness,board_thickness/2+3])rotate([ 90,0, 0])screw(); 462 | translate([300.5+board_thickness ,-200+board_thickness ,board_thickness/2+3])rotate([ 90,0,-90])screw(); 463 | translate([300.5+board_thickness ,-100-board_thickness ,board_thickness/2+3])rotate([ 90,0,-90])screw(); 464 | translate([300.5+board_thickness , 250-board_thickness ,board_thickness/2+3])rotate([ 90,0,-90])screw(); 465 | translate([300.5+board_thickness , 150+board_thickness ,board_thickness/2+3])rotate([ 90,0,-90])screw(); 466 | 467 | // 3mm separation for the screw heads at the bottom of the structure 468 | //translate([300,-180,0])rotate([0,0,90])color([1,0,0,0.35])pl(x=400,z=3); 469 | translate([300,-200,3])rotate([0,0,90])color([0,0,1,0.55])pl(x=450); 470 | 471 | translate([300+board_thickness,0])rotate([0,-90,0])color([0,0,0,0.4])p3bsgantry(); 472 | if(top){ 473 | translate([200+board_thickness+board_thickness/2,-200-board_thickness/2,450+board_thickness+1])mirror([0,0,1])screw(); 474 | translate([200+board_thickness+board_thickness/2, 250+board_thickness/2,450+board_thickness+1])mirror([0,0,1])screw(); 475 | translate([300-board_thickness-board_thickness/2,-200-board_thickness/2,450+board_thickness+1])mirror([0,0,1])screw(); 476 | translate([300-board_thickness-board_thickness/2, 250+board_thickness/2,450+board_thickness+1])mirror([0,0,1])screw(); 477 | translate([300+board_thickness/2 ,-150 ,450+board_thickness+1])mirror([0,0,1])screw(); 478 | translate([300+board_thickness/2 , 200 ,450+board_thickness+1])mirror([0,0,1])screw(); 479 | translate([300+board_thickness,-200-board_thickness,450])rotate([0,0,90])color([0,0,1,0.55])pl(x=450+board_thickness*2); 480 | } 481 | } 482 | 483 | 484 | translate([-25,312,0])rotate([0,0,-90])color([0,0,0,0.4]) 485 | boxframe(true); 486 | // floor 487 | //color([0.8,0.8,0.2,0.35])translate([0,0,-100])cube([800,800,200],true); 488 | //-------------------------------------------------------------------------------------------------------------------------------- 489 | 490 | 491 | 492 | 493 | 494 | 495 | 496 | 497 | //-------------------------------------------------------------------------------------------------------------------------------- 498 | // Parts to fix Y axis to the frame 499 | //-------------------------------------------------------------------------------------------------------------------------------- 500 | // y brackets, used to fix the threaded rods of the y axis to the wooden XZ frame. 501 | translate([-bracket_width(12)/2 +yrodseparation/2,-3+12 ,board_thickness+3]) yrodbracket(12, 3, 3); 502 | translate([-bracket_width(12)/2 -yrodseparation/2,-3+12 ,board_thickness+3]) yrodbracket(12, 3, 3); 503 | translate([ bracket_width(12)/2 +yrodseparation/2, 3+12+100,board_thickness+3])rotate([0,0,180]) yrodbracket(12, 3, 3); 504 | translate([ bracket_width(12)/2 -yrodseparation/2, 3+12+100,board_thickness+3])rotate([0,0,180]) yrodbracket(12, 3, 3); 505 | //-------------------------------------------------------------------------------------------------------------------------------- 506 | translate([-bracket_width(12)/2+6+yrodseparation/2,12+3+3 ,board_thickness+bracket_height(3)+0.5])rotate([180,0,0])screw(); 507 | translate([ bracket_width(12)/2-6+yrodseparation/2,12+3+3 ,board_thickness+bracket_height(3)+0.5])rotate([180,0,0])screw(); 508 | translate([-bracket_width(12)/2+6+yrodseparation/2,12+3+3+12 ,board_thickness+bracket_height(3)+0.5])rotate([180,0,0])screw(); 509 | translate([ bracket_width(12)/2-6+yrodseparation/2,12+3+3+12 ,board_thickness+bracket_height(3)+0.5])rotate([180,0,0])screw(); 510 | 511 | translate([-bracket_width(12)/2+6-yrodseparation/2,12+3+3 ,board_thickness+bracket_height(3)+0.5])rotate([180,0,0])screw(); 512 | translate([ bracket_width(12)/2-6-yrodseparation/2,12+3+3 ,board_thickness+bracket_height(3)+0.5])rotate([180,0,0])screw(); 513 | translate([-bracket_width(12)/2+6-yrodseparation/2,12+3+3+12 ,board_thickness+bracket_height(3)+0.5])rotate([180,0,0])screw(); 514 | translate([ bracket_width(12)/2-6-yrodseparation/2,12+3+3+12 ,board_thickness+bracket_height(3)+0.5])rotate([180,0,0])screw(); 515 | 516 | translate([-bracket_width(12)/2+6+yrodseparation/2,-12+3+3+100,board_thickness+bracket_height(3)+0.5])rotate([180,0,0])screw(); 517 | translate([ bracket_width(12)/2-6+yrodseparation/2,-12+3+3+100,board_thickness+bracket_height(3)+0.5])rotate([180,0,0])screw(); 518 | translate([-bracket_width(12)/2+6+yrodseparation/2, 3+3+100,board_thickness+bracket_height(3)+0.5])rotate([180,0,0])screw(); 519 | translate([ bracket_width(12)/2-6+yrodseparation/2, 3+3+100,board_thickness+bracket_height(3)+0.5])rotate([180,0,0])screw(); 520 | 521 | translate([-bracket_width(12)/2+6-yrodseparation/2,-12+3+3+100,board_thickness+bracket_height(3)+0.5])rotate([180,0,0])screw(); 522 | translate([ bracket_width(12)/2-6-yrodseparation/2,-12+3+3+100,board_thickness+bracket_height(3)+0.5])rotate([180,0,0])screw(); 523 | translate([-bracket_width(12)/2+6-yrodseparation/2, 3+3+100,board_thickness+bracket_height(3)+0.5])rotate([180,0,0])screw(); 524 | translate([ bracket_width(12)/2-6-yrodseparation/2, 3+3+100,board_thickness+bracket_height(3)+0.5])rotate([180,0,0])screw(); 525 | 526 | //-------------------------------------------------------------------------------------------------------------------------------- 527 | --------------------------------------------------------------------------------