How to Turn Your 3D Printer into a Plotter in One Hour

Teach Your 3D Printer How to Draw and Write on Paper with Pens, Color Pencils, Crayons and More! 🖍

Building a plotter was on my list for a long time. A plotter is a device that can draw text and pictures on paper using a pen. A few weeks ago, after fellow Israeli makers built a small plotter from old CD drives, I decided it was finally time to build my own plotter.

I sat down and started planning the hardware, when I suddenly realized that there might be a nice shortcut — my 3D printer already includes all the hardware and electronics I need, I just need to figure out how to attach a pen to it and how to tell it to draw.

One hour later I had a working prototype. It was much easier than I initially expected. In this blog post you will learn how you can make your own printer draw.

This will be your 3d-printer’s first drawing! 📝

Turning a 3D Printer into a 2D Printer 🖨

You might be wondering what is the utility in turning a 3D printer into something that can draw 2D pictures on a paper. After all, conventional printers do that for several decades already, isn’t that a step backward?

First, who said everything I make has to be useful?

Second, a plotter allows you to draw with pen, colored pencils, crayons, markers, and even a quill. Basically everything that can leave marks on a piece of paper. You even draw on different materials, such as cardboard or glass. You can also get creative with unique ink types, such as golden, silver or glow-in-the-dark —you name it.

Step 1 — Attaching a Pen

You want to reliably mount a pen to your printer’s head and ensure that the tip of the pen goes a little below the nozzle. I started by designing a small part of this purpose. It clips to the printer’s head, and I use a small M3 screw to fix the pen to it:

You can get the model here. It should fit any Creality Ender-3 or CR-20 printer, and possibly other Creality printers. It is also customizable, so you can tinker with the dimensions (if you want to fit a larger marker, or need a tighter fit with the printer).

For other printers, you will need to design your own mounting mechanism (when you do, please share a link in the comments). While is it also possible to use screws for mounting the pen, I personally prefer the clipping mechanism as it allows me to switch between 3D printer and plotter modes really quickly, and also change pens really quick.

Step 2 — Calibration

Once you have successfully mounted your pen to your printer, it’s time to calibrate it. You will need to attach a piece of paper to your printer’s bed:

Pen mounted, paper attached, ready for your command!

Next, you will need to find the correct height for printing. I recommend using Repetier Host for this (I initially started with Cura, but Repetier Host made everything much easier, so I will stick with it for this tutorial).

Before starting, make sure your printer’s bed is level and that both the nozzle and the printer bed are cool.

After homing your printer, go to the “Manual Control” tab inside Repetier, and move the print head up until the tip of the pen goes above the paper. Then, move your X / Y axis to the edge of where you want your drawing to be. Finally, move the Z axis down in 0.1mm increments, until you see the tip of the pen touching the paper. You can then move the X/Y a little and check that the pen actually leaves a trace on the paper. When done, note the X/Y/Z values that appear in the top line:

Calibrating your pen position in Repetier Host.

In my case, the values were 47 for X, 40 for Y and 14.6 for Z. We will use these values shortly when we generate the GCode file for printing.

Step 3— Choosing a what to print

That’s a tough one. So many options. You will need to get it in vector format, though — so if you use Google Images, add the text type:svg at the end of your search query. You can also convert JPEG and PNG images to SVG, but I’d suggest to start with something that already comes as a vector to make things simple.

The printer-plotter in action!

Step 4 — Generating GCode

When I started this project, I thought I was going to spend some hours on getting the hardware right. I was surprised how quickly I got the hardware part working. The software was, however, a completely different story — as always, software is where the real complexity lies.

After spending several hours on research, I finally found a workflow that works pretty reliably, though, it requires some setup. Other than Repetier Host mentioned above, you also need to get Inkscape (which is, by the way, also useful if you want to create PCB art!).

Inside Inkscape, create a new file and go to File menu Document Properties (Shortcut: Ctrl+Shift+D). Then set the document size a little smaller than your print bed size, and also make sure you use mm for the units.

Once you have set the size, you can import any SVG file that you like, or simply draw some text using the Text tool:

When done, with the text still selected, click on Path menu → Object to Path (Shift+Ctrl+C). This will convert the text into a series of points connected by lines, which is required for feeding into the printer. You can add more elements such as spirals and star shapes, repeating the “Object to Path” operation for each:

When printing, objects won’t be filled, so you may want to remove their fill color and set their stroke color to black (or whatever color your pen is), so you get a more accurate representation of the final result. Select all the objects (Ctrl+A) and then remove the fill and apply black color for stroke (Ctrl+Shift+F):

Set the stroke paint color to black

When you are happy with the result, it is time to generate the GCode for the printer! We will use an extension called “Gcodetools”, which comes bundled with Inkscape (if not, you have an older version and need to upgrade).

We will start by defining the Orientation Points, which tell the printer how to map the lines on screen onto the paper. Go to Extensions Menu → Gcodetools → Orientation Points… and after making sure “2-point” mode is selected click Apply and then Close. You should now see two new text elements added at the bottom of your drawing:

These are the Orientation Points. Each point is a list of X, Y, Z coordinates that specifies the target location of that point in the Printer’s coordinate system. You need to edit them to match the X / Y you found in the calibration step, and set the Z (the third coordinate) to 0.

Edit the text on the left point and update it to contain the X / Y coordinates that you found. In my case, it was (47; 40; 0). For the right point, add 100 to the X value, copy the Y/Z from the first one, e.g. (147; 40; 0):

Next, we need to generate a tool and configure its speed. This step is optional, but if you don’t do this, your printer will draw really really slow. Go to Extensions menu → Gcodetools → Tools Library…, and select “default” in “Tool types”:

Click Apply and then Close, and you should see a green rectangle with a lot of settings added to your drawing:

You can move this rectangle away (together with all the values) so it doesn’t come over your drawing. Then, you want to edit the text and change the values for “Feed”, “Penetration Feed”, “Passing Feed” to set the movement speed of the printer when drawing. I use 4500 for all of them (the unit is mm/min, so this value corresponds to 75 mm/sec).

We are finally ready to generate the GCode! Select all the elements in your drawing (Ctrl+A), and go to Extensions → Gcodetools → Path to Gcode…

There, go to the Options tab, and set “Scale along Z axis” to 1, and “Offset along Z axis” to the Z value that you found in the calibration step, minus one (I found 14.6, so I set it here to 13.6):

Next, go to the Preferences tab, and set the name of the output file and the path of the directory when you want it to be saved. You can also set the Z safe height to a lower value, to speed up the print (I use 5):

Finally, switch to the Path to Gcode tab, set the Depth Function to 1 and click Apply. It will take a few seconds and might spit a warning about no paths selected which you can safely ignore. You should see a new layer on top of your drawing, showing the moves of the print-head in the generated Gcode file:

At this point, I suggest opening the .gcode file in a text editor and verifying that the it looks legit — especially that the Z values there match the calibration value that you found:

Generated GCode! Note the Z value is 14.60000 here

I also suggest editing the first G00 line and adding F4500 at the end, otherwise, your printer might make the initial head movement really slow:

That’s it! You are ready to print. Load your Gcode file in Repetier host, and you should see your drawing on the screen:

Say your prayer, click the “Start Print” button and… enjoy the show!

Congratulations! 🎉

Your 3D printer now also doubles as a plotter. You can take it one step further and experiment with the different settings of Gcodetools — for instance, you can configure it to change the height of the pen according to the color of the line, thus making the plotter draw thinner/thicker lines. You can also use the “Area” function to fill shapes instead of just drawing the outline. ⭐

Please keep experimenting and try different types of pens and materials, and post you results in the comments — I’d love to see how far you can take this!


This is my 5th post in my Postober challenge — writing something new every single day throughout October.

I will tweet whenever I publish a new post, promise! ✍