Welcome to MakerHome




We've completed our yearlong print-a-day project!
All new material is now at Hacktastic: www.mathgrrl.com


Friday, March 14, 2014

Day 200 - Friday Fail, candlestick edition with bonus rant

Every week there is more failure.


But those who seek only to avoid failure will never succeed at anything new. If you want to succeed every time at making something, go down to the Build-a-Bear shop in the mall, buy a Paint-by-Numbers kit, or cook a microwave TV dinner. Expect things to be done for you and that everything will just work without you having to do anything interesting. And then go read Seth Stevenson's article I tried a 3D printer and all I got was plastic goo in Slate. 

It is difficult for me to express strongly enough how disappointed I was in Stevenson's article while still remaining nice. When you buy a tennis racket or a chessboard, are you surprised when you aren't automatically a great tennis player or clever at chess? Does buying a new stove make you a good cook? Of course not, and using a 3D printer is no easy ride, either. 

The reason this article upsets me isn't because it is negative about 3D printing. There are plenty of negative things to talk about regarding 3D printing: copying keys, printing guns, copyright violations, non-standard filament spool sizes, and yes, the fact that sometimes the learning curve is steep. And sure, 3D printing isn't yet at the point where every household needs or wants to have a 3D printer. What upsets me is that Stevenson's dismissive, snarky article perpetuates the feeling that we should all expect things to be handed to us, fully functional. That we shouldn't have to think, or learn, or be creative, or fail.

The best spin I can think of for this article is that Stevenson set out to write an article about 3D printing, ran up against a deadline, and decided that if he couldn't succeed before his print deadline then the best thing to do would be to complain that 3D printers are just so impossible to deal with that no normal human could possibly find them useful. That's the best spin, because the alternative would mean that he genuinely was not willing to fail or learn after falling down just a few times, and that possibility is very sad. It would mean that he approached 3D printing as if it were just another way to consume - instead of trying to make any models himself, he only tried printing what he dismissed as "trinkets and geegaws" and then was disappointed when they didn't pop out of his 3D printer like it was a vending machine. If you want a quick and cheap source of little plastic trinkets, then go to the Dollar Store. If you want to actually learn to make something yourself then go get a 3D printer.

In the Thingiverse community we may start out designing "geegaws" but we are learning the skills to make bigger and better things all the time, and to teach those that come after us. The filament-extrusion 3D printing technology that we hobbyists have on our desks is decades old, and isn't representative of what the pros can do with 3D printing (bioprinting, circuitry, airplane parts, houses, you name it). But limited as it is, we don't want to mindlessly consume our entire existence from the shelves of Target. We want to MAKE things.

Being driven to make rather than just accept the status quo is what enabled projects like RoboHand's Mechanical prosthetic hands printed on a MakerBot Replicator 2 and Manu Prakesh's 50-cent paper microscope that folds like origami, both of which replace expensive and inaccessible consumer products with things that are inexpensive and easy to share. 3D printing enables doctors to do complicated facial reconstructions, builders to make new types of houses, and even helps NASA create tools for space exploration

I'll never make anything as important as those things, but at least when I failed at printing this Friday, I had enough grit to get up and try again until it worked. In the end my failed orange chalice turned into a pair of silver candlesticks, using anoved's Customizable Chalice Lathe on Thingiverse and a profile image of my son's face and mop of curly hair: 


Tinkercad link: https://www.tinkercad.com/things/fPH71QxCeSw-day-200-cgr-candlestick-lathe
Thingiverse link: http://www.thingiverse.com/make:69779

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

Technical notes: I'm no artist, so to get the profile of C's face as the side of this vase required some tracing. Specifically, I sized a .jpg of C's profile to be the same as the drawing window in anoved's Customizer, and then put a piece of paper over the screen to trace the outline of his face from the .jpg. Then I put the paper over the box in the Customizer and looked through it to guide the mouse and trace out the profile. A *lot* of failure was involved here, and I had to try the Customizer sketch many times before it looked right. Then my initial try at printing a vase failed because of some massive overhang under the chin part of the profile. Trying to resketch to avoid that overhang didn't work; somehow every orientation came with some unacceptable overhang.  In the end I sketched a thinner model, downloaded the solid .stl model output from anoved's Customizer, and imported it into Tinkercad, where I made a hole for a 7/8" candle and made a septagon indentation at the top. The candlesticks were printed in white and then colored in later with a silver Sharpie. They look pretty good but it's weird to pick them up because although they look a bit metallic, they each weigh only 32 grams!

Thursday, March 13, 2014

Day 199 - Triakis Icosahedron

For the last week I've been printing whatever polyhedra appeal to me, and today I realized that everything I've printed is a Catalan solid. Today is the fifth, the Triakis Icosahedron - dual of the Truncated Dodecahedron, and the first one so far that has triangular faces. This way leads madness; I'm going to have to print all of them now. Luckily, there are only thirteen Catalan solids. (Of course later I could print all of the Archimedean solids, then the Johnson solids, then Platonic solids and prisms and anti-prisms and arrgggh...)


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

Settings: MakerWare custom profile described in Day 194, on a Replicator 2.

Wednesday, March 12, 2014

Day 198 - Deltoidal Icositetrahedron

Another day, another Catalan solid.  Today it is the Deltoidal Icositetrahedron, dual of the Archimedian solid known as the Rhombicuboctahedron. As we discussed yesterday, the fact that these are duals means the following two things:
  • Since every vertex of the Rhombicuboctahedron is degree four, every face of the Deltoidal Icosahedron has four sides. 
  • Since every face of the Rhombicuboctahedron is either a triangle or a square, every vertex of the Deltoidal Icositetrahedron has degree three or four.
The Deltoidal Icositetrahedron looks like the little brother of the Deltoidal Hexecontahedron from Day 196:


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

Settings: MakerWare custom profile described in Day 194, on a Replicator 2.

Tuesday, March 11, 2014

Day 197 - Pentagonal Icositetrahedron

Today's print is yet another Catalan solid, the Pentagonal Icositetrahedron - dual of the Snub Cube which we printed with Poly-Snaps in Day 116, and giraffe-cousin of the Pentagonal Hexecontahedron we printed on Day 194.  Designed using Mathematica, MeshLab, and TopMod as described in Day 194, with scaling factor determined as described in Day 195



Settings: Same as the past few days, detailed in Day 194, on a Replicator 2. 

Monday, March 10, 2014

Day 196 - Deltoidal Hexecontahedron

Continuing our string of Catalan solids, today we printed a Deltoidal Hexecontahedron.


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

Settings: MakerWare custom profile described in Day 194, on a Replicator 2.

Technical notes, math flavor: Catalan solids are the polyhedra that are the duals of the Archimedean solids. To recap with some nice pictures from Wikipedia, the three Catalan solids we've printed (on the left) have the following Archimedean duals (on the right):


Look at these pairs of polyhedra for a minute and see if you can figure out what "dual" means. Then look at the picture below from donsteward's blog instead, for some much easier examples. The picture below shows black wireframes of the five Platonic solids (polyhedra whose faces are all the same regular polygon and for which every vertex has the same degree) along with colorful models of their duals. In order from left to right and top to bottom: The dual of the tetrahedron is itself, the dual of the cube is the octahedron, the dual of the octahedron is the cube, the dual of the icosahedron is the dodecahedron, and the dual of the dodecahedron is the icosahedron.


From these figures it is much clearer what we mean by duality here, namely: to obtain the dual of a polyhedron we draw a vertex in the center of each face and then connect those vertices with edges. Mathematicians often say that we "replace the faces by vertices and the vertices by faces" when they want to express this concept. So, for example, each five-sided face of the dodecahedron in the last wireframe picture above corresponds to a five-degree vertex in the colorful icosahedron inside it, and each three-degree vertex in the last wireframe picture above corresponds to a three-sided face of the colorful icosahedron inside it. Now you can go back to our fancy Catalan and Archimedean solids in the first picture and see if you can spot the same pattern!

Sunday, March 9, 2014

Day 195 - Disdyakis Dodecahedron

The Disdyakis Dodecahedron is a convex Catalan solid with a lot of cool properties, including:
But the main reason we printed this particular polyhedron today is because it looks cool, kind of like the frame of an Octahedron with fancy asterisks added to its faces:



Settings: MakerWare custom profile described in Day 194, on a Replicator 2.

Technical notes:  Here's the fun part. (Warning: When a mathematician says that, it means that they are about to spend a long time talking your ear off about something.) The yellow model above isn't the first Disdyakis Dodecahedron we printed. When we followed the modeling procedure used to create yesterday's Pentagonal Hexecontahedron, we got the much smaller red model shown in the front of this photo:


Clearly, next to the open, delicate Pentagonal Hexecontahedron shown in blue, the red Disdyakis Dodecahedron is too small and dense; we need to scale up the model.  There are two things to consider here: First of all, we have to scale the model before we create the wireframe, or else the edge thickness will increase as the model gets larger - and we want the edges to look the same in all of our polyhedron models. Second of all, although we could try to eyeball a satisfying scale for the new polyhedron, it would be much better to have some kind of consistent scaling factor that we could apply to all of our polyhedron models. And that's a math problem!

Let's walk through the problem. We want to print a set of polyhedra that look like a matching set, even though they will have many different types of faces and vertex degrees. All the initial scaling rules we thought of had problems. For example, we could insist that every model has the same smallest edge length. Not a bad idea, and might make things look pretty consistent, right? Well, it happens that this is exactly what Mathematica does, and since we used Mathematica to get the original polyhedral form for our models, the blue and red polyhedra already have this property! If you look at the picture you can see that the edge length on the red model is actually the same as the shortest edge length on the blue model. Here's another possible rule: Make all triangles the same sizes in all models, and make all pentagons the same proportionally larger size, and so on. Once again, this is already the case for the red and blue models, but the red one is somehow far more dense. One more: what if we let the area of the smallest face be the constant? Well, then models that involve pentagons and hexagons are going to look a lot different than models that involve triangles and hexagons. Nothing is working and we are starting to feel more than a little dense for not seeing the answer. Welcome to mathematics!

Wait... DENSE. Density is the key. And what is causing the density here is the amount of the surface area of the polyhedra that is used by the wireframe. Although our model has some extra material at the vertices, the wireframe is essentially made up of the edges of the polyhedron. So what we want to look at is the ratio of the area taken up by the edges to the surface area of the polyhedron. Since all of the edges have the same width, let's focus on their lengths. We can ask Mathematica to find the edge lengths that occur in the Disdyakis Dodecahedron with this command:

N[PolyhedronData["DisdyakisDodecahedron", "EdgeLengths"]]
Output: {1., 1.33771, 1.6306}

Since we can see from the model that these three edge lengths each occur once on every face, the average edge length is:

length = (1 + 1.33771 + 1.6306)/3
Output: 1.32277

We also need to know how many edges are in the model:

edges = PolyhedronData["DisdyakisDodecahedron", "EdgeCount"]
Output: 72

As well as the surface area of the model:

surface = N[PolyhedronData["DisdyakisDodecahedron", "SurfaceArea"]]
Output: 32.0667

From these pieces we'll construct our scaling factor. We'll take the product of length and edges to represent the amount of the polyhedron covered in wireframe (up to some constant multiple based on the width of the edges; let's ignore that for now), and look at the ratio of that product with the surface area. One last thing, though: Since we are going to use this scaling factor to linearly scale the model in each direction, and the ratio we are computing has to do with surface area, we should take the square root of the ratio to get the scaling factor:

scalefactor = Sqrt[(length*edges/surface)] 
Output: 1.72338

Now here's the really cool part. We thought that we'd have to multiply this scaling factor by some constant to account for the width of the edges, until we realized that yesterday's print of the blue Pentagonal Hexecontahedron had exactly the look and density that we wanted. So we calculated the scaling factor for that model and it came out to be... wait for it...

Output: 0.980345

In other words, just about 1. Close enough that we can pretend it is equal to 1. This means that relative to our nice airy Pentagonal Hexecontahedron model, our Disdyakis Dodecahedron model should be scaled up by a linear factor of about 1.72338. To get today's yellow model this is exactly what we did, adding the scaling in the MeshLab file conversion step:

Filters/Normals, Curvature, and Orientation --> Scale --> enter scaling factor 

Note number 1: Usually when I say "we" I really mean "I", since that is how math people talk for some reason and I can't shake it. But today "we" is really a plural, as my husband Phil was a great sounding board and suggestion-factory for this scaling problem. Thank you Phil!

Note number 2: I apologize for falling behind on this blog, once again. I knew this post would be a doozy so was procrastinating, and also, life and stuff. The good news is that while I was procrastinating I printed about ten more polyhedra wireframes, so I'll have lots to share with you very soon.

Saturday, March 8, 2014

Day 194 - Pentagonal Hexecontahedron

For the next week or two we will be modeling and printing wireframe models of various exotic polyhedra. On Day 192 we developed a method for doing this using Mathematica, MeshLab, and TopMod, and tested three types of meshes.  We like the Goldilocks one in the middle (not too angular and not too round), so today we applied it to a very beautiful polyhedron, the Pentagonal Hexecontahedron. This is now my favorite polyhedron; so irregular and yet so regular at the same time!


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

Settings: We printed this on a Replicator 2 using our minimal-support MakerWare custom profile from Day 110. This profile is based on the Standard PLA profile, with the following modifications:
  • "roofThickness": 0.5, 
  • "floorThickness": 0.5,  
  • "sparseInfillPattern": "linear",  
  • "infillDensity": 0.2,   
  • "minSpurLength": 0.4,  
  • "doSupport": true,
  • "doSupportUnderBridges": true,
  • "supportDensity": 0.1,   
  • "supportExtraDistance": 0.8,  
  • "supportModelSpacing": 0.5, 
Technical notes: To create the model for this object we used the same procedure we followed in Day 192, detailed below. 
  1. Use Mathematica to create the polyhedron and export to STL:
    PolyhedronData["PentagonalHexecontahedron"]
    Export["PentagonalHexecontahedron_math.stl", %]
  2. Use MeshLab to convert to OBJ format.
  3. Use TopMod to remove edges or vertices that don't belong in the wireframe, and then create the frame and remesh:
    Wireframe 0.250
    Remeshing/4-Conversion/Linear Vertex Insertion
    Remeshing/4-Conversion/Doo Sabin
    Export as STL
  4. Use MakerWare to size and orient the model. Specifically, Mathematica creates models in inches, so when this model is imported into MakerWare it will be very small (for example, a 2-inch model would only be 2 millimeters). Since there are 24.5 millimeters in an inch, we need to rescale by a whopping 2450%. This makes a really huge model so I scaled by another 50% before printing. By experimenting with the orientation of the model you can sometimes reduce the print time and amount of supports; in this case I re-oriented so that one of the pentagonal faces was flush with the build platform.
UPDATE: Mike Lawler (@mikeandallie on Twitter) alerted me to an related and even more amazing polyhedron posted on Mr. Honner's blog on the same day as this post: a beautiful wooden model of a Dual Snub Hexpropello Dodecahedron.  While you are clicking on links you should also check out Mike's excellent blog mikesmathpage where he explores lots of interesting math with his kids!

Friday, March 7, 2014

Day 193 - Friday Fail, angel hair edition

It's Friday! Also, this:


I was trying to make a smaller version of owens' Sierpinski tetrahedron model from Day 189, but stupidity got in the way. Specifically, I started the print and walked away before checking to make sure everything was okay. I know that I definitely Should Not Do This, but I did it anyway. Even worse, I also did it earlier in the day in the JMU MakerLab and caused a similar angel hair catastrophe that in that case required some serious cleanup and a replacement of the ceramic tape on the Replicator 2. In short, I was an idiot today, and the universe caught me on it twice. Fool me once...

Lessons learned which I either already knew or should have known but did not heed:
  1. Models don't stick as well on tape as they do on acrylic. (See picture above.)
  2. Models don't stick as well on glass as they do on glass with tape. (At the JMU MakerLab we have a new glass build platform!)

Thursday, March 6, 2014

Day 192 - Mesh-testing a Gyroelongated Pentagonal Bicupola

Inspired by the many sets of polyhedral models on Thingiverse (for example pmoews' Archimedean SolidsJohnson Polyhedra, and Catalan Solids, and pdragy's Customizable Convex Polyhedra), today we experimented with ways to make wire-frame polyhedra. Our test subject was the gryoelongated pentagonal bicupola, which has regular polygon faces but non-regular behavior at its vertices. This sounds fancy but just means that the vertices can look different; for example, in this model there are some vertices that are surrounded by one pentagon, two squares, and one triangle, where in other places there are vertices that are surrounded by four triangles and a square.


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

Settings: MakerWare with custom settings from Day 110 on a Replicator 2.

Expensiveware warning: On this blog I try to stick to free and commonly available software, but for today's object I am pulling out the big guns and using Mathematica, which is very much not free. Mathematica's freeware baby cousin wolframalpha.com also knows about the gryo-pen-bic-whatsit, but Mathematica has much more data and power, and most importantly, can export models to STL.

Technical notes: It is easy to get a 3D polyhedral model in Mathematica using the built-in PolyhedronData package; for today's polyhedron it's as simple as:
PolyhedronData["GyroelongatedPentagonalBicupola"]
Mathematica can also output a wireframe, give specific vertex coordinates, calculate the surface area of the polyhedron, and lots of other things, including export to STL. However, Mathematica only reliably exports full models, not wireframes (as far as I can figure). We could use Mathematica's vertex coordinates to explicitly construct a wireframe model in OpenSCAD by combining the methods in Day 174 and Day 188, but that would require keeping track of vertex adjacency information. That might be tolerable for just one polyhedron, but would be way too tedious for constructing a big collection of different polyhedral wireframes.

So the problem is this: How to turn a model exported from Mathematica into a wireframe? This afternoon I was thinking about this problem and suddenly remembered that there is a little button in TopMod that looks like this:
Problem solved! Export the polyhedron from Mathematica to STL, convert to OBJ using MeshLab (or your favorite online converter) so we can open the file in TopMod, remove the edges and vertices from the mesh that we don't want included in the wireframe, and then press the magic button. The model pictured on the right is the result of this process. The one pictured in the back had a mesh refinement and then a Doo Sabin remesh (see Day 135), and the one pictured on the left had no refinement but then two Doo Sabin remeshings.

UPDATE: Bill Owens (owens on Thingiverse) points out that you can get Mathematica for free on a Raspberry Pi, so for some of you Mathematica *is* freeware!

Wednesday, March 5, 2014

Day 191 - Filament bracelet

Today we made something very simple: a small, thin rounded tube for turning a scrap of filament into a simple bracelet. Despite how simple this is, it took over a dozen prints to get it just right so that it would hold the filament securely. The resulting bracelet is the top one in the following picture:


Tinkercad link: https://tinkercad.com/things/1u7wu02ELWJ-day-191-filament-bracelet-clasp
Thingiverse link: http://www.thingiverse.com/thing:264544

Settings: MakerWare .1mm/high with raft but no support, in about 7 minutes on a Replicator 2.

Tuesday, March 4, 2014

Day 190 - One hundred triangle-squares

In bulk printing mode again. Over the past few days we have printed 100 of the Hinged Triangle-Square models from Day 189, for a giveaway at an upcoming conference. Many more to print but a hundred is a milestone worth a picture, don't you think?


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

Settings: MakerWare .3mm/low with linear fill with no support and no raft, on a Replicator 2. I've been printing six at a time, which takes about an hour. I'd do more but my build plate is warped - I know I should just order one but it is expensive! My reliability has been great, with just one lemon in the hundred I've printed so far. On one of the print runs I ran out of green filament halfway through and switched to black, as you can see in the picture.

Monday, March 3, 2014

Day 189 - Sierpinski tetrahedron

Today an amazing thing happened. It became possible to print a Sierpinski tetrahedron without internal supports on a desktop filament-based 3D printer. Not a fancy laser sintering powder printer that costs tens of thousands of dollars and uses expensive printing material to boot, but a simple Etch-a-Sketch-plus-glue-gun printer that can make an object as big as your hand for less than a cup of coffee. Two key things made this possible; two things that just WORK, no muss, no fuss. Sparks of genius.

The first key thing is an idea and model, both by owens on Thingiverse. He constructed a Customizable Sierpinski Tetrix model that can be printed with no supports other than a custom stand that prints underneath the model and is snapped off later. The spark of genius here is that owens' stand enables you to print the Sierpinski tetrahedron upside-down, and therefore in a configuration with no overhangs! Owens had done the same thing earlier for the Menger cube, which made us so happy that we printed and posted Menger cube models using owens' stand method for six days last month (Day 157Day 161Day 162Day 169Day 170Day 171). I'll say what I said about this on the first day: sure, it's obvious now, but nobody else put the pieces together before owens did, and in addition his execution is great. The model easily breaks off the supporting stand it prints with; no muss, no fuss.

The second key thing is a machine: the MakerBot Replicator 2. I now have access to three of these machines, one in the JMU MakerLab in the Department of Mathematics and Statistics, one in the JMU 3-SPACE general education 3D-printing classroom, and one in my house, right here on my desk. This machine just works. Out of the box. With minimal fiddling with print settings and calibration. And it produces absolutely stunning prints, even at the .3mm/low resolution that we used today for the Sierpinski triangle. In my job running MakerLab and 3-SPACE I help maintain sixteen 3D printers of various makes and models. Some are ABS, some are PLA; some are multiple-extrusion and some are not; some work better than others and some need more attention than others. Each one fills a role in our lab and in our classroom, and each one breaks, has printing catastrophes, and has to be taken apart and put back together from time to time. We had some bumpy times early on as I was learning and the Replicator needed some replacement parts, but now that we've settled in, the Replicator 2 is the boss at printing mathematical objects. Your filament 3D printer doesn't have to be a Replicator 2 to print owens' Sierpinski triangle, but it sure as heck doesn't hurt.

So here it is! Today's amazing thing:


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

Settings: MakerWare .3mm/low on a Replicator 2 with no raft and no supports. Prints with a stand that easily snaps off after printing.

Sunday, March 2, 2014

Day 188 - Hinged Triangle-Square

Today we printed the famous hinged dissection called the Haberdasher's Puzzle from Henry Dudeney, who found a way to cut an equilateral triangle into four pieces that reassemble into a square. Dudeney's solution had an additional property, which is that the pieces could be hinged so as to swing from one form to the other. It's a beautiful construction and I was recently reminded of it by a tweet from WWMGT ("What Would Martin Gardner Tweet?"). Here are seven copies of the model, laid out so you can see the triangle turn into a square, and vice-versa:



C is at home for a(nother!) snow day with his friend E, who was kind enough to demonstrate how the Triangle-Square works in this short video.

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

Settings: MakerWare .3mm/low on a Replicator 2 with linear infill (just because it looks nicer when using translucent filament), in about 10 minutes, with no raft and no support.  The model prints in *one piece*, hinges and all.

Technical notes: This is the model we were working on in Friday's post about failing. It was created in OpenSCAD by modifying the code for our Fidget cube from Day 146. When I first started this project, I thought it would be a simple modification. Then I realized I didn't have coordinates for the dissection of the triangle. After some searching I found an explicit construction with coordinates in coordinates the MapleSoft article Animation of Dudeney's Dissection Transforming an Equilateral Triangle to a Square by Mark Meyerson of the U.S. Naval Academy. After some trial and error I got this worked into the following coordinates for points A, B, C, E, F, P, Q, R, and S in OpenSCAD code (where s is a scaling factor with default value 35mm):

A1=s*0; A2=s*0;
B1=s*1/2; B2=s*sqrt(3)/2;
C1=s*1; C2=s*0;
E1=(A1+B1)/2; E2=(A2+B2)/2;
F1=(B1+C1)/2; F2=(B2+C2)/2;
P1=(B1+s*sqrt(2*B2/s-(B2/s)*(B2/s)))/2; P2=0;
Q1=P1-s*1/2; Q2=P2-0;
R1=P1+(((F1-P1)*(E1-P1)+(F2-P2)*(E2-P2))/((E1-P1)*(E1-P1)+(E2-P2)*(E2-P2)))*(E1-P1);
R2=P2+(((F1-P1)*(E1-P1)+(F2-P2)*(E2-P2))/((E1-P1)*(E1-P1)+(E2-P2)*(E2-P2)))*(E2-P2);
S1=E1-R1+P1; S2=E2-R2+P2;

The second major problem was that the hinges needed to be angled and oriented to fit on non-square pieces, and also that some of the hinges needed to attach to angles that were much less than 90 degrees. These acute-angle hinges were unstable and didn't snap apart correctly after printing, so I had to add some stabilizing connectors and then some holes in opposite pieces to accommodate those connectors so the pieces could still fold flush to each other. What I hoped would be easily generalizable code that would work for any hinged dissection with given vertices and hinge locations quickly turned into a mess of one-use angles and hacks to make things close up correctly. But in the end we worked it all out, if messily. Perhaps in the future we'll make a more generalized OpenSCAD code for these constructions, but for today we are content just to be able to turn a triangle into a square and back again. And again, and again, and again.

UPDATE: This model got a shout-out in the post Using Manipulatives for a fun twist on Dan Meyer's geometry problem on the mikesmathpage blog. Nice ideas for how to use the Haberdasher triangle-square to get kids thinking openly about mathematics!

Saturday, March 1, 2014

Day 187 - Spirograph

Thank you so much, Hercemer, for making a 41 Piece Spirograph collection available on Thingiverse!


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

Settings: MakerWare .3mm/low on a Replicator 2, but my build platform is still a bit warped so I had trouble printing any rings larger than the blue one pictured here. I think it may be time to consider buying a new platform.

Stuff to change: I couldn't get the rectangular and triangular gears to work very well, but that may be because I needed a different size of large ring, or because I used "low" instead of "standard" layer height. More experimenting later!

Friday, February 28, 2014

Day 186 - Friday Fail

One thing I love about 3D printing is that it teaches you how to deal with failure. Lots and lots of failure. Every design I make ends with a pretty picture but starts with a stack of failed prints, and each one of those failed prints tells me how to redesign my model to be a little bit better. Printing a model to see how it is working is cheap, fast, and easy when you have a 3D printer, so you can literally "design to fail", that is, make a design that you know isn't quite right but then print it, learn from it, and fix your model or print settings accordingly. Failure is actually an active part of my design process.

The process of try/fail/try again is something that many of my math students have difficulty with; they can remember and repeat tasks but they often have trouble being creative and solving problems. For the calculus geeks out there, consider the difference between differentiation and anti-differentiation. Differentiation is simple for most functions and it would not be hard to write a computer program to do it; the process doesn't require much creativity. Anti-differentiation is another story; for example, the functions 1/(3x^2+2), x/(3x^2+2), and (3x^2+2)/x are fairly similar, but their antiderivatives are wildly different (one involves arctan, one involves logarithms, and one is a polynomial). Finding these anti-derivatives requires a willingness to make a guess, test out the guess, and then re-guess accordingly, and students have a lot of trouble doing that when they first encounter anti-derivatives. A lot of them don't like to try things that they aren't sure will work, and in addition are reluctant to try again when they fail the first time.

I hope that the use of 3D printing and modeling in K-12 schools will help my future students learn to fail. And how to pick themselves up, dust themselves off, and fail all over again. And again, and again!

So in celebration of failure, I'll stop hiding my catastrophes and put them up here for all to see. This week's Friday Fail is a collection of hinge tests for a project we will be posting later this week. The design is based off our old Print-in-Place Fidget Cube model, written in OpenSCAD. Some of the modules in the new design have angles of much less than 90 degrees that need to have hinges, and this causes a problem with stability and reliability. So we've been testing, retesting, coding, and recoding until we get it working just the way we want. Here are some of the failures that helped us on our way today:

Thursday, February 27, 2014

Day 185 - Wishbone

Easy mashup time: Today we printed SimplusDesign's Wishbone Cookie Cutter Set on Thingiverse and Eckerput's Rolling Pin Spacer on Thingiverse so we can make some cookies! Also, a bonus: The rolling pin spacer can be resized into a really simple bracelet to use as a reward for winning the wishbone-breaking competitions that will ensue.


Thingiverse link for wishbone cutter: http://www.thingiverse.com/make:68121
Thingiverse link for rolling pin spacer: http://www.thingiverse.com/make:68122

Settings: MakerWare .3mm/low on a Replicator 2, with no raft and no support.

Technical notes: Eckerput made his rolling pin spacer in OpenSCAD, which makes it easily customizable to different rolling pin sizes and dough thicknesses. It's a great example of simple OpenSCAD code; if you're a beginner you could start with this example and then work on extending and modifying it into other projects:

// Rolling Pin Spacers
// all measurements are in mm

// by Eckerput
// http://www.thingiverse.com/thing:38943

// Diameter of rolling pin in mm (best if slightly smaller than actual)
pin = 46;
pinr=pin/2;

// How thick you want the dough to be in mm
Dough = 5;

difference () {
   cylinder (h=7,r=pinr+Dough, $fn = 200);
   translate ([0,0,-2]) cylinder (h=14,r=pinr, $fn = 200);
   translate ([0,0,-2]) cube([pinr+Dough+2,2,14]);
}

The code is probably fairly self-explanatory except for the "difference" command. This command works by creating the first object that is listed and then subtracting all objects listed after that. In this case, Eckerput is making a solid cylinder that it is 7 mm high and whose radius is enough to get around the rolling pin and make room for the desired thickness of dough.  The "$fn" part tells OpenSCAD to use 200 fragments to make the round part of the cylinder; this controls how smooth the cylinder will be. Using a value as high as $fn=200 can slow your code down significantly in more complicated examples, so when working with rough code I suggest using $fn=12 or not including any $fn directives. There are two things that have to be removed from the cylinder that was created on the first line of the difference command: first, the center of the cylinder, to allow room inside for your rolling pin; second, a small slit in the resulting annulus to give the ring some flexibility to enclose and grip the rolling pin. Note that in each of these objects to be removed, Eckerput made the height 14 instead of 7; this is so that those objects extend well past the original cylinder and do not share any faces with the original cylinder. Failing to do this can cause strange errors in OpenSCAD. For more information on how to get started with OpenSCAD, see the OpenSCAD User Manual.


Wednesday, February 26, 2014

Day 184 - Mystery pyramids

Today we made a lot of little pyramids and a box. Why? Can't tell you that right now, it's for a friend and we'll follow up later on this year with a reason.


Settings: As usual, MakerWare .3mm/low on a Replicator 2. We printed the pyramids three at a time at 80% and the box at 81% to add a little clearance that was missing in our first trial run. You could probably print more pyramids at a time but our build plate is a little warpy so we are currently trying to keep our prints small and near the center of the plate.

Technical notes: The OpenSCAD code is really simple; the only part to think about is how to find the height of a square-based pyramid with sides all of equal length. Get out your trigonometry hat: Given that the sides of the square are 30mm (based on our coordinates for those vertices in the code below), the Pythagorean theorem tells us that the diagonal of the base is 30*sqrt(2). Then the height of the pyramid is one leg of a right triangle whose other leg is length 30*sqrt(2)/2 (halfway across the diagonal) and whose hypotenuse is 30 (one of the slanted sides of the pyramid), so another application of the Pythagorean theorem gives us a height of 30/sqrt(2). Or you could just memorize that the height of an equilateral square pyramid is the side length divided by sqrt(2).

// mathgrrl packing problem

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

the_box();

//square_pyramid();

////////////////////////////////////////////////////////////////////
// module for square pyramid 
// from OpenSCAD manual example
// http://en.wikibooks.org/wiki/OpenSCAD_User_Manual/Primitive_Solids
////////////////////////////////////////////////////////////////////

module square_pyramid(){
polyhedron(
 points= [[15,15,0], [15,-15,0], [-15,-15,0], [-15,15,0], 
          [0,0,30/sqrt(2)] // top point
],                                 
 triangles=[ [0,1,4],[1,2,4],[2,3,4],[3,0,4], // each triangle side
             [1,0,3],[2,1,3] ] // two triangles for square base
);
}

////////////////////////////////////////////////////////////////////
// module for the box
////////////////////////////////////////////////////////////////////

module the_box(){
translate([0,0,76])
difference(){
cube([92,92,92],center=true);
translate([0,0,6]) cube([90,90,100],center=true);
}
}

Tuesday, February 25, 2014

Day 183 - Hiroshima University

To celebrate today's visit to the JMU 3-SPACE classroom from a group of students from Hiroshima University, we them made a nameplate logo design in Tinkercad.



Settings: MakerWare .3mm/low on a Replicator 2 with no raft and no support, oriented so the nameplate was face-down.

Technical notes: To import the logo into Tinkercad we opened a .jpg of the design in Inkscape, converted to bitmap, and then saved in .svg format. 

You can see pictures from the Hiroshima University visit at the JMU 3-SPACE blog.

Cool fact: Today marks the halfway point on our journey to 3D print and post about something every day for a year!

Monday, February 24, 2014

Day 182 - Voronoi die

Today we printed a copy of sirmakesalot's clever Bone Die on Thingiverse using our loaner Afinia H-Series:


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

Settings: Afinia .3mm/low on "fast" with "only base" supports.

Sunday, February 23, 2014

Day 181 - Hexagonal Borromean rings that print without support

Printing Borromean rings in three pieces minimizes support because the first two pieces need no support at all. In this model we've used a hexagonal ring shape with sides beveled so as to allow printing in one assembled piece with no support or raft needed! The "chain" demo file by sal on Thingiverse that comes with the Replicator 2's SD card was the inspiration for this beveled hex design. Although not as pretty as the three-color prints, when you need a quick set of Borromean rings you can't beat a print-in-place support-less model. But in case you want to try a three-color model, I've included files for that as well.


STL file, horizontal ring: http://www.geekhaus.com/makerhome/day181_borr_hex_piece12.stl
STL file, vertical ring: http://www.geekhaus.com/makerhome/day181_borr_hex_piece3.stl
STL file, together: http://www.geekhaus.com/makerhome/day181_borr_hex_together.stl
Thingiverse link: http://www.thingiverse.com/make:67202

Settings: MakerWare .3mm/low on a Replicator 2 with no raft and no supports, all in one piece!

Technical notes: Like yesterday, use the ellipse function and tubify module from Day 179 and then comment in the part you want to use from the code below.

////////////////////////////////////////////////////////////
// Borromean hexagons - all together (no supports needed!)
////////////////////////////////////////////////////////////

// set faces
$fn=6;

difference(){
// make the three rings
union(){
rotate([0,0,0]) rotate([45,45,0])
color("red") tubify(r=3.5,step=45,end=360);
rotate([0,0,120]) rotate([45,45,0])
color("yellow") tubify(r=3.5,step=45,end=360);
rotate([0,0,240]) rotate([45,45,0])
color("blue") tubify(r=3.5,step=45,end=360);
}
// hack to shave off base for good platform adhesion
translate([0,0,-45.4])
cube(50,center=true);
}

////////////////////////////////////////////////////////////
// Borromean hexagons - one at a time
////////////////////////////////////////////////////////////

/*
// set faces
$fn=6;

// hexagon ring
// print two of these
tubify(r=3.5,step=45,end=360);

// final hexagon ring
// print standing up and pause to assemble
// rotate([0,90,0]) tubify(r=3.5,step=45,end=360);
*/

Saturday, February 22, 2014

Day 180 - Diamond Borromean

Same as Day 179 but with diamonds instead of ellipses! This version of the Borromean rings has more limited mobility but that restricted movement makes it naturally sit on your desk in a beautiful star shape:


STL file, horizontal diamond: http://www.geekhaus.com/makerhome/day180_borr_dia_piece12.stl
STL file, vertical diamond: http://www.geekhaus.com/makerhome/day180_borr_dia_piece3.stl
STL file, all together: http://www.geekhaus.com/makerhome/day180_borr_dia_together.stl
Thingiverse link: http://www.thingiverse.com/make:67201

Settings: MakerWare .3mm/low with no raft or support for the first two pieces, and both raft and support for the vertical piece. The vertical piece is oriented in such a way to need to support on its interior, while forcing support in a small area at its base for stability.

Technical notes: Using the ellipse function and tubify module from Day 179, uncomment the code below to get the type of model you want (single diamonds or all together).

////////////////////////////////////////////////////////////
// Borromean diamonds - all together
////////////////////////////////////////////////////////////

/*
// set faces
$fn=4;

// make the three rings
rotate([0,0,0]) rotate([56.6,56.6,0])
color("red") tubify(r=3,step=90,end=360);
rotate([0,0,120]) rotate([56.6,56.6,0])
color("yellow") tubify(r=3,step=90,end=360);
rotate([0,0,240]) rotate([56.6,56.6,0])
color("blue") tubify(r=3,step=90,end=360);
*/

////////////////////////////////////////////////////////////
// Borromean diamonds - do one at a time and then assemble
////////////////////////////////////////////////////////////

// set faces
$fn=4;

// diamond ring
// print two of these
scale(1.3) tubify(r=3.5,step=90,end=360);

// diamond ring
// print two of these
// scale(1.3) rotate([35,0,0]) rotate([0,90,0]) tubify(r=3.5,step=90,end=360);


Friday, February 21, 2014

Day 179 - Tricolor Borromean rings

Yesterday we mentioned that you could print a three-color model of the Borromean rings by printing the rings separately and placing the first and second in and around the third right before it closed up. We did that today, using more elliptical rings to make the assembly easier:


STL file, horizontal ring: http://www.makerhome.blogspot.com/day179_borr_ellipse_piece12.stl
STL file, vertical ring: http://www.makerhome.blogspot.com/day179_borr_ellipse_piece3.stl
Thingiverse link: http://www.thingiverse.com/make:67200

Settings: MakerWare .3mm/low on a Replicator 2 with the first two rings laying flat with no support or raft, and the third ring printing vertically with both raft and support. We used the custom slicing profile from Day 110, which made a very thin one-layer sheet up the center of the interior of the vertical ring. When we added the first two rings near the end of the print, this support sheet had to come out, which led to a few stray threads in subsequent rows that had to be removed. Files for the horizontal and vertical files are separately here because in later models, the orientation of the third piece will be important.

Technical notes, OpenSCAD flavor: The code is very simple; much like it was for Day 178, but with a less circular function for the rings. Remove the comments for the piece you want to print.

// mathgrrl Borromean 
// thanks to kitwallace for tubify module!

// an ellipse
function f(t) = 
[ 25*cos(t),
 15*sin(t),
 0
];

module tubify(r,step,end) {
for (t=[0: step: end+step]) {
hull() {
translate(f(t)) sphere(r);
translate(f(t+step)) sphere(r);
       }
   }
};


////////////////////////////////////////////////////////////
// Borromean ellipses - all together
////////////////////////////////////////////////////////////

/*
// set faces
$fn=36;

// make the three rings
rotate([0,0,0]) rotate([45,45,0])
color("red") tubify(r=3.5,step=10,end=360);
rotate([0,0,120]) rotate([45,45,0])
color("yellow") tubify(r=3.5,step=10,end=360);
rotate([0,0,240]) rotate([45,45,0])
color("blue") tubify(r=3.5,step=10,end=360);
*/

////////////////////////////////////////////////////////////
// Borromean ellipses - one at a time
////////////////////////////////////////////////////////////

// set faces
$fn=36;

// ellipse ring
// print two of these
tubify(r=3.5,step=10,end=360);

// final ellipse ring
// print one standing up and pause to assemble
//rotate([0,90,0]) tubify(r=3.5,step=10,end=360);

Thursday, February 20, 2014

Day 178 - Borromean rings

When I give talks about 3D printing and knot theory, I often tell the story of my student Olivia who created and printed a 3D model of the Borromean rings as her first project in my class.  The Borromean rings consist of three rings arranged in such a way that no two of the rings are linked to each other, but the three together are linked and cannot come apart. Olivia's model came out beautifully, but she had a confession: no matter how hard she tried, she could not make the Borromean rings model out of circles. She reported to the class that she had to resort to using slightly elliptical rings instead of circles, and that in fact, she wasn't even sure that it was possible to construct the darn thing out circles. She had independently discovered what Linstrom and Zetterstrom proved in 1991 in their paper Borromean circles are impossible (American Mathematical Monthly, Vol. 98, Issue 4)! What's more, when you hold the 3D model in your hand it is immediately obvious why constructing the Borromean rings out of circles doesn't work.

Although I've told this story many, many times, it always ends on a lame note - with me realizing that I don't own a copy of Olivia's model to show! Today, I fixed that problem and made a model of the Borromean rings in OpenSCAD:


The rings don't touch each other and you can flatten them to get a braid link conformation of the form AbAbAb, or in other words, the spiral link S(3,3,(1,-1)).


STL file: http://www.geekhaus.com/makerhome/day178_borr_regular_together.stl
Thingiverse link: http://www.thingiverse.com/make:67199

Settings: MakerWare with our custom knot-slicing profile from Day 110 to minimize support. Only very thin sheets of support were generated, which worked wonderfully.

Technical notes: Using the parametric equations for an ellipse and kitwallace's tubify code, we get the following OpenSCAD code:

// mathgrrl Borromean

// nearly a circle
function f(t) = 
[ 25*cos(t),
 20*sin(t),
 0
];

module tubify(r,step,end) {
for (t=[0: step: end+step]) {
hull() {
translate(f(t)) sphere(r);
translate(f(t+step)) sphere(r);
       }
   }
};

// set faces
$fn=36;

// make the three rings
rotate([0,0,0]) rotate([45,45,0])
color("red") tubify(r=2.2,step=5,end=360);
rotate([0,0,120]) rotate([45,45,0])
color("yellow") tubify(r=2.2,step=5,end=360);
rotate([0,0,240]) rotate([45,45,0])
color("blue") tubify(r=2.2,step=5,end=360);

Stuff to change: If you printed these rings one at a time then you could slip the first two around/inside the third just before it finished printing. In that way you could make a cool three-color model! Here are the necessary files for a horizontal ring and a vertical ring.

Pictures of Olivia's original Borromean rings, which she constructed in Tinkercad, can be found at an old post of this story at jmumakerlab.blogspot.com.