# Hephaestus' Extruder

When I was a kid, my dad bought a fairly unusual electronics kit – an oscilloscope – and had the whole thing shipped from the US.

I remember we took a long time putting it together from scratch, including assembling the metal case and stuffing the whole thing and its multiple PCBs into the case1, plus testing and calibrating it with its companion signal generator for a few weeks more.

This is my version of that, I guess.

In case you’ve just tuned in, a couple of weeks ago I was involved in the Lisbon Maker Faire. I also took the kids there, did a bit of soul-searching regarding my lack of interesting, non-job-related hobbies I could share with them, and ended up ordering a Prusa i3 Hephestos kit.

I picked this particular model because:

• The Prusa is a RepRap, and carries with it a fair amount of pedigree including copious documentation and a rampaging ecosystem of software and tools.
• The kit comes with all the required parts, saving me days (months?) of shopping around.
• bq took the time to write copious documentation, as well as open source the whole thing2.
• bq did a promotion at the Lisbon Maker Faire, shaving €50 off the kit price.

And so far, if you disregard the bits about assembling your own 3D printer being a sort of modern day rite of passage for DIY folk and the annoying smell of hairspray, I’m having quite a lot of fun with it.

## Putting It Together

Aside from a couple of things I’d probably do in a different order (or at least would have prepped earlier in the process), the mechanical bits were very straightforward. Not having assembled any of the other printers I used before, I was quite surprised to find that it was only necessary to measure one thing when assembling the whole kit, which is a testament to the genius of Josef Průša.

On the whole, it took me a day spread over two weekends to put it together – one afternoon for all the mechanical assemblies and a brightly lit Saturday morning for all the wiring and electronics, which was also very straightforward (I did make a point of fitting the cables to within a couple of inches, and will eventually go back and do it again for some of the other pre-assembled wiring).

Were it not for the enthusiastic “help” from the kids and a couple of deadlines, I would probably have assembled the whole thing in a single weekend. A lot of people probably rush it through in an afternoon, but I tend to be methodical about such things, and it is true that putting the machine together helps you appreciate what it does – I ended up reading a fair bit about principles of operation, microcontroller features, etc.

## Printing Stuff

A good thing about the Hephestos is that it ships with a smart LCD controller, so you can set it up entirely without a computer and have an easy way to keep track of what it’s doing3.

After some fastidious plate levelling and a little fiddling about with settings, I fired up Cura, loaded up the printer profile (bq provides four Cura profiles with varying quality levels), converted the stock MakerBot logo model into a GCode file, stuck it on an SD card and went to town.

Later on, after some more fiddling, I printed out a LEGO block (after all, who else is at least as good on precision plastics manufacturing?), and it was a great fit – aside from a few little irregularities around the base all the measurements were very nearly correct, something I currently attribute to pure dumb luck.

Besides Cura, my 3D arsenal currently consists of OpenSCAD, Cheetah 3D and Strata 3D SE 7 – all very different tools, although I favor the former two for precise dimensioning as well as performing direct edits (including Boolean operations) on .stl files.

I’ve yet to print any really large pieces (I’m still figuring out the various quality settings), but so far I’ve only come up with one gripe. The one flaw in the Hephestos design, as I see it, is that putting the filament spool on top of the printer makes it jiggle a little when there are sudden moves. It’s basic physics – top-heavy objects are inherently less stable, and the sudden moves of the servos are effectively jiggling the base of an inverted pendulum.

That and there was also a situation where Cura decided to move the extruder up to the limit of its range (a relative Z200 in end.gcode) and it nearly knocked off the spool support…

So on the whole it doesn’t strike me as a good idea to have the spool on top, and I’m trying to find a better place to hang it from and build a little guide to run the filament over the extruder.

## Keeping An Eye On Things

Using an SD card to move GCode to the printer got real old after the first couple of times, so I soon got hold of Octopi, a pre-built distribution of Octoprint for the Raspberry Pi.

Besides running the printer for me, it also provides copious real-time monitoring: I can keep track of the extruder temperature, tail a log of GCode commands, view the resulting extruder path live, and even stream (low framerate) video from the Raspberry Pi camera, letting me check on my prints from the iPad.

Octoprint also does time-lapse videos, which is nice if you ever want to figure out why a print went wrong mid-way through. It takes a little while to generate them on the rather puny CPU and is sure to contribute to the wear on your SD card, so beware – but it is a nice feature to have.

But it can do a lot more, and is still evolving quickly. To make the best of it on Octopi, you’ll want to log in and update to the latest version of OctoPrint (currently 1.1.0), since that provides support for extending Octoprint via external event hooks.

Here’s how to do it in six simple commands:

ssh [email protected]/* <![CDATA[ */!function(t,e,r,n,c,a,p){try{t=document.currentScript||function(){for(t=document.getElementsByTagName('script'),e=t.length;e--;)if(t[e].getAttribute('data-cfhash'))return t[e]}();if(t&&(c=t.previousSibling)){p=t.parentNode;if(a=c.getAttribute('data-cfemail')){for(e='',r='0x'+a.substr(0,2)|0,n=2;a.length-n;n+=2)e+='%'+('0'+('0x'+a.substr(n,2)^r).toString(16)).slice(-2);p.replaceChild(document.createTextNode(decodeURIComponent(e)),c)}p.removeChild(t)}}catch(u){}}()/* ]]> */
# activate the virtualenv
./oprint/bin/activate
cd OctoPrint
# you can also switch to the develop branch to try out 1.2.0
git pull
python setup.py install
sudo service octoprint restart


After doing that, I tied Octoprint to my global notification system by adding the following lines to /home/pi/.octoprint/config.yaml:

events:
enabled: True
subscriptions:
- event: Connected
command: mosquitto_pub -h broker.local -t twitter/direct -m "i3 connected."
type: system
- event: Disconnected
command: mosquitto_pub -h broker.local -t twitter/direct -m "i3 disconnected."
type: system
- event: MovieRendering
command: mosquitto_pub -h broker.local -t twitter/direct -m "i3 {movie_basename} done."
type: system
type: system
- event: EStop
command: mosquitto_pub -h broker.local -t twitter/direct -m "i3 panic"
type: system
- event: PrintDone
command: mosquitto_pub -h broker.local -t twitter/direct -m "i3 {file} done."
type: system
- event: PrintStarted
command: mosquitto_pub -h broker.local -t twitter/direct -m "i3 printing {file}."
type: system


broker.local is my home hub, which runs an MQTT broker to tie together a bunch of shared services. Here I’m using it to send me Twitter notifications, but I also have other kinds of apps talking to it like RSS feed fetchers, analytics handlers, etc. – this way I have a universal, lightweight API for my little menagerie of personal servers.

I just hope that now that I’ve hooked up the printer they don’t figure out how to print themselves robot bodies and take over the house…

1. If memory serves me right, it was the IO-4205 pictured in this video. It was definitely a dual-trace oscilloscope, and the front panel seems awfully familiar. ↩︎

2. The printed instructions were very good (mine were in Spanish, which is fine for me), spread across a set of numbered booklets with copious photos. ↩︎

3. My kit didn’t ship with any documentation regarding operating the printer, but the menus are pretty standard across all RepRaps I’ve come across so far. ↩︎