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.

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.

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 (white or brown) 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

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.

<p>Hi, do you need to lube the axis ? Thanks</p>
<p>Is there any difference between F623ZZ bearings and 623ZZ bearings?<br>Can i use 623ZZ bearings?</p>
yes, F stands for flange, in our case flanges help to keep the belt on the bearing.
<p>So i can't use 623ZZ bearing.</p>
<p>what to do?</p>
<p>and an M3 washer in between the two bearings.</p>
You need two of them, mounted with the flange oposite to each other and 6mm witdh belt.
<p>F623ZZ bearings are too small</p>
<p>i dont understand how are the belts conected, where can i see how the belts work?</p>
<p>asked and replied in the comments below</p>
<p>Hola misan!! Felicitaciones y muchas gracias por la gu&iacute;a!! Respecto de la modificaci&oacute;n para motores 48mm, &iquest;S&oacute;lo es una pieza m&aacute;s y d&oacute;nde ir&iacute;a agregada? Muchas gracias</p>
Es un soporte de motor m&aacute;s alto, que reemplaza al otro m&aacute;s bajo.
<p>can we use L293D Motor Driver Shield instead of cnc shield and pololu stepsticks</p>
I guess you can but you will need to find a software solution that works for you with that hardware.
<p>Hello,</p><p>Need help with servo control. M3 and M5 commands when entered manually in the &quot;Command Line&quot; of Universal Gcode Sender controls the servo OK. But the M03Sxxx command in the Gcode file regardless of the S value,just moves the servo a small click only.</p>
That is odd, can you try M3 instead of M03? Are XY moves working ok?
<p>Yes I have tried M3. XY moves seem to be working OK but I cannot be sure since I cannot get the pen down.</p>
<p>servo motor doesnt have different wires. they all are clubbed. how to connecgt it to different ports. Also please show all the circuit diagram</p>
servo motor will certainly require some extension to its wires, these do not need to be clustered together.
<p>please tell all the model numbers of the objects like arduino uno, cnc shield pololu stepsticks</p>
<p>also please give full details regarding software. </p>
<p>please give detailed circuit diagram. ur input would be very much appreciated</p>
<p>Hey!</p><p>I need a little help :) Everything works fine but if I move on X or Y axis some distance, real distance is half then I set. Also if I export gcode from inkspace I have to set 7.1 scale on both axes or final result is very small. Do anyone know where could be a problem? Here is '$$' result:</p><p>&gt;&gt;&gt; $$</p><p>$0=10 (step pulse, usec)</p><p>$1=25 (step idle delay, msec)</p><p>$2=0 (step port invert mask:00000000)</p><p>$3=0 (dir port invert mask:00000000)</p><p>$4=0 (step enable invert, bool)</p><p>$5=0 (limit pins invert, bool)</p><p>$6=0 (probe pin invert, bool)</p><p>$10=3 (status report mask:00000011)</p><p>$11=0.010 (junction deviation, mm)</p><p>$12=0.002 (arc tolerance, mm)</p><p>$13=0 (report inches, bool)</p><p>$20=0 (soft limits, bool)</p><p>$21=0 (hard limits, bool)</p><p>$22=0 (homing cycle, bool)</p><p>$23=0 (homing dir invert mask:00000000)</p><p>$24=25.000 (homing feed, mm/min)</p><p>$25=500.000 (homing seek, mm/min)</p><p>$26=250 (homing debounce, msec)</p><p>$27=1.000 (homing pull-off, mm)</p><p>$100=80.000 (x, step/mm)</p><p>$101=80.000 (y, step/mm)</p><p>$102=250.000 (z, step/mm)</p><p>$110=500.000 (x max rate, mm/min)</p><p>$111=500.000 (y max rate, mm/min)</p><p>$112=500.000 (z max rate, mm/min)</p><p>$120=10.000 (x accel, mm/sec^2)</p><p>$121=10.000 (y accel, mm/sec^2)</p><p>$122=10.000 (z accel, mm/sec^2)</p><p>$130=200.000 (x max travel, mm)</p><p>$131=200.000 (y max travel, mm)</p><p>$132=200.000 (z max travel, mm)</p>
<p>I figure it out! :) For my steppers I needed to set 1/16 step mode on pololu, so solution was to remove first two jumpers below drivers. Everything works ok now. I still need to figure out dimensions from InkSpace but I can use scale axis for it when exporting to gcode.</p>
well done.
<p>How much torque does nema 17 stepper motor need?</p>
I am using 34mm-tall stepper from an old copy machine. I'd say any nema17 motor you can get most likely can do the job. <br><br>If a figure is needed let's talk about 1Kg.cm or better.
<p>I bought 2 nema 17 stepper motor with torque 25 Ncm, I hope it works, and thank you for your instructions</p>
<p>Hi, worked your engines with 25Ncm? thank you</p>
Hello misan plz help ....everything is ok but my servo is not working properly :(
The &quot;smiling face&quot; part is mounted upside-down in yours. Servo arm lever would it up when mounted right.
<p>Hola MiSAN:</p><p>Estoy haciendo progresos con el plotter. Ya lo tengo configurado bien.</p><p>Pero el plugin del inkscape siempre me da esto:</p><p>Built gcode for image3344 - will be cut as raster.</p><p>Finished processing.</p><p>Es decir, que me hace todo el dibujo sin saltos, de una sola l&iacute;nea.</p><p>Sabes porqu&eacute; me pasa esto?</p>
Deber&iacute;as fe partir de un gr&aacute;fico vectorial. No de una imagen.
<p>Bueno, hago lo siguiente:</p><p>Importo la imagen, la doy objeto a trayecto, le doy a vectorizar mapa de bits, le doy a dev&iacute;o din&aacute;mico, y ahora me sale este otro mensaje:<br>Built gcode for path3349 - will be cut as vector.</p><p>Finished processing.</p><p>Vale, me sigue haciendo un solo trazo. (!)</p><p>Estoy intentndo hacer el perro que viene de muestra.</p>
<p>Hola misan,</p><p>Te escribo desde Argentina, te cuento que hace tiempo que con un amigo hicimos la maquina, y quer&iacute;a felicitarte por el gran aporte!</p><p>Solo tenia una pregunta, quer&iacute;a saber como hacer las firmas y las letras de un solo trazo como las del video comercial del AxiDraw, y los rostros con sombras, me encantar&iacute;a alg&uacute;n tutorial.</p><p>desde ya muchas gracias!</p>
Gracias.<br><br>Todo depende de c&oacute;mo hayas creado el archivo gr&aacute;fico. En Inkscape puedes unir varios trayectos para que sean uno s&oacute;lo.<br>
<p>Hi Misan,</p><p>Can I ask you whether/why it is necessary to power the shield through the arduino? I am now powering the shield directly from the screw terminals and the machine seems to be working fine (with your version of the firmware and no other changes). The reason I tried that is that I seem to have destroyed two arduino Uno clones (Sintron) when I was powering everything from the arduino using the soldering trick. I don't know what went wrong: the machine was working fine, but sometimes when plugging the usb in would turn my macbook screen blank and force my laptop to reboot, while permanently making the arduino invisible to the arduino IDE... Any ideas? Another minor problem/concern I have is that the servo (SG90) slowly builds up heat and eventually becomes hot, though it works fine. Your input would be very much appreciated. </p>
Hi, The way apply power makes sure Arduino is always powered when motors are powered and it does so in a way wrong polarity is ruled out. <br><br>On top of that, it helps if you plan on using it without USB (which I did through a Bluetooth adaptor). <br><br>Are you powering the SG90 with 5v? Mine does not get hot but it gets warm with use.<br><br>From the two screw terminals one is GND and is shared with Arduino. The other is 12-30V and it is independent. I use 12V for my shield and and send the 12V from the Arduino Vin pin to the shield with the soldered cable I mentioned.<br><br>Powering the shield and not the Arduino may be a bad thing when you connect the USB.
<p>Thank you! Do you know/can you guess what may have gone wrong when plugging the uno to power and the usb to my laptop, which forced laptop to reboot and permanently damage the arduino? I've checked the power supply gives const voltage ~11.8 V in operation and is only 1.25A. I've done the soldering correctly, maybe with a little too thin wire, but it did not get hot. My only guess (because on pololu clone was burnt at some point) is that a pololu clone was faulty and short-circuited something. But how did this destroy two arduinos? When I now plug those arduinos in my laptop, the arduino IDE does not even detect the port... Any clues/help? I am too afraid to try with a third arduino and the soldering trick...</p>
<p>Pololu can be mounted in two ways, if connected upsisde down it might send 12V to the Arduino and kill it (just a guess).</p>
<p>how i can change the GRBL Code ( servo pins or add some thing else ??</p>
Not easy as GRBL uses up most of available code space. You may want to got GRBL github though.
<p>yeah it seems not easy . but I need to know about ! would you give me idea about it or guide me where i can start ?! </p>
You should have a look a the issues on grbl master github repo. You may find some problems and solutions there.
<p>Everything works but the machine makes tilted lines instead of straight lines, lines are straight when checked in visualize(universal gcode sender) but the machine draws them slant</p><p>Every drawing is tilted and squeezed a bit</p><p>also it draws mirror image of what is drawn in inkscape</p><p>Note:I have CoreXY enabled and using the code from the link provided by you in the instructable</p>
If the pulleys on the stepper motors are similar and the steppers are same type both values should be equal.
<p>even tried same values, i have attached an image showing some values, everything is similar, motors, drivers, etc. have followed your list of components</p>
You need to set the right scale values for $100 &amp; $101 parameters (stored in EEPROM) for me 80 is the right value for both.
<p>Thanks</p><p>understood how to remove the squeeze but the drawing is still skewed</p>

About This Instructable




More by misan:4xiDraw 
Add instructable to: