Welcome to MakerHome

What would you print if you had a 3D printer in your home? We'll print one thing every day with either a MakerBot Replicator 2 or an Afinia H-Series and catalog it here, with a picture, an .stl file, and technical notes for each thing.

Almost everything we make will be with free and accessible software and we'll provide instructions that are friendly to beginners with 3D modeling.

If you want to see more mathy and technical stuff then visit jmumakerlab.blogspot.com, and if you want to see updates about JMU's 3D-printing general education classroom, visit www.geekhaus.com/3space.

Saturday, April 19, 2014

Day 236 - Conference swag x 8

Today, eight models we've seen before, optimized for printing small and fast. We'll be printing one of these tiny models for each person that comes to the Fall Meeting of the Maryland/DC/Virginia section of the Mathematical Association of America, which will be hosted here at JMU next week.

Friday, April 18, 2014

Day 235 - Friday Fail: Time Edition

There is never enough time. Over the past few weeks I have failed miserably at time, specifically at keeping up with this blog on a daily basis. I've been "a few days behind" - sometimes an entire week! - for a long time now; always printing and working every day, but always behind. But it's not like I haven't been printing things. For example, here is some of what I printed in the past few days, making giveaways for a conference (more on that tomorrow):

But none of that made a blog post for me. However things in Life are settling down now and as of today I'm caught up - or at least one day short, with it being Saturday while I post this Friday Fail - so I am going to try to keep up with time from here on out. Time, by Grabthar's hammer, I will catch you!

Thursday, April 17, 2014

Day 234 - S(5,2,(1,1,-1,1))

This semester five students and I have been 3D-printing the knots through 7 crossings in both standard and special configurations, as part of our MATH 297 - Knot Theory Research and 3D Printing course in the JMU 3-SPACE classroom. One of the knots that fell to me was 7_6, which happens to be the spiral knot S(5,2,(1,1,-1,1)). This means that it can be represented as a braid that has 5 strands, one of which crosses the others in an "over, over, under, over" pattern for a repeat of 2 times; or in other words, that the knot can be obtained with braid word (abCd)^2. All that is nice, but for the purposes of this post all that matters is that the knot 7_6 can look all spirally like it does in this picture:

Thingiverse link: http://www.thingiverse.com/thing:304206

Settings: Printed on a Replicator 2 with our custom MakerWare support profile for knots from Day 110. The model has so many long pieces that if you orient vertically as in the picture below, you can get away with almost no support at all. This is the least amount of support I have ever had for any knot!

Technical notes, TopMod flavor: I am very excited to report that I actually constructed this knot by hand, one arc at a time, in TopMod. Although I did make the knot from Day 137 with TopMod, I was not trying to make that particular knot; this is the first time that I had a certain knot in mind and then constructed it in TopMod, rather than with equations or data. The reason I did that is that I don't know the equations or have any data for the spiral conformation of 7_6; I just knew what it was supposed to look like! In case anyone out there is interested in using TopMod to construct knots, here is a step-by-step breakdown of what I did, starting with a 2-dimensional projection of the conformation I wanted to build:
  1. Open TopMod and click on the cube to put down one box.
  2. Select a face of the box and use the Cubical Extrude button to extend into a connected line of boxes (I used x50 to get a line that was 50 blocks long). In the 7_6 spiral case I knew that all of the crossings would end up on one line so that was all I needed to get started. For other knots and other conformations you'll have to use Cubical Extrude to build a branching framework to build from.
  3. Use Selection/Edge Ring to select boxes to delete from your row. I deleted two boxes between every one box that I wanted to keep, plus a few more for the center. After deleting I had six separated boxes in a line, followed by a gap, followed by six more separated boxes.
  4. Select the tops of all your boxes and Cubical Extrude x8 to get some height. You will be connecting boxes at various heights to make the arcs between each crossing in your knot projection.
  5. Make the arcs of your knot by connecting faces of boxes as desired with the Add Handle (Shape Interpolation) Mode button. As part of this you will have to adjust the number of segments (for a finer or coarser look) and the weight (to determine the curvature of the connecting handle). When you select two faces to connect with a handle you will also select a corner on each face, which will determine how twisty the connecting handle is. You can also manually set the number of twists if desired.
  6. Once all your arcs are in place, delete any unneeded cubes using Selection/Edge Ring and the wonderful tool "=", which expands a selection outward one step at a time.
  7. You should now have a choppy-looking curve in the desired conformation of your knot. Use Remeshing/Corner Cutting twice to get a smoother knot model.
  8. Export to STL; this may take a minute because TopMod will have to further refine your mesh to be triangular as it is performing this export. 
Technical notes, Blender flavor: The knot produced by the method above had fairly thin strands, so to thicken them up I used Blender. Although one of our lab students wrote the excellent post Adding Thickness to your STL file at the MakerLab blog last December, I had not used this method until today. I also consulted the Interface and Navigation video at BlenderCookie to learn how to move around: scroll wheel to zoom, middle-click and drag to rotate view, and shift-middle-click and drag to pan view.
  1. A new "starting document" in Blender will contain a camera, light, and cube, which I wasn't sure what to do with. For the moment I learned how to hide them: in the upper right "Scenes" box, deselect the eye, arrow, and camera icons for all three.
  2. File/Import/STL and choose the file you want to open. You may have to zoom out a lot to see your model. 
  3. Under the "Scenes" box in the right column, choose the "wrench" icon to get to Object Modifiers. You may have to expand the width of the right column to see the wrench icon.
  4. Choose Add Modifier/Solidify with Thick changed to 2 and Offset to 0. Pressing return after setting the offset performs the action so you do not need to click "Apply". 
  5. Export your new, thickened STL file. 

Wednesday, April 16, 2014

Day 233 - Bedmaker

We don't have one bed of every size in our house but it seemed like a good idea to print all of the sizes; here we have Twin, Full, Queen, and King:

Thingiverse link: COMING SOON with all furniture in one set

Settings: Replicator 2 on .3mm/low, as usual.

Technical notes, OpenSCAD flavor: Picking up where we left off in yesterday's code, we're back to larger spheres at the corners to make our beds seem comfy. Nothing too interesting here, except that it is good to note that the height parameter in this code does not include the height of the pillow.

// module for making beds ///////////////////////////////////

module bed(depth,length,height){
// mattress
translate(s*[0,0,0]) sphere(r);
translate(s*[depth,0,0]) sphere(r);
translate(s*[depth,length,0]) sphere(r);
translate(s*[0,length,0]) sphere(r);
translate(s*[0,length,height]) sphere(r);
translate(s*[depth,length,height]) sphere(r);
translate(s*[depth,0,height]) sphere(r);
translate(s*[0,0,height]) sphere(r);
// pillow
translate(s*[0,0,(5/4)*height]) sphere(r);
translate(s*[0,(1/8)*length,(5/4)*height]) sphere(r);
translate(s*[depth,(1/8)*length,(5/4)*height]) sphere(r);
translate(s*[depth,0,(5/4)*height]) sphere(r);
translate(s*[0,0,0]) sphere(r);
translate(s*[0,(1/8)*length,0]) sphere(r);
translate(s*[depth,(1/8)*length,0]) sphere(r);
translate(s*[depth,0,0]) sphere(r);

Tuesday, April 15, 2014

Day 232 - Bookcasemaker

Continuing our moving series, today we made an OpenSCAD module for making the most important type of furniture at all: bookcases! Here we have some Bondes (now discontinued, sadly) and Hemnes from IKEA, as well as a low TV stand:

Thingiverse: COMING SOON with customizability...

Settings: MakerWare .3mm/low on a Replicator 2 with the bookcases on their backs so that support is not required.

Technical notes, OpenSCAD flavor: Again we continue from the previous day's code. The interesting thing today is that we added a parameter for number of shelves and used a for() loop to put them in. The tricky part was handling the translation correctly while putting in those shelves.

// module for making bookcases //////////////////////////////

module bookcase(depth,length,height,shelves){
// body of the bookcase
translate(s*[0,0,0]) sphere(tiny);
translate(s*[length,0,0]) sphere(tiny);
translate(s*[length,height,0]) sphere(tiny);
translate(s*[0,height,0]) sphere(tiny);
translate(s*[0,0,depth]) sphere(tiny);
translate(s*[length,0,depth]) sphere(tiny);
translate(s*[length,height,depth]) sphere(tiny);
translate(s*[0,height,depth]) sphere(tiny);
// minus an inside
// put in some shelves
for (i = [1:1:shelves-1]){

Monday, April 14, 2014

Day 231 - Tablemaker

Continuing with our (procrastination of) planning for this summer's move, we printed our dining room table and two coffee tables.

Thingiverse link: COMING SOON you will be able to customize to match your own furniture...

Settings: Printed on a Replicator 2 with MakerWare .3mm/low, upside-down so as not to require supports.

Technical notes, OpenSCAD flavor: Continuing with the same parameters as yesterday's code, today we constructed a table module. Since tables are sharper than sofas we used smaller spheres at the corners. The result is slightly nicer than just using the very sharp cube() module that we used for the legs.

// module for making tables /////////////////////////////////

module table(depth,length,height){
// body of table
translate(s*[0,0,0]) sphere(tiny);
translate(s*[depth,0,0]) sphere(tiny);
translate(s*[depth,length,0]) sphere(tiny);
translate(s*[0,length,0]) sphere(tiny);
translate(s*[0,length,depth/5]) sphere(tiny);
translate(s*[depth,length,depth/5]) sphere(tiny);
translate(s*[depth,0,depth/5]) sphere(tiny);
translate(s*[0,0,depth/5]) sphere(tiny);
// legs

Sunday, April 13, 2014

Day 230 - Sofamaker

It's official; we are moving to NYC this summer! This means downsizing from a house to an apartment, and some interesting furniture decisions. To help sort things out (and to procrastinate actually packing for as long as possible) I wrote a customizable sofa generator in OpenSCAD, and used it to model our sofas:

Thingiverse link: COMING SOON

Settings: Printed on a Replicator 2 with MakerWare .3mm/low. 

Technical notes, OpenSCAD flavor: The code below makes sofas in the same way that we made knots in Day 153, by using hulls of collections of spheres. For example, the sofa code starts by forming an upright rectangular solid to make the back of the sofa, with eight spheres placed at the corners and then hull() filling in the space between by taking the convex hull of those eight spheres. Of course we could also have used the cube() command to make the rectangular solid, but taking the hull of spherical corners is what gives our sofas a rounded, comfy look. 

We used a scale of 1:50 for these models (meaning that our furniture is fifty times as long, wide, and tall as these models) and a conversion factor that allowed us to enter our dimensions in inches. For example, one of our sofas has depth 59", length 70", and height 32". To convert these to inches we have to multiply by 25.4, since there are 25.4 millimeters in an inch. Then to make the scale 1:50 we divide by scale=50.  In the future we'll add the ability to scale automatically to certain types of graph paper. 

// mathgrrl parametrizable sofa

// parameters ///////////////////////////////////////////////

$fn = 12; // facets
scale = 50;  // enter desired scaling factor here e.g. 50 means 1:50
m = 25.4; // measurement unit conversion
//(m=25.4 does 1:1 scale with inches entered)
//(m=12*25.4 does 1:1 scale with feet entered)
//(m=10 does 1:1 scale with cm entered)
//(m=1000 does 1:1 scale with meters entered)
s = m/scale; // scaling factor 
r = 3*s;     // radius for soft bevels depends on scale
tiny = .2;   // radius for sharper edges

// renders //////////////////////////////////////////////////

//uncomment the one you want to make

// purple loveseat

// purple sofa

// tan sofa

// brown loveseat

// spotted chair

// ottoman  

// module for making sofas //////////////////////////////////

module sofa(depth,length,height){
// back of sofa
translate(s*[0,0,0]) sphere(r);
translate(s*[0,0,height]) sphere(r);
translate(s*[0,length,height]) sphere(r);
translate(s*[0,length,0]) sphere(r);
translate(s*[depth/4,length,0]) sphere(r);
translate(s*[depth/4,0,0]) sphere(r);
translate(s*[depth/4,0,height]) sphere(r);
translate(s*[depth/4,length,height]) sphere(r);
// left arm of sofa
translate(s*[0,0,height/2]) sphere(r);
translate(s*[depth,0,height/2]) sphere(r);
translate(s*[depth,0,0]) sphere(r);
translate(s*[0,0,0]) sphere(r);
translate(s*[0,depth/4,0]) sphere(r);
translate(s*[depth,depth/4,0]) sphere(r);
translate(s*[depth,depth/4,height/2]) sphere(r);
translate(s*[0,depth/4,height/2]) sphere(r);
// right arm of sofa
translate(s*[0,length,height/2]) sphere(r);
translate(s*[depth,length,height/2]) sphere(r);
translate(s*[depth,length,0]) sphere(r);
translate(s*[0,length,0]) sphere(r);
translate(s*[0,length-depth/4,0]) sphere(r);
translate(s*[depth,length-depth/4,0]) sphere(r);
translate(s*[depth,length-depth/4,height/2]) sphere(r);
translate(s*[0,length-depth/4,height/2]) sphere(r);
// cushions of sofa
translate(s*[0,0,0]) sphere(r);
translate(s*[depth,0,0]) sphere(r);
translate(s*[depth,length,0]) sphere(r);
translate(s*[0,length,0]) sphere(r);
translate(s*[0,length,height/3]) sphere(r);
translate(s*[depth,length,height/3]) sphere(r);
translate(s*[depth,0,height/3]) sphere(r);
translate(s*[0,0,height/3]) sphere(r);

// module for making ottomans ///////////////////////////////

module ottoman(depth,length,height){
translate(s*[0,0,0]) sphere(r);
translate(s*[depth,0,0]) sphere(r);
translate(s*[depth,length,0]) sphere(r);
translate(s*[0,length,0]) sphere(r);
translate(s*[0,length,height]) sphere(r);
translate(s*[depth,length,height]) sphere(r);
translate(s*[depth,0,height]) sphere(r);
translate(s*[0,0,height]) sphere(r);

Saturday, April 12, 2014

Day 229 - Saturday Guest: kitwallace and Programming Polyhedra

Today's post is contributed by Chris Wallace, also known as kitwallace on Thingiverse, and author of The Wallace Line. He is the creator of the Rolling Knot, Mobius Strip, and Concave Polyhedra models on Thingiverse that have been featured here as well as the amazing Knot Server to OpenSCAD code (see Days 151, 153, 168, and 215). Thank you, kitwallace, for everything you have made possible, and for today's post!

The open source project OpenSCAD is the programmer's 3-D language. The language allows primitive object like cubes to be defined and combined using the Constructive Solid Geometry operations such as union, difference and intersection. Complex polyhedra can be defined in terms of points and, until the latest release, triangles. Now OpenSCAD allows faces to be used so that the programmer doesn't have to triangulate faces. So a cube can also be made with:

points = [
[ 0.5,  0.5,  0.5],
[ 0.5,  0.5, -0.5],
[ 0.5, -0.5,  0.5],
[ 0.5, -0.5, -0.5],
[-0.5,  0.5,  0.5],
[-0.5,  0.5, -0.5],
[-0.5, -0.5,  0.5],
[-0.5, -0.5, -0.5]];

faces = [
[ 4 , 5, 1, 0],
[ 2 , 6, 4, 0],
[ 1 , 3, 2, 0],
[ 6 , 2, 3, 7],
[ 5 , 4, 6, 7],
[ 3 , 1, 5, 7]];


Until the latest release of OpenSCAD it hadn't been possible to dynamically create the lists defining the polyhedra. This means that developers had to resort to quite awkward unions of primitives to build up complex objects. So one way to make a wire-fame model is to position a cylinder along each edge of each face. We can do that with a recursive module:

module make_face_edges (face,points,i=0) {
    if (i < len(face)) {
       assign( p1 = points[face[i]],
                  p2= points[face[(i + 1) % len(face)]])
       union() {
             cylinder(r=wire_radius, h = norm(p2-p1));
         make_face_edges (face,points,i+1); 

module make_faces(faces,points) {
   for (i = [0:len(faces)-1])

spoints = scale * points;

The locate(p1,p2) module changes the coordinate system so it is centered on p1 with the z-axis pointing to p2. It was originally written to create knots. It is in the form of a transform which applies to all its children.

module locate(p1, p2) {
   assign(p = p2 - p1)
   assign(distance = norm(p)) {   
      rotate([0, 0, atan2(p[1], p[0])]) 
      rotate([0, atan2(sqrt(pow(p[0], 2)+pow(p[1], 2)),p[2]), 0])

However, such models prove very slow to render when there are large numbers of edges. For example, here is one of the Catalan polyhedra, the Pentagonal Icositetrahedron, formed from 20-sided cylinders:

I found a different approach in the work of Paul Draghicescu (pdragy on Thingiverse), where the object is created by forming a shell made by removing the same polyhedron scaled down from itself, then removing prisms from each face. You can see it in this see-thu model:

The latest release of OpenSCAD supports a concat() function which together with recursive functions enables lists to be computed. In the script which creates this object, we have to centre the points in a face and this means subtracting the average of the points from each of the points. Until now that operation hasn't been possible but now we can write a recursive function:

function vsub(points,c,i=0) =
      i < len(points)
        ?  concat([points[i] - c], vsub(points,c,i+1))
        :  [];

Similarly we can transform every point in a list:

function transform_points(list, matrix, i = 0) = 
    i < len(list) 
       ? concat([ transform(list[i], matrix) ], transform_points(list, matrix, i + 1))
       : [];
where the functions vec3() and transform() are defined as:

function vec3(v) = [v.x, v.y, v.z];

function transform(v, m)  = vec3([v.x, v.y, v.z, 1] * m);

This allows us to find the centre and normal to each face, transform to the xy-plane and project to a polygon, then extrude a prism and finally reposition that prism back to the original face and remove it from the shell to create a cut-way model, here of a dodecahedron:

This is much faster to render than the wire-frame model and no nasty vertexes. The amount of cutout and the thickness of the shell can be adjusted, as can the inclination of the prism which turned out be useful when creating objects with very sharp vertexes.

Later I realized that if I made the prisms pyramids, I could add them to create stellated polyhedra or 'excavate' with then to yield convex polyhedra such as the Great Dodecahedron and Hugels' solid:

Powerful though OpenSCAD is, its ability to read data from external sources is limited to a few special case. Matrices can be loaded to define a surface, DXF files read to create a 2D object and STL files loaded. OpenSCAD code can be included, but the name of the file is static. Consequently scripts which can create multiple solids must include all the data needed and this makes these scripts quite complicated and less flexible.

In my search for coordinates for mathematical polyhedra, I came across David McCooey's wonderful site providing data and Java Applet viewers for hundreds of polyhedra. Any one of them would be interesting to convert into STL for viewing and printing. In my work with web site development I use another functional language, XQuery, developed for manipulating XML data. Using this language running on the open source eXistdb native XML database, I'm developing a web site to browse over this corpus of polyhedra, extract the coordinates from the text file which is included on the site and then generate OpenSCAD code for the selected style of object. Some coordinates transformations are done by XQuery. These include changing the winding of faces from right-haded to left-handed and computing edges from faces.

I'm fond of a 'Grook' (a kind of poetic aphorism) by the Danish designer and poet Piet Hein: Every problem you solve creates ten problems more. It is certainly true of this work: each time you try to solve one problem, like the construction of the regular solids, you are led into new areas of problems and faced with new difficulties. That's the thrill of this work and the pleasure of finding others like Laura similarly solving and posing new problems, helpful people on the OpenSCAD forum and generous people like David McCooey. I'm writing up my journey in my blog both as a log of my own work and in acknowledge of the help I've received for others. Thank you all.

UPDATES: For updates and further information see the OpenSCAD and Polyhedra post on kitwallace's blog The Wallace Line.

Friday, April 11, 2014

Day 228 - Friday Fail: Terminal edition

Seriously? An overnight print of eighteen Fidget Cubes (see Day 158) failed just before the LAST LAYER. Sigh.

Thingiverse link: http://www.thingiverse.com/thing:230139

Technical note: We now use .48 clearance instead of .5 for our 10mm Fidget Cubes; you can set your own preferred clearance at the link above.

Since there isn't much to learn from this final-layer fail except how to take a deep breath, here is a more useful fail to think about: Sometimes the MakerWare software (Mac version) for our MakerBot Replicator 2 freezes and has to be force-quit. After this happens I am unable to open the software again; it just freezes on opening and I have to force-quit again. My computer-savvy husband told me how to fix it:

  • Open the Terminal window and type ps -A to list the current processes.
  • Look for the line that has MakerBot/conveyor in it. This is a process that needs to be killed; see the highlighted line in the screenshot below.
  • Find the number at the start of the line for that process; let's call it 2222 for this example (although in the screenshot it is 14881, and on your computer it will be different every time).
  • Type sudo kill 2222 (again, use the number you found above, not this number).
  • Safety warning! Do not use ever use "sudo" unless you know what you are doing or someone smart that you completely trust recommends that you do so. It basically tells your computer "I know this is dangerous but go ahead and do it anyway."

Thursday, April 10, 2014

Day 227 - Penrose Snap Tiles

Today we printed emmett's Penrose Snap Tiles on Thingiverse, which are a genius-level modification of the already awesome Penrose P3 Tiles by pleppik. The genius is the excellent snap-together design that at the same time enforces the matching rules for aperiodic rhombic Penrose tilings. The tiles print up in no time with just two layers around the outside, and snap together surprisingly securely. You could quickly decorate an entire wall with these tiles!

Thingiverse link: http://www.thingiverse.com/make:73765

Settings: Printed on a Replicator 2 with custom profile based on the Low PLA script, with 0% infill, no roof, no floor, and two shells.

Wednesday, April 9, 2014

Day 226 - Tetris box puzzle

RarelyEvil's 3D Tetris Pieces Puzzle with Box on Thingiverse is one of the nicest working models I have seen on Thingiverse. It's a simple thing - just 3D Tetris-like pieces that fit together into a rectangular shape inside a box. But the details of this model are impeccable. First of all, the pieces consist of one of each of the eight tetracubes, which is very cool. Second, they fit into a 4x4x2 box exactly (math geeks study stuff like that; for example, see bumblebeagle.org for ways to pack pentacubes and hexacubes into a 5x5x2 box). Third, the pieces are very nicely rounded and print perfectly, and the box and its top are exactly the right size. This is one of those things that is just nice to play with; everything fits well together and the pieces make nice noises when they hit each other and the world is a good place. A great model for a gift if you're looking for one.

Thingiverse link: http://www.thingiverse.com/make:73669

Settings: MakerWare .3mm/low on a Replicator 2, using their fantastic Neon Green PLA filament for the pieces and white filament for the box.

Shameless elf-promotional note: If you like polycubes then you might also like polyominos; our newest Brainfreeze Puzzles book Double Trouble Sudoku uses tetromino and pentomino regions and is now available for pre-order and will ship in June!

Tuesday, April 8, 2014

Day 225 - Hilbert cubes

Today's print is sushiyaki's Hilbert block model on Thingiverse. This model is great because it prints without any supports at all, and some of the gaps between the paths even separate. There is also a natural slot that you can use to hold a business card or photo!

Thingiverse link: http://www.thingiverse.com/make:73667

Settings: MakerWare .3mm/low on a Replicator 2.

Stuff for the future: Bill Owens (owens on Thingiverse) has been thinking about making a Hilbert cube model that prints on its corner without the need for supports... stay tuned?

Monday, April 7, 2014

Day 224 - Rattlebacks

Today we printed VeryWetPaint's Rattleback Twins model from Thingiverse. If you spin one of these "rattleback tops" in the proper direction, it will actually shake and reverse itself, ultimately spinning in the opposite direction! It is really weird.

Thingiverse link: http://www.thingiverse.com/make:73666

Settings: MakerWare .3mm/low with the usual 10% infill.  We also made a set with a much higher infill but they actually worked less well than the 10% infill models.

Stuff to change: Some sanding was required to get the rattlebacks to function correctly. Next time I would print at a finer resolution and also try to print the models on their long edges, in the hopes that the tops would be smoother. These do reverse direction but do not spin very much after reversing, and I think further sanding or finer/smoother resolution would improve the action.

Sunday, April 6, 2014

Day 223 - CGR 3-Doodler squiggle tower

Today we finally broke out the 3-Doodler 3D-printing "pen". Calvin loves making tall towers of squiggles. This one broke the record!

Technical notes, Yaya-comparison flavor: We also have the Yaya 3D Pen, which is a nearly identical knockoff to the 3-Doodler except that it seems to be (a) lower quality and (b) more expensive. On the other hand it shipped quickly and works pretty much the same way with similar results. One big difference is that with the Yaya you have to withdraw the filament by running the motor backwards, and you can't let the end of the filament disappear into the pen. In contrast, the 3-Doodler lets you just keep running the filament through the pen even when it runs out, which means that you can feed in new filament right behind the old. Calvin loves this because you can do a color-change with a funky transitional color along the way. The 3-Doodler also seems a little safer and has a cover for the nozzle that keeps young fingers from accidentally touching the hot nozzle. You can also switch between ABS and PLA with the 3-Doodler and the packaging and filament collection is much nicer.

Saturday, April 5, 2014

Day 222 - Cube screw-puzzle

Today we printed the four-piece cube puzzle from GeorgeHart's Five Screw-Puzzles model on Thingiverse. This one is very easy in comparison to the tricky tetrahedron puzzle from that set of models, which we printed on Day 104, but it is a good warmup to the trickier puzzle since it works basically the same way. And just as importantly, it makes a really beautiful two-color model.

Settings: We used a MakerBot Replicator 2 on .2mm/standard with a raft but no supports, on blue tape over a glass build plate. The model printed very nicely without supports and required only minimal cleanup and edge-smoothing with a knife. We printed two of them in different colors in order to make 2-color models. It looks particularly good with one translucent and one opaque filament color.

Stuff to change: The resulting model is very loose so next time I would try printing on .3mm/low to see if things tighten up a bit. Also the very tips of the square ends of the pieces got sliced very thin and came off during cleanup. Nobody looking at the model would notice this unless you pointed it out to them, but it contributes to the overall looseness. The thin area could be fixed by extending the square ends of the pieces just a little bit further.

Friday, April 4, 2014

Day 221 - Friday Fail: CubeX Trio edition

Let's start on a positive note. This week the CubeX Trio in the JMU 3-SPACE classroom printed something! Specifically, the giant hand model that comes as a demo with the CubeX software:

Settings: CubeX Trio in draft/fastest mode, in one color PLA.

This success is really the result of failure, but not in the positive keep-trying-and-you'll-learn-and-succeed-eventually way that I usually talk about. No. This time our success is the result of failing repeatedly and eventually giving up. This print represents the day that we gave up on trying to make the CubeX Trio print in multiple colors and decided to use it as a large-scale one-color printer.

Back in October we did a head-to-head test between the CubeX Trio and the Afinia H-Series, which you can read about on the JMU MakerLab blog. That one-color model was the first print we had made on the CubeX Trio, and also the last successful print we did on that printer until today's giant hand, over six months later. The problem was printing with multiple colors. Here is our first multicolor print; it was supposed to be a set of pieces for two-color puzzle with red raft and support material.

If you're wondering how that big blue blob fits into the puzzle, the answer is that it doesn't; it's what got built up around the nozzle in our print catastrophe:

What went wrong with this and all of our other multi-color prints was that there was a problem with the filament-swap step. Specifically, when one nozzle is done printing a layer and it is time to switch to a nozzle with a second color, the nozzles go to the back of the machine and generate some waste material. This waste material is then supposed to be knocked off and into a collection bin by a "wiping stick". In the video below you can see that our wiping stick can't manage to reach the red blob and knock it off:


If anyone writes to me now to say that we just need to recalibrate the jet offset or the height of the wiping stick, I think I will scream. My infinitely patient student Zev and I spent most of fall semester doing just that, with lots of help from customer support and various printed and emailed sets of instructions. We've had things aligned in every way that you can imagine and the video above is just one of many examples. The blobs that get stuck to the wiping blade eventually end up getting stuck to the nozzle later and ruining the print. In the end, CubeX customer support actually told us that they were out of suggestions, and agreed to swap out our machine for another identical machine. Although the second machine was better, we still couldn't get multi-color prints to work. Here's our best try at printing three small cubes in three colors at the same time; note that we didn't make it past the first couple of layers:

So I guess part of failing over and over again is just knowing when to give up. This week we decided to give up and print a one-color demo model just to prove that the machine can do something, and that's today's giant hand model. Although the wiping stick got the last laugh even here; the arrow in the picture below shows the wiping stick catching on the model after slipping down from its aligned location. We had to stop the print and unscrew the wiping stick to finish the hand.

So what's next for the CubeX Trio, now our one-color large-scale printer? Stay tuned for a huge model of Henry Segerman's Dragon Curve from yesterday, as well as some of our Catalan Wireframe Polyhedra from Day 212

Thursday, April 3, 2014

Day 220 - Dragon Curve

Today we were very excited to print Henry Segerman's stunning Developing Dragon Curve model. Henry sent us the file for the model so we could print a small test run of it before attempting to print a supersize model on our large printer (more on that tomorrow). It's a Level 11 and it looks amazing! I brought this print to the NYC Inside 3D Printing Conference to give to Joe Scott from Afnia to thank him for inviting me to speak on a panel at that conference. Thank you, Joe!

Link to Shapeways: Henry has made this fantastic model available on Shapeways at http://www.shapeways.com/model/600153/developing-dragon-curve.html.

Settings: .3mm default fast on an Afinia H-Series, with raft and support.

Technical notes, support flavor: The supports were minimal because of the shape of the model; even the "windows" had very little support, and that support was needed only for the tops of the windows and fell outside of the holes because of how the model curves. Here is a picture of the model with supports still intact, hot off the press:

Technical notes, clean-up flavor: The matte color of the Afinia's ABS plastic filament is fantastic, but small white marks get left in the locations from which rafts and supports were removed. To get rid of these white marks just apply heat; we do this with a Nicole Heat Embossing Gun and it works in just a couple of seconds.

Technical notes, math flavor: Below are two in-depth sources for more information on the mathematics behind the shape and construction of this beautiful model.
  • Numberphile's excellent Dragon Curve video, in which he explains how the Dragon Curve can be built up by folding a long strip of paper. Cool bonus fact I learned from this video: the Dragon Curve was featured in the chapter headings of Michael Crichton's Jurassic Park book.
  • The Irving/Segerman paper Developing Fractal Curves, which explains both the Dragon Curve itself and their method for building a continuous rounded model of its iterations using Bezier curves and a healthy dose of serious mathematics.

Wednesday, April 2, 2014

Day 219 - Chmutov-Schwartz minimal surface

Today we printed elgolem's Chmutov-Schwarz minimal surface model on Thingiverse, in honor of George Hart's wonderful bouncy circle sculpture from G4G11.

Thingiverse link: http://www.thingiverse.com/make:72978

Settings: To print this object we had to convert from obj to stl (used MeshLab); it was huge so we then reduced the scale twice by 50%.  Printed on a MakerBot Replicator 2 with .3mm/low layer height, with raft but no support. The raft was needed; without it the circles on the bottom layer wouldn't adhere to the platform (blue tape on glass).

Stuff to change next time: The bottom of the model is very rough and either needs finer resolution or support for future prints. The rest of the model did very well without supports.

Tuesday, April 1, 2014

Day 218 - Poly/giraffe bracelet

Today we designed a bracelet by using TopMod to extract a ring of irregular pentagons from the center of a Pentagonal Hexacontahedron wireframe (our "giraffe polyhedron" from Day 194). We made small and large versions. The large should fit over most hands and form a bangle bracelet. The small is for those of you with more lady-like hands. For those with larger hands like me, you can cut off a couple of rungs of the small version to make a C-shaped bracelet that is easy to put on and take off, and fits more snugly, as in this picture:

Thingiverse link: http://www.thingiverse.com/thing:288182

Settings: MakerWare custom profile to minimize support (same as our previous knots and polyhedra).

Monday, March 31, 2014

Day 217 - Customizable Tree

Today we printed the Customizable Tree from Thingiverse. A lot of my students at JMU 3-SPACE try to print trees from Marissa's Tinkercad community shape script or other sources, but those models often don't print correctly, and usually end up causing a lot of heartbreak. Thingiverse's new customizable model generates a printable tree every single time! Here's the one that I generated:

Thingiverse link: http://www.thingiverse.com/make:71874

Settings: Printed on a Replicator 2 with .3mm/low resolution, and it looks great.

Technical notes, humble flavor: I was going to post here about the new 3D Vector OpenSCAD Library and how it is used in this model. Since the Customizable Tree is available in the Thingiverse Customizer, you can look at its OpenSCAD code; I hoped to pick it apart and tell you all how it works. Being a math prof I figured vectors are right up my alley and that I would have a lot to say about this. However it turns out that I am not yet smart enough to figure out what is going on in the Customizable Tree code. It looks like I have a lot of OpenSCAD-studying to do this summer. Kudos to the real makers out there who actually know what they are doing!

Sunday, March 30, 2014

Day 216 - Tiling space with a weird squiggle

I've been having fun watching the math that Mike Lawler (@mikeandallie on Twitter) and his kids discuss on video at their blog mikesmathpage, and thinking about how to get my own 8-year-old son interested in watching those videos. Their post from yesterday, Penrose tiles and some simple 3D variations, has three great videos that are very visual and so I started with those. In these videos Mike and his kids examine various tilings of 2-dimensional space and various tessellations of 3D-space, using the following models:
Much thanks to Mike and his kids for making their mathematical journey available for others to learn from, and also for using our models as part of their explorations!

In the second video, Mike and his kids show that two very odd shapes can be used to fill 3-space because pairs of them can combine to make a cube, which of course fills space. In their third video they use 3D-printed models and ZomeTools to show that Rhombic Dodecahedra also fill space. The following model combines these two ideas, using four copies of an even stranger object to construct a Rhombic Dodeahedron:
And that's the weird squiggle that we'll be filling space with today:

Settings: Printed on a Replicator 2 with raft but no supports, on a glass platform with blue painter's tape, at 80% scale, with two pieces of each color. On .3mm/low the pieces took about 12 minutes each to print and made a model was very tight and difficult to assemble, and nearly impossible to take apart. On .2mm/low the pieces took about 16 minutes each to print and have the same problem. Hopefully the clearance will loosen up with repeated use, but if not then I will try to figure out the OpenSCAD code that made this model so that I can increase the clearance.

Technical notes, OpenSCAD flavor: VeryWetPaint made their code available and I'm going to attempt to annotate it to make clear how it works. To understand this code you'll need to learn about Minkowski sums and .dxf extrusion in OpenSCAD.  Here are some things I don't understand yet about this code: (1) why does it seem like the two helical pieces that are removed in the "difference" operation are so different, and (2) how was the .dxf file made and what is the equation for whatever that helix is? I'll update later if I figure it out; please comment below if you know!

// mathgrrl annotation of rhombic puzzle piece code
// code by VeryWetPaint on Thingiverse
// http://www.thingiverse.com/thing:12489

// parameters ///////////////////////////////////////////

tw = 240;

// module for making a rhombic dodecahedron /////////////

// here VeryWetPaint has the elegant idea to contruct the 
// Rhombic Dodecahedron by intersecting six rectangular solids 

module rhomb()
  // take six rectangular solids and intersect them
rotate([45,0,0]) cube(size=[sa,sz,sz],center=true );
rotate([-45,0,0]) cube(size=[sa,sz,sz],center=true );

rotate([0,45,0]) cube(size=[sz,sa,sz],center=true );
rotate([0,-45,0]) cube(size=[sz,sa,sz],center=true );

rotate([0,0,45]) cube(size=[sz,sz,sa],center=true );
rotate([0,0,-45]) cube(size=[sz,sz,sa],center=true );

// this sphere rounds all of the edges with Minkowski sum

// render of twisty piece ///////////////////////////////

// here VeryWetPaint takes away two corkscrew pieces from the 
// Rhombic Dodecahedron, leaving one corkscrew piece behind

// start with the Rhombic Dodecahedron
rotate([0,0,45]) rhomb();

// take away one corkscrew piece
slices=64 );

// take away a rotation of that same corkscrew piece
slices=64 );

UPDATE: Scott Elliott (VeryWetPaint) has uploaded a new .dxf file and OpenSCAD code on Thingiverse with some helpful descriptions and bonus OpenSCAD code in the comments below. Thank you, VeryWetPaint!