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 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:



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 If you are using an unofficial Arduino board you may need to download additional drivers, for example

To upload you can follow this guide:


If you want to create a 3D object or modify something existing I recommend one of these software, both for free: Fusion 360:



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:





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:


Universal G-Code Sender:




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