Drawing Plotter




About: DIY projects, CNC, 3D Printing and Arduino

Welcome to my Instructable!

Thanks for everyone who voted for me in the contests!

More about Mk2 version Plotter.

Here I'll show you how to make 2 axis, gcode controlled drawing plotter.

I've already made a delta 3D printer which is awesome, the only thing that wasn't made by me was the Arduino program. This program was very long and complicated, so I've downloaded it from the Internet. I've started to think if I am able to also make it myself. But why should I start with something so hard, firstly let's make something easier - Plotter!

Step 1: Parts

Here are the parts you should have to make my drawing plotter.


  • 6mm aluminium pipes (more in step 2),
  • 3m of GT2 belt,
  • 3D printed parts,
  • screws and nuts (3x M2 12mm, 14x M3 20mm, 6x M4 12mm).


  • 3 stepper motors (28BYJ-48, 5V DC) with drivers (ULN2003),
  • microservo (Tower Pro 9g),
  • 16x2 LCD with I2C converter,
  • SD card reader,
  • DC 5,5x2,1mm plug and socket,
  • 5V 2A DC charger,
  • PCB parts (more in step 4),
  • wires, goldpins, heat-shrink tubing.

Arduino programmer or Arduino UNO board (only to upload program).


Screwdriver, soldering iron, marker, scissors etc.

Step 2: 3D Printing

Firstly let's print all the parts that I've made in Fision 360.

You can download the .stl files below.

Step 3: Belts and Pipes Cutting

Now you need to have 6mm aluminium pipes, of which you can make plotter frame.

I bought 5x 1m long pipes for 0.80$ each in a DIY store, and 3m of GT2 belt on the internet for 9$. Now cut the pipes so you will have 2x 53cm long, 2x 38cm long, 2x 28cm long and one 58cm long.

Than cut the belt - 3 times 2cm pieces, 1 64cm and 2 115cm long.

Step 4: PCB and Electronics

Now I prefer to make a PCB (Printed Circuit Board). The other way to control this plotter is to use Arduino board, but it won't match the SD card module, there won't be enough power supply pins ant they will be away from each other so you will have to use a ridiculous amount of cables.

You can find more about making PCB's here.

Eagle files - schematic and board available to download below.

Than solder all the electronics parts (layout on the photos):

  • ATMega328P (with Arduino bootloader),
  • 28 pin socket for your ATMega,
  • 3x 10kΩ resistors (SMD version),
  • capitators: 3x 100nF, 2x 22pF, 1x 10nF,
  • button,
  • 16MHz crystal,
  • 10uH coil,
  • goldpins.

Now make all the cables needed to connect your board with stepper motor drivers and plug them in (photos).

Step 5: Wires

The next thing you should do is to make motors and servo cables longer.

First X axis motor wires are long enough - motor will be close to microcontroller. Second X axis motor will be placed on the other side of plotter, it's cables should be 53cm long.

Y axis motor will be moving across all X axis so his cables should be longer than it - 60cm will do the work.

Servo will move across all X axis and all Y axis, so it's cables should be longer than these two together - 90cm will be good.

Remember not to mix them, the order must be the same.

Step 6: Display

Now it's time to make your display working. It will be connected to your main control unit with 4 cables (+, -, SDA, SCL). Solder them to I2C converter. GND wire (white on my photo) should go further to buttons, which opposite endings connect, using cables, to PCB.

Cables lenght actually doesn't matter, my are 15cm long so display isn't very close to control unit.

At the bottom of LCD panel stick 2 small parts which will hold it in right place. Make sure that screws or nuts didn't block the pipe.

The third photo shows cable endings, there is one very important thing:

order of LCD cables starts with -, + but ends with +, -.

Step 7: Stepper Motors & Servo

Start with sticking GT2 pulleys top with their bottom. Add M2 nuts and screw them to stepper motors. Than stick together 2 servo holding parts (3rd photo), add part which will hold marker. Screw servo to it.

Make sure that servo handle rotated fully right makes the same angle as shown on the fifth photo.

Step 8: Assembling the Frame

Makig plotter frame is very simple, just follow the pictures and assemble it.

Put nuts into holes in 3D printed parts and screw it with aluminium pipes. Some Y axis parts require using glue (look at the photos)

Step 9: Microcontroller and LCD

Mount on the longest pipe from the left microcontroller, and LCD with first cable chain segment next to it. Put all the remaining wires into chain, put it on it's place and plug wires to main control board.

Step 10: Charger

To power up plotter you can use charger from an old phone or buy it for like $10.

It must be 5V and minimally 1,5A DC charger (I recommend using 2A).

This chargers usually have micro usb cable, just cut off the end and solder 5,5x2,1 plug. Red charger wire (+5V) to inside of the plug and black (-) wire to outside.

Step 11: Arduino Program

Now let's focus on Arduino program.

The first important thing is to check your's LCD I2C adress. Every I2C device have it's own number and to check it you will need special program called I2C scanner. Connect LCD to Arduino board or plotter PCB and upload it. Device adress will be printed on serial monitor. Than replace original 0x27 with your adress in 7th line of code.

Install LCD_I2C library on Arduino IDE:

  1. Go to Arduino installation directory (usuallly: C:\Program Files (x86)\arduino\libraries),
  2. Change LiquidCrystal name to something else (f.e. Old_LCD),
  3. Open Arduino IDE,
  4. Go to Sketch - Import Library - Add library,
  5. Select new downloaded LiquidCrystal library and click 'Open'.

Upload main program to plotter.

All files can be found on original Arduino website or downloaded below.

Step 12: Making G-Codes

To making Gcodes I'm using tha latest version of Inkscape. It's free and can be downloaded from original Inkscape website.

How to make them:

  1. Open Inkscape and draw or write something,
  2. Go to Extensions - Gcodetools - Orientation points,
  3. Select 3 points mode and click apply,
  4. Go to Extensions - Gcodetools - Tools library,
  5. Select cylinder and click apply,
  6. Using text tool (F8 key) change tool diameter to 0,
  7. Select your drawing and go to Path,
  8. Select Object to Path,
  9. Once again select your drawing and go to Extensions - Gcodetools - Engraving,
  10. Go to Preferences tab,
  11. Select file name GCODE.ngc and directory in which it will be saved,
  12. Go to Engraving tab and click apply,

You can also convert into G-code any picture that you want, import it to Inkscape, select it and go to Path - Trace Bitmap. Choose one of three first options depending on your picture (I recommend using Edge Detection). Click OK and path should be under original picture.

You probably will receive an error 'Cylindrical cutter has no shape', so just click ok.

If there will be error #CloseParts change text font to Arial, because in normal the letter 'u' is bugged.

File will be saved in the directory you've typed before, you can close Inkcsape. Open this file and remove header and footer (I'm woking on new program which will ignore it).

Move file to SD card and plug it into plotter.

Step 13: Final Printing

Plotter is very cheap, but his drawings looks very good for me.

If you have got any ideas how to improve this Plotter or any questions about it, make sure to leave a comment!

The next project I'm working on now is my own website. I will publish my projects also there.

Design Now: 3D Design Contest 2016

Third Prize in the
Design Now: 3D Design Contest 2016

Arduino Contest 2016

Runner Up in the
Arduino Contest 2016

CNC Contest 2016

Runner Up in the
CNC Contest 2016



    • Colors of the Rainbow Contest

      Colors of the Rainbow Contest
    • Fandom Contest

      Fandom Contest
    • 1 Hour Challenge

      1 Hour Challenge

    65 Discussions


    Question 3 months ago

    Good work. I liked it but I did not get why two motors are used for one axis?
    I am planning to make it using your instructions.


    8 months ago

    Can we use a wheel instead of axis?


    1 year ago on Introduction

    i down loaded stl files. missing end pieses that hold the rod for the pen holder, x y ?

    printed all parts wish to finish this project can you send files ?

    please and thank you


    Question 1 year ago

    I do everything according to instructions but at the end I get an error Can not save the file

    Can you help me please

    kind regards

    2 answers

    Answer 1 year ago

    The file to make g-code which software version use, inkscape version 92.3 does not go

    How can I solve this please

    Kind Regards


    Question 1 year ago

    Hello, I'm new with this type of project. I have completely build the electronic circuit as here is posted but only with an arduino uno. There were no problems with the upload to the Arduino. With testing it went wrong, the buttons work barely but it can be my fault. the most annoying thing is that the Arduino cant read the SD card. I used an micro SD card reader of Catalex and I have it connected like in this project the bigger one is connected. Do I really need an normal one or is this one good enough? in the LCD is constantly showing "SD NOT INSERTED". Can someone help me with this please?

    Ps: sorry if my English is bad, I am originally Dutch

    1 answer

    Answer 1 year ago

    Does your SD reader have a 3,3V converter? My one had it built in and if it is the only thing different than mine it maight cause problems.


    Question 1 year ago

    Hi, thanks for your project.

    about the connection could you please show me the connection of the circuit using arduino uno ?


    1 year ago

    Hello! I am doing a similar project at UNI as bachelor thesis. In our project we will use DC motors and rotary encoders to control the machine and analyze how the resolution (number of holes) on our encoders affect the resolution of the drawing. We are thinking if it is possible to use the G code in some way on our DC motors, and then add code for the encoders. Just want to discuss and see what you think. Thanks in advance! /Natalija,engineering student

    1 reply

    Reply 1 year ago

    Using DC motors with encoders is indeed possible, in fact that is how normal office printers work because they are cheaper than stepper motors. I actually tried to use them in my project but there were some problems. DC motors usually have lower torque than steppers so you need to use some sort of transmission with them which means that they will spin quite fast. In my experiments with them Arduino UNO board was too slow to register all of the holes and motor was skipping steps. I even used Arduino MKR1000 with higher clock speed and then it kinda worked but it still wasn't perfect. If you have a way to attach the encoder after transmission (it will rotate slower; I couldn't do that because my encoder was permanently attached to the motor shaft) I believe it should work well. As for the G-CODE, the implementation to the program is not hard at all.


    Question 1 year ago on Step 4

    Hi, thanks for your project.
    Do you have a link to buy 10kΩ resistors (SMD version)
    I'm looking for 10kΩ resistors (SMD version) on google and they are a diferente products.

    2 answers

    Answer 1 year ago

    Sorry but i don't have a link to them. I desoldered my resistors from some old RC controller PCB. You can find them on a lot of old electronic circuits, they have 103 or 1002 numbers printed on top.


    1 year ago

    I am not much of a programmer, however, I hope someone could help me solve this. I get this error message while trying to compile the sketch. I have replaced the name of the previous LCD library and placed the new folder inside Arduino library folder.

    From what I can tell out of the context it has found multiple LCD files and does not know which one to pick. The problem however is that I don't know either. Any help is welcome.


    Arduino: 1.6.12 (Windows 10), Board: "Arduino/Genuino Uno"

    Plotter4:7: error: no matching function for call to 'LiquidCrystal_I2C::LiquidCrystal_I2C(int, int, int, int, int, int, int, int)'

    LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7);


    C:\Users\ooadsf\Desktop\Drawing plotter cnc\Kod\Plotter4\Plotter4.ino:7:50: note: candidates are:

    In file included from C:\Users\dzfsbmkldsf\Desktop\Drawing plotter cnc\Kod\Plotter4\Plotter4.ino:5:0:

    C:\Users\mkladskfklasd\Documents\Arduino\libraries\LiquidCrystal_I2C/LiquidCrystal_I2C.h:57:3: note: LiquidCrystal_I2C::LiquidCrystal_I2C(uint8_t, uint8_t, uint8_t)

    LiquidCrystal_I2C(uint8_t lcd_Addr,uint8_t lcd_cols,uint8_t lcd_rows);


    C:\Users\poabrde\Documents\Arduino\libraries\LiquidCrystal_I2C/LiquidCrystal_I2C.h:57:3: note: candidate expects 3 arguments, 8 provided

    C:\Users\ölasdflöfasd\Documents\Arduino\libraries\LiquidCrystal_I2C/LiquidCrystal_I2C.h:55:7: note: constexpr LiquidCrystal_I2C::LiquidCrystal_I2C(const LiquidCrystal_I2C&)

    class LiquidCrystal_I2C : public Print {


    C:\Users\kldasfkfasd\Documents\Arduino\libraries\LiquidCrystal_I2C/LiquidCrystal_I2C.h:55:7: note: candidate expects 1 argument, 8 provided

    C:\Users\kdfasklfds\Documents\Arduino\libraries\LiquidCrystal_I2C/LiquidCrystal_I2C.h:55:7: note: constexpr LiquidCrystal_I2C::LiquidCrystal_I2C(LiquidCrystal_I2C&&)

    C:\Users\kjasofji\Documents\Arduino\libraries\LiquidCrystal_I2C/LiquidCrystal_I2C.h:55:7: note: candidate expects 1 argument, 8 provided

    C:\Users\pokdsokdfs\Desktop\Drawing plotter cnc\Kod\Plotter4\Plotter4.ino: In function 'void setup()':

    Plotter4:114: error: 'class LiquidCrystal_I2C' has no member named 'setBacklightPin'

    lcd.setBacklightPin(3, POSITIVE);


    Plotter4:114: error: 'POSITIVE' was not declared in this scope

    lcd.setBacklightPin(3, POSITIVE);


    Multiple libraries were found for "LiquidCrystal_I2C.h"

    Used: C:\Users\mkldskldfs\Documents\Arduino\libraries\LiquidCrystal_I2C

    Not used: C:\Users\öldaskdfas\Documents\Arduino\libraries\jm_LiquidCrystal_I2C

    Not used: C:\Users\dasf\Documents\Arduino\libraries\LiquidCrystal

    Not used: C:\Program Files (x86)\Arduino\libraries\LiquidCrystal

    exit status 1

    no matching function for call to 'LiquidCrystal_I2C::LiquidCrystal_I2C(int, int, int, int, int, int, int, int)'

    This report would have more information with

    "Show verbose output during compilation"

    option enabled in File -> Preferences.