Code Bits, Projects, & Tech Thoughts

(Mostly) Recycled Drawing Robot

(Mostly) Recycled Drawing Robot


It's a robot that draws on sticky notes. It runs on an Arduino Uno. You send the Arduino G-Code instructions, and it moves a pen around and draws. You can download the parts from Thingiverse but unless you can find identical CD-ROM drives they'll be more useful as reference. The firmware is available for reference on my Github.

Here the plotter is drawing at about half speed, for darker lines, but it can go about twice as fast.

But why?

Flashback to 2014, a younger and more bored version of myself pulled a handful of 5.25" CD Drives out of a bin of computer bits. With no idea if they worked, and no real need for them, I ripped them open and salvaged what I could. A couple years later and I was annoyed at the pile of bits I still had lying around, so I bodged them into a drawbot over a weekend. Also, why not?


Since I'd decided to use what I had laying around, the brunt of the design work was focused around constructing a suitable frame to hold the CD-ROM carriages, and constructing a servo-actuated pen mechanism. I prototyped the parts in Autodesk's Fusion, then 3D Printed them from PETG. Read more about my printer workflow in my printer setup post.

The Frame

The frame is pretty simple, a truss with a rectangular foot and pegs sized to fit the mount points on the X Carriage. Both trusses were glued to the carriage and then glued to the back panel of one of the CD-ROM drives, which serves as the base. Simple risers for the Y Carriage are also glued in place. Since it was a weekend project, superglue and scrap materials was fine for me. It's sufficiently attached and rigid enough to lift by either the baseplate or the frame/ X Gantry.

The Bed

I sized the bed for a sticky note (3"x 3"). It's a simple reinforced flat platform with the exception of the mount, which was designed to nest with the existing electronics mount on the Y Carriage, and was glued directly to the carriage.

The Gantry

This was the most complicated bit of design work, and probably could have been done better. But that's for version 2. The main body of the gantry is two interlocking plates. The first snaps onto the existing electronics mount on the X Carriage, and supports the weight of the servo. The front plate snaps (via tabs) into the back plate, and provides lateral support for the servo, as well as a recessed channel into which the pen tube snaps. The pen tube has an offset channel for the pen follower, a tab for spring retention, and two tabs for a rubber band (in case the spring does not provide enough tension for the writing surface). The pen clip is split in the back, and slightly undersized to snugly clamp the pen in a friction fit. The pen then slides into the pen tube, and the servo arm holds the pen clip in place. When the servo is rotated 90ยบ the tension spring forces the pen against the writing surface. The servo can grab this arm when rotating back to horizontal, lifting the pen. This whole assembly is glued together and to the X Carriage, as well as being a snap fit.


The Arduino is running a simple G-Code interpreter, that processes G-Code commands sent over a USB-Serial link to the printer. This is identical to how most hobbyist 3D printers, CNC routers, and laser engravers work. Take a look at the Lightweight G-Code Firmware write-up for specifics.

First Prints & Failures

After building the hardware I was eager to see the machine in action, so I downloaded a pre-written solution (I started with grbl, a pretty standard starting point for CNC machine firmware) and flashed the Arduino. It worked!

At least, it sort of worked. The plotter responded to G-Code commands over a serial connection, and sending G-Code drawings moved the pen relatively as expected. But the prints were poor quality, with shaky edges and large stair-step moves where there were supposed to be smooth lines. I was wasn't quite sure what the issue was, but instead of digging around in the firmware I decided to spin my own, because I'm a glutton for punishment (and also, clearly needed to write more parsers -.-). This solution, while quick and hack-y, works well enough for me.


  • (Top Left) "steampunk sketch 2" by Ariane P, done by stippling the pen on the paper. This effect was achieved by limiting the maximum path length while tracing the image in Inkscape.
  • (Top Right) Inkscape Logo. Shading achieved by using the Eggbot extensions for Inkscape.
  • (Bottom Left) "Celtic Knot Mandala". This is about the finest detail the printer can recreate as a vector, though finer detail can be achieved by stippling the pen.
  • (Bottom Right) Red Panda, using a similar effect as the steampunk portrait.

  • (Left) Some of the test prints illustrating different print techniques. I experimented with outside-to-inside path fills for the Github logo, but ultimately settled with the Eggbot striped fill solution tested on the space invaders.
  • (Right) Storm trooper helmet, in case that wasn't glaringly obvious. Some of the drawings the machine makes are charmingly human-looking, especially when the shading has gaps or the pen skips on the paper.

I ended up quite pleased with end result. The plotter prints with decent granularity (and pretty rapidly once the speed settings were tweaked). I was able to tackle it as a weekend project, all in all putting about 35 hours of time into prototyping and development, and similar solutions could easily reuse my code for a much faster turnaround.

The Tedious Details