Computer-controlled Machining


  • Make something big:

What should be done

  • Explained how you made your files for machining (2D or 3D)
  • Shown how you made something BIG (setting up the machine, using fixings, testing joints, adjusting feeds and speeds, depth of cut etc)
  • Described problems and how you fixed them
  • Included your design files and ‘hero shot’ photos of final object

In Fab Lab Egypt, after we moved into a new location in Cairo which is more spacious than the old one, we got the chance to purchase a CNC router manufactured by a local company.

It wasn't used much, the only project that was done using it was a Christmas tree.

So, I took the opportunity to test the machine out and understand how it works, what are its limitations and maybe create a tutorial for anyone who wants to use it. So me and Asem when on to discover more about this machine specifically and the machine in general.


I found that the computer controlling the machine is running LinuCNC on Debian Wheezy.

So I started looking around for sources to learn about it I found many but as I didn't want to dig deep on making a CNC machine - for now - I decided to read what I need from the official manual .

The part that helped me was the explanation of the user interface. It made the beginning less intimidating.


The machine has two physical buttons that control the power supply to the machine; a green button that turns the machine on and a red one that turns it off and acts as an emergency stop (e-stop).

As a start, I wanted to execute the toolpath that is loaded by default, so:

  • I removed the end-mill that was installed so that it doesn't break and to be able to air cut it.
  • Pressed on the on button in the machine, toggled on the "E-stop" button on linuxCNC and the "power" button on LinuxCNC to power-up the machine.
  • Moved the axes by using "Up & Down" for the Y axis, "Left & Right" for the X axis and "PgUp & PgDn" for Z axis.
  • As the machine didn't have limit switches for automatic homing which enables the software determine the home position of the machine, I had to home the axes manually by selecting each axis from the "Manual Control" panel and pressing the "Home" button.
  • In the same manner, I set the coordinated system "G54" by pressing "Ctrl+Home" for each one.
  • As I wanted to understand the G-codes, I used the "Step" button from the toolbar to go through each instruction in the ".ngc" file and inspect its action in the machine.
  • By inspecting the actions I got an overview of how the code works.

I wanted to test the toolpath without sacrificing the end-mill as we only had two 6mm end-mills. So, I removed the Collete and attached a marker to the side of the spindle with tape. And I stuck a piece of paper to the bed so that I draw the toolpath.

I homed the spindle to touch paper.

I edited the "axis.ngc" file to remove the "M3 S10000" that is responsible for turning on the spindle at 10000RM then started executing the toolpath.

The tip of the marker went up when it plunged into the sheet so I removed all the instruction responsible for this "G0 Z3.0" and "G1 F100.0 Z[-#<depth>]" rehomed to a new position a restarted the file.

As the marker was fixed in Z positions and didn't have a spring - as the cutter in the vinyl cutter - so this will probably happen if the surface is uneven or during motion in general.

I stopped the job as the Z position wasn't down enough to complete the path and rehomed the Z to a proper position.

Now to try cutting and learn about toolpaths, we tried to model a circle and create a toolpath and see its execution.

So, in Inkscape I drew a circle measuring 100mm in diameter, resized the document size and saved it to SVG.

Then in Fabmodules, I opened the SVG file and chose the "G-code (.nc)" processor and "1/8 mill" and calculated the toolpath using the default settings.

I found that the toolpath will makes 4 passes in the stock so I changed the "cut depth" and "stock thickness" so that it can cut deeper than the 11mm stock and changed the "tool diameter" to 5mm

I then saved the toolpath to a ".ngc" that is accepted by LinuxCNC which then I opened it in it and I ran the file.

When I ran the file I noticed that the spindle doesn't reach its target RPM before cutting so when I reviewed the g-code file I noticed that there is a "G04 P1" which is a "Dwell" command that makes the controller waits for 1 seconds but when the gantry went down. So I edited it to wait for 10 seconds by modifying it into "G04 P10"

Asem created a circular part in Fusion 30 and created a toolpath with one pass. So I edited the g-code to ad a 10 seconds dwell "G04 P10", homed the machine axes into a suitable position and started it.

We found out that there was problem with the toolpath as it plunged in and out in the same point so there was a point that wasn't milled properly.

Then I tried to edit speeds a bit as we thought we went to high so I did the same but when I ran it I thought midway that the end-mill plunged far down so I panicked and hit the physical "E-STOP" button and took a closer look and then re-powered the machined but then the end-mill broke. I think this was because the spindle stopped and didn't pick-u speed when restarted and couldn't mill when the gantry moved.


In Fab Lab Egypt we had a laser-cut deer head over the fireplace.

I wanted to create a bigger version of it using the CNC router; So I searched for the source and found this.

I started by converting the DXF files of the design to PNG so that I can use them as a reference when designing.
I created a new part file in Inventor and imported the PNG file in the sketch and Created a "Center Line" to be a base for mirroring the sketched geometry.

Then started sketching the deer head using "Line" and "Spline" tools

Then set a vertical and a horizontal dimensions to check the size of the drawing.

Then scaled the curves by 1.5 scale factor.

Afterwards, I began designing the T-bone pattern for the slot at the bottom

Then, mirrored the shape along the center line.

Then removed some extra curves and modified the extrusion I made earlier.

I then repeated the process for one of the holding pieces.

Created a new assembly file and placed the two pieces together.

I then repeated the same process for the another piece

In the assembly file, I continued placing the pieces and assembling

Toolpath Generation

I chose to use Autodesk HSM as it's tightly integrated with Inventor work-flow and I found that it gave me good understanding of machining techniques.

Started by assembling the parts on a same level and nesting them to decrease the space.

By pressing "Setup" from the "CAM" toolbar, I was able to access the "Stock" tab to be able to setup the job.

I chose the "Relative Box Mode" and zeroed all the offsets.

And from the "Setup" tab, I chose the cursor to set a "Stock Point" and clicked upper bottom left corner.

Then I started a new "2D Contour" process and chose all the bottom loops.

By pressing "OK", I was propmpted to chose a tool so I chose a 6mm tool I setup earlier.

I then chose to insert tabs and modified the values a bit.

I then changed the "Bottom Height" value to -1mm to make sure that the cut go all through.

I also changed the "Maximum roughing stepdown" down to 1mm.

Then finished the editing.

I then edited the job to modify the feed rate to something suitable for milling in MDF.

Then added a "Manual NC" job to add a 6sec interval before beginning so that the spindle has time to reach full speed first. I then moved this job to be first.

Then clicked "Post Process" to export the G-code

To prevent the machine from from moving obliquely to the zero point as this caused the endmill to break before due to uneven surface, I commented out the G53 line.


I started the machine and powered up the motors; Then in LinuxCNC loaded the .ngc file, turned of the software's emergency stop.

I then resetted the home axises to touch the stock on the bottom left corner then jogged the endmill up away from the stock; Then started the job.

As the sacrificial layer wasn't quite surfaced, the parts needed some finishing. Then assembled them.