DIY Multicolor Pen Plotter

by Aaqib Saad in Workshop > CNC

276 Views, 4 Favorites, 0 Comments

DIY Multicolor Pen Plotter

DIY multicolor Pen Plotter
WhatsApp Image 2026-06-15 at 6.48.52 PM.jpeg
WhatsApp Image 2026-06-15 at 8.13.38 PM.jpeg
WhatsApp Image 2026-06-15 at 8.13.39 PM.jpeg
WhatsApp Image 2026-04-01 at 7.52.58 PM.jpeg
WhatsApp Image 2026-06-15 at 8.13.37 PM.jpeg
WhatsApp Image 2026-06-15 at 8.22.59 PM.jpeg
WhatsApp Image 2026-06-15 at 8.17.02 PM.jpeg
WhatsApp Image 2026-06-15 at 8.13.40 PM (1).jpeg
WhatsApp Image 2026-06-15 at 8.17.01 PM.jpeg

Pen plotters are common nowadays, but they all use single pen color to plot, or you need to change pens manually. But, this multicolor pen plotter can change colors up to 8 pens automatically.

Don't worry you don't need a 3D printer to make this, nor professional cutting tools. This Arduino (grbl based) pen plotter is completely hand made using a scale, an anti-cutter, and a small drill machine.

It uses Nema 17 stepper motors with Arduino UNO CNC shield along with A4988 stepper motor drivers. The plotting accuracy and speed is quite impressive, considering hand cut parts with cheap linear rods.


In this instructables I will try to share everything I know about this plotter with a major focus on software part. Because I think the hardware part is already available on the internet. And making the axis is up to your creativity. You just need to make 3 axis linear motion. You may use linear rods or linear rods.

Supplies

  1. 4x Linear Rod 8mm - Amazon AliExpress
  2. 6x long linear bearing 8mm - Amazon AliExpress
  3. 1x Nema 17HS4401s (x axis stepper) - Amazon AliExpress
  4. 1x Nema 17HS3401s (Y axis stepper) - Amazon AliExpress
  5. 1x Nema 17HS4023 (Z axis stepper) - Amazon AliExpress
  6. 3 meter Timing Belt GT2 20 teeth, 6mm width - Amazon AliExpress
  7. 3x motor timing pulley 20 teeth, 5mm bore, 6mm width - Amazon AliExpress
  8. 2x Idler pulley 20 teeth, 5mm bore, 6mm width - Amazon AliExpress
  9. 1x Arduino uno R3 - Amazon Aliexpress
  10. 1x Arduino uno R3 CNC shield with 4x A4988 stepper driver - Amazon AliExpress
  11. M3 & M4 screws about 20 pieces each - Amazon AliExpress
  12. 1x Mg90s metal gear servo - Amazon AliExpress
  13. 12 5A SMPS - Amazon AliExpress
  14. 3x limit Switch - Amazon AliExpress
  15. 12V DC cooling fan - Amazon AliExpress
  16. 1x 5mm linear rod 100m length for mounting the idler pulley - Amazon AliExpress
  17. 4.7k resistor, 7806 voltage regulator, jumper wires, ceramic capacitors, Electrolyte Capacitor
  18. 8mm pvc board 4/2 feet


Purchase good quality bearings and linear rods. Cheap version may not be in proper diameter and causes you a bearing play.


All links are affiliated links.

Assembly Process

setup part 1

Please watch this video to understand the benefits of multicolor pen plotters and how I assembled it from scratch.

Important Notes for Making the Body

WhatsApp Image 2026-06-16 at 12.08.40 PM.jpeg
Picture2.png
WhatsApp Image 2026-06-16 at 1.27.15 PM.jpeg
WhatsApp Image 2026-06-16 at 1.27.15 PM (1).jpeg
WhatsApp Image 2026-06-16 at 1.27.14 PM.jpeg
WhatsApp Image 2026-06-16 at 12.08.39 PM (1).jpeg
Picture1.jpg
WhatsApp Image 2026-06-16 at 12.53.08 PM.jpeg
WhatsApp Image 2026-06-16 at 12.53.07 PM (1).jpeg
WhatsApp Image 2026-06-16 at 12.53.07 PM.jpeg
WhatsApp Image 2026-06-16 at 12.53.09 PM.jpeg
WhatsApp Image 2026-06-16 at 12.53.11 PM.jpeg
WhatsApp Image 2026-06-16 at 12.53.10 PM (1).jpeg
WhatsApp Image 2026-06-16 at 12.52.31 PM (1).jpeg
WhatsApp Image 2026-06-16 at 12.52.33 PM.jpeg
WhatsApp Image 2026-06-16 at 12.52.31 PM.jpeg
Picture3.png
WhatsApp Image 2026-06-16 at 12.52.33 PM (2).jpeg
WhatsApp Image 2026-06-16 at 12.52.33 PM (3).jpeg
WhatsApp Image 2026-06-16 at 12.53.14 PM.jpeg
WhatsApp Image 2026-06-16 at 12.53.15 PM (1).jpeg
WhatsApp Image 2026-06-16 at 12.53.15 PM.jpeg
Picture4.png

First of all, I don't have 3D models that I can provide you nor I have fixed measurements. I used 500mm linear rods, so the length of x and y axis is 525mm or 20 inches approximately, with motors mounts on one side and idler pulley on the other end.

Use the video reference for making the axis and you may also check my previous plotter instructables, there I have uploaded few images about the axis making. I have followed the same methods here.

The pen holder isn't perfectly perpendicular. It is slightly angled, to prevent the pen from falling. If you make the pen holder perfectly perpendicular, the pen may not stay in place. Due to machine vibration and normal gravitational force or even a gentle air may cause the pen to fall over. Moreover, the y axis is also slightly angled, proportionate to the pen holder angle. So, the machine grabs and removes the pen at an angle. When removing the pen, when the gripper is released the pen just drops and lean there.


Pen Gripper: I used Galvanized wire and inserted a cut piece of a old ball pen into the wire. Around the ball pen cut piece I superglued sand paper to make the surface rough. Use the image reference.


I have used chloroform to join the pvc pieces together. Chloroform joint is stronger than super glue because chloroform melts the pvc board joint. After drying the parts become one single piece. Another advantage is chloroform takes 10,15 seconds time to dry completely so it gives you last moment correction chance. The pieces are 20 inch long or some required precise location so that slow drying is beneficial, compared to instant fixing of super glue. If anything goes wrong you can just cut it using anti-cutter and melt the joint again with no visible clue after drying. Where in super glue there is a high chance the joint will break.


I used masking tape to precisely identify the screw hole.

Circuit Diagram

Final circuit_image.png
WhatsApp Image 2026-06-16 at 1.50.57 PM (1).jpeg
Picture5.png
Picture6.png
WhatsApp Image 2026-06-16 at 1.50.58 PM.jpeg
WhatsApp Image 2026-06-16 at 2.01.02 PM.jpeg
WhatsApp Image 2026-06-16 at 1.50.56 PM.jpeg

Hard Limit:

On each axis I have used one limit switch in the negative direction ( direction is discussed in the setup 2 video). This is a physical safety switch which tells the machine when to stop (hard limit) in the negative direction. If the switch is pressed it sends a signal to the controller and it stops.


Soft Limit:

The machine counts how much distance it can travel from the physical limit switch to the opposite direction or for my case in the positive direction safely and sets this as soft limit or software limit switch.


Limit Switch:

There are 3 pins in a limit switch. C (Common), NO (Normally open), NC (Normally closed).

We can set the limit switch in two mood. Normally open (NO) and normally closed (NC).

In normally open condition no signal/voltage will pass from C pin to NC until the stich is pressed. And in normally open condition is just the opposite, signal will always pass from C to NC pin until the switch is pressed.


1. Normally Open (NO) Configuration

  1. The Setup: The switch is wired between the Arduino pin and Ground (GND). The circuit is normally open (broken).
  2. The Voltage: The Arduino's internal pull-up resistor keeps the pin HIGH (5V) when idle. Pressing the switch completes the circuit, dropping the pin to LOW (0V).
  3. GRBL Setting: Set $5=0. GRBL watches for that LOW signal to trigger the alarm.
  4. The Catch: Not fail-safe. If a wire breaks, the system won't know, and the machine will crash.


2. Normally Closed (NC) Configuration

  1. The Setup: The switch is wired between the Arduino pin and GND. The circuit is normally closed (continuous).
  2. The Voltage: The constant connection to GND holds the pin LOW (0V) when idle. Pressing the switch opens the circuit, allowing the internal pull-up to snap the pin to HIGH (5V).
  3. GRBL Setting: Set $5=1. GRBL watches for that HIGH signal to trigger the alarm.
  4. The Benefit: True fail-safe. If a wire breaks or unplug, the circuit opens, and GRBL instantly triggers a safety halt.


For safety I am using NC configuration. But, Whatever configuration you use I suggest you to use an external pullup resistor to minimize falls trigger. Arduino's internal pullup is 20k which is very small and outside noise can easily overpass this small positive voltage and cause a hard limit alarm. Using a 4.7k resistor pullup resistor between the 5V and limit input of Arduino filters most of the high frequency noise.


I initially didn't used a external pullup resistor, as a result whenever someone press the door bell hard limit appears, also when I unplug or plug in a AC table fan connected to the same port where my computer and 12v SMPS are connected causes a hard limit alarm. Even when I pull the fan lever to change its speed also caused me a hard limit falls alarm also the real time serial communication also hampered. This is very irritating. Then I used external pull up resistors in all the limit input pins along with 100nf ceramic capacitors (don't use a high value as it will slow the response time). Now 95% of the problem is solved.

I also recommend you to try a ferrite core USB extension cable. The electrical noise may enter from the USB cable connected to the computer, a ferrite core will absorb that.


Setting current limits for the motors

Watch this YouTube video to understand how to set the output current limit of the A4988 driver. The A4988 can provide up to 2 A of current per coil with proper cooling. Setting the correct current limit is crucial: too little current can cause the motor to lose steps under load, while too much current can cause the motor to overheat.

Since our Z-axis motor is small, we must limit its current; otherwise, the coils may burn out. Additionally, I have used hot glue to mount the Z-axis motor, and excessive heat could melt the glue.

I am running the X-axis at 75% of the motor's rated maximum current, the Y-axis at 60%, and the Z-axis at 20%. These percentages are relative to the maximum continuous current that each motor is designed to handle, not the maximum output capability of the A4988 driver.


The a4988 drivers get too hot when operating, resulting ampere fluctuation to the motor coils. use a fan to cool them down.

Basic Grbl Settings

Setup part 2

In this part I have discussed primary settings of grbl.

Download the folder named "Final Software" from my drive link and follow the steps mentioned in the video.

Additionally you need to download Arduino IDE. The version doesn't matter. I am using version 1.8.18.

Multicolor Setup

Setup Part 3

After finishing basic grbl settings, this part discusses how you will setup the automatic pen changing mechanism practically.

Plotting Your First Potrait

Plotting potrait
IMG_20260509_221342.jpg

I suggest you to just keep the necessary colors in the tool table. If you need orange and blue just keep these two colors in the tool table and remove the hex files of the remaining.


To plot something, you can directly import a svg file or import any jpg image into the grbl plotter software and the software will automatically generate a g-code.


Limitations of plotting


1.

When an image contains very fine details, subtle shading, or many colors packed into a small area, the plotter may use all available pen colors throughout the image. This often results in thousands of tiny overlapping dots, even in areas where only one color is needed.

For example, imagine plotting a traditional Bengali saree with intricate patterns. A section may primarily contain a beautiful red pattern with a small amount of blue shading. The plotter might first draw the red pattern correctly, but then use blue micro-dots on top of it. These overlapping dots can blur or partially hide the red pattern, reducing the overall quality of the artwork.

To improve the result, you can separate the colors and edit the G-code manually.

Step 1: Save a Backup

Copy the entire G-code into a text editor such as Notepad and save a backup copy.

Step 2: Separate the Colors

Look for lines that start with commands such as:


T06

These commands indicate a pen/color change. Separate the G-code for each color into its own text file.

Step 3: Copy the Header

Each new color file must contain the original header from the beginning of the G-code. It will look similar to:


G54 (Setup - GCode-Header)
G90
G00 Z0.000

Copy these header lines to the top of every color file. This ensures each file can be run independently.

Step 4: Create Individual Color Files

After separating the color sections and adding the header, you will have several independent G-code files, each responsible for plotting a single color.

Step 5: Inspect the Preview

Load one color file into your G-code plotter software. The preview will show the areas that will be drawn by that color, along with the X-Y coordinates.

Step 6: Remove Unwanted Areas

If a color is being used in a region where it is not needed, locate the corresponding coordinate commands in the G-code and delete them.

Save the file and reload it into the plotter software to check the preview. If unwanted marks are still visible, repeat the process until the preview looks correct.

Important Note

There is no fixed rule for deciding which G-code lines to remove. It usually requires some trial and error. After a few attempts, it becomes much easier to identify and remove the unwanted portions.

Helpful Tip

The machine plots from right to left along the Y-axis. Because of this, rotating the image before generating the G-code can sometimes make the color sections easier to identify and edit, saving a lot of time during manual cleanup.


2.

The second issue I faced is with controlling the image dimensions and placement. When uploading an SVG file directly into the G-code plotter software, I have very limited control over the scaling and positioning of the image.

With my previous plotter, I could easily create any design in Inkscape and precisely control the drawing area according to the plotter's X and Y axis travel limits. For this plotter, I tried setting the Inkscape page size according to the machine's working area, but when I imported the SVG file into GRBL Plotter, the software generated its own dimensions instead. This means I have almost no control over where the image will be plotted. The only available option is to adjust the X and Y offset values to move the image within the plotting area.

I also tested this by creating a simple drawing in Inkscape with multiple colored lines. After saving it as an Inkscape SVG and importing it into GRBL Plotter, the software failed to recognize the colors correctly. I am not sure whether this is due to my limited Inkscape knowledge or a limitation/bug in the software.

Another problem is that some SVG files allow me to select the entire image and easily resize or rotate it. However, other SVG files are imported as thousands of separate objects, making it impossible to select, rotate, or resize the complete design at once. I tried grouping the paths together in Inkscape, but it did not solve the problem.

I also searched for third-party Inkscape extensions that could directly generate G-code from Inkscape, but unfortunately, I could not find any that worked reliably. This lack of a proper SVG-to-G-code workflow is a major limitation of the current setup.


To summarize this plotter can mostly draw images, importing custom svg file is a big headache.


If you guys know a solution of these problems, please let me know. Not having proper control over svg file, restrains the full potential of this plotter.

Rainbow Section

IMG_20260611_181254.jpg
Phoenix Bird

This is a special segment for the Colors of the Rainbow Contest.


Here I tried to integrate major colors of a rainbow to draw a phoenix bird, a legendary symbol of renewal and transformation. In the heart of the robot is the instructables robot, signifying harmonious correlation between technology and art.

At the bottom there is a prism. The bird is rising beautifully from its own ashes in a sense that, in physics, a prism takes invisible white light and refracts it, splitting it into the brilliant spectrum, we see as a rainbow.

Design Limitations and Future Upgrade Scope

One side of the Y axis has no linear support except a cabinet wheel to support its weight. So due to rapid movement of motors, the y axis vibrates. Which is not a good thing. In future upgrade I may use another linear rod and bearing to support the linear movement of the y axis.


The x axis height can be reduced, resulting a lower z axis, providing better stability and less vibration.


Lastly, I have plan to operate the plotter remotely and make it voice controlled, maybe through using an Esp32. For example: if I say draw a red circle of 5 inch radious, the esp 32 will convert the speech to text then a python program will generate the gcode and the esp 32 then finally send the gcode to the arduino.


But for now, I am not sure if this is possible or how to implement this. Please guide me.


To conclude, although it has few limitations in the software part, this type of multicolor plotters are a exception in traditional single pen plotter.


Happy plotting...