G300 - 3D Printed CNC Machine




Introduction: G300 - 3D Printed CNC Machine

About: Handyman by passion, engineer by profession

About 6 months ago I started designing a cnc machine that allowed me to carry out some milling works; the design phase was very demanding in terms of time because it involved both the mechanical and the electronic parts.
I decided to call this machine G300 because € 300 is the overall spending target that I set myself, which I was able to meet. I intend to use the G300 mainly on wood and plastic sheets (PP and PE) but I believe it can also be used for aluminum.


Before starting I analyzed some of the existing projects and I particularly appreciated the works of Nikodem Bartnik and Topsie, whom I thank for the contribution they have given to the world of open CNCs and for having given the community some beautiful projects from which, I too was able to draw inspiration.

In the creation of my proposal I was inspired by existing solutions and I evaluated each component with my personal ranking of importance:

  • does it allow me to meet the target budget?
  • is it an optimal solution?
  • is it strong enough?
  • does it have adequate reliability and durability?

I have therefore roughly established the characteristics of my CNC, which will consist of:

  • Frame with 2040 aluminum profiles;
  • 625ZZ V-Slot wheels;
  • GT2 fiber-reinforced belts;
  • Lead Screw for the Z axis;
  • 3D printed elements in PLA;
  • Arduino with GRBL;
  • Nema23 motors with TB6600;
  • Katsu router (Makita RT0700C clone);

For my applications I was interested in having a working area of about 600x450mm and a vertical excursion of about 60mm; the overall size of the CNC (excluding the electronics box) is about 1000x800mm. In case you require a different working area, keep in mind that the aluminum profiles in the X axis must be longer by at least 130mm of the required size, while in the Y axis by at least 160mm.



I have been using Fusion360 for hobby purposes for 5 years now and it has been of help to me on numerous occasions; therefore I chose it to make the G300, modeling in detail every single component necessary for the creation of my CNC.


The feature of Fusion 360 that I liked right away is the simplicity of the tools available, their potential and the graphical interface cleaning. There are also a number of modules that accompany you throughout the creation process: concept with sketches, 3D solids, mechanical analysis, render, and physical creation with the CAM.

The geometry I have chosen is quite square and regular; therefore also the modeling tools are simple and basic: sketch, extrude, stretch, move / copy, fillet, drill. Despite the relative simplicity of the controls, the design phase took several hours, obtained from my free time in a span of about 6 months; the revision of the pieces took me a lot of time as I tried to optimize every single element as much as possible. Optimized design involved: functionality, strength, and finally I tried to give a personal touch to what I had designed.


The three-dimensional model was then completed using the McMaster-Carr library, already included in Fusion360, with a vast assortment of small parts that allowed me to insert all the screws, bolts, nuts, washers, etc.
The few objects not available, or with dimensions not adequate for what I needed, I found them through the free library of www.GrabCad.com With a three-dimensional model, precise down to the tiniest detail, I was able to analyze every single element and make the appropriate changes since the design stage, eliminating the need for a preliminary prototyping.


I am currently developing a custom electronics for the G300 management which consists in the coupling of two separate Arduinos. The first manages CNC operations using GRBL software while the second is dedicated to managing the spindle speed.
In particular, the second Arduino reads the required spindle speed from the TX port of the GRBL and compares it with the real one, measured by an IR sensor, and makes sure that the speeds match using a PI / PID system. It also takes care of the emergency stop of the CNC in case errors are detected (send STOP signal to Arduino GRBL). I'm still testing the system and it's not ready to release yet, so I'm using a traditional circuit for now.



The main tool used is a 3D printer, with which all the main elements of the G300 will be made; a print surface of 20x20cm is required.

  • Screwdrivers
  • Wrenches
  • Allen key
  • Drill
  • Through Hole Tap ø5
  • Level
  • Caliper
  • Square/ruler
  • Two-component epoxy glue for plastic-steel


I created two pdfs: a flattened version useful for having an overall idea of the materials and another in which the parts are divided by component, more useful in the assembly phase. The pdfs are attached at the bottom of this step


Single Zip file (REV 1):


or download the single files just below


Since I won the CNC competition it seems right to release all the 3D model I created. It can help you during the assembly phase or if you want to customize some components.
In case you want to make remixes, I invite you to always mention my source.


Since the precision of the printed pieces is essential, it is important to check the squaring of the 3D printer and check the dimensional accuracy of the printed pieces; a 20x20cm printing surface is required. I used a Tevo Tarantula with 0.4mm nozzle combined with the CURA slicer whose settings have been adjusted to increase the resistance of the pieces:

  • PLA because it is a rigid material, I do not recommend PETG because it is too flexible;
  • slightly higher than normal temperature to ensure better fusion, even at the expense of some small burrs;
  • layer thickness 0.3mm;
  • 30% grid filling;
  • at least 3 perimeter lines;
  • brim 5mm on the outer perimeter;
  • I printed the fill first and then the edge, the fill connections will be vaguely visible on the shell but this ensures a better connection between the two;
  • ironing finish of flat and rigid surfaces.

The stl files are already in the printing position which ensures the best resistance of the piece and the least use of supports. I used about 1.8kg of filament to print all the necessary components.


Strangely my Nema23 had ø4mm threaded holes and I thought it appropriate to widen the hole with a ø4.5mm tip and then make a new ø5mm thread. My 2040 profiles had ø5mm holes while the standard is ø4.2mm; so I had to thread them for a M6 bolt (and therefore enlarge the holes in the two side panels).

If your profiles are perfectly standard, thread them for the M5 and there is no need for changes to the other elements.

The M5 L75 threaded bars must be inserted in the components “Y carriage LA”, “Y carriage LB”, “Y carriage RA”, “Y carriage RB”, “X carriage A” and “X carriage B”; in the X panels they must be positioned both above and below. They will be fixed with two-component epoxy glue: for its correct use follow the product instructions; I left them to cure for at least a day.

To give greater rigidity to the 20mm plywood top, I made a 10cm-high grid of panels with a mesh of about 25x25cm; the reinforcements are in plywood to which I previously made the comb joints. I then fixed the pieces with pocket holes.

Assembly is quite simple and presents no particular problems but it is important to check its geometry.

For the X track it is important to check the squaring of the lateral surfaces with the long side of the profiles 2040 and that the external vertical distance of the profiles remains constant in each section.

For the Y tracks I verified the orthogonality of the feet with the base plane and then that the distance between track and floor is always constant. I also verified that the free sections of the two 2040 profiles have the same size.

In the case of small errors, they can be remedied with a little sandpaper or with a little adhesive tape to insert a small thickness. Do not fix yet the rails to the Y basis.

Then proceed with the assembly of the Y carriage, fixing first the components “LA” and “RA” to the track X; then mount wheels, pulleys and spacer. Then proceed with fixing the external panels "LB" and "RB", the motors, the limit switches (2 on the left and 1 on the right for squaring) and the lower parts of the carriages.

I have assembled them separately but not yet fixed. The X carriage is the component with the most pieces. It is advisable to start by mounting the rear part (pieces D, E, motor, pulley, limit switch, etc.) on panel B, then mount the 608ZZ on the top panel C and the two ø8 bars, checking that they are vertical and parallel to each other.

Mount the lower part of the carriage with the 6 wheels, without tightening the screws. Assemble the upper part of the X carriage (panels A, B and C), check the alignment and then mount the 6 wheels; assemble the Z carriage and all its parts and insert it between the two bars. Place the X block on the rail and complete it by hooking the lower part, check that the X and Z carriages slide easily and then tighten the screws.

The piece is finally completed by housing the trapezoidal screw, the motor for the Z axis, the closed belt.

Fix the left Y guide to the plywood first, to be used as a reference; the track must be fixed as far back as possible, otherwise the work space will stick out from the panel in the front part. Temporarily fix the second Y rail, with the help of the Y carriage, making sure that they are equally distant from the front side of the plane. Measure the squaring of the Y tracks by checking distances and diagonals.

Place the Y carriage on the two tracks and mount the two lower wheel blocks; then insert the GT2 belts giving a slight pretension. The perfect XY orthogonality will be ensured after the first power up, by adjusting the limit switches on the Y carriages.

I made the square of the spindle axis with the help of a compass made from a piece of wood about 20cm long; one end is fixed to the spindle while the second is free to rotate and allows you to understand if the axis of the cutter is perpendicular to the plane. If not, it can be adjusted by putting small shims between the Z carriage and the drill bracket.


I have included the images of the electrical connections; I'd like to point out that I have connected the limit switches NC in series, so that if they are damaged the CNC will stop; you should install noise filters to reduce noise generated by the motor cables. I followed this guide, in case you want to learn more: https://github.com/gnea/grbl/wiki/Wiring-Limit-Switches



Currently the latest released version of GRBL is 1.1h which introduced automatic squaring, which will be used in this project, using the A3 / A4 pins to be dedicated to the second motor of the Y axis; the second Y axis limit switch will be connected in series with the Z limit switches, as specified by the patch notes.


Before uploading the code it is necessary to enable some functions by editing the config.h file, uncommenting these lines:

#define HOMING_SINGLE_AXIS_COMMANDS // Optional, useful for testing one axis at time

#define HOMING_FORCE_SET_ORIGIN // Optional,I don’t like negative value of coordinates



#define DUAL_AXIS_CONFIG_PROTONEER_V3_51 // Check if enabled

The other G300 parameters can be entered as default in the config.h file, or later using the console.

$1=255 Hold motor in place

$3= Set Invert axis code (see table)

$5=1 Set limit switch to Normally Close (NC)

$20=1 Enable software limit

$21=1 Enable limit switch

$22=1 Enable Homing

$23= Set homing direction (see table)

$30= Set your spindle max speed

$32=0 Laser mode off

$100= X step/mm

$101= Y step/mm

$102= Z step/mm

$110=1000 X Max speed (it can be increased later)

$111=1000 Y Max speed (it can be increased later)

$112=600 Z Max speed

$120=30 X acceleration

$120=30 Y acceleration

$120=30 Z acceleration

$130= X Max travel (for me 620)

$131= Y Max travel (for me 440)

$132= Z Max travel (for me 116)

For the upload I used Arduino IDE https://www.arduino.cc/en/software If you are using an unofficial Arduino board you may need to download additional drivers, for example https://sparks.gogo.co.nz/ch340.html

To upload you can follow this guide: https://www.instructables.com/How-to-Installuse-G...


If you want to create a 3D object or modify something existing I recommend one of these software, both for free: Fusion 360: https://www.autodesk.com/products/fusion-360/pers...

Freecad: https://www.autodesk.com/products/fusion-360/pers...


These are software that, starting from an input geometry, allow to process the GCODE. Depending on what you have to do, there are various possibilities:


Fusion 360: https://www.autodesk.com/products/fusion-360/pers...

FreeMill: https://www.autodesk.com/products/fusion-360/pers...


Estl/CAM: https://www.autodesk.com/products/fusion-360/pers...


There are numerous possibilities on the management software, which must be mounted on the PC dedicated to the CNC; I used a PC from 2012, you don't need great performance, but it's better to avoid laptops:

Candle: https://github.com/Denvi/Candle

Universal G-Code Sender: https://winder.github.io/ugs_website/

LinuxCNC: http://linuxcnc.org/

EstlCam: https://www.estlcam.de/

UltimateCNC: https://ultimatecnc.softgon.net/

The first three are totally free, EstlCam is free but the unlicensed version has Advertising, UltimateCNC has some unlockable features only with the purchase but it is also functional in the free version. To start I used Candle as it is very simple and allowed me to do the settings and calibrations even from a very old Eee PC, later I will configure the dedicated PC with LinuxCNC.


With the control software I verify that the 3 axes are moving in the right direction, otherwise it can be corrected by reversing the 4 motor wires or by making a modification with the console ($ 3). I then proceed with the homing of the 3 axes and with the verification of the correct functioning of the endstops; with homing, automatic squaring will be performed. I transfer the trace of the displacements on the X and Y axes to the wooden surface and check the diagonal; if it is not precise, it will be possible to intervene by adding a small thickness on the stop of the right limit switch or by moving the track. When the squaring is perfect, the second Y track is definitively fixed. At this point the belts can be tensioned; it is important that the tension on the two Y axes is identical: you can put a small weight on the belts and compare the vertical displacement, you can also use a telephone (or ear) to listen to the note produced by a pinch, as if it were string of a guitar. Each time the home is performed, the CNC will return to the perfect square and, since I have set '$ 1 = 255', the motors will remain in tension and will not lose their squareness for the duration of the work session.

It is important to check the calibration of the steps / mm by verifying with a ruler that the real displacements coincide with those provided by the software, otherwise they are updated using the console commands $ 100, $ 101, $ 102.

With Fusion360 I prepare a grid with a 10x10cm mesh that I have to bring back to the MDF martyr surface and it will serve as a reference for the positioning of the pieces to be machined, I also insert some holes in which I subsequently fix the threaded inserts, which will allow to block the pieces to be milled.With Fusion360 I can export the sketch to DWG, and then process the paths on the control software, or use the Fusion 360 CAM module and create the G-Code directly.


I designed the G300 to be a modular machine, for now I have developed the cutter brackets with a diameter of 65mm (for Makita rt0700c, Katsu, etc.) and 52mm (classic 500W spindle with ER11 collet).
It can be easily adapted, by printing a specific support, to mount other cutters or a laser module. If desired, you can also install an extruder to 3D print very large objects, up to 600x440x60mm; in this case, however, it would be necessary to make changes to the hardware as the Arduino Uno / Nano pins are limited. One of the first things I will do will be a chip cleaner: it is really necessary.

Step 10: Video Tutorial & G300 at Work

My configuration for aluminum

3mm bit with 1 flute
XY feed rate: 500mm/min
Z feed rate: 200mm/min
Z step: 0.25mm (can be increased)

Step 11: Revision

revision 28/05/2021:

- two pdf of the BOM have been published: flattened and multi-level versions;

- added 8mm shaft collar at the bottof of Z Carriage.

revision 23/06/2021:

- added F3Z file with complete 3D Model

revision 26/06/2021:
- fixed misalignement on Y LB & Y RB pieces (updated zip, single stl and fusion 360 assembly). Thanks to EmreG13

CNC Contest

Grand Prize in the
CNC Contest

2 People Made This Project!


  • Sculpt & Carve Challenge

    Sculpt & Carve Challenge
  • First Time Author Contest

    First Time Author Contest
  • Build a Tool Contest

    Build a Tool Contest



Question 21 days ago

I would like to congratulate you for using your structural engineering background to design such a beautiful
project and for sharing it with us. The comprehensive information complete with step by step video tutorial and a very detailed parts list. I must say this is one of the best 3D printed cnc projects I have seen in a long while. Your award is well deserved!

If I was to build this cnc with dimensions of the 2040 aluminium profiles (x) 1000mm x 600mm (y) to provide an estimated workarea of about 870mm x 440mm.

Looking to use the cnc for wood and soft metals mainly aluminium, considering the x-axis lenght is going to be quite wide, in your tests what sort of delflection have you seen and what is the accuracy you are getting, is it say within 0.5mm or less on both x and y axis?

Once again thanking you :)


Reply 21 days ago

Hi, I'm looking at making this machine and was curious to find out in order to increase the work area to 800 x 600. What size 2040 (x-axis) and 2060 (y-axis) did you use?

According to the estimate provided by the author one has to add 130 mm to X-axis and 160 mm to Y-axis in order to arrive at the lenght of the profiles.

Am I right to think that you have used 930 mm 2040's for the x-axis and changed the 2040 profiles to 2060?

Are you not seeing any delflection of the longer x-axis because of the wider carraige, what is accuracy you are getting on x and y axis?


Question 5 weeks ago

Amazing build ! - One question i have almost completed it but am having an issue with the dual axis working. In the config file I have the dual axis set for my Y_AXIS and have turned Dual Axis on (uncommented) but am still not getting a response to my A Axis (Y2 - slave motor). my Y1 motor works but not my Y2. i am currently testing in 0.1mm increments as to not destroy it and am at a loss as to why it won't work. My X and Z axis both work and in the right direction. Just my Y2 (A axis) is being stubborn. any common errors that you may know about that causes the dual axis to not work?


Answer 5 weeks ago

well i guess i answered my own question kind of lol - just solved my issue. I had extra Arduino Uno's so i edited the Config file and this time i also corrected the 2 spelling errors that are found in GRBL 1.1h in the "grbl.h" and "report.c" files. I have also changed the "#define DUAL_AXIS_SELECT Y_AXIS" to state "#define DUAL_AXIS_SELECT Y_AXIS" - initially there are 2 spaces between the SELECT and the Y_AXIS. I highly doubt that has anything to do with anything but just noting it incase it did and someone else is having the same issue i had. i also reset some of my wiring and it worked(my power wires were a little sloppy - 2 14awg wires in one screw terminal was a task lol) . One motor was opposite of coarse (forgot to switch earlier) so i switched the A+A- wires with the B+B- on my DM556 driver and bingo. Dual y axis working right.


Question 7 months ago

Hi, i was wondering what kind of grbl did you use... does the "foxalien" brand grbl work/compatible with it


Answer 7 months ago

grbl 1.1.h https://github.com/gnea/grbl/releases
I don't know that version of grbl but in general, if it's a specific fork of a proprietary machine, it's never worth using it on something else.


Reply 7 months ago

Oh ok thx. Another question, ik the "BTT skr 1.4 turbo" is for 3d printing but can I use that for a router or would an Arduino Uno be better(acquired both untested 😔 )


Reply 7 months ago

Arduino Uno / Micro is better. GRBL has the pinouts predisposed and with a different card you would go crazy to understand where all the signals go. Technically it would also be possible but in practice it is a waste of time.


7 months ago

Already said several times but I am going to repeat it: what a great instructable! Respect for that. Would love to build this but still a very far way ahead. Just curious but what kind of 3d printer you use? I bought a Tevo Tarantula but never worked fine. I see that you also don't have a very sufisticated one. thanks!


Reply 7 months ago

I also have a Tarantula, but I have improved it a lot (bracket, double Z, tmc2008, etc.) to have satisfactory prints.


Reply 7 months ago

Ok, great. thanks for letting me know!


7 months ago

Great project; in fact the best DIY CNC I have seen to date. Getting my parts together and looking forwards to the learning curve. Do you have a video showing how the setup the motors and belts?


Reply 7 months ago

Hi, I am currently working on the third video in which I finish the assembly of the pieces (belts too), the electronics and load the firmware. In the fourth and last video I planned to include the calibration phases and the filming of some works. If you have any doubts about the assembly, you can download the Fusion360 model and see the position of each single piece.


Reply 10 months ago

the measurements of the 2040 profiles must be set according to your work area; if you look in the description I have indicated how much to increase the profiles.


11 months ago

nice project to build.
question why can't i get the second y-motor to run ?
uploading grbl no problems ,made changes in config.h file,uploaded.
no working second y-motor help plz


Best Answer 11 months ago

#define DUAL_AXIS_CONFIG_PROTONEER_V3_51 // Check if enabled

check those lines. if the code is ok then check the wiring; swap the wrong engine with another, etc.


1 year ago

To begin with, I would like to congratulate you on such a beautiful project and most of all for sharing it with us, I wanted to ask you this cnc I can manufacture it with dimensions of 1,200mm x 1,200mm.
And it would be very helpful to have a video of how it is assembled very quickly, because some of us are somewhat nobodies and we will not know where some screws go, or how some parts are assembled, but I go back and I say it is one of the best projects that eh seen to be done in 3d printing and I already have almost all the materials, again thanks with all my heart. :D!


Reply 1 year ago

Thanks, I am very pleased that you enjoyed my work. I believe that for workspaces as large as the ones you want the G300 needs some tweaking. For a net area of 1200x1200 you need profiles about 1500mm long and the 2040s for the Y tracks are too deformable, better to use the 2060s; for the X track keep 2040 but add at least another two to three central reinforcements. As already mentioned in another message, the supports of the Y tracks must be modified to accommodate the larger profiles while for the two Y carriages it is sufficient to use threaded bars longer than 2cm compared to what is indicated in the BOM.

I recorded the entire assembly phase with the intention of publishing it on youtube but I didn't have time to do the video editing.
To make up for this lack in the next few days I will publish the Fusion360 source file in order to allow everyone to view the components and facilitate any remixes. After all, having won the CNC contest and a cash prize, it seems fair to me to release the .f3d file
With the Fusion design, the separate BOM per component and the written description of the various steps it should not be complicated to finish the assembly. If you have any doubts, feel free to contact me even in private.