A small cnc machine for milling FR4 pcbs using an arduino UNO. It is also capable of CNC engraving at low Z travels. You could potentially do laser engraving if you added a laser to it.
Note to reveiwer: I have exported the assembly as .STEP, but I had trouble so there is a zipped .stl of the assembly just in case the .step doesn't work. Also I am updating my BOM with the current prices (since submission) so it might be slightly different (most are cheaper) from my cart pictures. Thank you :) Also, yes the spindle is the cheapest option (prices are in AUD so 50-60 USD is 75-90 AUD). The spindle I am purchasing also includes PSU.
I created this project as a means to create PCBs quickly at home, removing the time and cost of ordering PCBs online. Now I can make 2 layer PCBs at home on my desk for quick prototyping. It also taught me a few things about routing with power draws. To use the project, you simply stream Gcode to the machine over usb form a computer, and the machine will replicate it.
The assembly of the project is made up of a few key components. The idea is a stationary, square base with linear rails making the Y axis. The H frame moves along thiscarrying the X and Z axis. Motion is achieved through leadscrews.
To start assembly, there is the base frame that the whole machine is supported by. 4 2020 300m T slot Aluminium profiles are arranged in a square, with M5 T nuts and 90 degree connectors holding them in place. Two 300mm MGN12 linear rails are attached to the top edge of the profiles using M3 T nuts.

Now onto the H. The H moves back and forth along the linear rails attached before, this is the Y axis. The H moves along the rails by a 3d printed bracket, to attach it to the MGN12H carriage. Use 4 M2 screws to attach each bracket to the carriages, then 4 M5 T nuts to attach profiles to each bracket.

We now have the two pillars of the H. Attach to 2060 profile to the pillars using M5 T nuts and 90 degree connectors. The bottom edge of the 2060 should be roughly 4 cm from the top of the bracket we assembled (Exactness is not needed as Z leveling and the spindle height on the mount will compensate for this). Attach the linear rails as before.

To assemble the gantry, screw on both rear MGN12H carriages, and linear rails. Attach the limit switch and press the bearing into place. Then assemble the spindle plate and slide onto the gantry.

Finally, attach the motor, coupler, nutblock and rod, and then slide onto the H frame. The H frame can now slide onto the base frame rails.

Last steps, attach a bed/spoilboard of wood with M5 T nuts. Screw nutblocks to each Y carriage, then mount all 4 Y axis brackets, and their fixing blocks (plus limit switch on one). Now you can feed the rods through and attach the GT2 gears.

Mount the belt plate, motor and drive gear using M5 T nuts, then attach the pulleys.

Finally, attach the X motor bracket, motor and limit switch. The fixing block attaches to the profile on the other side using the T nuts already installed on it. Now you can feed through the leadscrew and assembly is done.

The components required for this project are a PSU, an MCU, a spindle or spindle kit, stepper motors, stepper drivers, and limit switches. For the MCU I decided on an arduino UNO because of its pin availability and GRBL compatibility. To power the UNO, I will use an LM2596 buck converter connected to the VIN pin. The PSU is 24v logic, 200w. Power is introduced to the PCB by screw terminals, and powers the VMOT pin of drivers, and 5v logic through the arduino. The steppers are Nema 17 because of their cheap cost and reliability. Drivers used to control these are A4988, which support 1/16 microstepping (why all MS pins are connected to 5v). The 500w spindle comes as a kit including a mount and dedicated PSU. This kit also has speed control to stop the spindle. I am using standard 3 pin limit switches.
Cirkit designer: https://app.cirkitdesigner.com/project/915723a2-d3f0-4d32-8109-c895c4144bcc
The PCB for this project interfaces the power supply, steppers, arduino and endstops. It uses wide traces to deliver power from the PSU screw terminals, and has connectors from leftover pins for future connections.

The project uses the GRBL library to command the machine. GRBL is a program that instructs the arduino to respond to G-code, sent by a computer. No modifications to GBRL are required other than tweaking default steps/mm, speed, acceleration etc to the machine. To install, copy the edited firmware folder into Arduino IDE libraries, include it in a sketch, and then flash. It is installed as a zip.
| Quantity | Name | Picture |
|---|---|---|
| 1 | Spindle plate | ![]() |
| 1 | Gantry plate | ![]() |
| 1 | X motor bracket | ![]() |
| 2 | Y carriage | ![]() |
| 1 | Y bearing bracket with switch | ![]() |
| 3 | Y bearing bracket | ![]() |
| 1 | Belt plate | ![]() |
2 layer PCB that is 127x118mm.

3x Nema 17 stepper motor
1x Arduino uno
3x A4988 stepper driver
1x 24v 200w PSU
1x 500w Spindle kit
1x LM2596 Buck converter
3x Limit switch
1x V bit
1x Drill bit
1x End mill
1x Collet
6x 300mm 2020 T slot aluminium profile (can do 4x300mm and 2x 200mm, but 6x300mm ended up being cheaper)
1x 300mm 2060 T slot profile
8x 90 degree connector
42x M5 T nut
42x M5 screw
32x M3 screw
32x M3 T nut
1x 100mm T8x8 Leadscrew
3x 300mm T8x8 leadscrew
2x 100mm MGN12 linear rail (with MGN12H carriage)
4x 300mm MGN12 linear rail (with MGN12H carriage)
4x T8x8 nutblock 2mm pitch
2x 5x8mm shaft coupler
1x 5mm bore GT2 timing gear
2x 8mm bore GT2 timing gear
1x GT2 belt (at least 600mm)
2x Toothed GT2 idle pulley
2x Smooth GT2 idle pulley
4x Leadscrew fixing block
1x 16x8x5 bearing
1x spoilboard (any wooden sheet)






