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. 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 (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

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 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>Hey, I have loaded the special flavour of GRBL software from the link which you have provided.</p><p>But, when I am using Arduiono Serial Monitor to check it is working or not, its showing me welcome message: grbl 0.9j ['$' for help].</p><p>It is showing 0.9j , not 0.9i. Won't be it a problem?</p>
<p>On giving command (gcod file) from gcodesender, there is movement in both steppers but there is no movement in servo. Any suggestion ?</p>
Many people having problem with servo because the only power Arduino gets is from the USB. If you follow the wiring I propose the 12V supply go to Arduino power jack. <br><br>Does this help?
<p>yeah I am using the same procedure by using 12V supply which goes in Arduino power jack, but still no luck.<br>One more thing, the steppers are not rotating smoothly, I am observing that while rotating there is jerk in them.</p>
<p>did you populate the three jumpers below each pololu driver board on CNCshield? </p>
<p>I din't get this point. How to populate? Please elaborate.<br>(Is this the solution for servo or the jerk produced in steppers?)</p>
<p>while sketching an image by using bitmap tool in inkscape, it always selects outer boundaries of what is in picture and same is the case when a text is converted into path it selects perimeter of text</p><p>is there any way to select single line or middle line of text or picture?</p>
I am not aware of a way of doing that when vectorizing a bitmap, maybe other readers can chime in.
<p>try this online tracer http://online.rapidresizer.com/tracer.php</p>
<p>Hey, can I use Imported DRV8825 StepStick Stepper Motor Driver Module Pololu stepsticks?</p><p>Have a look at this - http://www.amazon.in/DRV8825-StepStick-Stepper-Heatsink-Printer/dp/B01GECZGHO?_encoding=UTF8&amp;deviceType=desktop&amp;psc=1&amp;redirect=true&amp;ref_=oh_aui_detailpage_o01_s00</p>
Thanks for the reply.
<p>How I am going to pair the servo motor for up and down?? there are no gears whatsoever on the stl files???</p>
<p>I am a bit depressed becouse u didn't make pictures of the most important part and that is the servo up and down mechanism :(<br>can't figure it out</p>
<p>I provided the full CAD so anyone can see how all it is assembled and I did that on a platform that requires you install nothing (unless using a laptop or iphone) as it works on the browsers <a href="https://cad.onshape.com/documents/236f46681d1cbe31f6d52db0/w/5948c0b4f86507971afed68c" rel="nofollow">https://cad.onshape.com/documents/236f46681d1cbe31f6d52db0/w/5948c0b4f86507971afed68c</a></p>
No need of gears or extra parts. Lever should push carriage up on pen up movements.
<p>I have converted the AxiDraw plugin for Inkscape so that it works with 4xiDraw.</p><p>This means that you can draw directly from Inkscape without having to save G-code and start another program.</p><p>Get it from <a href="https://github.com/bullestock/4xidraw" rel="nofollow">https://github.com/bullestock/4xidraw</a></p>
Wow, that is fantastic news. I am sure people will love it.<br><br>Thanks a lot Torsten!!<br><br>If you do not mind I will post the link on the instructable.
<p>Sure, go ahead.</p>
<p>Misan could you plzz help me about the hatching of text or any closed objects/shapes using inkscape.</p><p>Is there any possible reason any extension/info regarding to this feature.</p><p>THANKS</p>
You can use Egg Bot's plugin for hatching.
<p>did any of you guys heard of the problem that when u upload the GRBL firmware and restart the arduino The ON led lights up and the LED on pin 13 is ON</p><p>I can't upload anything more on the arduino, that's the second in row that happened... please help asap</p><p>Does anyone know how to fix the arduino... and why is this happening??</p>
<p>I burned the bootloader fixed!<br><br>Now when I run gcode it's mirrored in paper :/</p>
You can easily mirror it on Inkscape
Yes absolutely, i needed to change the servo angles from the plugin. Which one is the option for that in the plugin? Thanks for the help and what is meant by default laser intensity, cut feedrate, transversal feedrate for this project and what should be its value?
I am a bit confused about the position the machine should be before a drawing is begun. I read your prev comments misan in which you suggested to keep carraige nearest to arduino board and pen holder farthest. I did that but when i ran monalisa example, the carraige collided with the holder. What should be the initial position? <br>And can the initial position be automated that it will bring it to the starting postion every single time power is turned on? Please note i use 500 mm rod for x axis and 400 mm rods for y axis.
You are right, it is a bit confusing as different standards call for different locations for (0,0). So I have moved my own home location depending on the toolset I was using at the time. If I reckon correctly for Monalisa coordinates to work well you need to position the pen farthest from Arduino board (in both axis).<br><br>Initial position (aka home) can be automated with the use of end-stops but I am not sure if power-up can trigger it (I think it cannot). But it definitely could be included in your g-code file.
<p>Yes it works now perfectly misan. How can we set our own home location in inkscape to define our 0,0 cordinate. Do you move the carraige manually before each drawing? And what is your current home position and how to set it up? </p><p><br>What are your speed parameters acc. And max travel, which will be best for speed and accuracy?<br><br>And please answer for the servo angle adjustment in the comment below. When i extract gcode from a inkscape file and i open it in notepad, i see for servo up, ms100 is used. How can i change it to ms50 through the plugin or something. (Apart from replacing these commands from notepad). I've given the details in below comment</p>
I'm sorry to bother you but the script si too big to be uploaded.. <br>do You know how to compile it smaller?
I use Arduino UNO not a nano but they both feature the same processor with the same memory size. I have just tested nano targer with Arduino 1.6.7 and there is no issue, 96% of program memory used.
<p>I do not know how to program it</p>
<p><a href="http://blog.protoneer.co.nz/grbl-arduino-library/" rel="nofollow">http://blog.protoneer.co.nz/grbl-arduino-library/</a></p>
<p>Hi, do you need to lube the axis ? Thanks</p>
<p>I do not think so as LM8UUs come with some grease of their own.</p>
<p>Hello !</p><p>I think i did everything right but when i try to move along the X or Y axis, it move in diagonal...</p><p>any answer?</p><p>thx !</p>
This is usually happenning as COREXY is not enabled in the firmware (it is on my linked firmware though). Maybe you are doing something wrong with the uploading/compiling process or you already have grbl installed in your libraries and it is interfering with mine (if so remove grbl from your libraries folder).
<p>Great work misan. just help me with this question. How do i check the default values(angles) for servo and how to set them up?. i.e pen up and down. how can i change these angles. one more thing, i don't know why my servo buzzes continuously when it is in the pen down position. it does &quot;not&quot; happen with pen up position. tried with 2 servos</p>
I already told you how to change the values, by replacing the M3/M5 commands by the proper values using M3 S strings.<br><br>That said, please remember the splines on the servo shaft allow you to have many different attachment angles for the arm, so maybe you can just rotate the arm till it works ok without changing the angle values.
<p>As he programmed it</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>

About This Instructable




More by misan:4xiDraw 
Add instructable to: