Polargraph Drawing Machine

Picture of Polargraph Drawing Machine

This machine, a variation on the hanging-pen plotter is a conspicuous and wilfully naive attempt to break out of the pristine, pixel perfect, colour-corrected space that exists inside our computers. It's a drawing machine, that takes a pen (a human tool) and uses it to draw in a singularly robotic way, with some grand results.

It doesn't draw at all like we would (though it could), and we would struggle to draw exactly as it does (though we could).

It can draw on things bigger than itself - the question is really "how long is a piece of string?" when it comes to working out it's maximum area.

It's easier to look at what it does, than to explain it, so just have a look.

Remove these adsRemove these ads by Signing Up

Step 1: History

Picture of History

Well there have been lots of new drawing machines doing the rounds lately, there's a real thirst to see devices that leap out of the virtual into the
physical. For me, it's all too easy to produce digital things which are interesting - programming or mash-ups or virtual experiments are devalued because they are intangible, you can run a hundred, a thousand, a million variations in a day - it's the proverbial roomful of monkeys with typewriters. The output becomes disposable, it get's hard to see the value, the craft.

So 3D printers and other desktop manufacturing tools and technologies (laser cutters etc) have got more and more popular, it's hard to overestimate how much hunger there is for a tangible, physical, touchable, smellable product of all this clever-clever digital work.

So this isn't wholly original, check out this prior art for more inspiration:

Hektor - the daddy of all hanging drawing machines
Der Kritzler - the smartest one yet
AS220 Drawbot - the basis for mine
SADBot - Instructable for an automatic drawing machine on the same pattern by Dustyn Roberts

Or have a look at what I've been doing with mine
Polargraph website
Polargraph project code
Flickr stuff

1-40 of 244Next »
Martin Balák made it!8 days ago

I made it! I like to upgrade it and try new things, like painting on canvas:

Thanks for the instructions.

Euphy (author)  Martin Balák8 days ago
I love this instructable - I've been skirting around trying to do something like this myself for ages, but never figured it out! Thanks!
chenjian2 months ago

hello,very nice work, i have a problem , when i click the "click to start" the pen didn't working, i don't know what's wrong with that ,please tell me my problem , thanks very much.

Euphy (author)  chenjian2 months ago

Hi Chenjian, thank you! The bad news is I don't even know what you mean by "click to start" - which step are you reading that from?

chenjian Euphy1 month ago

everything is ok now , really thanks , and i am sorry for i didn't reply timely, i was busy for my graduration these days,

nam20024 months ago

hey, nice instructable'

i have a problem here, can you help me?

can i use servos instead of steppers? and i dont have a motorshield, can it be without it or is it necessary?

if so please help me with the code,

thanks ,


Euphy (author)  nam20022 months ago

The Polargraph software is written for stepper motors, and a motorshield.

However, the principle of this machine is very simple, and a machine like this can be made using any kind of physical actuator. Equally so, you can construct a motor driver from discrete parts if you wanted to, but the shield is easier.

nam2002 Euphy1 month ago
(removed by author or community request)
nam2002 nam20021 month ago

I got a stepper but it has six wires coming from it ??!

nam2002 nam20021 month ago

I got a stepper but it has six wires coming from it ??!

Dean Wilson2 months ago

Hi Euphy,

I've been slowly following this Instructable to completion, in stolen moments here and there, for a while now and have had a lot of fun (and the odd moment of frustration) doing so.

I'm tantalising close to the end now: i have a machine; I have steppers that respond; I have a functioning gondola; I can set home and move pen to point (now that have set the stepping to SINGLE, for some reason my steppers don't function well with INTERLEAVE); and I've managed to upload and render an image.

Only trouble now is when I hit Render and then Generate commands, I can see the queue gobbling up commands, the pen moves to the start position, then......nothing. The commands continue to get gobbled up but the pen hangs motionless.

I'm sure there is something simple happening that I have overlooked but I'm stumped. Any clues?


Euphy (author)  Dean Wilson2 months ago

Hi Dean, aha, the clues will probably be in the debug console! If you press ctrl-C in the controller, you'll be able to see the raw communication between the controller and the machine itself - the commands being dispatched from the controller, and then some kind of response from the machine itself. If there's something going wrong, then you should see an error, and it might shed some light on what's afoot.

When you changed to SINGLE rather than interleaved, did you also half your steps per rev? And when you are doing "move pen to point", does it definitely move to the exact right point that you've indicated? And of course you've uploaded your machine spec to your machine!

lets see :)

sandy noble

Dean Wilson Euphy2 months ago

Thx Sandy,

I hadn't changed steps per rev so I've now halved that to 100.

Pen definitely moves to the point indicated when I move pen to point.

What the controller reveals is the following (this is a snippet but you'll get the picture):

"Dispatching command: C05,896,544,23,226,END


incoming: C05,896,544,23,226,END not

incoming: READY

incoming: READY

regenerating preview queue."

This basically repeats for each command. So the Arduino is having problems recognising the coordinates it would seem? Any ideas why this would be?

I have not had this result using move pen to point or return to home which seem to be working just fine.


Euphy (author)  Dean Wilson2 months ago

Ok yes if you're using SINGLE, then 200 is the proper stepsPerRev.

Hmm! Which firmware are you using? The "not recognised" means it doesn't recognise the command (C05) rather the coordinates... The newest release of polargraph_server_a1 1.7 does not, by default, include the code for pixel shading (because it had to go to make room for the new motorshield library).

Dean Wilson Euphy2 months ago

Ahhhhhhh! It seems I have not paid due attention to the words of the King Fu master and have failed to define pixel drawing!

Thanks for the clues and I will try this out as soon as I have a (stolen) moment.


P.s. your support for this instructable is amazeballs.

Euphy (author)  Dean Wilson2 months ago

Thanks :) The current latest firmware is a bit of a beta version, because it has this ability to load only certain features at compile-time. If you are using the plain adafruit shield v1, then you _should_ probably be able to load pixel shading AND vector functions at once. Give it a go at least - I think I got that working. It's only for the v2 shield that you need to choose which one you need. I need to revise this instructable at some point - things have got a little more complicated since I wrote it up first!

Dean Wilson Euphy2 months ago

I'm up and running! Still some calibration required (I'm not sure my motors are the best though) but it's definitely drawing things, and the output has a lovely low-fi quality. I'll post some video when I have something worth sharing.

Just pre-ordered the SD version to install on a wall in the Fluxx office (

Great instructable and great support, long may you prosper!

...apologies, I think the default steps per rev is 400 so I had already halved that (my steppers have a 1.8deg step).

smalltortoise made it!2 months ago

My local hackerspace recently completed this build. I was able to help with some of the build. This was one of the most fun builds I've helped with. I feel less intimidated by motor controls in Arduino IDE and Processing now. We named our bot Pablo. Pablo will be helping out with a local arts festival called the Dogwood Arts Festival. Here's a video:

Thanks to our fearless cat herder @samthegiant for sending us on this mission

Euphy (author)  smalltortoise2 months ago
Looks great, thank you for your message! Really glad that you had a positive experience during the build - good luck at the festival :)
Seeshi_suin3 months ago

I'm having a weird issue where when I click on "set home" I see no purple dot, and only one of the motors will lock. Then when I click "Move pen to point" and select a point, the line from where the machine thinks the pen is starts way off the screen up to the left and the machine does not move. I tried deleting the default config file and starting over, but it still seems to think the pen is there. Also, when I select "return to home" it will do the same, thinking the pen is up in the far left beyond the screen, and the purple dot is in the correct place, so I believe "home" is still in the right locations. My motors are working just fine with the Accelstepper Multistepper example btw, so no issue with the electronics side of it.

Like I said in my other comment (page 13), I am using a motorshield v2, so I'm checking to make sure I didn't update the program improperly, but so far I can't find anything that is wrong. I've updated all the Arduino libraries to accommodate the motorshield v2, but per your instructions I am using Processing 1.5 and the libraries that you provided on github for the processing side of things.

So, any ideas? I am stumpted!

Euphy (author)  Seeshi_suin3 months ago
Only one of the motors locking is a sign that something is wrong with your firmware, so that's a start. BUT even if that is the case, the rest of the stuff should probably work as you expect.

You have already set your machine size, and uploaded it with "upload machine spec"?

And just to be sure, you're based on the code from the latest release zip at github:

Open the console with ctrl-c, then issue your "set home" command, see if the numbers that come back are the same as the number you send.
Seeshi_suin Euphy3 months ago

Seems to me that the issue is probably with Accelstepper. I contacted Adafruit and they told me that Accelstepper is not compatible with the Motorshield v2, unless you use the adafruit edited version that you can download from their site. That version doesn't seem to work with the polargraph though.

Euphy (author)  Seeshi_suin2 months ago

I got this working with the new motorshield recently (well, moving at least), and didn't have to use adafruit's own accelstepper fork.

Euphy (author)  Seeshi_suin3 months ago

Aha, that's worth knowing. I wonder what is different about adafruits fork of accelstepper. I've actually got a motorshield v2 now, so I hope I'll be able to get it put together and have a go myself sometime soon. The work you have already done will be useful, but if I get it working I'll let you know and write it up as part of this instructable, and on the site (

squeakychair8 months ago
Hi Sandy,

First, Great project! This is my first Instructable, you have inspired me.

I purchased the new Adafruit Motorshield v2 and the Library has changed. I was able to update your source to accommodate the new Library however now the compiled code is too large for the Arduino Uno. Looks like the new shield library adds some additional libraries. I'm also assuming the shields new ability to add additional shields creates a new array variable that is taking up space. (just a guess)

Binary sketch size: 32,474 bytes (of a 32,256 byte maximum)

My next step would be to graduate to a Arduino Mega 2560 however I wanted to ask you if there was anything that could be done to simply reduce the code by 218 bytes? This reminds me of code length issues with my TRS-80 / 4k memory way back when.

Here is what i changed in file "configuration" to update for the new Library. I'm assuming this will work however its not tested as I'm unable to load.

// 1. Adafruit motorshield V2 - testing
#include "utility/Adafruit_PWMServoDriver.h"

// Create the motor shield object with the default I2C address
Adafruit_MotorShield AFMS = Adafruit_MotorShield();

const int stepType = INTERLEAVE;

Adafruit_StepperMotor *afMotorA = AFMS.getStepper(motorStepsPerRev, 1);
Adafruit_StepperMotor *afMotorB = AFMS.getStepper(motorStepsPerRev, 2);

void forwarda() { afMotorA->onestep(FORWARD, stepType); }
void backwarda() { afMotorA->onestep(BACKWARD, stepType); }
AccelStepper motorA(forwarda, backwarda);

void forwardb() { afMotorB->onestep(FORWARD, stepType); }
void backwardb() { afMotorB->onestep(BACKWARD, stepType); }
AccelStepper motorB(forwardb, backwardb);

void configuration_motorSetup()
// no initial setup for these kinds of motor drivers
void configuration_setup()
defaultMachineWidth = 650;
defaultMachineHeight = 650;
defaultMmPerRev = 95;
defaultStepsPerRev = 400;
defaultStepMultiplier = 1;
currentlyRunning = true;
// end of Adafruit motorshield definition
// =================================================================

Euphy (author)  squeakychair8 months ago
Very good point squeakychair, I knew the space was getting tighter and tighter on the ATMEGA328 boards and I have already done a little code optimisation to make it fit. The only thing I can think to do is make two versions, one that only does bitmap shading and another that only does vector drawing.

You could empty the function exec_drawBetweenPoints(..) and remove desiredSpeed() to cut out the vector drawing features (drawing straight lines), saving 2k.

To remove the pixel shading features, delete the entire "pixel" tab and snip a little out of the exec_executeBasicCommand(..) function, freeing a mighty 3.5k.

I think the AccelStepper library has grown a little bit during the last couple of releases too - it all adds up.

good luck!
I found my issue, I'm able to compile. I did not change the include to point to the new Library.
Squeakychair - I've got the same issue re: implementing with the V2 Motorshield. I get the "too big" error on compile. Would you mind sharing your final version (after you resolved your issue) of the file?

Many thanks!
Euphy (author)  wcritchie2 months ago
Hi squeakychair... Could you explain (or show) what you had to modify in the source code you attached above to make it all work? Thanks!
Seeshi_suin Euphy3 months ago

I just did this with an UNO and MotorShield v2. I replaced all the config code like Squeakychair suggested, but I had to cut down some stuff to get my sketch down from 33,242 bytes. I cut the DC motor code out of Adafruit_MotorShield.h and Adafruit_MotorShield.cpp, but that wasn't enough. Ultimately I had to cut out the penlift code to get the sketch small enough

Euphy (author)  Seeshi_suin3 months ago

Aha, thanks for the note - very good to know.

nam20023 months ago

Hi, i posted a comment. I havent got a reply for it. plz help!!!

ltaddeo3 months ago

Hi there!!

Sorry if I'm asking anu absurd here, but It's my first project using arduino.

I'm trying to build a variation from this project.. the same software and everything, but with a diferent "hardware" structure.

But In a distraction, I bought the Adafruit's Motorshield V2. I already mapped the correct wires positions for the stepper motors. I know i'll have to use the V2 libraries as well.

Do you have any idea were I'll have to change code to use the new library?

Euphy (author)  ltaddeo3 months ago
Hello, I haven't done it myself, but I'm told the polargraph code can run on the motorshield v2 with minor adjustments. There's a couple of threads on the polargraph forum about it - is a good place to start.

Good luck!
ltaddeo Euphy3 months ago


That's REAAAAAALLY good!

I'll give it a try, and if it works, I'll tell you! :)

EoinM173 months ago

Hi, first off I want to say that this is an amazing instructible and machine! I have been thinking about making one after i finish my current arduino project.

I saw this board on sparkfun: and I was wondering if it would be suitable for controlling a polargraph. It looks suitable as it has 2 axis stepper control and a servo control for the pen lift. if anybody knows whether or not this would be compatible a response would be greatly appreciated!

Euphy (author)  EoinM173 months ago
Hello, thank you :) The eibot board is absolutely perfect for a polargraph type drawing machine. In every way, it is the logical choice of board to base a 2-axis machine on. The only reason I didn't use it back in the day was that it wasn't an arduino, and I was only just starting with hardware, so wanted to stay with what I knew.

So yes, I would be very surprised indeed if there are not plenty of EBB-based drawing machines out there. It is NOT, however, compatible with polargraph. Polargraph uses arduino firmware, and would need to be rewritten to use the PIC chip in the EBB.

That said, the general firmware that _is_ in the EBB is already capable of behaving as a 2-axis plotter, so modifying or rewriting the polargraph control software (rather than the firmware) would also be an option.

dustmason4 months ago

Also check out these guys for high quality bead chain sprockets! . They are based in NYC and have a very old web page. They also have a $50 minimum order :(

1-40 of 244Next »

Get More Out of Instructables

Already have an Account?


PDF Downloads
As a Pro member, you will gain access to download any Instructable in the PDF format. You also have the ability to customize your PDF download.

Upgrade to Pro today!