This page documents my building a CNC router capable of handling 24" x 48" plywood (64 x 127 cm). While the design can easily be expanded to handle a full 4' x 8' sheet, I don't have space for that kind of machine. The idea here is to have a largely wood CNC that can reproduce many of its parts. This philosophy was inspired by the wildly successful RepRap 3D printer that could create many of its own parts. Much of the design for this machine was lifted from that of the Lowrider CNC.
Rails for the X axis are made from 40" sections of 1" metal conduit spaced 100 mm on centers. Supports were milled from 3/4" MDF. Holes are spotted along a line on the rail with a large drill bit then drilled with a smaller bit. Elbow braces connect the rails to the supports.
The X axis is stiffened by 1/4" plywood braces in the X-Y and X-Z planes
In this build, the router is mounted on the Z axis (aluminum extrusion in the figure) which is mounted to the wooden core. The Z axis has an OpenBuilds designed C beam linear actuator. In this configuration, the XL C Beam gantry plate is mounted on the core and the extrusion rides up and down with the router. The Z axis operates using a NEMA 23 stepper motor and a T8 lead screw. Here is a kit for the actuator priced at $180. The NEMA 23 motor is not included.
The X and Y axes run using belts driven by stepper motors. Originally, I built the machine using NEMA 17 motors. I switched to larger NEMA 23 motors due to a problem I perceived as being insufficient power. I now believe the problem was not with the motors, but with an incorrect resistor value in the configuration file I downloaded from the BigTreeTech GitHub site. The problem with the configuration file is documented here. If you want to use T8 lead screws for the X and Y axes, here is a link to where you can purchase one compatible with 4 foot motion (perhaps for longer builds, a rack and pinion motion system makes more sense. Here is a link to a page for gear racks compatible with V-slot aluminum extrusions).
The belts and gears used with the NEMA 17 motors were not compatible with the larger motors. Here is a link for a gear pulley that works with the larger NEMA 23 motor. Note that the NEMA 23 gear pulley is press fit to the motor and requires a different belt (3GT, 3 mm lead) than the pulleys generally used with NEMA 17 motors (2 mm lead). The core travels on the X axis rails (described above). Bearings in the core (1/4" ID, 3/4" OD) contact the X-Rails. Bearings use 1/4" bolts for axles. The photo above shows a core prototype build from 1/2" plywood, oak and mahogany. To the left of the Z axis, this photo shows a NEMA 17 stepper motor mounted to accept the belt for the x axis.
Photo on the left shows four of the eight X axis bearings viewed from the bottom. The figure shows how the bearings ride on the rails. No wood piece of the core touches the rail. In the center right of this photo you can see the head of the lag screw used to tension the bearings to the rails.
For the Y axis, bearings were sandwiched between two wooden supports. This newer design is intended to offer greater support for the axle. The Y axis motion rides on two sets of bearings, one at high X values and one at low. The photo on the right shows the bearings for the low-X end, where the machine rides on a rail made from conduit. On the other, high-X end, the machine rides on a single set of bearings running on a flat surface.
While the Z axis is controlled by a motor turning a lead screw, the X and Y axes are driven by timing belts. The X axis motor is mounted on the core. All three belts are fixed at the axis ends and wrap around idler bearings near the motors. One end of each belt is connected to an adjustable block that sets the tension. The photo on the left shows the back side of the core, including idler bearings for X axis belt. A small piece of 1/8" plywood bridging the idler bearings prevents the belt from slipping away when the belt is loose.
The X axis is carried in the Y dimension by two carriages, one at the low X end (shown on the left) and another on the high X end (shown on the right). The low X carriage rides on a rail made from metal conduit. At the high X end, the carriage rides on flat mdf. Both are powered by NEMA 23 stepper motors.
The photo shows the non-adjustable ends of the Y axis. Belt ends are attached to 1/2" plywood in a design inspired by that of the Lowrider CNC. Each belt is wrapped around a 3 mm machine screw and held in the groove of a wooden clamp.
On the adjustment end, the clamp is screwed to a block that is pulled by screws to adjust the belt tension.
Our build table is supported by two cabinets that were being thrown away during a local university renovation. Cabinets were mounted on casters and cut down for the build table height to match that of our table saw. Many of the ideas behind this table were lifted from this design. Most of the support is made from 3/4" mdf. pine stringers were added to give screws holding the spoil board something to hold to.
The spoil board is 3/4" mdf with an array of 1/4" threaded inserts for holding down work pieces. Zero positions are established by rails in the X and Y directions. Inserts are placed at 1", 2", 4", 8" from the zero positions. When not in use, inserts are covered with painters tape to keep them from filling with dust.
We are working on dust management. The figure on the left shows our shop vac suspended by its handle. The hose feeds through a support on the Z axis and connects to the dust boot on the router. The dust boot connects to the router clamp using rare earth magnets making it easy to install and remove. The boot needs some refinement; The space between the hose and the brush is "pinched" and too much dust escapes. Here is a link to an instructable for a self-adjusting dust boot design that I like. Here is a link to a dust collector that I wish I had room for.
The machine is powered by 110 volt AC that runs through the ceiling of the shop and is controlled by a light switch. The light switch also powers the AC to DC converter (24 volt), which is on a shelf suspended from the ceiling. Lighting is incorporated under that shelf. The router and vacuum are both powered from a relay that is switched by the controller (represented in the figure by the blue line).
The configuration of the LowRider CNC that we used as a model has two motors each for the Y and Z axes and one for the X axis. That requires a controller with five motor drivers. Using the OpenBuilds linear actuator on the Z axis reduces that number to four, allowing us to use the Rodent board from Big Tree Tech (a low cost option).
This controller uses the ESP32 microcontroller. It has built in WiFi and bluetooth capability, is capable of sourcing 3A to the motors and has optical isolation on the limit switch pins.
My one issue with the Rodent board is the type of connectors used for the motor / end stops / probe cables. While I would prefer to have connections use screw terminals, this controller board uses JST connectors, requiring crimp terminals that can be difficult for the hobbyist to fabricate.
FluidNC is a firmware package for controllers based on the ESP32 microcontroller. One nice aspect of using FluidNC is the convenience and simplicity of loading and modifying firmware using a web installer (accessed from the wiki getting started page). I am a novice at using FluidNC and I am sure there are good tutorials out there. That said, I did not have any trouble getting the firmware installed and modified to fit my machine. The getting started pages on the FluidNC wiki are quite good. Below are some notes from my experience:
Unfortunately, the Web Installer does not support Firefox. I got an error message saying "Browser not supported". wtf? The error screen recommends using chrome, edge or opera instead. Here are steps for installing FluidNC.
Open the Fluid NC Web Installer on your computer using one of the supported browsers.
Power your controller board from your DC source (While the first version of this board, V1.0 could be powered over usb, the V1.1 board cannot).
Plug a usb cable in to the controller and the computer and connect via the Web Installer. You will be queried for which com port to use.
Install a version of FluidNC by clicking the appropriate buttons. I chose the WiFi version without Bluetooth.
Enter the WiFi setup page and enter your system name (SSID) and password. Here is a link that helps with setting up WiFi.
When your controller connects make a note of the ip address noted on the screen. The ip address probably starts like this: 192.168.0.xxx.
The configuration file (rodent.yaml) from the rodent github page needs to be modified to reflect the realities of your machine. I used the code editing program Notepad++ to do this.
The configuration file can be modified over WiFi or the web installer.
1. Download the rodent.yaml file from the rodent GitHub site.
2. Open the file in Notepad++, make the desired changes and save the file with a new name.
3. Click on the button for the files on the esp32. That will take you to a screen where the files are displayed. Click on the upload button and select and upload your configuration file. This should show that your file is now on the controller. Select this as the default configuration file.
4. On the left side of the web installer is a button for viewing a terminal. The terminal page has a button to restart the controller. Hit that button.
Things in the configuration file that I changed include:
The Spindle. The default in the configuration file is for a brushless DC spindle with variable frequency drive controlled by RS485. I use a Makita palm router controlled using a relay. To adapt to the router, I (1) deleted all the code in the yaml file that refers to uart1 and Huanyang (lines 202 through 214) and replaced it with the relay code from here. Even that required a little modification: The rodent board has the output pin for the relay as gpio25, rather than gpio.26 (as listed in the example code).
Two motors on the Y axis. Here is the FluidNC wiki page that discusses multiple motors and auto-squaring. The downloaded rodent.yaml configuration file was set up to have motor drivers on four independent axes; X, Y, Z, and A. This machine requires three independent axes with two motors on Y. The configuration file is set up with a number of parameters for the axis, followed by parameters for motors associated with that axis. To get the Y axis to work with two motors, I moved the A motor code to be under the Y axis and changed the motor designation to be motor1 from motor0. I also changed the number of microsteps on motor1 from 16 to 8 in order to match the number of microsteps on motor0.
Current sense resistor values. It appears that the downloaded configuration file has the incorrect value for current sense resistors. This is documented on the FluidNC wike page here. For each motor, I changed r_sense_ohms: 0.022 to 0.075. This change increases the current passed through the motor coils by a factor of 3.4.
the maximum rate, direction of homing and limit pins, steps per mm. I discovered that the 0.5A currents were insufficient to run the Y and Z motors. I increased the current to the Y motors to 1.0A and the current to the Z motor to 1.5A.
While FluidNC has a web interface that can be used as a GCode sender, I use a program called bCNC. This program has some useful CAM features and a bed leveling feature that the FluidNC does not. bCNC is also pretty simple to load and run on a Raspberry Pi single board computer. I want to have a dedicated computer on the machine so that i dont have to carry stuff back and forth to the shop. Right now I am running on an older model (3B) that I had on hand. The down side of working with the model 3B is that it is slow for working on the internet. So far, it has proven ok for controlling the CNC router. If this turns out to not be acceptable in the future, I will probably just purchase a RPi model 5 that will be dedicated to this project. Mostly, I want to use bCNC because I am already familiar with it.
To connect to bCNC over WiFi, you need to know the ip address of your controller and the port that it communicates by. In my case, he ip address is 192.168.0.234. While FluidNC can communicate by either TCP or websocket protocols, bCNC only communicates using TCP. For TCP, the FluidNC port is 23. To connect bCNC to the CNC, go to the com port text field, type "socket://" then the ip address followed by a ":" and the port number. In my case that makes it: "socket://192.168.0.234:23". Then pressing the "connect" button connects the computer to the CNC.