Introduction: 4xiDraw

This project was inspired by a commercial product called AxiDraw that I saw a video of recently from Evil Mad Scientist Laboratories.

It was a combination of reasons that made me consider to do it myself, cost, availability and customs playing a role in the equation (that, and having a 3D printer at home).

This is just a drawing machine quite similar a to a pen plotter but that can adapt to any size of document and any type of paper.

It can use regular felt-tip pens, ball pens or fountain pens as pen orientation is variable. It is a new version of an XY plotter using a single belt and two stepper motors in a configuration called h-bot.

Step 1: What You Need

I started the project using laser cut parts but eventually evolved the model to 3D printed parts. So you can grab the STL files of the printed parts from here or here.

Bill of materials

  • 2 nema 17 steppers (*)
  • 4 8mm smooth rods (two 400mm-long and two 320mm-long)
  • 8 LM8UU
  • 2 20-tooth GT2 pulleys
  • 10 F623ZZ bearings
  • 1 micro servo SG90 (plus a 250mm cable extender)
  • 1 Arduino UNO
  • 1 CNCshield
  • 2 Pololu stepsticks
  • 1 GT2 belt ( 1.4 meters long )
  • 2 M10 threaded rods (400mm-long each)
  • 8 M10 nuts
  • 8 30mm M3 screws with nuts
  • 8 6mm M3 screws
  • 4 16mm M3 screws with nuts
  • 4 M3 washers
  • 2 4mm OD, 100mm-long carbon fiber tubes
  • 2 15mm M3 screws
  • 1 12V 2A power supply
  • 1 USB cable
  • 1 felt tip pen (or many for more fun)

(*) Stepper motors should be 40mm or shorter, unless you chose the taller parts that I later created for some users willing to use 48mm tall steppers (like many use for 3D printers).

Step 2: Assembly

There is a live 3D model you can see for yourself in here. The explode feature may give you an idea of what is inside of another part. Or you can download STEP model or access Onshape CAD design from Thingiverse.

I recommend the following building sequence:

  1. Slide two LM8UU in each of the two longest smooth rods.
  2. Slide the rods into the motor pieces, one on each side (leave an extra 20mm of the rods in one of the two sides protruding from the part towards the motor, this will later be used for supporting the Arduino holder).
  3. Insert the M10 treaded rods so each one supports one side of the motor-supporting pieces using a nut on each side (total 8 M10 nuts).
  4. Mount the nema 17 stepper motors on the two big plastic parts using 8 M3 screws (8mm long).
  5. Insert 8 M3 nuts into the nut-holders in the bottom squared carriage and place it supporting the LM8UU linear bearings you inserted in the long smooth rods already installed.
  6. Take the remaining (shorter) two smooth rods and insert two LM8UU linear bearings on each one of them.
  7. Insert the two endY parts on each end of the pair of smooth rods. Now you have the second axis done.
  8. Insert the top square carriage over the 4 linear bearings of the shorter smooth rods.
  9. Insert 4 M30 30mm-long screws in the 4 central holes of the top square carriage, put the carriage upside-down carefully so the head of the screws will lay on the table and the screws will point upward.
  10. Insert one F623ZZ bearing with the flange down, next an M3 washer and finally another bearing but now with the flange up) into each one of the four screws of the top square carriage.
  11. Use a post-it or a similar-size piece of paper to press it against each one of the screws protruding so paper is perforated and is pressing against the top of the bearings. The goal is for this paper to hold them in place while we put the whole thing upside-down preventing the bearings to fall off.
  12. Place the top carriage over the bottom carriage so the smooth rods on the top form a right angle with the bottom smooth rods.
  13. Screw lightly each one of the four M3 screws and once you notice each one is attached to the nut in the bottom tear the post-it paper apart. Next finish tightening the screws and add the other 4 M3 30mm screws that do not have a bearing but add strength to the union of top and bottom parts of the carriage.
  14. Place one GT2 pulley on each stepper motor but do not tighten the grub bolt yet.
  15. Place a pair of F623ZZ bearings with an M3 washer in between fixed with an M3 screw in the end Y part that will support the servo part.
  16. Insert the belt all along its path (the crossings of the central carriage are a bit tricky). And once pulleys are aligned with the belt tighten the grub screws on each one.
  17. Use two M3 screws and two nuts to attach the servo support part and later add the microsevo using the two screws that come with it.

  18. Make sure the vertical two holes in the servo support part are 4mm diameter and that the carbon fiber tubes can be inserted into them (if not, drill the holes with a 4mm drill bit). Insert both tubes from the top but only mid way. And next insert from the top the vertical carriage (the one that looks like a smiling face). Gently push it down till you can insert the remaining half of the carbon fiber tubes so they are inserted into the bottom holes of this carriage.

  19. Using a couple of M3 screws and nuts fix the pen-holder part to the vertical carriage.

  20. Push the Arduino holder into the protruding smooth rods on one of the stepper motor holders. Use a couple of M3 screws to attach the Arduino board to the plastic holder.

Congratulations, the mechanical assembly has been completed.

Step 3: Load Arduino Firmware

This project uses a special flavour of GRBL software created by robotini user. It enables GRBL to handle a servo on digital pin 11 using commands M3 and M5. This way it can raise and lower the pen on the paper.

Installing the software is better explained here, please read it carefully as some people may find it difficult as is not the typical Arduino program (in essence the code is created as a library).

How do you know it is all working?

You can connect using the Arduino Serial Monitor to your board at 115200 bps and a welcome message: grbl 0.9i ['$' for help]

Step 4: Wiring Everything Together

Before inserting the CNCShield over the Arduino you want to do this trick, that will allow to power everything from the Arduino power jack. Failing to do this connection from Vin to + header on CNCShield most likely will make your servo not to work properly.

On top of Arduino you insert the CNCShield board and on top of it, two of the Pololu StepStick stepper driver boards. But before inserting these two boards for axis X and Y, make sure you put three jumpers in the headers (that will later be obstructed by the Pololu carrier boards).

A three-wire cable will be coming from the servo and two four-wire cables come from the stepper motors.

Servo cable has to go to (red) +5V, (black) GND and signal (white or brown) to Digital pin 11. Servo cable is too short, so an 250mm extension cable will be needed.

Each stepper motor goes to X and Y axis four pin headers on the CNCShield.

There is an optional improvement: make the plotter wireless by adding a Bluetooth module, but I would only do this once everything else is up and running.

Step 5: Computer Software You Need

There are two types of programs to use in your computer (until someone creates one that does both): one for creating the code for a given graphical design. And a second program to send the code just created so the plotter will draw it on paper.

For the first part I use Inscape free vector drawing program with a plugin I hacked. Install may be a bit tricky for the non tech savvy user.

For the second part I use UniversalSerialGCodeSender Java program that allows you to load the file created with Inkscape and send it to the plotter.

You want to setup the proper scale for your machine, but that is not stored in GRBL firmware but on the Arduino UNO EEPROM memory. So you will need to set that right before starting to draw. (Following text comes courtesy of Erivelton user):

  1. Access from the terminal (commands tab) of the Universal Gcode Sender, the settings of your firmware by typing $$
  2. Check the parameters $100 and $101. They define how many steps are required for the machine to go 1mm.
  3. Considering that you used a 200-step motor, a 20-tooth pulley, and the GT2 belt (2mm pitch), the correct values for both parameters would be 80.
  4. If they are not with these values, type “$100=80 + Enter” on the terminal to adjust the X axis. Type “$101 = 80 + Enter” to adjust the Y axis.
  5. Ready, your machine will now draw exactly the same dimensions as your Inkscape drawing :-D

Update: Torsten Martinsen has brought to my attention his work on another plugin that will take care of sending the drawing to the 4xiDraw from within Inkscape software, so no need for UniversalSerialGCodeSender nor for another plugin this way. You can get his plugin here: https://github.com/bullestock/4xidraw

Step 6: Final Touches

I think this a fun project can easily take a weekend to get it done (depending on your skills).

This is my first instructable and I can see there is yet much more that could be said about the details of the project, but once the basic stuff has been laid out I would try to improve it by addressing user comments.

And if you would like to say thanks in ways different than a comment, you are welcome.

Robotics Contest 2016

Participated in the
Robotics Contest 2016

First Time Author Contest 2016

Participated in the
First Time Author Contest 2016

3D Printing Contest 2016

Participated in the
3D Printing Contest 2016

27 People Made This Project!


  • Toys & Games Contest

    Toys & Games Contest
  • Big vs Small Challenge

    Big vs Small Challenge
  • Fix It Challenge

    Fix It Challenge



Question 6 days ago

Hello! First off, this is a wonderful project, and I am very happy to see you are actively answering questions! I'm going to gather the parts to build this soon.
I was wondering about the motors and the power supply -- most 12V steppers I find are rated 1.5-1.7A or above, and including the servo, I imagine all together they will draw somewhere between 3-4A when running. However, you suggest a 12V 2A power supply -- are the steppers you used rated below 1A? I am thinking of getting some steppers which are 1.5A-ish and then getting a 12V 3A or 4A supply.
Additionally, I have an idea for a modification to this machine -- a spring-loaded holder for the pen which will ensure an even pressure on the surface. When I have built the main thing I will prototype some designs.
Thank you!


Answer 2 days ago

Do not buy steppers rated for 12V but for 3-4V only. Drivers will not go beyond 1.2 A but that is not a problem. Do not worry, 2A supply is ok. As coils return some of the current back to the supply and total consumption is not the addition of the current over each coil. However, some servos may cause a significant current draw, but still, it is such a short time that I have had no trouble with 12V/2A supplies. Plus steppers will mostly be operated at just 0.7 A or so, as once you get them strong enough, any additional power is just dissipated as extra heat with no added advantage.
The spring idea is hinted at in some of the graphics/CAD but just gravity causes a constant force too if z-carriage moves smoothly up and down.

That said, feel free to experiment and report back what works best for you.


Question 10 days ago


Everything got working but after a while (1-2 weeks) my servo stopped working. I ordered a new one and same story.. Is there something I'm doing wrong? Maybe not enough amps? I use a 12V 2A adapter like you said.


Answer 10 days ago

Hi, While servos do die over time, aging is mostly caused by the brushes of the motor giving up the ghost. And that is connected with the number of cycles (if a drawing has many page-up/page-down commands it induces higher wear than those with just a few of these moves). My experience has been so far that a servo works for months (but as I said, it might be dependent on the drawings too). Please note that these $2 servos are cheap for a reason :-)


12 days ago

solution Info for range problem with inkcape plugin

i build a larger Version of the 4xiDraw. And got the Message:
"Warning: 4xiDraw movement was limited by its physical range of motion.
If everything looks right, your document may have an error with its
units or scaling. Contact technical support for help!"

At some point the drawing was cutted while plotting.

I changed $130 and $131 to get bigger physical range. Doesnt help.
i changed the Document properties and SVG Scaling in Inkscape. Doesnt help.
i searched for a solution but only found open issus for it.

So i reverse engeneered the code.

1. Go to your inkscape directory
2. open fourxidraw_conf.py
3. change


to your physical size.

Even if the comment in the file says "The values listed here are ignored when called via Inkscape." !!!!IT´S A LIE!!!!! It matters!

If i helped someone, please say "thank you" :D



Reply 10 days ago

Thanks BerndNeuhauser, I am sure that infor will be useful for other users.


Question 11 days ago

It is somehow possible to use a drag knife (with the plotter) for cutting vinyl?


23 days ago

Hi Nice work. I have rebuild this plotter. I use the linked inkscape extension https://github.com/bullestock/4xidraw . But my device is not going to home posion 'after' and 'before' plotting. What have i done wrong?

$0 = 10 (step pulse, usec)
$1 = 25 (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 = 0 (hard limits, bool)
$22 = 0 (homing cycle, bool)
$23 = 0 (homing dir invert mask:00000000)
$24 = 25.000 (homing feed, mm/min)
$25 = 500.000 (homing seek, mm/min)
$26 = 250 (homing debounce, msec)
$27 = 1.000 (homing pull-off, mm)
$100 = 100.000 (x, step/mm)
$101 = 100.000 (y, step/mm)
$102 = 250.000 (z, step/mm)
$110 = 5000.000 (x max rate, mm/min)
$111 = 5000.000 (y max rate, mm/min)
$112 = 500.000 (z max rate, mm/min)
$120 = 1000.000 (x accel, mm/sec^2)
$121 = 1000.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)


Reply 23 days ago

Home is to be done by hand before powering up the device, as no end stops are used. But if is possible to add them if you want (as GRBL can handle them).


Reply 23 days ago

Done by hand? So, after every drawing i have to push the maschine to its starting position manually? :-(


Reply 22 days ago

I suggest that you add a G0 X0 Y0 at the end of each drawing so the machine will get back to the home location on its own. You only need to position it at home by hand at power up.


Reply 22 days ago

But homing in between plots is not really needed as the machine will keep its location right. Still, you might want to go home to make the change of sheet easier.


4 months ago

This is a comment listing something of the things I did to get more accurate plotting. I hope it will be of help to others.

The following assumes you're managing to plot *something* but you're
getting misalignment, suggesting that steppers are losing steps

For testing plot quality, I suggest you use the Inkscape 4xidraw plugin (this now works with Inkscape 1.0.x) and look at the files in "examples/test and cal". Start with "GridTest.svg" - you could even edit that and make a document with a single square grid for quick testing. The square grids with varying gaps between lines are good proxies for overall quality. If you have that working reliably, try "PrecisionTest.svg" - if you can plot that correctly, you are in a good place.

* Basic check #1: is your central carriage screwed tightly enough to be rigid, so rods aren't going to flex?

* Basic check #2: are your stepsticks firmly pressed in to the cnc shield? Even a surprisingly small gap here can cause dropped steps - I was hit by this at one point when trying out various microstep settings (see below)

* Basic check #3: speed and acceleration - look at your GRBL settings for $110/111, $120/121. I managed to get a correct plot at values of 5000, 1000 respectively. You may have more luck at lower levels but this kind of speed should be achievable. I have personally found that cutting speed/accel to below 5000/1000 didn't make much difference once I had sensible tension and didn't have anything over-tightened (see below).

* Basic check #4: checking your "home" definition - if your plotter shifts along a little every job you start then look at your GRBL response to command for $# - if this gives non-zero values for G54 (your default coordinate system) then you'll get creep on each plot. For some reason I had this in my setup. I ran "G10 L20 P1 X0 Y0 Z0" to zero this - for more, see https://wiki.shapeoko.com/index.php/G-Code#Using_...

* Basic check #5: if you're getting occasional slippage in your drawing, check if your 4xidraw is shifting around slightly? Make sure it's firmly footed on whatever surface you're running on. I spent ages trying to figure out why I was getting apparent slippage when the Y-axis was at full stretch, and realised that the increased leverage was making the 4xidraw move about just enough to account for the difference. Best way to be sure is have it on a board and mark the position, perhaps using some double-sided tape to keep it still..

* Basic check #6: is your table top firm? I was running on a thin board on some industrial shelving, and it bowed slightly when the main unit was in the middle. The result was extra pen drop. I'm now running on a rigid board, which has got rid of that problem.

The remaining ponts are all along the same lines - maximise the torque of your steppers relative to the friction of the 4xidraw. Each of the below changes caused a noticeable improvement in the quality of the plots.

* Reduce unncessary friction #1: You need enough tension on your driver belt to hold everything together reliably, but you don't have to get everything as tight as you can pull it. Indeed having more tension than you need will almost certainly be counter-productive as it will increase the torque required from your steppers, making it more likely you'll lose steps. I had the timing belt far too tight to begin with from fear of backlash, but eventually realised I get best rests when there is enough tension to hold something in between the end-Y part and the tensioner (I use coins), but not so much tension that the freedom of movement of the carriage is substantially impaired

* Reduce unccessary friction #2: Another thing to avoid over-tightening is the bolt in step 15 that holds the flanges to the underside of the pen carriage. If this is screwed too tightly, it will substantially increase the friction when tension is applied to the timing belt. You can tell if this is the case because the central carriage will be harder to move in the direction that requires the belt to move around those flanges

* Maximise stepper torque #1: Make sure your current limiting is feeding the motor enough current - but not too much! You should set the potentiometer on your stepstick without motors attached - the stepstick vendor will have instructions on how to do this - use a multimeter with one probe on the potentionmeter and one on a ground pin, and use their rating to translate between voltate and the resultant current. I originally forgot to do this on my Reprap a4988 stepsticks, which came set to the minimum, so current was way too low at 0.65A for motors rated at 0.95A. I ended up maximising the current - at 0.85A this was still under the rated level for my motors, but things were much improved. I then got stepsticks with more capacity (misan likes Pololu A4988, I ended up using DRV8255, both have better capacity than reprap, and one may work better with your motors than another) - and found that running the motors at (very slightly under) max rated current made another dramatic difference.

* Maximise stepper torque #2: microstepping reduces noise, but also reduces torque - for the degree to which this happens, see article at https://hackaday.com/2016/08/29/how-accurate-is-m... I found progressively better results on my (somewhat under-powered, 0.9 degree) steppers going from 32-microsteps down to 2-microsteps: at each change I found the quality improved - finally at 2-microsteps I got the image shown - perfect alignment. Note that you will need to adjust GRBL settings for $100/101 proportionally with your microstepping changes to keep the plot size constant (less microsteps <=> less steps required to move a mm).

* Maximise stepper torque #3: consider buying better motors! I've now tried out the ooznest nema17s from https://ooznest.co.uk/product/nema17-stepper-moto... - the torque for their 40mm version is at least double what my previous motors (harvested from another project) support. On my previous motors I could get the precision test passing, but had to run at only 2 microsteps. The new motors can manage the precision test at 32 microsteps.

Once precision is achieved, then if you want to do multi-colour plots, this will be a lot easier if using 3d printed pen holders that replicate the grip of a pen lid, to enable swapping pen colours without moving the carriage or having to recalibrate height. For Sakura Gelly Rolls (good on black paper), stacked cylinders with mm dimensions (internal radius, height) of (4.4, 5)(4.2, 5)(4.95,95) work for me to replicate the grip of a pen top.


Reply 23 days ago

Nice work! Basic check #4 : my device is not going to home posion 'after' and 'before' plotting. What have i done wrong?


Question 6 weeks ago

Hello, I finally got it working but I have problems with generating my gcode. I always get this message. When I ungroup it, it still says it, no matter what I try, I still get this message. Can you help me out please?

Schermafbeelding 2021-03-19 om 15.38.19.png

Answer 6 weeks ago

It sounds as if one component of your groups cannot be converted into Gcode.


Reply 6 weeks ago

If I open the gcode file it's empty so it looks like all the components won't convert to Gcode. Am I doing something wrong in Inkscape or my svg?


Reply 6 weeks ago

Does your SVG file contain lines? A picture needs to be vectorized first.


Reply 6 weeks ago

it's filled with lines like this:
y2="112.6827" />

2 months ago

Hello, I made the plotter and have some problems getting movement in the stepper motors. As you can see in the video every time I start the steppers start vibrating like crazy but don't realy move at all. How can I solve this? I don't know if this is a software or hardware problem, I succeeded installing the grbl files and established a connection with Gcode platform and I think I have my wiring right so I dob't really know where to start.
Also, my servo doesn't function as well, how can I resolve this?
Thank you very much for your help!