From Noisebridge
Revision as of 21:24, 15 January 2010 by Terpsichorean (Talk | contribs)

Jump to: navigation, search

Hereby known as "That Goddamned Mill (TGDM for short)"

Here's the beast:



Improperly used, the mill can destroy itself, its tools, and parts of you. Please know what you are doing and don't be afraid to ask questions.

  • Always check limits by manually running outside your mill area with the tool at a safe Z height.
  • USE EYE PROTECTION unless you like tweezering pieces of shattered carbide mill tools out of them

Though we have implemented basic safety shutoffs, we should be watching it all the time. It will very happily mill through itself without stopping.

If it appears to be getting out of hand, the F1 key should toggle Emergency Stop in the software. This will power down the spindle and stop it where it is immediately.

If it REALLY IS getting out of hand, turn the power switch off (the one on the side of the control box). Note however that after doing this you'll probably need to restart the software because it will be out of sync with the controller (it gets out of sync).


We are using EMC2 and AXIS software to drive the mill. We had to hack the config files considerably and reverse-engineer the pinout. See here for documentation:

We have installed EMC2 and AXIS and some other software on the driver PC. This depends on a custom kernel and Ubuntu 8.04 -- PLEASE DON'T UPGRADE!

The EMC2/AXIS software takes GCode as motion control input files. More info here: We have figured out several Gcode #Toolchains for your CNC enjoyment

Local Installation

To experiment with EMC2/Axis machine on your personal Ubuntu/Debian setup, you may not want to apt-get emc2 because that depends on a special rtai kernel and Ubuntu 8.04. Here's a way to apt-get the pure simulator:

If you are badass, you can compile the code in simulation mode following the instructions here:

The resulting binary should run and give you a UI on your system. There's actually nothing machine-specific that you need at this point: your UI will look pretty much exactly what we have now. Select the "axis.ini" config file.

You should now just be able to:

  • open one of the sample gcode files
  • power the machine 'on' (unset emergency stop [red X], and set power [orange square] buttons)
  • 'home' the various axes (must home all axes, use radio buttons to select)
  • 'run' the gcode. (blue "play" triangle)

For most of the configurations there is a smaller window w/ an inverted cone representing the spindle (this is the default view). This will show the progress of your milling run. You can change the view and pan/zoom/tilt with the mouse.

For a sanity check, try simulating a run of the NB logo gcode from Identity

Then try gcode from the toolchain of your choice.


Many tools exist for generating/converting to gcode. Here's a good list:

In particular, here's how you generate gcode from

Bitmaps, Images

The EMC2/Axis application will import most image formats and create a raster scan tool path with milling depth proportional to image intensity. Haven't tried this but it looks very cool!

Text /TrueType

text / truetype :


DXF is a standard file format used bty many CAD programs (as well as exportable from inkscape and Adobe Illustrator). It's a good choice, especially as gcode export from Inkscape seems to be buggy.

QCAD is an open-source 2d CAD program. Linux users can apt-get qcad, there is open-source executable for Windows as well (but it's hard to find as Ribbonsoft took it closed-source (wtf?) and most searches end up at their page.) QCAD is very solid and a great place to start with CAD, especially if you can't afford/don't need Autodesk/Solidworks.

We use a DXF-GCode conversion called, unsurprisingly, dxf2gcode [URL is not a typo]. In the /home/nb/dxf2gcode directory, run the command.

Open your dxf file from File->Read DXF. It seems to barf on DXF exported from Inkscape, but is fine with QCAD, so a workaround is to load the Inkscape dxf in QCAD and save it from QCAD (it's also easy to scale and rotate if necessary).

I am still working through the various dxf2gcode options but setting "infeed depth" to the same value as "mill depth" gives you a one-pass toolpath (otherwise it seems to do it in two passes.)

Coordinate units are kind of a crapshoot and don't make much sense right now.

Note that it may be doing a lot of math without benefit of the numpy library so it can be SLOW. It has no progress indication, and doesn't redraw the screen, so it may look like it crashed. Sometimes it actually does. But be patient!


Cadsoft EagleCAD is a schematic editor and PCB layout tool. It's not open source, but there's a free version that is very decent and limited only to the size of board you can lay out.

To generate GCode from your Eagle layout, get the scripts from These do "Isolation routing," that is, they will generate GCode to mill away copper outside the traces you laid out on a copper-covered PCB (as well as drill it).

I've added MAXCNC mill-specific commands to the pcbgcode config stuff, including setting the spindle speed to maximum and turning on the motor. (Config file is /home/nb/eagle-5.6.0/ulp/gcode-defaults.h on the mill PC).

First experiments milling PCBs = success! Jtfoote 23:57, 17 October 2009 (PDT)

I used .01 carbide end mills from here:

On 1-sided copper-plated (1-oz) circuit boards from here:

To start, create a layout in Eaglecad. To work best, use one layer (which can make routing a pain), and use a minimum trace size of 0.012 inches. Make sure you do a DRC check with 10 mil isolation spacing (thouugh I have found it misses trace-pad distances).

From the Eagle command line,

run pcb-gcode-setup

This creates several gcode .ngc file in the same directory as your eagle .brd file. They have suffixes like "top" "bot" and "d" for top copper, bottom copper, and drill. Run AXIS2 and load the appropriate file. Look CAREFULLY at the tool path. Does it really isolate everything you want it to? If not, you may have to increase spacing and re-run. Check especially places of small pitch and tight clearances, especially between traces and pads.

Milling the copper is a tradeoff between quality and speed. At fast speeds, the copper tends to get rough at the milled edges. Slow speed rates help a lot but can lead to impractically long milling times.

2.5 ips gives beautiful results, but a good compromise is something like 5 - 8 ips (set in the pcb-gecode setup). If you look at File->properties in the EMC2-Axis tool it will give you a rough idea of the milling time.

Setting the Z home at precisely zero (at the board surface) is very important, because we are working at depths of hundredths of an inch. After several attempts I don't think you can do this well with just the manual jog, and risk breaking the tool. Here's what I did that worked:

  1. Raise the head so you can put the tool in the collet. Put it in as far as you can.
  2. Tighten gently, only enough to keep from falling out.
  3. Drop the head to about 1/4 an inch above the workpiece. Don't touch!
  4. Loosen the mill tool in the collet
  5. GENTLY let the mill tool drop to touch the workpiece surface
  6. finger-tighten the collet -- tightly!
  7. Home the Z axis VERY IMPORTANT DON'T FORGET!!
  8. Raise the head and wrench-tighten the collet

I think the default Z Down dimension of -0.01 may be too much given that 1-oz copper is supposed to be only 1.4 mils thick (0.0014 inches). I've had good results with -0.008; .0.005 led to problems because I think the PCB I used was not perfectly flat at at some places this depth did not hit "bottom." With further experiments this may be because the clamps are compressing the PCB: at least it seemed to work fine more than 1/2 inch away from them.


Latest: the gcode export from Inkscape is buggy. It's python so could possibly fix, but it looks kind of involved. Workaround: File->Save As-> .dxf, then use the QCAD->DXF toolchain.

For Inkscape 4.6, use this: (Do "get source", put all files in /usr/share/inkscape/extensions/)

IMPORTANT: Read the "Help" tab when you Effect->Export->Export as Gcode This tells you how to set the origin, and how to name your layers for different tools.

In the exported GCode, you need to add/change the following lines:

Set the cut height to -0.01 (for example, YMMV)

#2=-0.0100 (Height to cut at)

Add commands to turn on the motor after the first line:

G00 Z#1 
S 1000 (set motor speed to 1000 RPM)
M3    (turn spindle motor on)

And you are good to go. ---

This is cool but only works for Inkscape 0.43:


Cutting fiberglass (PCB) will eventually destroy any kind of steel cutting tool. The glass in the resin matrix is much harder than steel. You need carbide tooling. Available from suppliers: Note that carbide is too brittle for most metals and will just snap. carries Niagara carbide end mills in fine pitches suitable for circuit boards. Available via Amazon as well. also sells carbide tooling locally, which you can pick up at their store on 760 Market street #905

High Speed Stainless (HSS) tooling available here:

search for "small parts inc" on They have reasonable prices and reasonable shipping for endmills. (You can also search for endmills) I believe we have a 1/4" and 1/8" collet for the mill, so you're looking for tools with a 1/4" or 1/8" shank. I mostly bought HSS for cutting plastic, but I have some harder ones with exotic coatings for aluminum and brass. --lamont

Parallel port DB-25 pinout

OK, got a definitive pinout, seem to conform to those above. Jtfoote 23:11, 28 September 2009 (PDT)

Pin  1:  Tool speed PWM, active low
Pin  2,3: A quad input
Pin  4,5: Y quad input
Pin  6,7: X quad input
Pin  8,9: Z quad input
Pin 10: 7420 quad nand output (motion complete ack?)
Pin 11: NC
Pin 12: X,Y,Z limit (or'ed active high when at limit)
Pin 13: spare digital (unused header labeled "probe")
Pin 14: Enable, active high
Pin 15: NC
Pin 16: input to 4x PICs: enable, active low (reset?)
Pin 17: Enable, active high
Pin 18: GND
Pin 19-25 - NC

Misc other info


This guy rebuilt his, has derogatory things to say:

This other guy has some interesting upgrades. Especially notable is the new motor mount, and appropriate dxf

User:seph was hacking on one. Some notes from him are at There's a pinout, and an emc2 config. He also recommends thinking about eventually upgrading a lot of the components. Seph's work is what I (mikew) based the current functional HAL and INI files on.

Here's the link to how to drive the mill with a pc joystick:

Workshop notes, 1.15.2010

Machine geometry and parts

  • The X axis runs side to side; the "width" of the bed.
  • The Y axis runs forward and back, the "depth" of the bed.
  • The Z axis runs up and down - the space between the bed and collet.
  • The bed is the blue anodized aluminum extrusion to which the workpiece is affixed.
  • The collet is mounted at the end of the motor. It holds the milling bit.

Affixing the workpiece to the mill

  • Use a piece of aluminum stock between the PCB and the bed.
  • Use adjustable wrenches to cinch down the little "fingers" to the PCB. You only want the bolts to be finger-tight; the fiberglass substrate can actually be compressed if too much pressure is used, causing distortions in the milled part. Do not use pliers.
  • The collet faces upwards (like the tip of a rocket), into the spindle.
  • Keep the plastic guard attached to the milling bit. Place the bit into the collet, and bolt the collet into the spindle.

Zeroing the machine

  • Note: In the MaxNC control program, it's important to zero the mill - to set it to 0,0,0 - before routing a board. Occasionally, the milling machine will not home to 0,0,0 in the MaxNC control program. To fix this, go to Machine > Zero Coordinate System > P1 G54.
  • In AXIS' Manual Control tab, adjust the X, Y, and Z axis feed controls until the tool is at the upper right corner of the circuit board.
  • Chuck the bit, finger-tight.
  • It is critical to zero the Z axis correctly. The idea is to drop the bit down onto the surface of the copper, with zero force, and then zero the axis. Use the manual controls to drop the bit, step by step, until it is about 1/4" above the surface of the PCB.
  • Loosen the collet so that the bit drops onto the board. Tighten the collet.
  • Immediately zero the Z axis.


  • Controls for starting / stepping / stopping milling operations are located in AXIS' top toolbar.
  • At this point, all of the axes should be zeroed.
  • Click the Go button in the toolbar to start milling.
Personal tools