4xiDraw

121,516

267

563

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.

21 People Made This Project!

Recommendations

  • Make it Glow Contest 2018

    Make it Glow Contest 2018
  • Optics Contest

    Optics Contest
  • Plastics Contest

    Plastics Contest

563 Discussions

0
None
PraveenR55

8 weeks ago

IN MY AXIDRAW EVERYTHING FINE....BUT THE LETTERS NOT FULLY DRAWN..

0
None
ChristopherS323

2 months ago on Step 6

Hi Misan,

I am thinking of modifying the design for a chess-playing robot. Could you possibly give the dimensions that your design can reach (basically so I can see what size chess board I could use)

Thanks

1 reply
0
None
misanChristopherS323

Reply 2 months ago

That depends on the size of your smooth rods. Mine can barely reach an A4 sheet (not square but rectangular area). I am not sure this is mechanism is a good fit for an automated chess board.

0
None
aliN119

2 months ago

Hi.can u tell me what was your 3d printer setting for this project like density support...? and what kind filament you used?

0
None
HughM28

2 months ago

Hi Misan,

I am just wondering if there is any particular reason you used the length of smooth rods that you did. If I were to use longer smooth rods, would anything in the design change??

Thank you,

-Hugh

1 reply
0
None
misanHughM28

Reply 2 months ago

Hi Hugh,

I had some leftover rods from a 3D printer that gave a drawing envelop close to s letter page size so I used what at have available.

1
None
throwawaytipper

Tip 3 months ago

Hello! Thank you to Misan for your wonderful instructions.

I thought I'd post some of the small modifications I made in order to make everything work without the Inkscape extension/Pyserial but while still maintaining servo control. The reason I was unable to install the normal Inkscape extension was because I already have Python3 installed, and I didn't feel like unleashing the can of worms that is managing two parallel versions of Python. You can use this technique to convert any generic gcode to work with the servo. For this you'll need LaserWeb4, Inkscape, Universal GCode Sender (UGS), and Python 3, though the code may work with Python 2, I haven't tested it.

.

I use the LaserWeb4 application to generate gcode. I use misan's steps above to use Inkscape to create an SVG, and then I export it to LaserWeb4, which, while it is meant to control laser CNCs, works just as well to generate pure gcode. My settings are all default, except for that I select Laser Cut for the gcode type, and set the cut rate to 300 mm/min. Once you have all the settings and have clicked the yellow "Generate" button, you can use the green save button to export the gcode. The only problem with this gcode, however, is that it does not include servo control.

.

This paragraph explains in-depth how I fixed that problem. You can skip it if you like, and go to the next paragraph to implement the solution. As said, the gcode LaserWeb4 spits out doesn't know that the M3 and M5 commands control the z-axis. The gcode will work, but the servo will never move, and the pen will never lift. A gcode file is, essentially, an incredibly long text file containing positions for the pen plotter to move to. Before every pair of coordinates is a small character pair or triplet that tell the machine what kind of movement to perform. For example, "G1" is the "highly controlled, normal" movement, and "G0" is the "go as quickly as you can to this place" movement. "G1" is used for precision, and "G0" is used when the pen is supposed to be lifted, so that it can get back to performing pen-on-paper action as quickly as possible - it doesn't matter how inaccurate it is if it's in the air. Anyway, using the other comments on this post, I finally (I'm a newbie at this) figured out that the command "M03Sxx" moves the servo up xx angles, and "M05" makes it go back down. Now I just had to manually edit the gcode file (which can be opened in any notepad editor of your choice, I like Atom by Github, Notepad++ is also good), so that before every "G0" command, it would lift the pen with the "M03Sxx" command, and after each "G0" command, it would drop the pen again. The very first file I edited manually, but after around 120 substitutions, I grew tired, and spent another 2 hours writing 30 lines of Python3 code to do it for me.

.

Basically, to include the servo control on any gcode LaserWeb4 spits out, follow these steps:

0. Save the following text into a new file using your favorite notepad editor, and name it support.py : https://docs.google.com/document/d/1Lc43CqI-bBLkrv...

You can also use the above document to contact me with questions by leaving comments or sending me an email.

You can also find the code here on github: https://gist.github.com/mirrorkeydev/cf6836d83a882...

0.5. I have highlighted sections in the document. You need to edit those sections to fit the path of whereever your gcode is located. Notice the slashes are forward, not back.

1. Open the command prompt. On windows, it's winKey+r, and then type in cmd. Or just use the start button and type in "command prompt".

2. Navigate to the folder that your python file is in. The commands are "cd" to change a directory and "dir" to view everything in your current directory.

3. Type "py support.py" and press enter. If all is good, the directory you're in should pop up on a new line (communicating that it finished running the code without issue). If not, check that you have Python3, that the file is in the directory you're in, you didn't mess up any of the indenting in the python file, and email me with the error it spat out. If you somehow (???) find yourself in an infinite loop, control-c will force-stop the python code.

4. Check the gcode file you were editing using your favorite notepad editor. The very first lines that aren't talking about Operations and Cut Rates should look like:

; Pass 0 Path 0

M03S75

G0 X151.80 Y1.53

M05

5. Success! Import the gcode into UGS and you are good to go!

formisan.PNG
1 reply
0
None
misanthrowawaytipper

Reply 3 months ago

Hi throwawaytipper,

That was an instructable on itself!

Thanks for a detailed write up that I am sure will help other users.

0
None
girishrajg

Question 5 months ago

Hey Misan, I made it work using the 4xidraw Inkscape extension.

But the problem is all what it writes is mirror image. Any clue what could be wrong?

Thanks a lot for your help..

Really impressed with the precise writing.. appreciate your efforts posting and supporting by answering all the queries, that too for years :)

Hats off!!

3 more answers
0
None
giuseppe112112girishrajg

Answer 4 months ago

per gli utenti in italia

mi puoi spiegare come ai fatto? e in quale sistema usi? che versione di inkscape?

e come reperire pyserial ? è versione, e se ai delle informazioni utili .ti ringrazio anticipatamente ciao

ioglese

Puoi spiegarmi come si fa? e in quale sistema utilizzi? quale versione di inkscape?

e come trovare Pyserial? è la versione e se una qualsiasi delle informazioni utili. ti ringrazio anticipatamente

0
None
AlexD303girishrajg

Answer 5 months ago

Hey girishrajg. It is actually doing the same thing for me. Unfortunately, I don't have the time right now to figure out a solution, but I'm sure someone here can help us figure it out.

0
None
giuseppe112112

Question 4 months ago on Step 6

"Quando si tenta di utilizzare l'estensione" 4x4draw "di Torsten Martinsen, non riesco ad eliminare ne a risolvere l'errore" Impossibile connettersi a 4xidraw ho provato di tutto la mia domanda e se qualcuno e riuscito a farlo funzionare e come a fato non a tentativi ma quello che a fatto precisamente lui. grazie

2 more answers
0
None
misangiuseppe112112

Answer 4 months ago

L'estensione ha bisogno di:

1) che hai installato correttamente pyserial

2) che puoi localizzare la scheda Arduino nel tuo sistema

0
None
giuseppe112112misan

Reply 4 months ago

ciao Misan ti ringrazio per la tua risposta ma credo che non funzioni, io ho seguito le tue istruzioni alla lettera ma ho il solito errore, non capisco il punto 2 cosa significa "localizzare la scheda Arduino nel tuo sistema" con ugs funziona in win e in mac ma i drivers (plugin inkescape )nemmeno a palarne, se puoi darmi aiuto ti sarei grato ciao

0
None
PraveenR55

Question 5 months ago

Dear misan

pls tell sir...whether the bluetooth module is connected to arduino or cnc shield ...

And also guide me to connect bluetooth with parts list......i will helpful to finish my project being wireless.

1 more answer
0
None
misan

5 months ago

What I did was to use a couple of plastic bands to keep the wires as you can see in this video https://youtu.be/xPq4ciNnNnw I cut these plastic bands from a plastic folder. They help keep the wires away from the motion of the carriage and prevent any strong bending that could break the wires over time.

0
None
AlexD303

Tip 5 months ago

When attempting to use Torsten Martinsen's "4xidraw" extension, if you receive the error "Failed to connect to 4xidraw :(", there are a few steps I took that may help you get past this error.

First, check that you are running the proper GRBL flavor ( GRBL-servohttps://github.com/misan/grbl-servo).

Next, test that both of your steppers and the servo operate correctly in the Universal Gcode Sender ( I use the Universal Gcode Platform for my 4xidraw) by jogging the steppers, running M03Sxx (where xx is the servo angle you want to turn to) commands in the UGS console to test the servo, and finally testing the Mona Lisa file provided by Misan on thingiverse (https://www.thingiverse.com/thing:1444216/#files)....

If neither of those steps fixes it, what fixed it for me was, first, I uninstalled Pyserial 2.7 (using "pip uninstall Pyserial" in the command prompt) then reinstalled Pyserial 2.7 ("pip install pyserial==2.7").

Second, I re-copied and overwrote all the necessary .py and . inx files for the extension from the 4xidraw master directory you downloaded from the extension's github page (https://github.com/bullestock/4xidraw), the eggbothatch.py file (located here: https://github.com/evil-mad/EggBot/), and the three plotink .py files (ebb_motion.py, ebb_serial.py, and plot_utils.py located here: https://github.com/evil-mad/EggBot/),

Finally, I simply unplugged the cnc shield (12v adapter) and arduino (usb), plugged in the usb back in next (to avoid Windows or other os issues with recognizing the arduino), and then, finally, plugged in the 12v power adapter into the cnc shield.

If the extension is working correctly, hitting the apply button should first open up either a small empty window or a small window stating something like " Please wait ." , and then immediately start drawing.

You should also note that if your 4xidraw is connected to the UGS software, then the 4xidraw extension will not be able to connect. Therefore, you must disconnect your 4xidraw from UGS before using the 4xidraw extension.

I can't guarantee that these steps will fix it, but it should certainly help you get closer to solving your problem :)

1 reply
0
None
misanAlexD303

Reply 5 months ago

Great write up, I am sure it will help other users facing similar problems.

Thanks a lot for your contribution AlexD303.