Mostly 3d printable CNC

Just another mostly 3d printable CNC/engraving mill


Creative Commons Attribution Noncommercial Share Alike

Commercial use is not allowed, you must attribute the creator, you may remix this work and the remixed work should be made available under this license.

Learn more or download attribution tags


Documentation in progress...

* How to assemble

* How to Print

  - Many objects are not in print orientation

  - All needed print support already included on all objects

* What works

* What doesn't work

  - V4 GRBL board came with step and direction flipped on all axis, had to make changes in grbl pin out and recompile. Added grbl hex file I used.

  -- Microstepping also does not work on V4 GRBL board (tied to ground)

  - ESC overheats trying to power RPI

* How to configure Arduino, GRBL, RPI

  - test Brushless motor


  -- Download PWM program

  -- #wget

  -- unzip

  -- #cd PIGPIO

  -- #make

  -- #sudo make install

  -- Connect ESC control to BCM pin 17 (physical pin 11)

  -- To start the pigpio daemon

  -- #sudo pigpiod

  -- to run PWM signal on pin 17

  -- #pigs s 17 500 - initializ

  -- #pigs s 17 1065 - moves slowly

  -- To stop the pigpio daemon

  -- #sudo killall pigpiod

  - Current GRBL Values

  -- Using Quarter Step !!removed jumpers & connected VDD to MS2!!

  -- set Vref = 250mV (used 100mV when full steepping because vibration)

  -- Still need to set soft limits

  -- $0=5 (step pulse, usec)

  -- $1=1 (step idle delay, msec)

  -- $2=0 (step port invert mask:00000000)

  -- $3=0 (dir port invert mask:00000000)

  -- $4=0 (step enable invert, bool)

  -- $5=0 (limit pins invert, bool)

  -- $6=0 (probe pin invert, bool)

  -- $10=3 (status report mask:00000011)

  -- $11=0.010 (junction deviation, mm)

  -- $12=0.002 (arc tolerance, mm)

  -- $13=0 (report inches, bool)

  -- $20=0 (soft limits, bool)

  -- $21=1 (hard limits, bool)

  -- $22=1 (homing cycle, bool)

  -- $23=3 (homing dir invert mask:00000011)

  -- $24=50.000 (homing feed, mm/min)

  -- $25=800.000 (homing seek, mm/min)

  -- $26=250 (homing debounce, msec)

  -- $27=1.000 (homing pull-off, mm)

  -- $100=200.000 (x, step/mm)

  -- $101=200.000 (y, step/mm)

  -- $102=200.000 (z, step/mm)

  -- $110=800.000 (x max rate, mm/min)

  -- $111=800.000 (y max rate, mm/min)

  -- $112=800.000 (z max rate, mm/min)

  -- $120=10.000 (x accel, mm/sec^2)

  -- $121=10.000 (y accel, mm/sec^2)

  -- $122=10.000 (z accel, mm/sec^2)

  -- $130=200.000 (x max travel, mm)

  -- $131=200.000 (y max travel, mm)

  -- $132=200.000 (z max travel, mm)

  - Testing OLED

  -- Enable i2c

  -- sudo apt-get install git

  -- git clone

  -- cd Adafruit_Python_SSD1306

  -- sudo python install

  -- Run Adafruit Examples

  -- Possible Dependencies

  --- sudo apt-get install build-essential python-dev python-pip python-imaging python-smbus

* Software / Workflow

  - Fritzing, create circuits and export to SVG


  - Inkscape, get PCB trace outline (check out example file)


  -- load SVG file exported from Fritzing

  -- change view to outline (view β†’ display mode β†’ outline)

  -- ungroup objects (object β†’ ungroup)

  -- create a copy of all objects you would like to outline

  -- new copy combine all paths/objects (path β†’ combine)

  -- go to fill settings (ctrl + shift + F)

  --- change fill to no (X)

  --- change stoke to flat color

  --- Note: can make outline bigger by playing with β€œstroke style”

  -- create outline (path β†’ stroke to path)

  -- save new SVG

  - BlenderCAM, create G-Code from inscape SVG File


  -- will have to do some postprocessing here to remove what you dont want/need

  -- i'll try and and more info here later

  - Universal G-Code Sender, send G-Code from RPI to arduino


  -- OR bCNC


Materials and methods

Cheaper Parts can be found in other places:

Nema 14 Stepper Motor (Total needed 3)

5 Pcs SCS8UU 8mm Linear Motion Ball Bearing (Total needed 10)

skate bearings (Total needed 4) (1 is for small brushless motor only)

T8 Brass 8mm diameter 2mm pich Flange(Total needed 3 but 1 comes with the lead screw)

T8 500mm length 8mm diameter Lead Screw (Total needed 1, needs to be cut in to 3 pieces)

500mm length 8mm diameter Liner Rail (Total needed 2, each needs to be cut in to 3 pieces)

power button (16mm) (Shut down RPI)

E-stop button (16mm)

oled 0.96" I2c 128x64 screen

5-way Navigation switch

raspberry pi
raspberry pi wireless

GRBL Controller CNC Shield V4

End Stop Switch (Philmore 30-2501)(Total needed 3)

5mm-8mm coupler (Total needed 3)

Power Switch (only 1 needed)

1/8" and 1/4" Er11 Collet

carbide bits (For PCB etching)

#6-32 tpi x 2 in screws (Total screws needed 4) (home depot Everbilt Model # 803071 Internet # 204274608 Store SKU # 528433)

#6- 32 x 1 in screws (Total screws needed 18) (home depot Everbilt Model # 803041 Internet # 204274605 Store SKU # 526843)

m4 25mm screws (Total screws needed 16)

m4 16mm screws (Total screws needed 24)

m3 16mm screws (Total screws needed 6)

Round head machine screw. 4-40 x 1/2" (Total Needed ?)

Round head machine screw 2-56 x 1/4''(Total needed ?)

Heat Shrink Tubing

DC Power Jack 5.5mm (only 1 needed)

Dupont Jumper Wire Cable Female (Total needed ?)

3.5mm Gold Bullet Connector

MicroB Plug

Power Brick

Buck DC-DC Adjustable

Parts for small motor

Brushless Motor

8mm Pillow Bearing

DN C8 ER11M Straight Shank Chuck

#8 32x 3/4 in (total screws needed 2 and 2 nuts)

Parts for Large motor

Brushless motor with 5mm Saft (using: Turnigy Aerodrive SK3 - 3536-1400kv "reversed shaft" )

mystery 60a ESC (motor only needs a good 40A ESC)

er11 chuck with 5mm ID shaft

m4 25mm screws (Additional 4 needed ) (will need 4 less 16mm M4s)

m3 16mm screws (Additional screws needed 6)

Tachometer info

* Tested circuit using Attiny85 and 3mm IR LED emitter and receiver
* GPIO assignments (BCM)
power =21 #shutdown button
up =26
down =13
left =16
right =19
rpmPin = 6 #input pin to sense RPM
escPin = 12 #output to the ESC
#read PWM value = 15 (/dev/ttyAMA0)

* Test script before adding it to startup
* unzip script in your documents folder

* Add following to rc.local (sudo vi /etc/rc.local)
sudo pigpiod
sudo /home/pi/Documents/mlmCnc/ &

*Make sure serial port TTYAMA0 is available
*Make sure pigpio libraries are installed

* Full write up when completed



Issues are used to track todos, bugs or requests. To get started, you could create an issue.


C165cd560d5b47e4df221c5c44a26bd0?default=blank&size=40lgv2019 added this to the Electronics collection ago
18e49862e00cd397002147d7aafb882d?default=blank&size=40Saul Mendoza printed this ago
Carousel thumb 25
Printed on:
Ultimaker - The Ultimaker 2
After many failures I noticed I needed a way to get back to "zero" after a power outage or configuration issues. I have updated the program (mlmCnc30) to include the G28 command so that you can now go back to a specific location after a reset (and re-set the zero location). also added a minimal configuration file that is not really to helpful yet. Also I'm changing up my workflow to use flatcam instead of blendercam since its just easier for pcb work. I have added a document (in of the steps I took to go from fritzing to to gcode using flatcam. There are also some example gcode files in there as well. lastly I'm also changing the design of the tachameter to use i2c instead of serial since its more reliable and so it frees me up to use ttyAMA0 for GRBL. in the I have included the fritzing file of the new design, the attiny code, and a python test program to check everything is working on the breadboard before building it. I have not made the changes yet in the mlmCnc code yet but I will add that "soon".
As you can see from the picture this seems almost pointless without auto-level. I don't think I have enough time to figure out how to do a software auto level but I am thinking about how I can get a consistent trace cut...
18e49862e00cd397002147d7aafb882d?default=blank&size=40Saul Mendoza commented ago

Updated OLED menu ( to be able to test gcode/job before running it. (Must be running GRBL 1.1 on Arduinio)

18e49862e00cd397002147d7aafb882d?default=blank&size=40Saul Mendoza commented ago

Updated OLED menu ( to support grbl1.1. Added grbl1.1 zip with modified ( step and direction pins. I was able to upload GRBL from PI using .

18e49862e00cd397002147d7aafb882d?default=blank&size=40Saul Mendoza commented ago

Updated OLED menu ( Now you can connect to GRBL and jog/zero axis, home, and run a job. Any .nc/.ngc/.tap file in Documents show up in the jobs list. Run manually first to test new features and debug. Still not fully tested be very careful.

18e49862e00cd397002147d7aafb882d?default=blank&size=40Saul Mendoza commented ago

Updated OLED menu ( Now you can view PWM values if you have an attiny85 connected to the serial port. Also now displays RPM values if you have attiny85 connected to BCM pin 6. I have added code (connect ESC to BCM pin 12) to run the spindle manually or from PWM signal but I have not fully tested code, be VERY careful.

Fd3fbb8f7c0d2b2ae562aeb8fff22239?default=blank&size=40Pablo SuΓ‘rez Quero added this to the cnc collection ago
18e49862e00cd397002147d7aafb882d?default=blank&size=40Saul Mendoza printed this ago
Carousel thumb 20
Printed on:
Ultimaker - The Ultimaker 2
Taking a brake form the tachometer to start playing around with OLED and creating a menu system. I’m far from done (nothing really works) but its a start. I think all you need to have installed is Adafruit SSD1306 library, python and perl. Unzip in your Pi's documents folder and run
18e49862e00cd397002147d7aafb882d?default=blank&size=40Saul Mendoza printed this ago
Carousel thumb 16
Printed on:
Ultimaker - The Ultimaker 2
Final Tachometer design Chose to stick with the attiy85 to two jobs: * Smooth out noise when reading ir reflection values (would be smarter to use Schmitt trigger or 555 timer) * Read PWM Signal and relay readings back to pi using Serial connection (smarter to use MCP3008/MCP3002) I chose to go with the attiny because I can play with the resistor and capacitor values and print out the current state of the circuit instead of needing an oscilloscope. Will post full circuit and code once I create and test it. Ill try and put a zip of what I currently have.
3de1e5b60d989e6d5e0e88311783f9e3?default=blank&size=40Fielran added this to the advanced projects collection ago
83bd289fb3af4e695ba20763af962b62?default=blank&size=40hradec added this to the cnc collection ago
18e49862e00cd397002147d7aafb882d?default=blank&size=40Saul Mendoza commented ago

Yea i was also worried about that as well. Where there is a coupler there is a chance for the connection to be off center. For me the small motor i was using was soo crooked that i had no way of knowing the affects of the using a long shaft like i did. The ER11 chuck you listed bellow is the one I'm using now (look at the pictures at the end of the parts). The new large motor listed in the parts section with the chuck you have below is really nice and there is very little runout (did not measure). the chuck i got ended up fitting perfectly in the 5mm shaft of the motor. I don't have any milling experience... maybe zero, since i still haven't milled anything yet :)

4453dbe401c837a33bc8ff868ef341a7?default=blank&size=40Sjoerd Timmer commented ago

I was looking around some more online for motors.

Have you considered something like this:

It is a collet that directly attaches to a motor shaft.

That would simply things a lot...

With your setups I would be afraid that small angular or displacement errors would result in large errors at the tip... Especially with the long shaft errors would amplify... I have the feeling that a regular coupling is also bound to introduce axial displacement errors because you tighten the nut to one side with no way to center the mill bit...

Do you have experience with mills or do you have knowledge of the above issue?

4453dbe401c837a33bc8ff868ef341a7?default=blank&size=40Sjoerd Timmer commented ago

Interesting thoughts...

I'm looking forward to your findings...

18e49862e00cd397002147d7aafb882d?default=blank&size=40Saul Mendoza commented ago

Yea a 4mm lead might be a good choice. As for the motor thinking about it a bit more the biggest reason I changed the motor was that it vibrated way too much, I think the shaft was bent. I don’t know if it came like that or I bent it while trying to put the coupler on but I know I wanted to upgrade the motor anyway. So I just looked at 5mm shaft motors so I wouldn’t have that problem again and for easier assembly. The small motor would definitely etch the PCB fine, but I might affect your feed rate and cut depth settings. When it comes to etching both big and small motors will probably perform the same, but I think the bigger motor will have the edge with it comes to drilling and cutting the PCB out. Also the small motor seemed to run hotter so you might have to add a fan but I never ran it longer than 15 min. if I were to stick to a small motor I would probably redesign the Z carriage to hold the motor in a way that I would just use one of those 3mm couplers they use on those diy kits to reduce some friction:

I most likely will not be testing the small motor as the one I got is bad and I don’t see myself buying another one any time soon. I would say it’s worth getting a motor with a larger shaft, if only for a smoother rotation!

4453dbe401c837a33bc8ff868ef341a7?default=blank&size=40Sjoerd Timmer commented ago

4mm lead might be a good middle way then...

I had not expected that the spindle would be a problem... It should take very little force to scratch off the top copper layer from copper clad pcb board I would think... Bldc might not be the best choice for a spindle I realise now. They are high speed low torque motors. I could consider mounting the cable driven extension piece to the carriage instead....

I'll wait for your updates before ordering parts then ;-)

18e49862e00cd397002147d7aafb882d?default=blank&size=40Saul Mendoza commented ago

Hi Sjoerd,

yup I didn't measure the lead screws and linear rods just put them next to the CNC and marked them. But looking at the numbers your right, the lead screw on the X can be as long as 200mm and 180mm on the Y. I don’t believe the coupler adds any length (if you don't want it too), but the motors I used do protrude 7mm the same depth as the bearing opposite to it. As for the linear rods I believe you can get away with 210mm on the X and 190mm on the Y. You will have to cut a bit off of the Y axis rods and lead screws but you can use the 200mm rods and lead screw for the X if you use the extension piece I added and you can get 100mm rods and lead screws for the Z axis.

About the motors don't really know how much more accurate they are to 1.8 or 3 degree motors in real world application, especially with microstepping. Initially I wanted to use the motors in full step mode to get the most torque out of them, but the vibration noise was just way to loud. What I ended up doing in full step mode was reducing the Vref value of the stepper driver. I found that I could actually get more torque with less noise by microstepping at a quarter step (you can see my GRBL settings) and increasing the Vref value. I didn’t do any torque measurements just used my finger to apply force (not too scientific).

Yeathe lead screw I got has an 8mm lead. When I chose the lead screw I thought the pitch was the lead :) and was confused why my numbers weren't working when setting up GRBL. Looking back at it now don't know with microstepping If I would want a 2mm lead since travel is pretty slow as it is now. But yea at 3 degrees a 2mm lead does sounds like a good idea.

This might be surprising but I still have not cut a single thing yet. All I have done is check and tune features/hardware as I add them. I found the small motor very limiting it seemed to weak for the ER11 chuck, that's why I just added a bigger motor. The Z axis does have some small wobble because it only has one set of bearings. Don’t know yet if the motors torque are a limiting factor, I have plotted some stuff but I haven't tried to do anything crazy yet. The last feature I want to add is an RPM sensor to monitor the motors RPM as it starts to cut in to material, I just ordered some stuff, so that will probably be the first PCB I mill. I will add some pictures when I do that but with aliexpress shipping it might be next year :p

4453dbe401c837a33bc8ff868ef341a7?default=blank&size=40Sjoerd Timmer commented ago

Thanks for the elaborate yet quick reply!

That is a lot of useful info... You are right that I probably wouldn't need the extra 2cm in the Y direction...

I made an educated guess that the leadscrew in your design would be cut to approx. 200mm. I assume from your reply that that is incorrect?

I have a hard time guessing the length that is added by the coupling. I think I forgot to account for the fact that the coupling doesn't go all the way to the face of the stepper so that would mean your lead screws are actually less than 200mm? From your reply it seems that they are longer?

Do you know how long your leadscrews and linear rods are? That would be helpful info...

I realise now that the linear rods are a fixed amount longer than the lead screws so the probability that I can get away without cutting rods is low since I probably won't find the parts with the right length difference online...

I don't fancy a kit because I have many of the required parts already here (steppers, bearings, most of the electronics).

And you did most of the development work already anyway... ;-) For which I would like to thank you.

I agree that your motors are probably better. I measured mine and they have 3 degree steps :s

I can partially compensate that by choosing leadscrews with a smaller lead distance. Yours are 8mm lead but they go down to 2mm for the same price on aliexpress so that would give me a 4x precision gain (probably at the cost of speed).

This makes me wonder: do you use microstepping and at what divisor?

And: what is your general experience with the resulting quality?

What are the difficulties with this machine? which parts are limiting performance most?

18e49862e00cd397002147d7aafb882d?default=blank&size=40Saul Mendoza commented ago

Hi Sjoerd,

Yea I agree blender can definitely be tedious, but to be honest I probably spent 40% of my time on useless visual details, 40% on what parts I should go with, 10% revisiting everything on that 80% and changing my mind, and about 10% on the actual CAD/mesh work.

I went with the motors I chose because they seemed like the best combination of size/weight/torque/accuracy(.9 degree). One of my biggest concerns was the motor size and weight and that 3d printed material could not handle the wight of a nema 17 motor(without using up more space for extra support). I would have liked to use a nema 17 motor since they are more powerful and even cheaper. I pretty much built this machine around these motors :)

As for the rods and lead screws I wanted to go with a pre-cut sizes but I couldn’t find the right sizes for the print area. To cut the lead screws and shafts I just used a Dremel tool.

Basically the way I went about building the CNC was:

Q. What is the max size I can get out of the UM2?

A. Created cubes and opened it in Cura until it was gray. Didn't know at the time about messing with the machine settings.

Q. I know I want to use it primarily for PCBs, what is the biggest PCB I can make?

A. Worked out if I used 10mm walls for the CNC depending on the size of the X carriage I could at most get 150mm of travel in a single axis. Since PCBs generally come in rectangles I only cared about maximizing one of the X/Y axis's. As it is right now theoretically you can get 140mmx120mm (X/Y) of travel. Since the max X travel on the UM2 was 220mm I could either go down to 200mm on the CNC build and use pre-cut shafts and lead screws and sacrifice milling area or use the max printing size and go with larger shafts and lead screws that I could then cut down. I chose to go with the biggest shafts I could find that I could cut down. With 500mm shafts and lead screws I could cut them down to what I needed for the x,y, and z and use the max print size and it also saved some money instead buying separate pre-cut ones.

Q. How cheap can I make it without compromising quality.

A. This is where a lot of back and fourth happened. It reminded me of building a computer where you don't want to buy a super powerful processor with a crappy graphics card. So basically I chose mid range parts like ACME lead screws instead of low end hardware store screws or high end ball screw. Or linear ball bearings instead of those lower end brass or plastic bearings or high end linear rail guides and carriage.

If your interested in using 200mm leaner rods for the x axis, I added an x axis shaft extension piece. As for the lead screw brass coupler, the regular one seems to work ok with little to no backlash when installed, but I did see from your link that there are some with anti backlash ones which look cool. Also seems like there are a lot of options for controllers, but yea I Just went with a nano GRBL controller because it was cheap and small. I have a blank electronics mount so you can add your own standoffs :)
If I had to do it all over again I probably would probably just go with an aliexpress/banggood diy cnc kits like

since it was just way too much work to create my own. When I started I only know about those 3020/3040 kits that started like at 500/600 and up which seemed too pricey for what I wanted to use it for. I set out to just create a quick boxy CNC but … yea.

4453dbe401c837a33bc8ff868ef341a7?default=blank&size=40Sjoerd Timmer commented ago

Hi Saul,

I set out remodelling things in freecad because there are some other things that I would like to change too. I have used blender in the past but it can be rather tedious for functional parts...

I have not yet settled on the steppers to be used because mine are actually a bit too large for the current model:s (i.e. they stick out ebove the edge of the base blocking the platform:s)

I would also like to change the dimensions of the machine such that I can used pre-cut rods and leadscrews like these:

I was thinking 200mm leadscrews for both X and Y.

How did you cut things to size? Do you have special tools for this?

Is there a reason that you did not utilize all available Y-length of the um2?

I would also replace brass couplers with helical aluminium couplers because they are easier to obtain...

Any ideas on this?

(I would also change the controllers to an arduino mega+ramps because I have experience with that setup but that won't influence the 3d design too much)

As a side note:

Cura 2.1 is indeed beta software and may or may not behave as advertised. At some point they introduced the "feature" that the printable area is reduced by the brimsize... So if the model stays gray you can sometimes fix that by changing the bed adhesion...

18e49862e00cd397002147d7aafb882d?default=blank&size=40Saul Mendoza commented ago

Hi Sjoerd I tried Cura 2.1 (only using Linux) but it didn't even load STL files for me. Seems like the problem with scaling is with the Cura 2? Since Cura 1 and other programs load the STL files correctly. As for print area it seems to be a bit tricky since it looks like every few releases Cura changes its machine preferences defaults a little. The previous Cura release I used the defaults for x/y were 225mm I believe and the printer head size setting where such that I only had to change the y axis to 226mm. The current Cura I'm on (15.04.6) the defaults are 223mm and with the new default printer head size setting I have to increase the x/y to 230mm so the largest parts show as printable. I don't know what the best settings are as I didn't write down all the previous settings so I would try playing with the numbers and checking that your first layer is laid down correctly (as I know that the um2 has the available print area).

Sadly I'm using Blender it's far from the best tool but its the only 3d software I know how to use. I cleaned up the blender file for the top piece of the CNC(added to document section as top.blend). Check it out and if you are interested in the rest I can work on cleaning up the rest of the machine, its currently a mess. If you load up the file you might have to press the keyboard key β€œa” twice to select all the pieces and then ctrl+a and select scale for all the modifiers to take affect.

If you haven’t used Blender I can try adding the right mounting holes if you know the spacing or have an SVG of mounting holes. Don't know when I can get to it so if you have time I don't mind trying :)

4453dbe401c837a33bc8ff868ef341a7?default=blank&size=40Sjoerd Timmer commented ago

Saul, I would like to change the type of steppers because I have a few of a different model lying around. Would you mind sharing the sources of this so that I can change it? (assuming that you used some cad software and not a mesh editing tool to design this...)

4453dbe401c837a33bc8ff868ef341a7?default=blank&size=40Sjoerd Timmer commented ago

In the new 2.1 branch of cura they also show up as 100x too small. scaling to 10000% results in the sizes from your screenshot. However, the model exceeds the printable are in the x-axis.

18e49862e00cd397002147d7aafb882d?default=blank&size=40Saul Mendoza commented ago

Hi BΓΈrre thanks, I appreciate it. I haven’t used Simplify3d, only Cura. I created the model in mm so I don't know if there is a mm/inch issue? I just downloaded a few files to see if there was an issue after uploading but they show up fine in Cura. If its showing the objects to be scaled to 1 on all axis then you might have to scale the models up or maybe try re-installing Simplify3d? I know for the Ultimaker 2 I had to increase the print area β€œdepth” (y-axis?) by 1mm (226mm total) for Cura to be able to load some objects. Don’t know what I can do on my side, but would like to know if you get it figured out :) (or if some one else passing by has any suggestions)

for example 1:1 scale of the base (base.stl) should be 220x200.843x75mm (pic uploaded)

5ce1468f15c98c529122427d7f11973b?default=blank&size=40BΓΈrre Evensen commented ago

Really good work

Downloaded this, and the parts is really small when I import in Simplify3d.

Is it possible to get the parts in right scale?

998faba659a7a7f413f52cd48973be87?default=blank&size=40Bryan Andrew Clinko added this to the 3d printing collection ago
A66516fb7c7d512499e3694cc4fc42b4?default=blank&size=40Ryan Holliday added this to the Wishlist collection ago
Mini blog logoBruno M. commented ago

Love it. Awesome machine.

18e49862e00cd397002147d7aafb882d?default=blank&size=40Saul Mendoza published this design ago