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.

<p>Thanks Misan for this great project!</p>
<p>Thanks and congrats on your working unit.</p>
<p><br><iframe allowfullscreen="" frameborder="0" height="281" src="//www.youtube.com/embed/GthY-ipk7Ys" width="500"></iframe></p>
<p>Great job Miguel.bi, and thanks a lot for sharing it.</p>
<p>Hey , please can you upload some pics in detail ?</p>
<p>If it can serve, in a few days I will publish a videotutorial (in English), with step-by-step assembly.</p>
That is going to be great. Thanks.
The NEMA 17 stepper recommend 1,8&ordm; or 0,9&ordm; ?
I have only used 1.8&ordm; but I cannot think of a reason of why 0.9&ordm; won't work.
<p>Thanks Misan.</p><p>What precision is achieved with 1.8&ordm;?</p>
<p>I would say better than 0.2mm but math can fool you into thinking you can do much better. On the other hand, using a single belt for the two axis can make repetitivity poor unless you manage to get a very rigid structure. I won't use this for any high precision operation. </p>
<p>Hi, can I ask you for contact on the guy who made the 4xidraw plugin for Inkscape? It throws errors on me and I would like to discuss it with him, Thank you very much :)</p>
<p>Nevermind, I debbuged it myself. There was a problem with board addressing, the code had few typos. Working flawlessly now.</p>
Can you tell me how to correct it? I am facing a problem which says &quot;failed to connect to 4xiDraw :( &quot; . i have installed pyserial 2.7.
<p>I have the same problem, have you solved it yet?</p>
Torsten says that it doesn't work for windows currently and needs to be fixed
<p>That piece of information I did not know. Thanks for sharing it.</p>
<p>I was using Linux Mint and it had a problem with USB (/dev/tty0) addresing. I had to change code a little bit to correctly address the board. It was displaying the very same error, but I am not sure how to fix it for Windows.</p>
Great to know. I assume it is Torsten's code. His github is posted so you can create an issue for him in there.
<p>How do i set the home position in inkscape. I.e which corner of the page so that i can place my machine homed manually in that corner?</p>
SVG coordinates (down is Y+) work opposite of cartesian coordinates (down is Y-) https://www.sarasoueidan.com/blog/svg-coordinate-systems/<br><br>Depending on your plugin used that is kept or flipped. If your image is not right but the mirror image then you can flip it on Inkscape before printing it. For me, home is bottom left corner for my paper page but top left corner for inkscape.
<p>Thank u for your respond, </p><p>I uploaded Grbl several times (yours as well). Will try again.</p><p>Can you tell me, please how to edit conf.h (which program) to save changes. I've been using Notepad++, and unslash coreXY save settings, uploaded to arduino few times with same result.</p><p>Can u tell me what editor are u using?</p><p>Thank you.</p>
My version should not need any editing as it is already configured properly.
<p>Servo motor also dosn't work (i solder wire as u saw, and connect to positive).</p><p>Arduino is connected to computer + 12 power supply.</p>
if you use stock GRBL instead of the one I linked here do not expect the servo to work.
<p>Hello misian,</p><p>I already build similar plotter like yours, but I have a problem with a drawnings.</p><p>My machine draws diagonal pictures (they are kicked 45 degree)</p><p>I spend all days with Universal Gcode Sender Settings (invert pictures, changeing speed axies, and so on), but it still draw diagonal.</p><p>I have been changing grbl settings and uploaded to arduino until I burned voltage stabilizer (arduino is working yet).</p><p>Need some help, advise.</p><p>Thanks in advance.</p>
45 degree rotation is usually due to not having enabled COREXY on GRBL firmware.
i want to set up end stops to totally automate the machine. As axidraw goes to its home location on every startup and after every drawing. How can that be done using endstops or something?(Please explain Wiring software changes etc.)
you may want to read how they do it here https://www.shapeoko.com/wiki/index.php/Home/Limit_Switches<br><br>but you only would use end-stops for X and Y axis
Nisan, buenas tardes. Desde Mendoza, Argentina te escribo. Queria felicitarte por tu excelente trabajo y por la predisposicion que tenes en responder a las decenas de preguntas que te hacen a diario para que muchos puedan tener este excelente proyecto en casa. Lo encontre de casualidad por internet buscando hacer un grabador laser, el cual tengo pensado usar la 4xidraw con un peque&ntilde;o laser quemador. Comenzare pronto con la construccion. Espero poder conseguir todo lo necesario aqui en mi ciudad. Quizas pronto este escribiendote por problemas o dudas que tenga en la construccion. Un fuerte abrazo!
<p>Hello, </p><p>the axes X and Y works, but impossible to move the servo motor. In fact, I did not understand how to do the welding in step 4 on the CNC Shield (only 1 wire ?), I did not find any other information/picture about it, and unfortunately I burned An Arduino Uno ... could you help me? (I discovered Arduino is my first project)</p>
Only one wired is needed (as negative wire is already connected on another pin). Failure to have this connection may sometimes end up with a burned Arduino. The soldered wire will bring 12V from Vin on the Arduino to the CNC shield (to power motor drivers). <br><br>Power is only applied to the Arduino power jack input.
<p>Thank you very much Misan and Tamosan for these details, I understand better now. I'll do a try tonight and keep you up to date with the improvements. Thank you!</p>
<p>Hi, if you use the arduino cnc shield as on the step 4 photo ,you solder one wire to shown pin on the photo and connect the other end of the wire to + power input thats all ...</p>
<p>Hi misan ,finally I managed to work the 4draw and try the sample codes on your github page.I think There is a last problem I have to solve ...it begins to start after sending the code and everything works properly but after a few seconds later it stops at the beginning of drawing, if your sample codes are not half or a part of drawing there is a problem I think,need your ideas , thanks.</p>
you can use this link to drag and drop the gcode file and view it on your browser. AFAIK files uploaded are complete.
<p>thanks İ will try that</p>
the missing link http://chilipeppr.com/jpadie
<p>Hi Misan, or anybody else everyday I develop the project :) today both axis and servo begins to work with the sample gcode but the new problem is ; both x and y axis are overdriven even I changed the $100 and $101 to 80 ,how can I tell my 4axi it's limits and home position ? could anyone help ?</p>
you may want to read this https://github.com/grbl/grbl/wiki/Configuring-Grbl-v0.9<br><br>in particular $130, $131, $132 &ndash; [X,Y,Z] Max travel, mm<br><br>
<p>thank you it is very useful for me and solve the problem</p>
<p>Hola, mi 4xidraw funciona bien con universalgcodesender. He instalado la extensi&oacute;n 4xidraw en inkscape para intentar dibujar directamente sin exportar a gcode pero no consigo que conecte el serial. Creo que necesito ayuda para ello.</p><p> Tengo incluso la extensi&oacute;n &quot;exportar/plot&quot; en la que puedo configurar el puerto serie pero no lo consigo. Mo conecta.</p><p>Agradecer&iacute;a vuestra ayuda!</p>
Enhorabuena. <br><br>No he probado la extensi&oacute;n, si tienes dudas concretas quiz&aacute; le puedas preguntar al autor. Normalmente para que python use el serie se require la instalaci&oacute;n de pyserial.
We have did this. But it has lots of vibration. Belt is also vibrating alot. What should be next step? Which lubricant should be used
<p>Have you placed the jumpers for setting motors to 16x microstepping?</p>
do your motors move smoothly without the belt? if so, is the belt the same pitch as the pulleys? if so, can you move the carriage by hand smoothly?
<p>yeah sure</p>
<p>I think no lubrican needed , there was a post interested within ,maybe another problem is the cause of vibrating..</p>
<p>Hi Misan,</p><p>I have build your machine and it is a success. I redesigned all the printed parts just for fun and I'll post them later on thingiverse. But that is not what I come here to tell you. You said you want to test this machine with Laser Web right? Well, if you haven't try it, I suggest you should. They works perfectly. No more inscape plugins or extensions for extensions to work.</p><p>I use cprezzi's grbl-servo </p><p><a href="https://github.com/cprezzi/grbl-servo" rel="nofollow">https://github.com/cprezzi/grbl-servo </a> . It is grbl v1.1f and it can connect to Laser Web 4 which has binaries installer as well. You don't need to install node.js or do some crazy things on command line tool anymore. You can download it here </p><p><a href="https://github.com/LaserWeb/LaserWeb4-Binaries" rel="nofollow">https://github.com/LaserWeb/LaserWeb4-Binaries<br></a></p><p>After installing Laser Web 4, go to G-Code setting and change these and you are good to go. I have attached some pictures.<br></p><p>M3S100 for Tool On</p><p>M3S0 for Tool Off</p><p>PWM MAX S VALUE = 255</p>
<p>Thanks a lot for a very informative post. I am sure many other readers will find it very useful too.</p>

About This Instructable




More by misan:4xiDraw 
Add instructable to: