This is PlottyBot, a pen plotter you can build.

It’s based on a Raspberry Pi Zero W which means it’s loaded with software to make it easy to use. It also comes  with novel features.


  • Simple control from a web interface, with plot preview, play, pause & stop.
  • Works on complex hours long plots without missing a step.
  • Automatic calibration or manual calibration to work on smaller media.
  • GCode support, or simpler human readable (and kid friendly) Plotter code. Automatic conversion from GCode to Plotter code.
  • Various pen stroke aggregation algorithms & normalization to drawing area.
  • Internet enabled drawing

video soon to be released

  • Handwriting Typewriter

  • Local WiFi network where no Managed network is in range
  • Rotatable pen holder to accommodate various drawing instruments such as fountain pens.

    Using fountain pens gives you the ability to work with specialty inks such as UV ink.

  • Ink Refill Routine for instruments which require it.
  • Advanced tunables for every aspect of the machine’s operation.

Finished Build


STL Parts for 3D printing

Circuit Diagram

OS SD card image

SKP Model for editing

Build Instructions

Parts to gather

3D printed

Grab all the STL parts from here. Each part file has a name finishing with the quantity you need print of it.

When all are printed, you’ll have this:


Tools to have

  • soldering iron
  • glue gun (or sugru mouldable glue)
  • allen wrench set
  • dupont wire connection kit (possibly optional)



Household items

bendable plastic you can cut
click pens to steal their perfectly sized springs


Here is a full representation of the final circuit where we’re going to build. We’ll take it step by step, this is only for reference.

Click image for full size

Step by Step

1. Gondola


4 M4x35 hex screw
4 M4 lock nut
8 washers
10 bearings
8 LM8UU linear bearings

3D Parts:


For each belt roller, gently hammer in 2 bearings, one on each side. Use a piece of wood or something to shield the bearings from the hammer.

Your belt rollers will look like this when you’re done:

Grab the LM8UU linear bearings, also grab one of the linear rods simply to test them before you commit them to your build.

You don’t want a bad linear bearing so it’s a good idea to run them along the rod and make sure they move smoothly. You’ll know immediately if one of them sticks, throw it away and get another one.

Now that you know all your linear bearings are up to par, insert them in each corner of gondola_bottom and gondola_top. You can pressure fit them.

And of course, gentle hammering can help, be really careful not to damage anything in the part.

When you’re done, you’ll have a nice line of sight from one end to the other.

You can use the rod once more to make sure it runs smoothly through both bearings in a line.

When you are done, both the top and bottom parts of your gondola will each have 4 linear bearings in their corners.

Get your belt rollers and the rest of the hardware.

Put the 4 M4x35 hex screws through the top part with washers.

Place it upside down on your work surface.

Add 4 belt rollers (we’ll use the 5th later on).

Place the bottom part on top.

Add 4 washers and lock nuts into the innermost holes.

Because we’re going to be handling all this, I like to tape over the 3 nuts I’m not working on so they don’t keep falling. I remove a piece of tape when I’m ready to work on another nut.

Tighten each nut, the operation is a bit tricky, not only because you’re working with a different tool on both side, but also because lock nuts are very tight. Do not tighten the nuts firmly, the screw and its nut should float just a bit. These screws do not hold the gondola together, they only provide an axle for the belt rollers.

Make sure that each belt roller rolls freely inside.

It’ll look this this when you’re done.

3. Back Assembly Belt Roller


1 M4x35 hex screw
1 M4x25 hex screw
1 M4 lock nut
1 M4 nut
2 washers

3D Parts:


We’ll also use the 5th belt roller you made while building the gondola. While we’re doing belt rollers, it make sense to do this part :).

Grab the back assembly, the M4x35 hex screw and the M4 nut. Insert the screw into the hole of the back assembly, screw in the nut on the other side. Then pull the screw to force the nut into its similarly shaped receptacle.

Grab the back_assembly_belt_tightener, put the M4x25 hex screw through it, lock nut on the other side and washers on both sides.

As with the gondola, do not overtighten the roller, this is only an axle. Make sure the belt rolls freely.

You’ve built both parts.

Now we put them together. One simply fits into the other as follows.

3. Main frame, the Y axis


8 M4x12 hex screw
12 M4 nuts
8 washers
2 M4x30 hex screws
2 linear rod 8x450mm

3D Parts:



a whole bunch of wires

In the corner of both terminal_top and terminal_bottom, you’ll find the following:

It’s a oddly shaped assembly meant to receive 2 nuts and a screw to serve as height adjusters for your plotter. On the bottom of the terminal, where is assembly is, is a hole for a M4x30 hex screw and a receptacle for an M4 nut.

Screw the nut on the screw.

Then pressure fit it in the bottom receptacle.

Screw into the terminal until you can see the screw.

Then add another nut.

Then screw in some more until the nut you just added is itself pressure fitted into the receptacle above it. This is a bit of a funny exercise which takes a bit of back and forth to figure out.

When you’re done you have a screw held by 2 firmly encased nuts.

Put super glue into a terminal_height_adjust_foot end where a hex head is meant to fit a screw head.

Then pressure fit it into the screw. The gentle hammering may come in handy. I took the screw out precisely for this :).

Put the screw back in, you now have a height adjustable foot on your terminal.

Do the same for the other terminal, I’ll skip all the known steps.

Grab 5 wires of different colors (except red and black). Cut them at 3 times the length of the distance between terminals when they are joined by their slabs (you can put them together loosely to see).

Now begins the very tedious task of twisting them lengthwise. It will help in multiple ways. First on each terminals, we’ll deal with bundles of wires known for a purpose. Second, it’ll be easier to feed them through the slabs. Lastly, I hear twisted wires help with electromagnetic interference, and well, I haven’t had any since I twisted my wires so I’ll say that’s true.

Then do another run with red, black and orange.

Then another with white and yellow.

Lastly, add a couple of wires of random colors to your spools, they don’t need to be twisted.

You should have the following bundles when you’re done.

Grab them all and insert them into the bottom terminals corner, where an arch shaped hole is.

They’ll come out the other side (bottom view).

Insert them into the similarly shaped arch hole of a slab.

Until them come out the other side.

Repeat with the next 2 slabs.

And in through the top terminal.

Insert M4 nuts into the bottom where receptacles exist (except for 2 where the top terminal joins).

Screw in M4x12 hex screws from the top.

Put in nuts in receptacle for the last step (not screws yet).

Grab your linear rods, and the gondola you build previously. Insert the rod in the bottom terminal.

If the rods don’t fit, it’s ok, 3D printers tolerances can vary. Grab a drill with a bit 8mm or smaller and very, very, very carefully make the room you need for the rod. You do not want the rods to float in their hole, it will make drawings inaccurate, they are to be firmly held. Again, do not overdrill, take your time to remove a little bit of material at a time as you try the rod.

This is all I needed to remove to get mine to fit.

With both rods into the bottom terminal, slide the gondola on. Watch for the orientation. Insert the rods into the top terminal while rejoining it to the slabs.

Put in the last M4x12 screws to commit the top terminal. Make sure the gondola slides smoothly.

4. Stepper Motors


8 M3x8 hex screws
8 washers
2 GT2 20T timing pulley


2 stepper motor

The pulleys had 2 embedded hex screws used to tighten them onto a stepper motor. Have one slightly out and one slightly in as such.

The stepper motors shafts have a flat side meant for the “slightly inside” pulley screw. This ensure that a pulley screw is tighten to the flat side which prevents slippage.

Slide the pulley on and tighten both screws. The pulley’s height wants to match that of the stepper motor’s shaft.

Do this for both motors.

Insert a motor in a terminal.

Then it’s washers and M3x8 screws, nothing too crazy :).

Do this for both terminals.

5. Power

3D parts:



voltage regulator
12V power supply female connector

Insert the 12V power supply female connector into the top terminal. As always, fits may be tight and fabrication and 3D printing can vary, don’t hesitate to remove material where needs be.

The voltage regulator will go on the terminal_top_power_supply_holder which crimps on, but don’t crimp it on yet. This is just to see where we’re going.




Before we proceed further, a connector interlude.

We’re about to wire electrical components. In this build I will solder them, instead you can use headers and dupont connectors which can be added and removed at will. Removable connectors are nice in that mistakes are easy to fix, and components easier to repurpose. This is what I did for several previous iterations of PlottyBot. The one I’m building now however is a final version and very much meant to plot through the ages. I want sturdy connections unaffected by plotting vibration and transport. I have plotted for hundreds of hours on dupont connectors, they are fine but will come loose on occasion. Nothing that can’t be wiggled back in place.

Choose your path, headers or connectors or soldering.

The following dupont connector set is available from Amazon. If you go this route, I recommend you try a few wires to practice on before you move on to your plotter. There’s definitely a technique to it.





Take your voltage regulator, it needs to be set to turn 12V into 5V. We’ll tell it to not use the adjuster (a tiny rotating potentiometer on the other side), and instead hard set it to 5V to supply power to the Raspberry Pi. Definitely zoom in on the next picture to see exactly what to do.

After a little work with the exacto knife and the soldering iron.

Grab a new black wire (not one already in the plotter), strip it and solder it to the GND. I have this wonderful tool to strip wires.

Grab another new red wire and wire it into IN+. When you do so, also join IN+ with EN. It will make the voltage regulator always enabled.

I am not a good solderer and if it works, I’m all right with it :).

Grab a couple more red wires and a black one long enough to travel from the 12V power supply female connector to various parts of the terminal (plus some slack, it’s always easier to shorten a wire than to lengthen it). Also pull out from the umbilical of twisted wires joining both terminal the red/orange/black bundle.

Solder the orange wire from the bundle into VO+ of the voltage regulator.

Unscrew both screws of the 12V power supply female connector to ready it to take wires.

Insert into the 12V+ side, the red wire from the red/orange/black bundle, the red wire from the voltage regulator, and the 2 new red wires you made. That is 4 red wires total on the 12V+ side.

On the Ground side, insert the black wire from the red/orange/black bundle, the black wire from the voltage regulator, and the 1 new black wire you made. That is 3 black wires total on the ground side.

Here’s what this will look like when this is done schematically.

And with the usual photos.

Let’s plug the plotter into a source of power and make sure that we get the proper voltages where we think we have them. Every red/black combo should give us  approximately 12V (emphasis on the approximately).

Even at the opposite terminal.

Also at the opposite terminal, the orange/black pair from our power bundle should give us 5V. This is what we’ll use to power the Pi.

When you are satisfied that it all looks good, put some electrician tape at the tip of these wires to be safe. We won’t use all of them immediately.

6. Raspberry Pi

We’re going to get the Pi going so we can test components as we add them to our build (stepper motors, limit switches & servo motor).

Download the PlottyBot SD card image

Then download the Raspberry Pi Imager which we’ll use to write the image onto your SD card.

Launch the Raspberry Pi Imager and follow these steps:

Find the PlottyBot SD card image you just downloaded.

Make sure you pick the right SD card, if you have anything else show up in this list you want to triple check that you don’t overwrite something that is not the SD card for your Pi.

Elevated privileges are required.

Put the SD card in your Pi and plug it in to a standard USB power source.

You can connect it to a screen too if you want but you don’t have to because we’ll connect to it via WiFi. Keep in mind however that the first time it boots, it will take 10 to 15 minutes to complete all the initialization steps. This is only the first time as it installs all the necessary packages to run the plotter. You’ll know it’s done when you see a new WiFi network called “PlottyBot”.

Go ahead and connect to it, the password is 1234567890 (you will no longer be connected to the internet, only to your PlottyBot). Then point your browser to http://plottybot.local.

This is the web interface you will use to have your plotter do cool drawing projects for you. Because you’re seeing it, you know the Pi is ready to go in. It goes in the bottom terminal as such (here loosely fitted in its holder). Notice the red/orange/black wire bundle we’ll use to give it power.

Untwist your bundle a bit to work with it.

Grab 3 new black wires long enough to reach within the bottom terminal plus some slack.

Strip them, we’ll connect them to the black wire from the red/orange/black power bundle. We want to split the black wire from the bundle into 3 for various components needing ground. You will most likely need to shorten the black wire from the bundle as it exits the “umbilical” from one terminal to the other.

Let’s solder all this so it’s nice and sturdy (notice the heat shrink tubing we’ll slide over the exposed wire later).

Then we slide the heat shrink tubing over the expose area and shrink it with heat. I use heat from the soldering iron getting it close without touching, but if you have a heat gun it’ll work better and faster. Our ground is now 3 grounds.

We’re about to start soldering onto the Pi. If you went with dupont connectors it’s pretty forgiving. However with soldering you want to make sure you hit the right pins. I use as reference for Pi pins.

Solder one of the black wires you just attached to Pin #6 (Ground) of your Pi.

When soldering on the Pi (or anything really), you want to make sure you don’t create contact between pins.

Now let’s solder the orange wire from the red/orange/black power bundle to pin #2 (5V power) of the Pi. Again, you may need to shorten it from the umbilical. In the power bundle, red is 12V, orange 5V, and black ground.

You now have power from your plotter to your Pi.

Make sure that the wires have just enough slack in them to allow for the Pi to rest in its final position.

Let’s power the plotter and make sure that the Pi is itself powered. Again we know this when we see a PlottyBot WiFi network. This second boot should be much faster, maybe a minute or two.

You see the PlottyBot WiFi network? Congratulations, you’ve just powered your Pi with your own power circuit. Let’s get to wiring the first stepper motor driver, the one in the bottom terminal next to the Pi. It goes in the holder on the other side. We’ll first connect power from our red/orange/black bundle. The driver takes 12V (the only red wire) and a ground (one of the 3 black wires you added). They go to the PWR IN + pin and the PWR IN GND pin on the driver respectively.

If you solder your connections, make sure that there isn’t too much wire sticking our beyond the solder blob.

The stepper motor driver’s got power.

We’ll now connect the motor itself to the driver. I’ll be a bit more expedient with the pictures by showing only the results. You can always refer to the full circuit to know which stepper motor wire goes to which pin on the driver and I recommend you do so. Essentially the other is blue/yellow/green/red going from coil A to B.

Now grab 5 wires of various colors (except black and red).

Twist them into a bundle that can reach within the terminal (plus some slack).

Connect one end of the bundle to the driver pins, we will use ENABLE, DIR, STEP, MS1 & M2. Again, the full circuit comes in handy.

Place the driver loosely in its holder.

Now we’ll connect our new twisted bundle to the Pi. Wires will be a little crazy as we move on with more components. Always make sure they can reach to where they need to go, and be ok with components “floating in the air” supported by wires you connected. Of course, if you are using dupont connectors, you can simply have components sitting in their holders and connect them as needed. The only trick is to create wires of appropriate length. The full circuit will tell you which wire of your bundle goes to which pin of you Pi.

To confirm:
Pi pin #37 (GPIO 26) goes to driver ENABLE
Pi pin #35 (GPIO 19) goes to driver STEP
Pi pin #33 (GPIO 13) goes to driver DIR
Pi pin #31 (GPIO 6) goes to driver MS1
Pi pin #29 (GPIO 5) goes to driver MS2

When all the driver wires are connected, let’s power the plotter once more. Connect to the PlottyBot WiFi network, point your browser to http://plottybot.local and let’s see if the bottom stepper will move.

Scroll down to the “Mechanics” section of the web interface. This section is only enabled if you know what you’re doing.

Click on “Test Bottom Stepper Motor”.

Your bottom stepper should move back and forth 4 times with a different sound pitch every time. What’s going on is that it’s instructed to rotate a certain amount at various levels of microstepping. If you don’t see this behavior, one of the wires from the Pi to the driver is misconnected, or the driver is bad. Remedies are case by case and will trying various scenarios to isolate the issue. Drop a comment if you’re stuck.

Let’s now wire up the top terminal’s stepper motor. Remember how we bundled 5 wires going from the terminal where the Pi resides (bottom) to the terminal where the power resides (top)? Well this bundle is meant for the top terminal stepper driver.

Going quick because we’ve already done this on the other side. Grab a red wire and a black wire from the power outlet and connect them to the stepper driver’s PWR IN + and PWR IN GND pins as you’ve done on the other terminal. Also connect the terminal’s stepper motor coils as you have done before. And finally, connect the 5 wire bundle to it. On the other side of the plotter, this 5 wire bundle goes to the Pi and will join:

Pi pin #40 (GPIO 21) goes to driver ENABLE
Pi pin #38 (GPIO 20) goes to driver STEP
Pi pin #36 (GPIO 16) goes to driver DIR
Pi pin #32 (GPIO 12) goes to driver MS1
Pi pin #28 (GPIO 1) goes to driver MS2


On the other side of the plotter:

Power the plotter once more, connect to wifi, go to the web interface and into the “Mechanics” section. Click the “Test Top Stepper Motor” button this time.

Once again you’ll see the motor move 4 times the same way, but with various sounds.

Once again if you don’t, you’ll want to investigate and isolate the issue.

7. Fans


2 fan

The fans are wired in series and not tied to the Pi, they just spin when the plotter is powered.

Start with the top terminal (where power is), the fan will pressure fit in the driver corner. The stepper driver can get hot which is why we give give it good airflow, we’ll also give it heat sinks later on. These fans have a slightly different width and height so make sure it goes in at the right orientation. You can then connect a red wire from the red/orange/black power bundle. Do not however connect the black side, because they are wired in series, we’ll instead use one of the standalone wire we have in the umbilical.

Then with heat shrink tube.

On the other side of the plotter (bottom), we connect the standalone wire from the umbilical to the red (positive) wire of the other fan. Its black (ground) side goes to one of the power bundle’s black wire. Again, the fans are connected in series.

Now with heat shrink tubes.

You can power the plotter again to make sure both fans are spinning.

8. Limit Switches


1 M4x8 hex screw
1 M4 nut
2 M4x40 hex screw
2 M4x35 hex screw
4 M4 lock nuts
8 washers

3D printed:



4 limit switch

At the top terminal, put a limit switch in its enclosure. Run the yellow/white bundle from the umbilical to it and cut it to length (plus some slack just in case). Strip the wires and attach white to the middle pin, and yellow to the pin on the side where the little red button is.

Solder the wires in place, this is valid also if you use dupont connectors, this will help a lot.

Put the switch back in its holder.

At the other terminal (bottom), grab a limit switch an solder a new twisted pair of yellow/white wires, long enough to reach within the terminal.

Solder both the yellow/white pair from the umbilical, and the new yellow white pair you created into the Pi. In both cases, white will go to a ground on the Pi, you can pick any 2 grounds from the Pi, find them using For yellow, the switch from the top terminal going through the umbilical should be connected to Pi pin #11 (GPIO 17), while the switch from the bottom terminal should be connected to Pi pin #7 (GPIO 4).

Again components will be floating not in their holders, but you want to be mindful when wiring them up that they’ll be able to get back in there. This is less of an issue with removable dupont connectors where the component can rest in place and wires brought and connected to them directly on the top. With soldering we need to flip the components over so we can solder their bottom side, it’s definitely messier to work with.

You’ll notice you’re left with 1 cable on its own in the umbilical. It serves no purpose :). It’s meant as a backup in case another is faulty, if we mess one up, or for potential future expansions. Now that, is what I call planning ahead. For now we can simply coil it up to prepare it for storage.

With this last wire out of the way, we can slide the gondola to both extremities and make sure it triggers the 2 limit switches (you’ll hear a distinct “click” when it does). You want to gondola to trigger the limit switch before it runs into the terminal, with a bit of room in between to be safe. You can adjust the switch by bending it’s metal arm, do so until you’re satisfied with the location at which it triggers.

Let’s grab our 2 gondola_top_limit_switch_cap, our 4 gondola_top_screw_cover, and our remaining 2 limit switches. They’ll go on the top of the gondola.

They go in their caps like this:

We simply put the gondola_top_screw_cover on top of the gondola’s innermost hex screws. They’ll be held in place with the limit switch caps. They don’t serve any purpose 🙂 just here for aesthetics.

Now we’re going to wire the limit switches on our work surface, and then we’ll put them on the gondola. Wiring them is a bit tricky because you want their wires to go through their cover’s holes. But Also because they share a single ground which will go all the way back to the bottom terminal, and then extend all the way our the X axis, where the pen will go. Other than this ground, they also both have their own signal wire going back to the bottom terminal.

Here’s a schema of what we’re after, it include 2 other wires (yellow and red) which are just passing through the gondola on their way to the pen assembly. We are not worrying about these 2 right now, only black, green and blue.

What my wiring looks like when it’s done:

For the wires which go to the bottom terminal or the pen assembly, make sure they are plenty long enough plus some slack. We’ll cut then to size later.

You can then pressure fit the limit switch covers into the gondola. They’ll click into place but as we mentioned before, 3D printing isn’t always super accurate and so don’t hesitate to shave off plastic where fitting isn’t happening.

As you can see, the ground 2 limit switch signal wires go back to the bottom terminal while another ground is left dangling at the gondola.

Let’s now grab a piece of flexible plastic. Any plastic will do that can be cut with scissors and give rigidity and flexibility to carry the wires between the bottom terminal and the gondola. I found that a plastic folder that gives me exactly that and I’ve been using it since :). I’m sure there are tons of other options in one’s house.

I’m cutting 2 pieces here because 1 doesn’t suffice to reach all the way across so I’ll join 2. You also will want another length to go on the X axis from the gondola to the pen assembly.

This is the sort of flexibility we want.

With the wires back out of the terminal, we insert an M4 nut in a tricky spot right where the cables enter.

We can then screw our M4x8 hex screw into it, and use the screw as better leverage to pressure fit the nut into its receptacle (inside, away from the terminal wall).

We can now slide our bendable plastic into a slit right next to the arch opening where cables will enter the terminal.

You can then screw in the M4x8 hex screw to lock the flexible plastic in place.

On the gondola side, the flexible plastic goes on top in a slot the same shape as our gondola_top_cable_management. It helps to cut it to a good fit. Then we mark it where a screw will lock it into place going all the way through the gondola.

We then drill that hole in the bendable plastic.

We put it back in place. We mark and drill another hole on our X axis length meant to extend out the the plastic assembly. This is what it looks like with all our flexible plastic lengths in place.

We can now grab our gondola_top_cable_management and place it directly above our flexible plastic, along with 2 M4x40 hex screw ready to go through the gondola. 2 M4x34 hex screws go into the last 2 outer holes of the gondola. We also use washers for the screws, and at the bottom for the lock nuts.

As previously when we screwed in the belt roller axles, it’s a tricky exercise to tighten these 4 new screws on both sides of the gondola. These screws are holding the gondola together and are meant to be tighter than the axles ones we did earlier. Still though, definitely don’t overtighten and keep an eye on how well your belt rollers are moving.

When this is all done:

We then add a red and green cable going all the way from the bottom terminal, through the gondola, and to our yet to be built pen assembly. We can use the little hoops on the gondola_top_cable_management to keep our wires tidy. I uses electrician’s tape on the flexible plastic to hold the wires.

We finally get to connect our 2 gondola limit switches 🙂 that was a serious tangent… Grab them both, and the ground.

Connect the ground on any ground on the Pi. Then connect the limit switch situated to the left looking at the picture above to Pi pin #3 (GPIO 2). This is in fact the limit switch triggered when the pen assembly reaches it’s right most position and we’ll refer to it as the “right limit switch”. But looking at it this way, it’s on the left :). The other limit switch, the “left limit switch” situated to the right on this picture, goes to Pi pin #5 (GPIO 3).

We can now power the plotter once more and head to its web interface. The Mechanics sections will show the state of the limit switches. You can trigger the switches yourself manually and verify that their state is toggled as you do so (the state isn’t reflected on the web interface immediately, it might take a second or 2 to show).

9.  Servo Motor


servo motor

We’re about to do our last wiring :). Grab the red and yellow wires you have brought into the bottom terminal from the gondola (the ones that go all the way out to the pen assembly). Connect the red one to Pi pin #4 (5V power), and the yellow one to Pi pin #16 (GPIO 23).

Where the pen assembly will go, we cut and strip the wires, you’ll need to use your X axis linear rods to estimate where to cut. We will actually be terminating these wires with a dupont connector matching the servo motor’s. This is because these servos will wear and die. They are a part with limited cycles and so we want it to be easily replaceable.

When it’s connected, we can power our plotter once more and head back to the web interface. The Mechanics sections has “Pen Up” and “Pen Down” buttons to test the servo with.

We are done with wiring! We now get to tidy up our terminals by placing components in their holders and managing wires. There is no right solution for the wires, the model simply has opportunities for small zip ties. I used a glue gun to hold the components in place on the corners which aren’t covered, I usually prefer sugru mouldable glue but I didn’t have any.

My Pi is a a bit of an ill fit here but that’s ok.

10. Pen Assembly


2 8x350mm linear rods
2 3x100mm linear rods
1 GT2 belt
1 M4x8 hex screw
1 M4 pen holder hand tightening screw (or a regular less fancy M4 screw)
2 M4 nut
4 M4x12 hex screws
4 washers

3D printed:


Previously build:

the back assembly belt roller from step #3.

Run the rods through the gondola.

Add the back assembly belt roller.

And then the front_assembly.

Get your GT2 belt.

Run it through the plotter and out the front assembly. It’s hard to describe in words exactly how so here’s a schema:

This is an annoying thing to do with several attempts to be expected. But it’s not hard. I find attaching a bent but rigid guide to my belt helpful. You wand to make sure that the belt doesn’t twist and is always flat with its teeth eventually facing the stepper motor pulley.

Pressure fit 4 M4 nut into receptacles in the back of the front_assembly.

Grab your front_assembly_servo_holder. It has teeth in the back to hold the GT2 belt in place when pressed against it.

Put it against the front_assembly and screw in the bottom 2 holes with M4x12 screws and washers. You want to hold the belt tight until these 2 bottom screws are in place and holding it for you.

Slide in the flexible plastic carrying our servo wires from the gondola, drill a hole in your flexible plastic matching that of the front_assembly_servo_holder, as you’ve done before. Screw in the top 2 holes with 2 more M4x12 hex screws and washers.

Put your servo motor in (without the arm).

Plug in the servo, plug in your plotter, go to the web interface, and click the “Pen Down” button. Now put in the servo’s arm horizontally and screw it in.

Tidy up the servo wires.

Pressure fit an M4 nut in the receptacle in the back of front_assembly_pen_slider.

Place front_assembly_pen_holder on top of front_assembly_pen_slider, it has a circle of little dots matching little holes meant to adjust rotation of the writing instrument. We’ll just do a straight angle for now.

Screw it in place with an M4x8 hex screw.

Inside where the pen will be held is a receptacle for another M4 nut, pressure fit one and screw it a hand tightening M4 screw (or a regular M4 screw if you want).

Looking good.

Grab 2 M3x100mm linear rods (you can salvage some from old CD drives).

The rods need to slide without friction as much as possible. Until they do, you can hand drill the holes of your newly built pen holder. Be extremely careful now to remove too much material or your pen holder will have play.

Grab 2 sacrificial click pens. We’ll cannibalize them for their springs.

Then attach the pen holder to the plotter one rod at a time, placing the springs strategically. You might need to adjust the springs by forcing them to a new length.

Of course now is the time to try our “Pen Up” and “Pen Down” buttons in the Mechanics section of the web interface.


11. Final steps


4 M4x8 hex screws
4 M4 nuts
14 rubber feet

3D Printed:



4 heatsinks

Our stepper drivers can produce a lot of heat, on top of being next to a fan, we’ll give them heat sinks. They just stick to the chip and it takes 2 to cover 1 chip. Do this for both terminal’s stepper drivers.

Grab your terminal covers.

Pressure fit 4 M4 nuts in each of their little protruding arms.

Wiggle them in place on top of their respective terminals and screw in the M4x8 hex screws to the side. Getting them in place is a bit of an art, you want to make sure that the little arms embrace their matching shape in the terminal.

Finally, flip your plotter over and stick 14 rubber feet where there are receptacles for them.


Head over to the web interface and try a simple plot to make sure everything is functioning correctly.


As an afterword to this extremely long instruction set, I would like to congratulate you for your patience and tenacity. I refined this plotter over years and many, many prototypes. I tried very hard to provide instructions which were as clear as possible while making no assumption of understanding of any kind. It contains all the tidbits of missing information I had to find the hard way when I was researching how to build such a thing. I hope to have made this project free of the blind spots and dark corners I found myself into. Equally I hope for the software stack to significantly lowers the bar of entry to just get a plot going. If you find anything missing or unclear, please do reach out with a comment or email and I’ll fix it. May your new toy scratches your plotting itch :).

Please do get in touch if you build this, whether or not you are having issues. Thank you and take care!


  • What’s up with the sound the plotter makes? The stepper motors have inconsistent pitches when moving straight.

This is the result of 2 phenomenons, the first is that there is an acceleration algorithm in effect. The second and most likely culprit is that the sleep time is enacted by Python in software land. Python on a Raspberry Pi does not have access to dedicated hardware to “sleep” (wait) between stepper motor steps in a way that is accurate at the millisecond resolution. Python is competing for CPU cycles with other processes on the Pi. What this means is that the “attention” Python gets from the Pi is not dedicated and so the sleep time between steps may vary a little in a way that you’ll hear. Equally true is that sleep times are a minimum, if you instruct Python to sleep for 0.01 millisecond, it will sleep at least 0.01 milliseconds, and so while you can count on Python on a Pi to not sleep so little as to break the mechanical limits of how fast a stepper motor can move, you can’t count on it not sleeping a little more which is something you’ll hear. This is a draw back of working with stepper motors on a Pi, but the other processes getting attention make the Pi a very desirable device to step motors on regardless. An Arduino could not step motors while being connected to WiFi and serving web pages. At the end of the day, all your stepper motors do is sound a little funny in exchanged for a fully fledged software stack.

Future Features & improvements

  • does Python sleep better with nice?
  • interference from DC cooling fans?
  • need a way to report back stderr
  • manual calibration an issue on ipads because of JS events listened to (mousedown vs finger actions)
  • Consistent approach routine to homogenize belt tension at destination coordinates
  • SVG to GCode converter with optional hatching
  • Gondola Plotter support
  • Laser engraving implement
  • Time estimation
  • Load Google fonts locally when not connected to the internet
  • Support open & wep networks
  • When connecting to managed wifi, be more graceful about refreshing page and having some sort of acknowledgement and waiting animation
  • Build for latest Rapios

6 Replies to “PlottyBot”

  1. Hi! Thanks for this amazing project!

    I’m gearing up to make this, but am having trouble sourcing the 8mm x 450mm rods locally (trying to avoid Amazon if possible). I do however have a source for other lengths (also, I’m curious if the dimensions can be increased).

    If I modify the “terminal joining slab” parts to accommodate different length, do you think that would work? Or other tips for tweaking the plotter dimensions?


    1. Yes, you’re spot on. You can increase the slab size and have longer rods. I build a PlottyBot with 600mm rods for the Y axis, I have the elongated slab for this if you want.

      The X axis can be completely arbitrary but you’ll run into issues of weight if you extend too far out.

      I will say that, for all the stuff I buy local and believe in vehemently, Amazon and package delivery are extremely efficient systems and I’m pretty sure the environment comes out ahead if I don’t drive around trying to find specialty hardware that was made in China regardless. I’ve made my peace with getting some stuff from them. Hats off to your principles and you sticking to them, it’s important.

      I hope this helps.

      1. Oh awesome, thanks for the fast response!

        I would love the STL for the 600mm slabs, if you don’t mind.

        Yeah, it’s probably coming from the same factories regardless of how it gets to my door. Just would rather avoid them if possible.

        I found 90% of the parts at, which will get me free shipping. And they have the 600 mm rods!

        I will update you with my progress! This project tipped me over the edge to buying a 3D printer (the MKS)– really excited to use my robot to help build another robot.

  2. I can’t wait to build one for myself! I’ve even got a pi zero w just waiting for the perfect project! Thanks for such excellent documentation.

    1. Thanks for the kind words :). I tried to create documentation free of all the dumb little time sinking issues I ran into. It’s nice to know it’s appreciated.

Leave a Reply

Your email address will not be published. Required fields are marked *