Introduction: $100 Mural Drawing Robot (also Works As a Giant Etch-a-sketch)

Featured on Hack-a-day!

What I love about robots is that you can make a thing that makes other things.  So meta!  It uses gcode draw any picture you like, or you can drive it around like an etch-a-sketch.  You can scale this robot up to almost any size.  The version in the photograph is my smallest model.  I've built three of these now, the largest of which was 3m*2m.  This particular robot costs $150 in parts and, if assembled correctly, can be up & running in about 20 minutes.

You can now buy this robot as a kit on the Drawbot's official page.

Step 1: How Does It Work?

The basic trick of this robot is high school trigonometry.

If you know the distance between the steppers and you know the length of the strings then you can calculate the XY position of the pen. If you know the XY position of the pen and the distance between the steppers you can find the length of the strings.  From there you can figure out how much the strings have to change to move from one place to another and then you can draw lines and curves.

The rest is boring tricky stuff, nice but not vital.  There's some code to make sure you can't draw outside the drawing area, and some code uses trapezoidal motion interpolation to draw accurate pictures faster.

Step 2: Parts

1 - Arduino Duemilanove 328 or better: $30
2 - NEMA17 stepper motors: $30
1 - Adafruit motor shield: $20
1 - 12v2a power supply: $15
1 - USB cable: $1
2 - Bobbins: $0.50 for a three-pack

You will also need some tape and your computer.  A pen to draw with is good, but a whiteboard or blackboard is even better (easier to erase)

I sell these parts as a kit to fund other robotic development.

Step 3: Assembly

  1. Attach the Adafruit shield to the Arduino as in the picture.
  2. Wire the 12v2a power supply to the Adafruit shield.  Use a multimeter to make sure you don't wire it backwards!
  3. Wire the steppers to each end of the Adafruit shield.  If your colors are different, consult your NEMA17 documentation.  The first coil should go in M1 & M3, the second to M2 and M4.
  4. Plug in the USB and connect to your computer.
  5. wind a lot of thread onto each bobbin.
  6. Put the bobbins on the stepper motor shafts.  You may need a bit of tape wrapped around the shaft to give it a tight fit.  Make sure the thread on the bobbin hangs off the right hand side of each shaft.
  7. Mount the steppers to the L (top left) and R (top right) corners of your drawing area.  They should both be the same height off the floor.
  8. Put a slip knot into the ends of the thread, and put both slip knots around your drawing pen.  I made a 3D printed holder but a piece of cardboard and some tape will work, too.
  9. Measure the distance W between the shafts. W = R-L
  10. Measure the distance H between the top and bottom of the drawing area.  The top is considered to be line LR, not the top of your paper/white board.
  11. Wind the bobbins until your pen is at O.  O is in the middle of the drawing area, or (W/2,H/2).  If your pen starts too high or too low your picture will be warped like a frown or a smile.  If you start too far one side your picture will be slanted.  (In a future version I will be able to auto-center the drawbot.)

Step 4: Arduino Code & Testing

  1. Download and install Arduino.
  2. Download the Github Drawbot files.
  3. Open Arduino and edit the drawbot_code/drawbot_code.ino file to match your configuration.  Change X_SEPARATION to be your W value.  Change LIMYMAX to be half your H value.  Change LIMYMIN to be -(half your H value).  The code is helpfully commented and there's an FAQ in Github if you have any other issues.
  4. Upload the drawbot_code/drawbot_code.ino file to your arduino.
  5. Open the serial window.  It should say "== HELLO WORLD ==" and then give you instructions.
You should now be able to check everything works.

Type "G00 X5;" and your pen should move right.  If it moves left, your motors are backwards.  You can change this in the config.
Type "G00 Y-5;" and your pen should move down.  If it moves up, your bobbins are backwards or your wiring is reversed.You can change this in the config.
Type "G00 X0 Y0;" to return to center.

Step 5:

Hooray!  Your drawbot is working.  You can now draw complex pictures one instruction at a time.


Drawing pictures one command at a time is a pain!  That's not automated or robotic or easier at all.

Shake your fists at the sky and yell: I NEED MORE POWER!  (go on, if anyone asks you can blame me.)

Step 6: Java Automation

ZAP, I give you more power!

./java/DrawbotGUI.jar will run a java app that will send one line of gcode at a time to the drawbot.  this will automate your large drawing challenges.  Several gcode samples have been included in ./gcode/

Step 7: Feeling Generous?

Have you made an improvement to the drawbot?  Please contribute to the github project so everyone can enjoy.

Note: These instructions may become obsolete.  For the latest, check out the drawbot wiki page on assembling the machine.


JimS14 made it!(author)2015-03-01

This needs a massive updating. Like the location of the files. Also these guys sell an insanely priced kit now, not an under 100.. I pieced it all myself, now I'll have to hunt for the project.

Kickstart70 made it!(author)2013-12-18

I have an Arduino Uno clone, a couple stepper motors, a couple driver board...can I proceed?

aggrav8d made it!(author)2013-12-20

Yes? We only support the parts that come in our kit so you may find you have an uphill battle. There may be people in the forums who can help you. Good luck!

TheRealRocketBurns made it!(author)2013-09-17

Maybe you could use it at large events, or maybe use it to paint portiats based on input from a webcam

jasonwebb made it!(author)2012-05-20

Hey! I was wondering if you could post a photo or two of your pulleys with the line wound onto it? I used fishing line and sewing machine bobbins on my plotter, but the small changes in diameters as the plotter goes about its business seems to be causing a bit of distortion (pen won't go to the same place twice when a polygon is drawn :P).

At first I thought my problem was indeed the software I was using - it uses linear interpolation, rather than your cool trapezoidal interoplation. However, the author of the code I'm using states that if I were to use timing belts and pulleys, it would work just fine :S

Do you wind your pulleys with a great deal of line? Or just enough to allow the pen carriage to address the entire canvas and no more? Also, what kind of line do you use? I used some cheap fishing line, but maybe there is something even smaller I could try.

Thanks! :)

jasonwebb made it!(author)2012-05-01

Can you briefly describe the process you are thinking of to auto-center the pen carriage? It would be a very useful feature, I'm curious about how you plan to execute it.

aggrav8d made it!(author)2012-05-01

jasonwebb made it!(author)2012-05-01

404 :P Perhaps it hasn't been published yet?

aggrav8d made it!(author)2012-05-01

Argh, I set the two answers to publish tomorrow and the day after because I've already published today. Sorry :(

jasonwebb made it!(author)2012-05-07

Sweet! Just got around to reading both the links - great answers! The idea of using limit switches is brilliant, can't believe I couldn't think of it :P Its very common in CNC machines for the same exact purpose, there's no reason it wouldn't work well in a wall plotter :) Once I get my plotter producing decent prints, I'll definitely add some end stops and play around!

I've been building a wall plotter based largely on the Der Kritzler bot ( )

My blog posts:
My personal wiki article:

In my opinion, the Kritzler software and hardware execution is far more elegant and clean than most of the others I've seen, so I have been really drawn to it. He uses two A4988 motor drivers from Pololu to drive his motors. Each of those drivers only require two data pins to be connected to an Arduino to work, so it is very easy to expand and hack. I was thinking of actually using my extra Arduino pins to interface with a bunch of sensors so that users can eventually draw images like an etch-a-sketch (distance sensors, photocells, etc).

aggrav8d made it!(author)2012-05-07

Your machine is good, and inexpensive. One challenge is that it's much harder to assemble, making adoption difficult.

Have you read my code? I'd be interested to know if you consider it "cleaner". I borrowed a lot from GRBL. Most of it is sanity checking for silly humans.

jasonwebb made it!(author)2012-05-07

What aspects do find challenging to assemble about the plotter I'm working on? It looks to me that we use identical components aside from the motor drivers. The motor drivers took only a couple of minutes to wire up, but I could see that it would be more difficult for someone without much experience in electronics. I felt like the Adafruit driver locked me into too many design decisions that I wasn't really comfortable with - it wouldn't be easy to add more stepper motors, more servos or other components to the Arduino without digging through the schematics a bit. I like having one board = one motor. Plus, I didn't want to sacrifice a $30 Arduino board to stack the shield onto - I wanted to eventually use a raw ATMEGA328 on a breadboard w/ the drivers to keep the BOM down and simplify the electronics system (from my perspective).

I think your code is decent and better than a few of the other plotters I've come acorss, but I still really enjoy the Der Kritzler code more. At the end of the day, if the bot performs the functions that you wanted it to perform, that trumps any bugs or programming mistakes, so I'm just expressing my personal taste in code (not how it 'should be'). The Der Kritzler code completely decouples the various aspects of the system so that you don't have to trace phenomena down through different files. For example, all of the geometry to be drawn by the plotter comes from a single external SVG file. A Processing sketch processes it as a series of vertices and lines, and uses a simple object to send commands to the Arduino. This way, if I change the protocol (to say, Bluetooth or XBee), I don't have to rewrite the main code - just implement a new class to handle it. Neither the Arduino or the Processing code have any hard-coded behavior about how to draw features, so artifacts and distortion can easily be traced to physical mechanics or faulty input.

The Der Kritzler designer did a great job of implementing very smooth object-oriented code, and ended up with far fewer lines of code than any other project I've seen. I feel that Processing is a good choice over raw Java for helping to reduce unnecessary complexity and 'sketch' out ideas, just like Arduino does for electronics. Also has the benefit of resulting in much simpler, easier to read code.

Here's a link to the Kritzler Github if you're interested in browsing around:

Like I said, if you get the results you want with your code, that's more important than what any internet 'expert' has to say! I just wanted to discuss my own style and reasoning for my choices :)

jasonwebb made it!(author)2012-05-01

Can you elaborate a little bit on the gondola design you used? I see multiple versions in the photos, but I'm personally pretty interested in the simple ring design. It looks like it might be 3D-printed, or did you source it from someplace else?

aggrav8d made it!(author)2012-05-01

Great question!

rimar2000 made it!(author)2012-03-15

Very good work, sir!

Kiteman made it!(author)2012-03-15

Ooh, can we see it in action, please?

aggrav8d made it!(author)2012-03-15

Oh snap, I forgot the video link.

Kiteman made it!(author)2012-03-15


I'm looking forward to the update promised in step 3...

aggrav8d made it!(author)2012-03-15

Me, too. It shouldn't be hard, I've just had other drawbot priorities. It's easy to manually center the pen, either by turning the bobbins or using the etch-a-sketch program. This upgrade will just take it from a 3 step process to a no-step process.

About This Instructable




Bio: I want to build my moon base with remote controlled robots and solar sintering.
More by aggrav8d:Aduino I²C 2-Way CommunicationArduino Starter Kit 2: Use Buttons for LED ControlArduino Starter Kit 1: First circuit and program to control an LED
Add instructable to: