Building a Wall Hanging Drawing Robot

There is something insanely cool about watching a machine draw on a wall. The final drawing feels secondary to the robot’s performance of making it. I wanted one!

There are a couple premade wall robots for sale.

However, the Makelangelo ships from Canada, and I am in Europe.

And the Scribit which looks shiny and fancy in videos is rumored to be painfully slow. So it seemed like the perfect opportunity to work on my robot building skills.

When I started doing research, I realized that the wall hanging robot should be one of the easier robots to build as it requires minimal equipment. Probably, if you knew how to wire stepper motors, crimp wires, flash firmware, and the like, it would be a nice afternoon project.

However, I was starting near zero in terms of experience. I struggled for a few weeks. And finally, I got it working!

This article is is part build log, part instructable, and part curated list of resources that hopefully will be helpful to someone like me who wants to embark on their own build.

The Basics

Why build a wall drawing robot?

  • It looks insanely cool and is fun to watch.
  • The project requires much less equipment and is relatively cheap (under 100 Euros) compared to other drawing robots
  • It is easily scalable—you can go huge.

Why not build a wall drawing robot?

  • Accuracy is important to you. While the robot is quite accurate, there are more precise drawing robots out there.
  • You want to experiment with a wide range of pens and materials. The lack of gravity and gondola limit your pen/tool choices compared to a XY plotter.

History and Math

One of the earliest notable wall drawing robots, known as Hektor, was created by artist Jürg Lehni in 2003.

This spray painting robot served as an inspiration for Sandy Noble’s Polargraph design. His Instructable popularized the form.

Often, any wall hanging robot is called a Polargraph, the same way tissues are called Kleenex.

They aren’t using a polar coordinate system.  The popularity of the Polargraph caused a confusion that is still rampant in much of the documentation on these types of robots. In fact, they don’t function on a polar coordinate system. They are not limited to only drawing within a circle (something I read in some articles). Noble discusses why he chose the name and how it is a misnomer in this article.

The math. I think of the system as one of two triangles. Noble calls it “a kind of double-triangulation coordinate system.” Bill Rasmussen, who goes into the mathematics and issues of accuracies in a great article here, calls it “biangular coordinate system.”

The Options: Figuring Out What to Build

Polargraph

The most common and perhaps best documented is Polargraph. The original Polargraph is an open source robot developed by Sandy Noble. He wrote an extremely popular instructable detailing every step of building a Polargraph and has a website with even more information. If you google, “Polargraph,” you will find a myriad of other build logs.

It uses an Arduino Uno and a Adafruit stepper motor shield (I did build one with a CNC Shield v3 so there are a few options) with stepper motor drivers. It has its own firmware and using a Processing sketch as a controller.

The main drawback of the Polargraph is that it hasn’t been supported since 2019. This means the controller runs off Processing 2.2.1 —the current version of Processing is 4.2.

I did actually try this option and got it working but never could get it past insanely slow speeds (which easily could have been a setting problem I never could figure out).

The Processing sketch does run as long as you install the legacy version of Processing. However, it was buggy and crashed a few times.  Generally, it felt a bit too risky and wasn’t giving the results I wanted.


Makelangelo

The more current option is the Makelangelo designed by Dan Royer. It is also an open source project which if you don’t want to go through the hassles of a self-build you can buy in a kit from Marginally Clever.

It uses Marlin Firmware which is a common firmware for 3D printers. Marlin takes up too much space to fit on an Arduino Uno (I tried for a bit before realizing this…) but does fit on an Arduino Mega 2560. Royer uses a Rumba board in his build, but I used a Ramps 1.4 (a common choice in Makelangelo DIY builds) with stepper drivers to hook up motors and servo.

I did try hard to use the CNC shield v3 I already had from the Polargraph build with no luck. I could get the steppers to work but the servo never did.

The Makelangelo software is written using Java and will not only control the robot but also generate and process images to print. This ultimately was the build that I went with.

Other options

In my searching, I also came across GRBL modified for polargraph, unsure how well it works but in theory it should allow you to use something like Universal Gcode Sender to control it.

There may be even more options. V-plotter or vertical plotter are additional search terms that can help you find different builds.

Resources

A large part of this project was simply searching through the wide internet for resources.

Lots of generous people have documented their own builds. These are the ones I found most helpful:

Articles

This build log by Guillaume Membré is probably the clearest build log I found (I wish I had found it earlier in my build process!). He also built his own Makelangelo. It is in French, but it is very clear, and you can translate page easily.

Over at Github on zanedrys account, I found a wonderful twenty page instruction manual on how to build a Polargraph. It is a great document and helpful even though ultimately I built a Makelangelo.

This is an instructable for building a DIY Makelangelo using the Mega/Ramps combo. It is really well written, but he made the robot when Makelangelo still used its own firmware instead of Marlin so it is a bit outdated.

Videos

A video build that uses Arduino/CNC Shield so won’t work with the current Marlin situation but still helpful.

And here is the link of one of the best video tutorials I watched. Unfortunately, it is a polargraph build but he explains some simple build things very well so it is helpful nonetheless.

Discord Servers

Drawing Bots Channel. Very active with lots of drawing robot builders and a #hardware section.

Makelangelo/Marginally Clever Discord Channel. Lots of info and other users/builders.

My Build: Parts and Tools

This is a list of what is needed to exactly replicate my build. It is based on my own choices and might not be the best choice for you or the best choice overall. But in the end, I have a working, quick, and quite accurate (especially considering it swings from my wall) machine.

 

Parts

Arduino Mega 2560
Ramps 1.42x A4988 Drivers with Heatsink
7x Jumpers
2x Nema 17 Bipolar 1.5A 1.8 degree Stepper Motors
2x GT2 20 Teeth Pulleys
5 meters of GT2 6mm Belt
Extra Cable
4x M16 50mm screws
12V Power Supply
Micro servo
Screws (a few tiny M3 for servo motor, M4 for gondola holder, and some drywall or other screws to attach to wall)

 

3D Printed Parts

I suggest printing parts (especially the mount brackets and the arms of the gondola) with PETG. I made the mistake of printing with PLA and had to reprint because of snapping and breakage.

  • Brackets to mount the stepper motors to the wall
  • Pen holder (also called a gondola) There are a lot of options you can comb the internet for, but I went with the latest Makelangelo one which I think is very well designed, looks good, and allows for multiple width pens. If you search Thingiverse for gondolas, you will find other options.

 

Tools

This is the one thing none of the Instructables or things I read fully cover. There were a lot of skills I had to learn and tools I had to buy to complete this build. It was great learning and made the project worthwhile but also a bit frustrating to not know in advance. 

  • A multimeter in order to accurately adjust the potentiometer on the A4988 stepper drivers.
  • Very small small flat head (easier than tiny Phillips but that also would work) to adjust potentiometer.
  • Wire crimper kit. I needed long cords since my built was relatively large, and it was necessary to learn to put connectors on wire. I had to learn to strip and crimp wires.
  • Wire stripper
  • Wire cutter
  • Connectors (not necessary but if you hate crimping like me, I love using these instead where and when I can)

Putting All the Parts Together

Put together gondola. It can be 3D printed here. The full instructions for how it goes together is documented here.

Brackets. Screw the brackets to the Nema stepper motors. Make sure to do this as shown in the photo and not the other way round (a mistake I made at first…)

Decide the size you want. Cut the belts to the appropriate size and mount the machine on the wall. Make sure you know the measurement of the width. Also good to know is the height of the plotter when the belts are fully extended.

brackets

The Brain + Firmware

Now comes the wiring and getting this thing working.

Put together the brain. Attach the Ramps 1.4 to the Arduino Mega 2560 along with the two motor drivers and connect it to a computer via USB. You will need 7 jumpers, usually these come with your motor drivers although not always—you may have to buy separately. Three jumpers go under each motor driver (these are used for micro stepping) and one jumper is required next to the button in order to give power to the servo. 

Make sure you have the right measurements. The really important number is the width of the machine. This is the number that everything is calculated from so get this number accurate. I have seen different ways of measuring it, either from the very center of the motor or from the outer edge of the pulley.  I chose to measure it from the two closest points on the pulley.

Customize firmware. Before uploading Marlin to the Arduino, edit the config.h and config_adv.h for your specific build in Arduino IDE by following this tutorial by maker of Makelangelo.

The height of the machine doesn’t matter that much. A good number to choose would be either the max height or a little above which you can calculate as long as you know how long the belt is fully extended.

Note: I didn’t use endstops, decide if you want to. The Makelangelo build uses endstops. I chose not to use them and instead manually home it each time.. I literally unplug it and pull it to home before I start any drawing. This mean I adapted the config to keep my home at 0,0. This is the center point: the midway point between the two motors and the center point of the height I defined in config.h file. I measured it on the wall and then put marks where the counterweights should be when the gondola is at (0,0). You could also easily pick another home point. The Polargraph design has its home point is 20cm down from the top. But when you decide be sure to input the correct values here:

				
					#define MANUAL_X_HOME_POS 0
#define MANUAL_Y_HOME_POS 0
				
			

Upload firmware. Download Arduino IDE which is the software to use to flash the Marlin firmware to the Arduino Mega. When you have inputted everything specific for your machine in the config files, flash the firmware. 

Plug in the stepper motors, servo and power.

Download the Makelangelo software and test it out!

I suggest printing a single word to make sure that it is printing in the correct orientation.

If it isn’t you may either need to unplug the stepper motor, rotate 180 degrees and plug it back in. Another option could be to switch the x and y plugs. It took me a few tries:

Troubleshooting

First, check out this great article over on the Marginally Clever blog that details nine common things that can go wrong and how to fix them.

And if you don’t find your problem over there, here is my own list of things that can and did go wrong:

Can’t flash the Marlin to Arduino. Make sure you aren’t trying to flash an Arduino Uno, it won’t fit! Needs to be Arduino Mega. 

Robot printing backwards, mirrored, or at 90 degrees: You have two options, you can either unplug and rotate 180 degrees the stepper motors and/or switch the x and y. You can also toggle between true and false with #define INVERT_X_DIR and #define INVERT_Y_DIR in the config.h file. If you can’t get it right, a possibility is that the stepper wires are not in the correct order. 

Can’t open Makelangelo Software on your Macintosh. Open the terminal and type in:

				
					sudo xattr -cr /Applications/Makelangelo.app
				
			

After doing this return to the app, option click, choose open and then choose to open it in the dialogue box. 

Motors making funny noises or are loud. Use the multimeter to set the potentiometer to the right amount. You can find instructions on how to do this here. Check wiring.

Too inaccurate. I find that speed and acceleration are key to accuracy. Playing with these numbers can change things significantly.

Servo isn’t working. First, check if the servo itself is the problem. Servos are finicky, and I definitely get some duds, so I like to try a couple servos before I decide to troubleshoot other possibilities. Is the jumper connected on the shield to get the servo power? Is the power supply to the shield enough for the two motors and the servo? And always double check the correct wires and going to the correct places. 

Check your crimps, wire order, etc. If there is something wrong and you can’t figure out the solution, and you suck at crimping wires like me, check your crimps. I found that one loose crimp on one stepper motor wire was creating distortions.

Final Thoughts

It was a very fun and extremely challenging process to build this thing. It felt like lots of little puzzles I had to keep solving and was in a lot of ways the perfect project to help me learn more about all things robot building.

Now that it is built, interestingly, I am struggling to know how exactly I will use it. 

Primarily, I think of the robot as performative. It should have an audience, and perhaps that is what its main role will be. 

As I play with it a bit more, learn its errors and imperfections, we will see what emerges. 

NOTE: I wrote this article as a real novice for other novices—as such there may be terms that are incorrect. Shoot me an email or DM if you notice any error so I can correct it!