Print
PDF
04
May
2012

My life over the past two weeks

Last time anyone heard from me on this site, I was revving up to do my first full print test on my 3D DLP printer. Then I posted some quick videos of FireHero 2, and I was gone. Comments have been left un-answered (up until tonight! :)) and I dropped off the map for a while. Here's all the things that have happened in my life in the past 2 weeks which have kept me from updating this site as frequently as I'd like:

The 3D printer:

The first print was an absolute failure! Actually, there's no such thing as a failure as far as I'm concerned - After several hours of trying I had nothing more than a giant mess of un-cured resin (which everything still REEKS of).. but I knew exactly what went wrong and I knew what I had to do to fix it. Long story short, I realized why almost everyone who builds a DLP-based printer designs some sort of tilt mechanism into their device, so six hours later I had CAD'ed up a new design for the printer with a tilt mechanism and ordered $160 worth of new parts:

As some of you may have been aware, I was intending on entering my DLP build into the Instructables "Make It Real" challenge, which *had* a deadline of April 30th. My failed test was on April 23rd, leaving me just 7 days to get my new parts, rebuild the printer, finish the software, print some parts, perfect it, and then document the entire thing and create an instructable. This was totally possible, except for the fact that I was leaving for St. Louis the next day (more on that below) and I would be gone for five of those 7 days! I built a battery-powered rig so I could work on my laptop on the tour bus, and ended up finishing an Alpha release of the software on the 16 hour bus ride to St. Louis, while achieving a grand total of 40 minutes of sleep over two days! When I got back home, I worked in the garage until 4:30am rebuilding the printer with its new tilt axis and then grabbed a few hours of sleep before embarking on the last full day before the contest deadline. Right before I started work on the 30th, I happened to check Instructables.. and to my relief found out that the contest deadline was moved to June 4th!

I have some pictures from the build, I'll upload them all as soon as I get some more time!

The 2012 FIRST Robotics FRC World Championship:

As I've mentioned previously on this site, I mentor my local high school robotics team, Aperture. This season the team qualified for the World Championships, which meant heading down to the Edward A. Jones dome in St. Louis for four days along with 400 other teams to compete in front of almost 30,000 people!

We ended up at around 26th place in our division, at times being ranked as low as 9th place! If any of the students on Aperture are reading this, I'm extremely proud of you guys! Hearing Dean Kamen speak right before the finals was personally really inspiring for me, as a lot of what he said really resonated within me and my recent efforts of starting my own company. Dean started the same way I am - he spent a semester in school and then dropped out to start his own company, which he sold for $27 million eleven years later.

Winning the Instructables Extreme! Challenge:

A few weeks ago I created an instructable for FireHero, which I entered into the Extreme Challenge, the Arduino challenge, and the Game.Life 2 challenge. It was the first instructable I'd ever written, and honestly I wasn't expecting too much - until I started receiving a barrage of emails from Instructables. First was an email informing me that my instructable was featured as an Editor's choice. Then my instructable was featured on the front of the technology section, and then the front page of Instructables! I was awarded over two years of free Pro membership and traffic on my website spiked.

FireHero went on to take Grand Prize in the Extreme! Challenge, and second in the Game.Life 2 challenge. As of now I'm also a finalist in the Arduino challenge - maybe I should consider writing instructables more often!

Marion Industries' first contract(s)!

I'm extremely excited to announce that I'm doing some pyro work for NYLAHD, a film production company based in New York City. All I can say is that I'm doing some custom work for a music video shoot next week - I'm extremely excited to be working with these guys and I hope to do more work with them in the future!

Testing some new flame effects for the shoot.. stay tuned!

Print
PDF
18
April
2012

Late-night vat and resin adventures

Tonight I built a test 4"x4" vat (I know 4"x4" is really small - it only leaves about a quarter inch around all sides of my stage when it's lowered in - but it's the only size piece of 1/4" glass I had laying around). I also mixed up some of the Solarez resin with some dye (I use the Castin' Craft opaque yellow dye for polyester resins) and tested it. Read on for some exciting news about the resin!

Print
PDF
17
April
2012

Printer stage completed!

Today I built the stage for the printer. This is the actual build plate that gets raised or lowered by the Z axis and it is the platform that the model grows off of. The plate itself is made of glass, with plexiglass spacers above it. The glass was JB welded to the above plexiglass piece, and 1/4-20 screws are embedded in the JB-weld/plexiglass assembly. This allows the entire stage assembly to be removed by two wing nuts. Read on for pictures of the build.

Print
PDF
04
April
2012

Building the z-axis

Today the linear motion components for the printer finally arrived! I spent a few hours putting everything together and here's the result! The only big things left to do on the printer are to build the stage, build the vat, and then begin some test printing! I have a fully functional z-axis that has a theoretical resolution of down to .0003125mm, or around .3 microns! To put that into perspective, that's the width of about two E. Coli cells laying side-by-side! In practice I probably won't ever use 1/16th microstepping, but I might bring it down to 1/4 microstepping for around 1.2micron resolution. 1/2 stepping will give me around 2.5micron resolution and even that is absolutely incredible.

Print
PDF
01
April
2012

Synchronizing variables between two RoboRealm instances

This weekend I wrote a quick Python script to do a one-way synchronization of variables between two RoboRealm instances in the background. My code makes use of the RoboRealm API to access variables from the first instance and set them into the second one. Each instance must have a unique API port, which can be set via the command line when starting RoboRealm using the -api_port flag or by simply saving unique settings in each instance (preferred). I'm publishing the code here just in case it's useful for somebody else - it only took me five minutes to write but it could save somebody hours of frustration if they've never worked with the RoboRealm API before.

Feel free to modify or use my code for your own use - but feel free to give me a shout-out if you found this helpful!

import socket, re
# socket read/write timeout in seconds
TIMEOUT = 30
############################# RR API CLASS ##################################
#precompiling all needed regular expressions
VarParReq=re.compile('<response><[^>]+>([^<]*)</[^>]+></response>')
HitWidReq=re.compile('<response><width>([^<]*)</width><height>([^<]*)</height></response>')
class RR_API:
def __init__(self):
#create an INET, STREAMing socket
self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
#only wait TIMEOUT seconds for any request
self.sock.settimeout(TIMEOUT)
def escape(self, str):
str = str.replace("&", "&amp;")
str = str.replace("<", "&lt;")
str = str.replace(">", "&gt;")
return str
def write(self, msg, msgLen):
totalsent = 0
# keep sending while there is more data to send
while totalsent < msgLen:
sent = self.sock.send(msg[totalsent:msgLen])
if sent == 0:
raise RuntimeError, "socket connection broken"
totalsent = totalsent + sent
# Buffered socket image read. Since we don't know how much data was read from a
# previous socket operation we have to add in any previously read information
# that may still be in our buffer. We detect the end of XML messages by the
# </response> tag but this may require reading in part of the image data that
# follows a message. Thus when reading the image data we have to move previously
# read data to the front of the buffer and continuing reading in the
# complete image size from that point.
def readMessage(self):
msg = ""
while True:
byte = self.sock.recv(1)
if byte == '':
raise RuntimeError, "socket connection broken"
msg = msg + byte
if (msg[-11:] == "</response>"):
return msg
# Initiates a socket connection to the RoboRealm server
def Connect(self, hostname, port):
self.sock.connect((hostname, port))
# close the socket handle
def close(self):
self.sock.close()
# Returns the value of the specified variable.
def GetVariable(self, name):
self.sock.send("<request><get_variable>"+str(name)+"</get_variable></request>")
data = self.readMessage()
m = VarParReq.match(data)
if m:
value = m.group(1)
else:
value = ""
return value
# Sets the value of the specified variable.
def SetVariable(self, name, value):
self.sock.send("<request><set_variable><name>"+self.escape(str(name))+"</name><value>"+self.escape(str(value))+"</value></set_variable></request>")
if (self.readMessage() == "<response>ok</response>"):
return 1
else:
return 0
 
def SyncVariable(instance1variable, instance2variable):
instance2.SetVariable("%s"%instance2variable, instance1.GetVariable("%s"%instance2variable))
############################# Start program ##################################
# initialize the API class
instance1 = RR_API()
instance2 = RR_API()
#connect to RoboRealm - (host, port)
instance1.Connect("localhost", 6060)
instance2.Connect("localhost", 6061)
while True:
# Syntax for syncing variables: SyncVariable("Variable_to_get_from_instance_1", "Variable_to_set_in_instance_2")
SyncVariable("IMAGE_COUNT", "imagecount_instance_1")
SyncVariable("FPS", "Frames_per_second_instance_1")
instance1.close()
instance2.close()

You can download the .py file here (Python 2.7).

Print
PDF
29
March
2012

v0.3 of the printer software is here

I'm happy to announce that v0.3 of the 3D printer software has arrived!

Changelog from v0.2:

  • Added a progress bar with estimated time left in print
  • Added a remote host viewer - this allows you to check in on the progress of the print from any other computer on the network (or even the world if set up correctly). Now you can set up a print in the garage and check the status from your living room!
  • Squashed several bugs that arose when providing invalid command-line arguments
  • Added many more command line arguments and debugging options

You can download a copy of v0.3 here. Python source code is here.

Instructions for use:

Download the file and unzip the contents to a known location, i.e,. "C:\3dlp"
Open command prompt and navigate to the extracted directory, i.e. "cd C:\3dlp"
type "3dlp -h" to see information on how to use the software. Arguments are listed along with descriptions.
To test the software, type "3dlp -f testpart.stl". This will run the software using the STL part "testpart.stl".
To use your own models, add them to the "models" folder and call the filename of the model you'd like to slice.
Image slices are saved in the "slices" folder. This is cleared every time the program is run.

Print
PDF
28
March
2012

Successful test of printer electronics

I've successfully tested the printer electronics! The electronics are dead simple - an Arduino, a Pololu stepper driver, and a stepper motor. The Arduino is controlled over serial by the host software which synchronizes the stepper movement to the images being projected. I can control the stepper in full, 1/2, 1/4, 1/8, and 1/16 microstepping modes perfectly. The driver board allows me to dial in the regulated current at the exact 0.8A specified by the motor I'm using. The yellow and white wires from the motor are unused (center taps for the motor coils). In the future I may add opto switches to the z-axis (2 limit) if it becomes necessary, however to keep costs down I may be able to do without them if the stage is manually zeroed before each run and I build proper soft limits. Time and testing will tell.

Print
PDF
27
March
2012

v0.2 of the 3D Printer software released

I've been ridiculously productive in the past 24 hours. After cranking out the first release of the software last night, I'm happy to announce that v0.2 has arrived.

Changelog from v0.1:

  • -Squashed several bugs that arose when the script was run in a different directory. It now auto-detects the location of the executable.
  • -Added serial connectivity to the printer. Arduino firmware will be released soon.
  • -Added many more command line arguments and debugging options
  • -Packaged into an .exe with dependencies included.

You can download a copy of v0.2 here.

Instructions for use:

  1. Download the file and unzip the contents to a known location, i.e,. "C:\3dlp"
  2. Open command prompt and navigate to the extracted directory, i.e. "cd C:\3dlp"
  3. type "3dlp -h" to see information on how to use the software. Arguments are listed along with descriptions.
  4. To test the software, type "3dlp -f testpart.stl". This will run the software using the STL part "testpart.stl".
  5. To use your own models, add them to the "models" folder and call the filename of the model you'd like to slice.
  6. Image slices are saved in the "slices" folder. This is cleared every time the program is run.

Print
PDF
27
March
2012

v0.1 of the 3D Printer software is DONE!!

v0.1 of the 3d printer software is DONE!!! I will be making this open source from the start. It is Windows-only for now but I intend to work cross-platform with Linux, Unix, and maybe even Mac OSX supported. Here is a zip file complete with all the dependencies included (you will also need to install Python 2.7 for windows and win32com). More information will be coming tomorrow, as I've been working on this for over 15 hours straight and I'm running out of steam... until next time!

Print
PDF
23
March
2012

First Successful Print!!

Today I set up the printer with the intention of testing out the properties and polymerization of the resin I received. I created a simple 1/16" thick circle as a proof-of-concept part.


 

So, here are the conclusions I've come to at this point:

  • Three minutes of exposure will give me a solid, fully hardened layer around 1/16" thick.
  • I definitely have to order a UV-blocking dye to mix in with my resin. This will prevent the UV light from penetrating too far into the resin to help produce thin layers.
  • Three minutes is obviously WAY too long to expose each layer. A print will take days at that rate. I need to experiment with different resin mixes to try and advance the reaction to the point where I'm getting polymerization with exposures of under 10 seconds. I've ordered enough photoinitiator (PI) to create a resin mixture with eight times the normal concentration of PI, so that should help me speed up the reaction to the point where it happens in seconds.
Print
PDF
23
March
2012

Making the silicone vat floor

Items needed:

  • Transparency film sheets - you can find them at Staples or any other office supply store.
  • Acetone
  • Dish Soap
  • Paper towels (a full roll)
  • Scotch tape
  • Some flat cardboard or posterboard to work on
  • Glass to apply the silcone to
  • Pure 100% clear silicone with caulk gun
  • A straightedge with some flex to it (plastic ruler)
  • A hard, flat straightedge (the 1"x 1/4" aluminum bar stock I ordered to part of the frame)
  • VERY IMPORTANT: A dust-free environment!!!