diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..198ab70 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "wiki"] + path = wiki + url = https://github.com/revarbat/snappy-reprap.wiki.git diff --git a/GDMUtils.scad b/GDMUtils.scad index c17fd2b..ce4ff3d 100644 --- a/GDMUtils.scad +++ b/GDMUtils.scad @@ -552,18 +552,34 @@ module narrowing_strut(w=10, l=100, wall=5, ang=30) //!narrowing_strut(); + // Makes a wall which thins to a smaller width in the center, // with angled supports to prevent critical overhangs. // Example: // thinning_wall(h=50, l=100, thick=4, ang=30, strut=5, wall=2); -module thinning_wall(h=50, l=100, thick=4, ang=30, strut=5, wall=2) +module thinning_wall(h=50, l=100, thick=5, ang=30, strut=5, wall=3, bracing=true) { + ang = atan((h-2*strut)/(l-2*strut)); + dlen = (h-2*strut)/sin(ang); union() { xrot_copies([0, 180]) { translate([0, 0, -h/2]) narrowing_strut(w=thick, l=l, wall=strut, ang=ang); translate([0, -l/2, 0]) xrot(-90) narrowing_strut(w=thick, l=h, wall=strut, ang=ang); + if (bracing == true) { + intersection() { + cube(size=[thick, l, h], center=true); + xrot_copies([-ang,ang]) { + grid_of(za=[-strut/4, strut/4]) { + scale([1,1,1.5]) yrot(45) { + cube(size=[thick/sqrt(2), dlen, thick/sqrt(2)], center=true); + } + } + cube(size=[thick, dlen, strut/2], center=true); + } + } + } } cube(size=[wall, l-1, h-1], center=true); } @@ -571,6 +587,7 @@ module thinning_wall(h=50, l=100, thick=4, ang=30, strut=5, wall=2) //!thinning_wall(); + // Example: // sparse_strut(h=40, l=120, thick=4, maxang=30, strut=5, max_bridge=20); module sparse_strut(h=50, l=100, thick=4, maxang=30, strut=5, max_bridge = 20) @@ -823,7 +840,7 @@ module nema17_mount_holes(depth=5, len=5) cylinder(h=depth, r=plinth_diam/2, center=true); } } -!nema17_mount_holes(depth=5, len=5); +//!nema17_mount_holes(depth=5, len=5); diff --git a/README.md b/README.md index f69ad56..20eea07 100644 --- a/README.md +++ b/README.md @@ -2,3 +2,90 @@ snappy-reprap ============= A parametric design for a cheap self-replicating 3D printer (reprap) that snaps together to minimize screws and non-printed parts. +![Snappy Full Rendering](https://github.com/revarbat/snappy-reprap/wiki/snappy_small.png) + +Building the STL files +---------------------- + +The Makefile currently defines $OPENSCAD for building on OS X: +``` +OPENSCAD=/Applications/OpenSCAD.app/Contents/MacOS/OpenSCAD +``` + +Under Linux, you can change that to: +``` +OPENSCAD=openscad +``` + +Under Windows, you'll probably have to open each ```*_part.scad``` and ```*_parts.scad``` file individually and manually export the STL files. + + +Printing the parts +------------------ +You will need to print out the following parts: + +|Count| Part File +|-----|---------------------- +| 1 | cap\_parts.stl +| 1 | drive\_gear\_parts.stl +| 1 | motor\_mount\_plate\_parts.stl +| 2 | rail\_with\_motor\_mount\_part.stl +| 1 | rails\_90deg\_joint\_part.stl +| 2 | rails\_end\_part.stl +| 7 | rails\_part.stl +| 1 | roller\_parts.stl +| 3 | sled\_end\_parts.stl +| 2 | support\_leg\_part.stl +| 2 | xy\_joiner\_parts.stl +| 4 | xy\_sled\_part.stl +| 1 | z\_platform\_joint\_part.stl +| 1 | z\_sled\_part.stl + + +Required Vitamins +----------------- +You'll need the following un-printable parts: + +|Count| Description +|-----|---------------------------------------------------- +| 1 | RAMBo controller electronics. +| 1 | 60 Watt 12v Power Supply +| 3 | End-stop micro-switches and wiring. +| 3 | NEMA17 Stepper Motors, Less than 35mm length +| 1 | NEMA17 Stepper Motor, High Torque. +| 1 | Wiring for Extruder Heater. +| 1 | Wiring for Extruder Thermistor. +| 1 | J-Head Extruder. +| 1 | Threaded rod, 300mm x 8mm. +| 1 | Nut, 8mm. +| 2 | M3x15 Socket Screws. +| 18 | M3x10 Socket Screws. +| 4 | M3 Nuts. +| 16 | M3 Washers. +| 6 | M2x15 Socket Screws. +| 6 | M2 Nuts. +| 1 | Spring. _(**TODO:** determine size)_ +| 2 | M3x20? socket screws. _(**TODO:** determine actual size)_ +| 2 | M3x20? countersunk screws. _(**TODO:** determine actual size)_ +| 1 | Extruder Drive Gear. +| 1 | M2 Extruder drive gear set screw. +| 2Kg | Plastic Filament. _(**TODO:** determine actual amount.)_ + + +Required Tools +-------------- +You will need the following tools to assemble this printer. + +- 3mm hex wrench. +- 2mm hex wrench. +- Small flathead screwdriver. +- Small phillips screwdriver. +- Medium-Grit Sandpaper. +- Possibly cyanoacrylate glue. (super-glue) + + +Assembly instructions +--------------------- +TBD + + diff --git a/TODO.md b/TODO.md index a57f6ae..8bd2ca4 100644 --- a/TODO.md +++ b/TODO.md @@ -1,12 +1,14 @@ TODO: ----- * Z-axis platform threaded screw nut holder. -* Z-axis motor mount in 90deg corner part. * Y-axis cable chain. * Z-axis cable chain. * X-axis endstop. -* Y-axis endstop. -* Z-axis endstop. +* Z threaded rod shaft coupler. +* Extruder mount. +* Extruder base for J-head. +* Minimalist Mk7-esque Extruder Parts. * Electronics container. -* Extruder mount part. +* Motherboard mounts. + diff --git a/config.scad b/config.scad index 6d24b62..a049201 100644 --- a/config.scad +++ b/config.scad @@ -6,7 +6,7 @@ rack_tooth_size = 5; // mm per tooth. rail_length = 150; rail_height = 50; -rail_thick = 5; +rail_thick = 7; motor_rail_length = 100; diff --git a/joiners.scad b/joiners.scad index 7a33c16..46601b3 100644 --- a/joiners.scad +++ b/joiners.scad @@ -99,23 +99,23 @@ module lock_tab(h=30, wall=3, slop=0.0) -module lock_slot(h=30, wall=3, slop=0.2) +module lock_slot(h=30, wall=3, backing=0, slop=0.2) { s1 = 2*wall+slop/2; s2 = wall+slop/2; w = 2*s1+2*wall; d = wall*3+slop; ang = atan(((s1-s2)/2)/(h-2)); - translate([0, d/2, 0]) difference() { + translate([0, (d+backing)/2, 0]) difference() { intersection() { - yrot( ang) translate([0, 0, (h+5)/2]) cube(size=[w, d, h+10], center=true); - yrot(-ang) translate([0, 0, (h+5)/2]) cube(size=[w, d, h+10], center=true); - translate([0, 0, h/2]) cube(size=[w, d, h], center=true); + yrot( ang) translate([0, 0, (h+5)/2]) cube(size=[w, d+backing, h+10], center=true); + yrot(-ang) translate([0, 0, (h+5)/2]) cube(size=[w, d+backing, h+10], center=true); + translate([0, 0, h/2]) cube(size=[w, d+backing, h], center=true); } - translate([0, d/2+0.05, -0.05]) lock_tab(h=h, wall=wall, slop=-slop); + translate([0, (d+backing)/2+0.05, -0.05]) lock_tab(h=h, wall=wall, slop=-slop); } } -//lock_slot(h=30, wall=2, slop=0.1); +//!lock_slot(h=30, wall=2, slop=0.1); diff --git a/rails_90deg_joint_part.scad b/rails_90deg_joint_part.scad index 0e241b8..bf0319a 100644 --- a/rails_90deg_joint_part.scad +++ b/rails_90deg_joint_part.scad @@ -6,6 +6,8 @@ use module rails_90deg_joint() { joiner_length=10; + base_height = rail_height+roller_thick; + endstop_delta = platform_length - base_height; difference() { union() { @@ -15,9 +17,14 @@ module rails_90deg_joint() translate([0,platform_length/2,rail_thick/2]) yrot(90) sparse_strut(h=rail_width, l=platform_length, thick=rail_thick, maxang=45, strut=10, max_bridge=500); - // Back. - translate([0,rail_thick/2,platform_length/2]) zrot(90) { - thinning_wall(h=platform_length, l=rail_width, thick=rail_thick, strut=5); + // Lower Back. + translate([0,rail_thick/2,rail_height/2]) zrot(90) { + thinning_wall(h=rail_height, l=rail_width-joiner_width, thick=rail_thick, strut=rail_thick); + } + + // Upper Back. + translate([0, rail_thick/2, rail_height+(platform_length-rail_height-rail_thick)/2]) zrot(90) { + thinning_wall(h=platform_length-rail_height+rail_thick, l=rail_width-joiner_width, thick=rail_thick, strut=rail_thick); } // Side Walls @@ -27,7 +34,7 @@ module rails_90deg_joint() ya=[rail_height/2], za=[(platform_length-rail_height-joiner_length)/2+rail_height] ) { - thinning_wall(h=platform_length-joiner_length-rail_height+2*rail_thick, l=rail_height, thick=joiner_width, strut=rail_thick); + thinning_wall(h=platform_length-joiner_length-rail_height+2*rail_thick, l=rail_height, thick=joiner_width, strut=rail_thick, bracing=false); } // Lower Walls. @@ -35,7 +42,7 @@ module rails_90deg_joint() ya=[(platform_length-rail_height-joiner_length)/2+rail_height], za=[rail_height/2] ) { - thinning_wall(l=platform_length-joiner_length-rail_height+2*rail_thick, h=rail_height, thick=joiner_width, strut=rail_thick); + thinning_wall(l=platform_length-joiner_length-rail_height+2*rail_thick, h=rail_height, thick=joiner_width, strut=rail_thick, bracing=false); } // Corner Walls. @@ -43,7 +50,7 @@ module rails_90deg_joint() ya=[rail_height/2], za=[rail_height/2] ) { - thinning_wall(l=rail_height, h=rail_height, thick=joiner_width, strut=rail_thick); + thinning_wall(l=rail_height, h=rail_height, thick=joiner_width, strut=rail_thick, bracing=false); } // Rail tops. @@ -95,12 +102,48 @@ module rails_90deg_joint() } } + // Motor clip mounts. + translate([0, rail_height+roller_thick/2-1, 0]) { + zrot_copies([90, 270]) { + translate([(43+joiner_width+10)/2, 0, 30]) { + xrot(90) { + joiner(h=rail_height, w=joiner_width, l=30, a=joiner_angle); + translate([0, -30+rail_thick/2, 0]) + cube(size=[joiner_width, rail_thick, rail_width-joiner_width], center=true); + } + } + } + } + // Side mount slots. translate([0, platform_width/3, 0]) { grid_of(ya=[-platform_width/3/2, platform_width/3/2]) { zrot_copies([0,180]) { - translate([rail_width/2-2.5, 0, 0]) { - zrot(-90) lock_slot(h=25, wall=3); + translate([rail_width/2-joiner_width/2, 0, 0]) { + zrot(-90) lock_slot(h=25, wall=3, backing=joiner_width/2-2); + } + } + } + } + + // Y-axis endstop switch mount + translate([-(rail_width-4)/2, endstop_delta/2+base_height-0.05, endstop_delta/2+base_height-0.05]) { + difference() { + cube(size=[4, endstop_delta+0.05, endstop_delta+0.05], center=true); + translate([0, endstop_delta/2, endstop_delta/2]) xrot(45) + cube(size=15, center=true); + translate([0, endstop_delta/2-5, -endstop_delta/2+15]) { + grid_of(za=[-5, 5]) { + yrot(90) { + cylinder(h=10, r=2.5/2, center=true, $fn=12); + } + } + } + translate([0, -(endstop_delta/2-15), (endstop_delta/2-5)]) { + grid_of(ya=[-5, 5]) { + yrot(90) { + cylinder(h=10, r=2.5/2, center=true, $fn=12); + } } } } @@ -108,7 +151,7 @@ module rails_90deg_joint() } } } -//!rails_90deg_joint(); +rails_90deg_joint(); diff --git a/rails_end_part.scad b/rails_end_part.scad index f380180..fdeea39 100644 --- a/rails_end_part.scad +++ b/rails_end_part.scad @@ -17,7 +17,7 @@ module rails_end() // Back. translate([0, -joiner_length-rail_thick/2+0.05, base_height/2]) zrot(90) - thinning_wall(h=base_height, l=rail_width, thick=rail_thick, strut=5); + thinning_wall(h=base_height, l=rail_width, thick=rail_thick, strut=joiner_width); } // Clear space out near front clips. diff --git a/wiki b/wiki new file mode 160000 index 0000000..e40c007 --- /dev/null +++ b/wiki @@ -0,0 +1 @@ +Subproject commit e40c00754d828bb9d13d6eec3a98b46b6b6121ed diff --git a/xy_slider_part.scad b/xy_sled_part.scad similarity index 100% rename from xy_slider_part.scad rename to xy_sled_part.scad