Saturday, 22 November 2008

Making joystick buttons run simple CNC commands

It's pretty easy to get a button to do something simple (run any one line of G-code).

Create a new HALUI MDI command with one line in your .ini file:


This causes a new HAL pin to be created, called halui.mdi-command-00. Then wire that pin up to the joystick button that you want to cause that command to be run, with an line in your .hal:

net setXYOrigin input.0.btn-thumb2 => halui.mdi-command-00

Now pressing that button (in this case, the thumb 2 button) runs G92 X0 Y0, just as if I'd typed it in the MDI box. This setup allows me to use the joystick to jog to the place that I want my origin to be, and then set that to be my XY origin by pressing the button.

You can have any number of MDI_COMMAND .ini lines, and they each make make their own mdi-command-xx pin, ordered in the order they appear in the file.

Each one can run any one liner. In the next post I'll talk about running more than one line from a single button.

Friday, 21 November 2008

The Joy(stick) of Machining

I control my router with EMC2, which rocks, BTW. It's extremely versatile and extensible, while being easy to use, and has a vibrant community of contributors. I thoroughly recommend it.

The most accurate way that I have of measuring the offset between the tool and some fixed point (for example, in order to set the tool length offset) is to move the tool to that point, and see the offset in machine coordinates. At the moment I do that through the jog GUI in AXIS, which is slow and awkward, so task number one is to improve that.

I've got a USB joystick, and I'm following these instructions on the EMC Wiki. The rest of this post assumes that you have read them.

If you don't understand EMC and the HAL the instructions and the logic behind them won't make much sense, in which case I recommend reading an introduction to EMC2.

The joystick setup process is simpler than it looks: download joypad_v3.hal, tweak it, put a reference to it in your .ini file, and install joyhandle. The two snags that I hit were with getting the hal_input module to see my joystick and getting joyhandle helper module to work.

I had trouble with the hal_input for two reasons: I hadn't followed the "setting the permissions for input devices using udev" instruction closely enough, and had to mess around with the name pattern for the joystick to get one that hal_input would accept.

joyhandle is a HAL module designed to set a deadband around the center of a joystick axis, and provide power law and linear scaling for the value of that axis. There is a precompiled version on the EMC2 Wiki, but it's for a rather old RT kernel, so it doesn't work. Luckily, there's also a .comp (source) file. I installed the emc2-dev package to get comp (the HAL module compiler). After that, building and installing the module was as simple as:

$ sudo comp --install joyhandle.comp

And the man page:

$ sudo mv joyhandle.9.gz /usr/share/man/man9

Then it just worked. :-)

By itself, the addition of the joystick has made my old method of measuring tool offset or stock position quicker and easier, but the full benefits will come when I combine it with automatic offset recording for X and Y, and automatic probing to detect the tool length.

The many steps to 4 axis machining

I'd like to run some "all round" machining jobs on my router. To do that, I need a rotary axis. I intend to convert a rotary milling table into a CNC rotary axis by fitting it with a servo (more on that later).

To do that, I need to do some 3 axis machining, but there are a few obstacles that I'd like to get out of the way first.

At the moment it takes me annoyingly long to set up my CNC router after I change the stock or tool, and even then the results are often compromised by poor calibration of tool length and stock position. The next few posts will explore faster and more accurate ways to do this calibration. At some point I'll have to find out how the pros do fixturing, too.

The old way (if you care)

To measure tool length I fit the tool, and then jog it down close to some datum (such as the router bed or the top surface of a flat piece of stock). Then I use a feeler gauge to measure the offset and setting that to be Z=n with:

G92 Zm

with m=n + measured offset, in the MDI window of AXIS (the tab that's in the background in

I'm using oversize stock, positioning it by eye, fixing it down, and then jogging the router until the spindle is in approximately the right place above the stock and setting that to be X0 Y0 with:

G92 X0 Y0

in the MDI window of AXIS.