Introduction: Becoming a Human 3D Printer
I am building a system for building things by hand in the same way a 3D printer would. Why? Answers include: getting out of a lab and into the world, playing with everyday materials in new configurations, mechanical performance, doing things 3D printers still can't and won't be able to do for some time (i.e. large scale), creative exploration, watching things break in beautiful ways and paying homage to the power of a glue gun. What you see in the image above is the vision: a maker army of human fabricators taking to street to create public performances and artworks.
This Instructable will outline my journey from concept to implementation and everything in between. As an artist-in-residence at Instructables I am in a once in a lifetime position to experiment to my hearts content and I hope to share this journey with anyone who might be interested. I am also recruiting members for the maker army and I aim to make this system something easy to make yourself and try out. I'm also open to feedback and suggestions so fire away any comments you see fit.
Step 1: What I'm Making and Why
I like making things: drawing, painting, sewing, building, hacking, coding etc. When I learned about 3D printing, I have to admit that I didn't see how it appealed to my own creative interests. While I think 3D printers are wonderful for prototyping different design objects, I didn't feel like I would ever use them as a creative practice. I didn't like the idea of giving my work to a printer to do, I didn't like that things had to be made out of specific materials, I didn't like that you had to tethered to a printer indoors somewhere, and I didn't like that everything came out more or less to spec.
I decided that I wanted to create 3D printers to work with everyday materials in everyday settings. I struggled to think of the mechanics of a machine that could be this portable and versatile and then I though - humans are good at building things already - what does a machine really offer us. The answer I came up with was that machines "think" about objects differently than we do. While we may build a house by connecting 4 walls and a roof, a 3D printer would cut it into slices and build the house in layers. Perhaps making ourselves produce 3D objects in a way a 3D printer would could reveal new shapes, forms, structures, and aesthetics in objects that we wouldn't have imagined otherwise. I think it also might change the stories we tell about the objects we 3D print. Rather than having an idea and realizing it on a machine, we might talk about how we build something with this cool material we found, how people watched us build it and asked questions and how, over time, how it changed shape or form.
So, I decided that the machine I would build wasn't something that would do the assembling of objects into something 3D, but instead, would guide a maker through the steps of building an object just like a 3D printer would. What I am building is a laser guide. It draws a point on a surface and the maker follows the point, extruding materials as they go. My first storyboard of this interaction (shown above) thought of this as a new way to decorate cakes. You upload a 3D model to the guide and the guide converts it to G-Code. G-Code is the language that 3D printers speak. Each line of G-Code tells a 3D printer to do something (turn the extruder off/on, move to a point, etc). These instructions are then communicated to my laser-guide and drawn for the maker. For instance, if the G-code says to move in a straight line from point A to B, my laser guide draws a point from A to B and the maker follows it by hand. At some point, the model might need support, and when we are using everyday materials, we can quickly identify materials to hold up our model, in the example above, I show how someone might use cereal as scaffolding for a cake decoration.
Step 2: Understanding G-Code
I began to ask myself if I really understood how 3D printers worked and how G-Code was used in 3D printers. I played around with various G-Code generators like Skeinforge and Slic3r (Slic3r is much easier to use) but found that I didn't get a deep understanding of what G-Code looked like or how the machine moved from one point to the next. I searched the internet for G-Code visualizations and decided to build my own on top of something very close to my idea on Github. I modified the code to show me layer by layer, what G-code looked like. You can play with what I made and see if you really understand G-Code on my website at http://artfordorks.com/btm/
Step 3: Proof of Concept: House of Rose Petals
Before building anything, I tried to fake it and see what would happen. So, I pruned our rose bushes and saved all the stems and petals. I grabbed my trusty glue gun and a few snacks to munch on while I worked. I think started drawing G-Code paths with the glue gun and then laying rose petals along those paths. At some point, I needed support so I used a tupperware container. I kept building and building until I had a blob of rose petals. I used the stems to create house-like details on the model. It took me 20 minutes to build, it was surprising sturdy, and it smelled great. I particularly loved the visual effect when looking though the object on the bottom, like a hollow bowl of petals. In the end I placed in back in the garden to live among the roses. Perhaps a snail will find it to be a comforting home. The last photo shows the house 1 month later.
Step 4: Proof of Concept: House of Popcorn
I repeated the process with popcorn. I thought it would be great to build something 3D out of kernels and then pop them to see what new forms emerged. As expected, the melting point for a glue gun is less than the popping temperature for popcorn and I ended up with a melted pile of glue kernels. I intend to repeat this something more heat tolerant and I will report back soon. I also thought it would be great to fabricate from matches and then light the sucker on fire!
Step 5: First Laser Guide Prototype
Last week, I successfully assembled by first prototype by taping a laser to a servo to another servo. One of the other AiR's introduced me to VBH tape (Best. Tape. Ever!), another hooked me up with some hi-resolution servo motors, and another lent me his micro-controller and I was in business. While I had toyed with the idea of using a gimbal or a galvanometer to drive the laser, it turns out taping a servo to a servo is pretty robust and much easier.
I then tested my knowledge of high-school trigonometry to write a function that translates points on a plane to angles for each servo. I input the points for a square, corrected some errors in my math and about an hour later, it was drawing a square for me on the ground...AND...I managed not to blind anyone with my laser.
Step 6: Fail!
I spent the past few days optimizing the code to run the laser guide and finally got everything working enough to try using the guide with a real G-code file instead of just drawing a square. Here's the workflow so far:
- Use Slic3r to convert and STL file to G-Code using some special parameters so that it's optimized for a "human" machine. Notably, I forced it to only draw 1 perimeter, made the internal scaffolding more or less nonexistent, and set the material diameter and layer height to 5mm.
- View G-Code file in a G-Code Viewer that I wrote that lets me previous with the layers should look like
- Export a CSV file that just contains the points needed to draw the model with the laser guide
- Upload the CSV file to Python script that communicates with Arudino through the PySerial module.
I was so excited to see it work that my heart was racing as I imagined everything working perfectly and making these beautiful drawings of the layers used to print a hand. I grabbed some scrap paper and then used the laser guide to draw the first layer of an hand model that I created a G-Code file from. The first layer should have looked like the screen shot attached but, alas, it did not. The laser was hard to follow, it kept moving onto my hand and was all jerky. Ugh. I think one of the reasons it's not working is the very slapped together tape construction of my model. Next step, make this thing sturdy!
Step 7: Finessing Construction & Trying Again
I blamed the first failure on the fact that the servos holding the laser were held together in a more than precarious arrangement. Also, I discovered that the Arudino Servo library was cutting off the decimal point part of the positioning I was sending it. So, if I told the servo to go to 90.5 degrees, the servo would cut off the .5 and go to 90. This makes a huge difference in resolution which becomes particularly noticeable when the distance between the laser and the wall is increased (i.e. when laser mount is far from the wall, or the servos are far from their center position). I fixed my code to use Arduno's writeMicroseconds function instead of just write and that gave me 10 times more resolution in my servos.
With the help of fellow AIR Paolo Salvagione, we designed, 3D printed and assembled a new way to join the lasers and servo (I'll add a link when I've posted the files so you could also download and build the mount). We added a base that clipped into a tripod mount to give it an added level of support. Here's the parts list:
- 2 x HS-35HD Servos
- 1 x Laser Card Module - Red
- 3D Printed Laser Mount, Servo Connector, Servo Mount
I tried my drawing experiment again and had much better results. What you see here is a 3D model of a hand. I imported the model into Slic3r and adjusted the parameters so I wouldn't have to draw so much scaffolding material or so many layers. The software ended up slicing the hand into about 70 layers. When I imported the code into laser guide program, it began drawing the model layer by layer and I followed the laser point with a piece of charcoal. It started with the base layer and the base of the hand and each new layer progressed closer to the finger tips. The drawing became to look like a topological model of a hand if you were to stand directly above it looking from the fingertips to the base. I have to say that I was quite pleased with the drawing capabilities and had fun experimenting with this. What was interesting was how many people came by to watch or ask what I was doing. Then I would ask them to guess what the model that I was drawing was. Some people got it right away while others squinted and turned their heads - it reminded me of the Magic Eye posters you used to see in the mall.
I considered this to be a success. The laser was easy enough to follow and it didn't take hours to build. Next Step - try something 3-D.
Step 8: Attempting 3D - and It Works!
I spent the last week plugging leaks in my code and device. Turns out, running servos designed for a max voltage of 4.8V at 5V might have been a problem. Part of the problem with my device is that two of the servos were broken, probably from running them at a voltage that was too high and/or damaging the gears from trying to force the servo into a position that it couldn't get to. It wasn't a problem really but every so often the servo would freak out and shake all over the place or would bounce around when it was supposed to be in a steady position. I had one fresh servo left and when I swapped it in to my circuit and changed the voltage to 3.3V, everything worked smoothly.
I updated my code so that the circuit no longer communicates with Python. Sending individual instructions over Serial was causing major problems as well. I now just import every instruction into the Arduino code and run it form there. The problem is that Arduino Unos have very little memory so I did some tricks so that I can store each unique servo position in 1 byte of data. I use PROGMEM to store the instructions on the device instead of loading into Flash Memory which helps as well.
I also added buttons to control the laser. You can tell the laser to "play" or go one step at a time forward or backward. So, i set everything up and tested it out with some pipe cleaners and it works! It took about 3 hours to build (probably about the same amount of time to make it on a MakerBot) and I can't say it was entirely pleasurable aside from the fact that I couldn't believe it worked. The pipe cleaners tended to have a mind of their own and made it difficult at times to stay where I wanted them. Making the tips of the fingers also became pretty difficult.
Why did I make it out of pipe cleaners you ask? I wanted to use pipe cleaners to make a direct comparison between high and low tech forms of craft. I asked some of the other Aritsts in Residence what the most obnoxious craft supply was and pipe cleaners was the answer. I wanted to see if pipe cleaners might get some respect if they were used in a "high-tech" scenario like 3D printing. They seemed to work fairly well and they lead to some unexpected but interesting organic quality to the shapes. You can't have a terrible problem with faceting with you use fuzzy pipe cleaners. Also, the model looks like a colorful muppet hand which is a nice departure from the rigid, cool, geometric, monotone 3D prints we are used to seeing. The process also gave me sympathy for 3D printers and the work they do. It's slow and monotonous and following instructions can get tedious.
1 - Arduino Uno
2 - HiTec-HS35 Servos (insert to pin 9 and 10 on arduino)
1 - Laser (insert to pin 12)
1 - 3D printed servo mount
4 - push buttons (used to control playback)
lots of pipe cleaners
1 - glue gun
I'm still cleaning up the code and interface so that other people can use it but here are my steps:
1. 3D print and build Servo Mount (will post STL files soon)
2. Build Arduino Circuit (will post schematic soon)
3. Get an STL file that you want to build
3. Download Slic3r, a program to generate G-Code
4. Launch Slicer and import your STL, in the settings, change the filament and head size to the size of your material (pipe cleaners are 6mm). You can also adjust the size of your model in Slic3r
5. Click Generate G-Code in Slic3r
6. Drag the G-Code file into a website I built at: www.artfordorks.com/btm, this lets you visualize the G-Code paths and shows you how many instructions and building layers there are.
7. Push Ctrl-Option-I to open developer mode and click on "console" - I use this to print out some information about the model
8. If you think the model looks good, click "Download Code for Arduino". In the console, there is a print out that says "Distance to Base" followed by a number. Write that number down, you'll need it in a sec.
9. Copy the numbers in the file that is downloaded and paste them into the Arduino program in between the comments that say "Begin inserted data." These numbers represent all of the positions needed to create the model.
10. Upload that code to Arduino
11. Set up the laser guide on a tri pod (I use a magic arm so the legs don't get in the way). Make sure the laser is "Distance to Base" mm away from your building surface. Also, manually adjust the laser so it is centered.
12. Push the "Draw Bounding Box" button on the controller to make the laser draw the bounding box, use this to position any material. I put a piece of paper down and tape it to build on so I don't glue my model to the floor.
13. Once you're ready, press "Play!"
14. Bend the pipe cleaner so that the laser is "on" the pipe cleaner as it moves. Use the glue gun to fasten the pipe cleaner down as you go. If the model is going to fast, press play again to pause. You can use the next and previous buttons to move the laser back if you missed a step.
Step 9: To Be Continued...
As I mentioned this is an on going project that I'll be completing as an Artist in Residence at Instructables. I'll keep you updated as my progress continues. Expect to see a completed prototype and some example projects by the end of August 2014.
- Make the laser guide head worn to maximize portability
- Research different adhesive materials (caulk? quick drying concrete)
- Make stuff with it
- Create a way to network different guides together for collaborative building
- Create a programmable interface to create your own drawing paths
- Design awesome uniform for army cadets
- Mobilize army
- Curate a live performance of multiple people building in syncronization
We have a be nice policy.
Please be positive and constructive.