Introduction: CNC Plotter (3D Printed Mostly)

Hi everyone,

This is my very first Instructables that I'm writing today and I'm quite excited about it.


First, before I start to explain my project, let me tell you the why. I got the idea of building a CNC Plotter during the lockdown due to the coronavirus. I live in France so far and during the lockdown we needed to print an official paper explaining why we have to go out (groceries, family issues, go for a walk, etc). At that time, I didn't have a printer, so I needed to handwrite this entire page full of really administrative words, kind of boring to do it 10 times. And also I was starting to get interested into CNCs. BOOM, no way I'll buy a printer for this, I will build my own CNC Plotter and make this machine write for me.

I was already gloating to show this CNC made paper whenever I would get a police check. Long story short, the slowness of the deliveries because of the virus and the numerous bugs & tries (electronic and mechanical) that I had did not allow me to accomplish my mission. But however, I decided to continue the project and see it through.


If you want to get into CNCs, understand how it works, what is needed, how gcode works, this project is a good starting point.

The mechanical stuff is quite simple and quite permissive, plotting something with a pencil doesn't require high precision and high torque. Also, the size of the CNC is quite small (45 cm x 45 cm x 20 cm) so easy to build and doesn't require a lot of space.

My CNC Plotter is 2.5D. Your pencil can travel on X and Y, and the Z axis is kind of "binary", so you don't have to get into 3 dimensional stuff to start.

Well, let's go?!

Step 1: Quick Overview of Design, Electronics and Software

I decided to use mostly 3D printed parts for the CNC plotter and buy a few aluminium profiles, thread rods and linear rail guides. 3D printed parts are quite cheap (if you have a 3D printer) and are sufficient enough for the precision and sturdiness needed for this project.

(part list is detailed in the next step)

Pay attention, I use the metric system πŸ˜‡


Let's define the specifications for the CNC:

  • 30 cm * 30 cm so you can draw on an A4 paper
  • Good precision
  • Easy pencils swap
  • Easy calibration process
  • Upgradeable
  • 3D printed parts are independent from the size you want

30 cm * 30 cm is a good size since I live in a quite small appartement, the final size of the CNC with printed parts will be around 45 cm * 45 cm.

I wanted to design an easy swapping system for the pencils, because I would like to try a ton of different felt-tip pens, pencils, pens and I know it would have been frustrating to manipulate the machine 5 minutes each time I want to try something else.

And also, every 3D printed parts that I have designed are independent from the size of the CNC plotter. So if I want to make a 1m * 1m CNC Plotter I can reuse the same 3D printed parts and buy new aluminum profiles, threaded rods, etc.

I know the mechanical parts are quite overkill for a CNC Plotter and a regular GT2 belt could accomplish the same task, but remember I went into building a CNC Plotter to learn about CNCs and maybe one day build a milling CNC for aluminium or wood. So I wanted to learn the most from my design and be sure it will be sturdy enough for more demanding tasks.

And also, I'm the kind of guy who likes when it's overkill...


Still in a way of saving money and keep the project simple I chose to work with an Arduino Shield V3. This item will be mounted over an Arduino Uno and be the interface between movement commands and power sent to the motors. The PCB Board is well labeled, usually comes with stepper drivers and jumpers to select microstepping, more on that later.

You could achieve the same goal without the shield and cable everything by yourself, I DO NOT RECOMMAND THIS. For 10 $ you save a ton of cabling, around a 100 headaches and maybe burn an electronic part.

To move on each axis, I decided to use regular and cheap NEMA 17 stepper motor and a few end-course switches.


Luckily in this world, we have GRBL. GRBL is an open source software to flash on an Arduino and it will convert GCODE commands sent to the Arduino into stepper motor movements. GRBL is very versatile, you can use it for Plotters, Laser Cutter/Engraver, Milling, etc.


You can use whatever you want to draw or create shapes but I recommend using Inkscape because:

  • It's free, open source and light to operate
  • It's made for SVG files
  • Drawing ➑️GCODE conversion tools are included in it and quite easy to use

You can create your own drawings but what's cool about Pen Plotting, there is an awesome community delighted to help and share their creations.

You can go on DRAWINGBOTS ( to find a list of creation tools and you can go on PLOTTERFILES ( to find creations of other members of this community.

These two websites are made by Maks Surguy (@msurguy on Twitter)


Now that we have an idea of where we are heading, please find next the part list πŸ˜ƒ

Step 2: Parts List

    Please find below every item needed for this project. For the mechanicals parts, you can choose different length and get a bigger CNC but please be careful if you choose other mechanicals parts, I cannot guarantee compatibility with the 3D designed parts. However every 3D printed parts will be available on my GitHub in a f3d format, so you can adapt them if needed.

    Also out of a concern for honesty, all links are affiliate which means I get a small commission if you buy a product through my link. This is ABSOLUTELY NOT an obligation to use this links, it just help me to create and build others projects and it isn't more expensive for you.


    - 5x 300mm Aluminium profile: link

    - 1x Taps and Dies: link

    - 3x 300mm Linear Rail: link

    - 3x 300mm Lead screw: link

    - 3x Aluminium flexible shaft: link

    - 1x Aluminium corners: link

    - 1x Springs: link

    - 1x 3mm rod: link


    - 1x set of M3 sliding nuts: link

    - 6x M6x20

    - 34x M3x10

    - 16x M3 nuts

    - 16x M3x25

    - 4x M2x10

    For the screws and nuts, I advise you to go to your local reseller as the references are specific.

    - 3x Stepper Motors: link

    - 1x CNC shield V3: link

    - 1x set of jumpers: link

    - 1x 9g servo: link

    - 3x Limit switch: link

    - 1x 12v power supply: link

    πŸ”« ACCESSORIES (Optionnal):

    - 1x Plastic Cable Drag Chain : link

    - 1x 40mm fan: link


    While waiting for the parts to be shipped you can start 3D PRINTING, see you next part πŸ˜‰

    Step 3: 3D Printed Parts

    So let's go with 3D printing, it took me roughly 24 hours of printing, so grab some coffee and a good show on netflix.

    If you don't have a 3D printer, you can order them through a 3D printed service, but this project will become very expensive...

    πŸ“ƒ 3D printed part list :

    • 4 legs
    • 2 supports + arms for the X axis
    • A few parts for the head
    • Optional : a case mounted on the structure for the Arduino + GRBL shield


    To print all the parts, I've used an ender 3 pro (which is a really good 3D printer by the way, here is the link) with the following parameters :

    • Walls : 0.8 mm walls (with a 0.4mm nozzle)
    • Layer height : 0.2 mm
    • Bottom and Top thickness : 1mm
    • Infill : 15% Grid
    • Material : PLA

    That's the parameters I've used, obviously you can tune them as you want πŸ™‚.

    I've designed my parts so they don't need a ton of support, you can save time and filament.

    You can print the parts in two times, once by activating the option Support/Touching Buildplate for: 4 Legs, 2 supports, the mobile and the pen holder. And then activate the option Support/Everywhere for: the base and the two arms.

    What is great about the Pen Holder is that you can print a few of them, mount your favorites pencils and swap them easily. You just need a M3 screw to tighten the pencil. Also, you can adapt the pencil shape on the Pen Holder, so it fits perfectly. Watch picture 2

    ⬇️ Download on GitHub:

    Every STL files are available on my Github, so if I update them in the future, you will be able to download the latest version:

    Also if you feel that I should change or update the parts in a certain way, do not hesitate to do a pull request. I'll also upload the fusion file on github to make the project editable.

    link :

    Step 4: Assembly Time

    For this step, you should you have received all the parts and 3D printed everything, it's time for assembly! Well done, great milestone here.

    ⭐️The frame:

    We will start by assembling the frame with the aluminium profiles, for this you will need :

    • 4x aluminium profiles
    • 4x brackets
    • 8x M5 screws
    • 8x t-nuts

    Please refer to GIF 1

    You can slightly tighten the screws, and then put the frame on a flat surface and tighten up. This is really important because it will offer you a perfect square and an even surface (quite important for drawings).

    ⭐️The Legs:

    The legs supporting the step motors need to go to the back of the frame and regular legs need to go to the front.

    You will need:

    • 4x 3D printed legs
    • 4x M6x20 screws
    • Tap kit

    First, you need to thread the aluminium profiles on the sides with a 6mm tap to receive the legs. Then you can tighten the screws at their right placement. If you don't know how to thread, here is a great tutorial from FrankHurtAuto

    Please refer to GIF 2

    ⭐️Linear Rails on the Y axis:

    Now that the frame is in place, you can add two linear rails on each side.

    You will need:

    • 2x linear rails
    • 8x M3x10 screws
    • 8x sliding nuts

    You can put as many screws as you want but 4 per linear rails is more than enough.

    Please refer to GIF 3

    PLEASE BE REALLY CAREFUL with the sliding block of the linear rail, if it falls of the rail, the marbles from the bearings are going to fall. Honestly you can throw your linear rail to the trash. Because you've already installed the legs, it will help you in this process and stop the sliding block from falling apart while you are tightening the screws.

    ⭐️ Add arms on the supports:
    If there is one thing I don't like about my design, these arms are part of it. They are working well, but I don't know they look like a dirty solution for a problem. Well... If you have a good idea on how to replace then tell me πŸ˜ƒ

    You will need:

    • 2x 3D printed arms
    • 2x 3D printed supports
    • 4x M3x25 screws
    • 4x M3 nuts

    Please refer to GIF 4

    ⭐️X Axis:

    We will prepare the X axis to be mounted on the frame.

    You will need:

    • 2x 3D printed arms + supports
    • 1x aluminium profile
    • 2x M6 screws

    First you will mount the aluminium profile on the 3D printed supports, as earlier you will need to tap the aluminum profile with the 6mm tap. And then you can bolt the supports with the M6 screws.

    Please refer to GIF 5

    ⭐️Linear Rails on the X Axis:

    Now you can mount the linear rail on the aluminium profile, be careful to mount it on the right side.

    You will need:

    • 1x Linear Rail
    • 4x M3 screws
    • 4x sliding nuts

    Please refer to GIF 6

    ⭐️Assemble X & Y:

    Now that we have the frame supporting the Y axis and the X axis, we are going to mount them together.

    You will need :

    • 8x M3x10 screws

    Please refer to GIF 7

    ⭐️Mount the head:
    Before assembling the head, we need to mount her base on the X Axis sliding block.

    You will need:

    • Head base
    • 4x M3x10 screws

    Please refer to GIF 8

    ⭐️Assemble the head:
    Now that the head base is mounted, we can add the others parts on it.

    You will need:

    • 1x 3D printed mobile
    • 3mm rod
    • 2x springs

    You can start by cutting two 3 mm rods to the right size, around 50 mm. Slide the 3mm rods into the base, then add the springs and then add the mobile head. You can add a few drops of super glue on the rods to lock them to the base.

    Please refer to GIF 9

    ⭐️Mount the Lead screw:

    Take a breath, this is the final step 🀩

    You will need:

    • 3x Lead screw
    • 4x M3x10 screws
    • 8x M3x20 screws
    • 12x M3 nuts

    Please refer to GIF 10


    WELL, if you read this, you probably finished mounting the frame ==> NICE.

    If you have any issues, there is a troubleshooting page at the end, if your problem isn't write down there, send me a message πŸ™‹β™‚οΈ.

    Step 5: Add the Electronics

    Unfortunately, it's not over.... Now that we have a nice frame, we will add all the electronics and cable them!
    I prefer this part, it's more... clean. No oil or grease πŸ˜…

    ⭐️ Y Axis:

    You will need:

    • 2x Stepper motor
    • 2x Aluminium flexible shaft
    • 2x Shaft screw
    • 8x M3x25 screws

    First add the aluminium flexible shaft on each stepper motor. Then mount the stepper motors on each leg

    Now you can screw the shaft screw into the Lead screw until it hits the aluminium flexible shaft. And then you can tighten the shaft screw into the aluminium flexible shaft.

    Please refer to GIF 1.

    ⭐️ X Axis:

    You will need:

    • 1x Stepper motor
    • 1x Aluminium flexible shaft
    • 1x Shaft screw
    • 4x M3x25 screws

    Quite the same process here! Add the aluminium flexible shaft on the stepper motor. Then mount the stepper motor on the right support. Screw the Shaft screw into the coupling shaft and then tighten it into the aluminium flexible shaft

    Please refer to GIF 2


    You will need:

    • 1 servo
    • 2 screws (they are supplied with the servo)

    Mount the servo on the head, be careful with his orientation.

    For now, don't add the servo arm and the sewing thread, we will do that later πŸ˜‰

    Please refer to picture 3.

    ⭐️Limit switches:

    You will need:

    • 2 limit switches
    • 4 M2.5x8 screws

    If you bought the same limit switches as mine, you can screw them in place. If not, a bit of superglue will do the trick! Just be careful with their placement.

    Please refer to GIF 4

    ⭐️ Plastic Drag Chain (Optionnal)

    If you bought the plastic drag chain, you can run your wires through it. I decided to just glue it, and it works quite well.

    Please refer to picture 12.

    ⭐️Cable Management:

    Now that everything is mounted on the CNC, we will connect them to the Arduino, to the shield to be precise.

    ➑️If you printed the Arduino Case (Top.stl and Bottom.stl files), run all the wires through the hole and then connect them.

    Let's connect some wires:

    • Solder 2 cables to the Arduino. You will be able to connect the 12V power supply to the Arduino and connect it to the Shield.

      Please refer to picture 1
    • Mount the shield on the Arduino. Be careful to not misalign it by 1 pin, it could be a bad ending.
      Then connect the 12V and the GND to the shield.

      Please refer to picture 2
    • Add the jumpers.

      Please refer to picture 3
    • Add the drivers. Be careful with their orientation.

      Please refer to picture 4
    • Connect the steppers motors to the drivers. There is no orientation for steppers connector, you can change the motor direction by inverting the connector.

      Please refer to picture 5
    • Connect the limit switches. The Limit switch on the back leg is connected to Y- and GND, the limit switch on the support is connected to X- and GND. Because a limit switch is the same as a button, you can connect it both ways.

      Please refer to picture 6
    • Connect the servo. You might need to solder extra wires to reach the Arduino Shield. Connect the 5V of the servo to the 5V on the Shield, the same for GND and connect the pulse wire to the Z-.

      Please refer to picture 7

    What are these jumpers doing ?

    The jumpers under each stepper drivers are selecting micro-steps. A stepper motor is defined to make a number of steps for each rotation, usually a stepper motor makes 200 steps/revolution and by activating or not certain coils, you can make the rotor spin. With micro-stepping, you can create intermediate states and increase your number of steps/revolution. You can go for: 1/2, 1/4, 1/8, 1/16.

    So if you chose a 1/8 micro-stepping, you can multiply 200 steps by 8 = 1600 steps/revolution. So now with the exact same motor, you can control it more precisely. Be careful, too many steps aren't that good because you will also lose more steps by losing torque.

    If you want to learn more about micro-stepping, these article from Moritz Walter on hackaday is way better than my explanation: The other jumper on the right of the picture allow you to duplicate every commands of the Y channel on the A channel.

    ⭐️Add a fan (Optionnal)

    If you are the kind of person who like to overclock stuff, you can add a fan. The Arduino case can receive a 40 mm fan on top.

    You can attach it with M3 screws and nuts.


    ET VOILA, you are done with building the CNC. Congratulations!

    We will now focus on the Arduino and setup GRBL. πŸ˜‰

    Step 6: Install GRBL on the Arduino

    Installing GRBL on the Arduino is a quite easy task. GRBL is more often used to control milling machines, so we will have to use a modified version to control the servo and make it work as a CNC Plotter.

    Installing GRBL on the Arduino Uno:

    1. First, we will need the Arduino IDE that you can download here :
    2. Install the Arduino IDE
    3. Then download the modified version of GRBL on GitHub from Bart Dring: . Click on Code, click on Download ZIP.
    4. Unzip the folder and copy the grbl folder to the Documents > Arduino > Libraries
    5. Open the Arduino IDE, click on Open File and open the file located in : Documents > Arduino > Libraries > Grbl > Examples > GrblUpload.ino
    6. Once the file is opened, go to Tools > Board and choose the Arduino Uno.
    7. Connect your Arduino with the USB cable , go to Tools and choose the right port.
    8. Click on UPLOAD !

    I've made a video on how to install GRBL.

    Step 7: Setting Up the CNC

    To quickly explain GRBL, it receives GCODE commands then send steps to the stepper motors and raise/lower the servo. So we will need a software to send GCODE commands to the Arduino.

    πŸ“€ Installation:

    You can find many softwares, some are free, some are not, some are more or less easy to use.
    After testing a few ones, I chose to go with the Universal GCODE sender which is web-browser based. Please refer to picture 1.

    You can follow the instruction guide on their website : Universal GCODE Sender

    πŸ–₯ Setting up:

    GRBL is made to work with very different types of CNC, so we will need to make it fit our CNC configuration.

    So open Universal GCODE Sender or any other software, the interface will be quite similar.

    1. In the Connection menu, select the Arduino Port, set the Baud to 115200, select GRBL as the firmware, click connect (Obviously πŸ™ƒ)
    2. In command, type "$$", the Arduino should send back every parameters. Like that you know you are well connected to it.
    3. Setting the Travel Resolution (step/mm). It depends of your shaft screw thread pitch, your micro-stepping and your stepper resolution. The formula is travel resolution = stepper resolution * 1/micro-stepping / thread pitch. So in our case : travel resolution = 200 * 1/1/8 / 2 = 200 * 8 / 2 = 800 step/mm

      So in the command section, type : "$100=800" and "$101=800"
    4. Setting the Maximum Rate (mm/min). It's more of a tuning by feeling, we are looking for the highest speed without losing steps or have a stepper stalling. After a few tries, I've set it to 1000 mm/min.

      So in the command section, type: "$110=1000" and "$111=1000"
    5. Setting the Maximum Travel (mm). Here we enter the size of our CNC, so the head won't go too far and hit the side of the CNC.

      So in the command section, type: "$130=201" and "$131=201"
    6. Setting the Step Idle Delay (ms). After doing a motion, GRBL will wait for this delay and then disable motor power. I've chose to use 200. You can enter 255, which will never disable the motor.

      So in the command section, type: "$1=200"
    7. Setting the Invert Limit Pins (boolean). This parameter is for the limit switches, whether we want to detect a high or low for homing.

      So in the command section, type: "$5=1"
    8. Setting the Hard Limits and Soft Limits (boolean). Hard Limits will enable the detection of the Limit Switches and Soft Limits will take advantage of knowing the size of CNC to stop the head from going too far.

      So in the command section, type: "$20=1" and "21=1"
    9. Setting the Homing Cycle (boolean). By homing the CNC, it will know perfectly the X = 0 and Y = 0 position.

      So in the command section, type: "$22=1"
    10. Setting the Homing Direction Invert (boolean). To go to the home position, we need to tell the CNC where it is! Upper Left Corner, Lower Left Corner, etc, etc

      So in the command section, type: "23=2"

    If you want, the GRBL GitHub explain wayyy better than me everything we've just talked about:

    This is a quite hard part to resume, if you have an issue, do not hesitate to send me a message.

    Well you should have a well set up CNC! Bravo!

    Step 8: Moving Your CNC

    Just a quick overview of the different commands you can use to move the CNC.

    • $H: Homing the Head to the 0,0 position
    • $X: Unlock the CNC (if you have an alarm and you know that everything is under control, you can unlock the CNC with this command)
    • X: move the X axis by the step size you chose
    • Y: move the Y axis by the step size you chose
    • Z: As we said at the beginning, the Z axis is binary (low or high). In fact this modified version of GRBL allow us to lower the servo if the Z value is negative and raise it if the Z value is upper or equal to 0.

      Remember I told you to not mount the servo arm and the sewing thread, well now that we know where is our low and high positions, we can do it. So lower the servo, put the arm facing down, screw it, attach the sewing thread between the arm and the mobile. See picture 1 for a more detailed explanation.

    Please refer to picture 1

    Step 9: How to Use Inkscape for CNC Plotting

    So you should have a perfectly working CNC right now but we need to draw something now ? You can stop here, but well, you will not really enjoy your CNC Plotter πŸ˜›

    πŸ“€ Install Inkscape

    First, we need to install the software for drawing and generating GCODE files.

    Here is the download link:

    πŸ–₯ Create a shape

    This is not a tutorial on a how to use Inkscape, but on how to create GCODE from a drawing, so I'll not enter into too much detail.

    Open Inkscape:

    1. Start by setting the document size to 200 mm x 200mm which is our CNC size. Go to File > Document Properties > Under Custom Size, enter Width = 200 and Height = 200

      Please refer to picture 1
    2. Add a rectangle on the canvas. Remove the fill and add a black stroke, the thickness of the stroke doesn't really matter because in the end, it will depend on the size of your pen.
    3. Select the rectangle, go to Object, click on Object to Path

    4. Select the rectangle, go to Extensions > GcodeTools > Orientation Points. Select 2 points mode, Z surface = 0 and Z depth = -0.1mm, click Apply.

      Please refer to picture 2
    5. Select the rectangle, go to Extensions > Tools Library, select Cylinder, click Apply.

      Please refer to picture 3

      You should have a grey box with a few informations in it. The only interesting parameter to change is the feed, you can control the travel speed in mm/min if you want. I generally use something like 400 or 500. You can change it with the Text tool.

      Please refer to picture 4
    6. Select the rectangle, go to Extensions > Path to GCODE > Preferences. Enter your filename, select your directory, Z safe height = 0.2 mm.

      Please refer to picture 5

      Go back to Path to GCODE tab. For Cutting Order, select Pass by Pass, Click Apply. If it worked, you should see the arrows showing the GCODE commands on your canvas.

      Please refer to picture 6

      Be careful, you need to be on the Path to GCODE tab to click Apply. If you are on Preferences (or something else) it isn't going to work.

    Now, you have to go back on Universal Gcode Sender > Connect to your Arduino > Send $H to home the CNC > Browse for the GCODE file you've just created and press SEND.

    Damn, it's was a long way to get here... But you've made it!

    Please find this little present: video

    Step 10: Troubleshooting

    I hope this page will remain empty but if not, I will add issues and (maybe) solutions πŸ˜€.

    😿 Troubleshoot n°1 - Time shift:

    It happens only on really long drawings (> 30 minutes), it seems like steppers are loosing steps and this translates into a shift on both X & Y axis. But what looks weird, is that both motors on the Y axes are loosing the same steps, which made me conclude of stepper cables should be shielded, at least inside the Arduino case because they are really close to the drivers and they might be the origin of this problem.

    I will try this option and see how it goes !

    EDIT : it's not the CNC, but the GCODE generated by inkscape because when I draw the same thing twice, I have the same shifting in time...

    😿 Troubleshoot n°2 - Files:

    If you have problems opening the steps files, I've added the mp4 versions on the github repo: