This is an overview and guide to building the rigid CNC router I recently designed. The rigid router is based on 4590 aluminum extrusions and runs Linux CNC. All of the design files, software configuration, and build instructions are freely available here.
License: All design files, configuration files, and guides, including this post are licensed CC BY-NC-SA 4.0.
Most desktop or hobby-sized CNC routers struggle with cutting metals effectively. While they can technically machine aluminum, their lightweight construction and plastic components often lead to excessive flex and poor results or very long cutting times. Take the MPCNC for example - it's a great machine for many applications, but not ideal for metalwork. The alternative approach of converting small milling machines to CNC, like my previous Grizzly G0704 Mini Mill project, comes with its own limitations. The ways and lead screws on a small knee mill aren't designed for the high speeds and accelerations that modern CNC routing demands.
This is where the 4590 Rigid Router comes in. My goal was to create a desktop-sized machine capable of efficiently cutting aluminum and other free-machining materials while remaining accessible to build. The design prioritizes rigidity without requiring specialized tools for assembly and squaring. By leveraging off-the-shelf components wherever possible, I've kept costs reasonable while ensuring parts are readily available.
Here's the machine in action. Yes, there's some visible chatter - I'm cutting at a fairly aggressive 1200mm/min, and there's still room for improvement in the design. However, I've found that using smaller endmills significantly reduces chatter and produces excellent surface finishes.
Here's everything you need to get started:
I also designed a simple Simple MPG Pendant. Finally, I created a physical button panel to surround the monitor, which runs this stm32 firmware and connects to LinuxCNC via lcdbtns.comp. Keep reading for all the details
Here's some footage of the machining process for the custom parts.
I also explored anodizing the aluminum components to improve durability and aesthetics.
There are 2 main elements in the design for the router: the frame and the spindle. Free free to use either or both. All designs and supporting files are licensed CC BY-NC-SA 4.0 and available in this Fusion360 archive: Rigid Router CNC Design Files.
One of the most significant design decisions involved the spindle. While I initially considered using an off-the-shelf 2kW spindle, their minimum speed of around 10,000 RPM proved problematic for many machining operations. This led me to design a custom spindle solution that offers much greater flexibility. The custom spindle uses an ER collet holder shaft supported by two sets of angular contact bearings in a precision-machined aluminum housing. This setup allows for speeds from 200 RPM up to 7,000 RPM (though I typically limit mine to 6,000 RPM for longevity). Power comes from a C6374 2,900W Brushless Motor controlled by my Vertile CFOCer Brushless Motor Controller.
One quirk of the design is that I've mixed metric and imperial hardware. Being in the US, I have a lot of imperial hardware on hand and most of my tooling is imperial. While I used some imperial hardware, I put a list of alternative metric hardware in the BOM.
I've assembled the bill of materials (BOM) that I used in this Google Sheet: Rigid Router CNC BOM, however, this list is not guaranteed to be up-to-date or complete. I recommend checking the design files and making your own list.
The CNC-machined parts are not included in the BOM and should be machined based on the design files.
As detailed in the parts list, I used Stepper Online's closed loop stepper motors and drivers. Thanks to Stepper Online for providing a discount on these parts. If there is enough interest, they may offer a kit with all of the necessary motion electronics.
You'll also need a computer to run Linux CNC. I used an old p5gc-mx Motherboard that I had sitting around, but any computer with a parallel port will work.
If you have a computer without a parallel port, I've had luck with the AX99100 chipset-based PCIe Parallel Port breakout cards, such as this one. I used one of these for an extra parallel port for more inputs. I explain how to set it up in the Extra Parallel Port Setup section.
The rest of the electronics I used can be found in the BOM.
You'll want to start by collecting all the necessary parts from the BOM and machining the parts from the design files.
The frame assembly process has been carefully designed to be straightforward and self-squaring. You won't need any specialized tools - just a flat surface to work on. Let's break it down step by step.
Start by gathering the base components: four corner brackets, two 4590 extrusions, and two 4545 extrusions.
Begin the assembly by installing the front corner brackets. These provide the foundation for the entire structure.
One challenge I encountered was finding appropriate nuts for the linear rail mounting bolts, as they're smaller than typical 4590 extrusion hardware. While I initially created custom nuts, I later discovered that 1/4-20 Weld Nuts from McMaster work perfectly and are much more cost-effective. I recommend using these instead of machining custom ones.
Before attaching the rear corner brackets, mount the HGR20 linear rails using M5 bolts and appropriate t-nuts. While I originally machined custom t-nuts (shown in the design files), I've since found that these M5 T-nuts with 19mm length work just as well and save significant time.
Now's the time to insert the t-nuts for the pillow blocks while you still have easy access to the outer slots. Each side needs four t-nuts for the BK12 pillow block and two for the BF12 pillow block.
With the rails mounted and t-nuts in place, install the rear corner brackets using 1/2" socket cap screws.
Complete the base assembly by installing the y-axis motor mounts. At this point, you can begin building up the gantry for the x-axis.
Next, focus on building the x-axis gantry assembly. This forms the backbone of your machine's cutting capabilities.
The z-axis requires separate assembly before integration. Start with the z-axis plate:
Build up the complete z-axis assembly, paying careful attention to alignment and perpendicularity:
Here's how everything looks when properly assembled:
For the electronics enclosure, I repurposed an old Mac Pro case, which provided excellent space and airflow for all the components:
All connections are detailed in this comprehensive wiring diagram: Rigid Router Wiring Diagram.
For additional reference, check the LinuxCNC Configuration files, which specify all connections in detail.
Key wiring notes:
+Vdc
and GND
terminalsPUL+
, DIR+
, and ENA+
together and connect to the breakout board's +5V
terminalFor the CL57T V4.1 Stepper Driver:
11110001
for:
The corresponding LinuxCNC configuration for the 5mm pitch ballscrews:
STEPS_REV = 200
MICROSTEPS = 4
LEADSCREW_PITCH = 5
SCALE = STEPS_REV * MICROSTEPS / LEADSCREW_PITCH = 160
I used an extra PCIe Parallel Port breakout card for some more inputs. This allowed me to connect a jog pendant with 7 buttons, a touch probe and a tool setter. In order to make wiring easier, I build this little breakout board:
Note: The pendant design file is here: Simple MPG Pendant.
The pendant is very simple. It has 7 buttons, 3 for jog axis, 3 for jog speed and 1 which is used as a dead-man switch to enable jogging, all in a 3D printed case. The dead-man's button inputs are on both sides, pressing either one will enable jogging. It also has a rotary encoder for jogging. These buttons and the rotary encoder are wired to the extra parallel port.
I also added buttons around my monitor matching the soft buttons in Gmocappy along with some potentiometers for adjusting the feed rates and spindle speeds with a physical dial, which is really handy while machining. There are also 6 LEDs in the panel that indicate the currently selected axis and jog speed on the MPG pendant.
The monitor panel is driven by a separate microcontroller and communicates with the LinuxCNC computer via serial over USB. The code for the microcontroller is in the linuxcnc-button-panel repository as a PlatformIO project for a STM32F103 BluePill microcontroller. The LinuxCNC side is in the main linuxcnc-router-config repository. The configuration instructions are below Configure LinuxCNC.
I originally tried the ManualMatic open-source pendant, however, because this is not a real-time component, the jogging was not smooth, so I switched to the directly wired encoder.
Begin by installing LinuxCNC 2.8.4 using the preempt-RT kernel
.
Enter your BIOS and enable the parallel port.
Also, in the bios, disable all power management features to ensure maximum consistency in the real-time kernel's timing.
I set the user name to cnc
, use the same username if you want to follow the below directions exactly.
Once installed, you can check the kernel with:
cnc@router:~/Desktop$ uname -a
Linux router 4.19.0-21-rt-amd64 #1 SMP PREEMPT RT Debian 4.19.249-2 (2022-06-30) x86_64 GNU/Linux
Disable screen lock per this guide.
Enable auto-login by editing /etc/lightdm/lightdm.conf and adding the following lines:
[Seat:*]
autologin-user=cnc
autologin-user-timeout=0
Disable screen power management by installing xfce power manager: sudo apt install xfce4-power-manager
, then open the system settings power management page in the GUI and disable screen off (slide all the way left).
Install the 2nd parallel port with (AX99100 chip based):
Install the driver: https://github.com/MPeebles/asix_ax99100_linux.git
Checkout the driver code:
cd ~/src/
git clone https://github.com/MPeebles/asix_ax99100_linux.git
Install the build dependencies:
sudo apt install -y linux-headers-4.19.0-21-rt-amd64
Then, install the driver:
cd ~/src/asix_ax99100_linux
make
sudo make install
depmod -A
chmod +x ax99100
cp ax99100 /etc/init.d/
ln -s /etc/init.d/ax99100 /etc/rcS.d/Sax99100 || true
modprobe ax99100
Run stepconf
and check the base period jitter. Mine was 17000.
Check out the configuration from GitHub:
cd /home/cnc/linuxcnc/configs/
git clone https://github.com/nathantsoi/linuxcnc-router-config router
Compile the MPG Jog Pendant code:
sudo halcompile --install mpgbtns.comp
Compile the LCD Buttons code:
sudo halcompile --install lcdbtns.comp
You should be ready to run LinuxCNC!
Launch LinuxCNC and you're ready to go!
Check out my LinuxCNC Operation and Probing Guide for a quick reference on how to operate the machine.
The Rigid Router CNC represents a step forward in desktop metalworking capabilities. While the initial build requires some machining skills or a friend with an existing machine, the result is a robust and versatile machine that can handle a wide range of materials with precision.