About: PLC, Arduino - Do it yourself project

In this instructable, I'd like to share how to build a vertical plotter that can draw texts and images on the blackboard.

Let's getting started.

Time-lapse video with hatch fill extension from Inkscape.

Step 1: Bill of Materials

Main components:

Step 2: Ideas

Blackboard V-Plotter is a kind of CNC plotter that draws texts and pictures by moving a pen on a vertical surface. It has a simple mechanical structure, including:

  • One blackboard.
  • Two stepper motors with pulleys and belts.
  • One pen lifting micro servo.
  • Couple of counterweights.
  • And gravity force.

I have an 780 x 1200mm blackboard that my kids no longer use, so I make use of it to build a vertical plotter. My vertical plotter configuration is described in the picture below.

  • Machine Width: 550mm.
  • Machine Height: 800mm.
  • Belt Length: 1000mm.

Step 3: Blackboard Assembly

  • Preparing a blackboard, my blackboard has outer dimension 780 x 1200 mm including aluminum support width 30mm.

  • Drilling 2 holes for mounting 2 stepper motors, the distance between two hole centers is 600mm.

  • Mounting 2 stepper motors at the backside of blackboard.

  • Attaching 2 pcs x pulleys 80 teeth to the motor shafts at the blackboard frontside. Pulley GT2 80 teeth has a pitch of 2mm per tooth so its diameter is: 80x2/PI = 50.955mm.

  • Drilling 4 holes to mount Arduino Mega 2560 + RAMPS 1.4 board at the blackboard top center.

Step 4: Pen Holder Assembly

The main components to build the pen holder are including as follow:

  • Flow coupler, including dust cap.

  • Empty tin wire plastic coil with center hole diameter 19mm, height 23mm and outer diameter 55mm.

  • GT2 6mm timing belt 2000mm and two cable gland for 8 - 12mm dia. cable. I used 2 type of cable glands, one is made from plastic, the other from metal.

Firstly, I cut 2m timing belt into two segments, each 1m length. To hang the pen holder, I removed the chains from flow coupling and connected them to 2 timing belts by cable ties.

Two cable glands were inserted into center hole of empty plastic coil. I drilled 8 holes and installed 4 bolts M3x50 symmetrically along the plastic coil to hang the timing belts. Later we can use these bolts to hang additional counterweights if needed.

I glued a servo at bottom of plastic coil (at metal cable gland side) and soldered 3 wires from servo to RAMPS 1.4 controller. Finally, pen holder was hung on the motor stepper pulleys. I moved it manually and checked if it slipped or not.

Update: The pen holder was shaked and vibrated during plotting so I had to did some adjustments to get its balancing. The steps are as follows:

  • Adding some more counterweights - nuts M10.

  • Connecting the tin wire plastic coil with a round plastic, 100mm in diameter, thickness 10mm.

  • Glueing the micro servo into round plastic and adjusting the servo arm so that it is as close to the pen tip as possible.

  • Attaching the pen, tightening a cable gland to clamp it and try lifting and lowering the pen by rotating servo arm.

  • Done. And it worked much better.

Step 5: Connection

1. Schematic

The V-Plotter connection diagram is shown below:

The main controllers of vertical plotter are an Arduino Mega 2560 and RAMPS 1.4. They control 2 stepper motors via A4988 drivers and one servo motor.


  • In order for vplotter to function properly, two stepper motors should rotate in opposite directions so I had to reverse the wires of right side motor.
  • The RAMPS 1.4 provides four servo male headers tied to pins D11, D6, D5 & D4. My pen lift micro servo is controlled by pin D11.
  • Regarding power supply for servo, I connected Vcc and 5V pins together (using jumper, 5V & Vcc headers for servo power supply are located nearby RESET button) following to the instructions from this page:

"The 5V pin in that connector on RAMPS only supplies the 5V to the auxiliary servo connectors. It is designed so that you can jumper it to the VCC pin and use the Arduino's power supply to supply 5V for extra servos if you are only powered from USB or 5V. Since there is not a lot of extra power from the Arduino's power supply you can connect it directly to your 5V power supply if you have one. You can also leave this pin not connected if you have no plan to add extra servos".

2. V-Plotter connection

  • To arrange the cables neatly and aesthetically, I used a PVC square plastic electrical conduit to run the wiring inside. In addition, eight neodymium magnets were glued on the blackboard backside according to the A1 paper size.

  • Covering plastic conduit. Done.

  • Preparing an A1 paper for testing.

Step 6: V-Plotter Firmware

I used Makelangelo firmware at this GitHub, which was created and developed by Dan Royer - Marginally Clever Robots, Limited. Makelangelo firmware can be used in many different controllers and kinematic systems.

  • Robot styles supported
#define POLARGRAPH       1  // polargraph like Makelangelo
#define TRADITIONALXY    3  // gantry 3 axis setup.
#define COREXY           2  // gantry CoreXY setup.
#define ZARPLOTTER       4  // 4 motor, x-shaped 2D motion
#define SKYCAM           5  // 4 motor, x-shaped 3D motion
#define DELTA            6  // 3 arm delta robot, rotary action.  untested.
#define STEWART          7  // 6 arm stewart platform, rotary action.  untested.
#define ARM3             8  // 3DOF palletizing robot arm.
#define SIXI             9  // 6DOF robot arm.
#define TRADITIONAL6    10  // 6 axis machine, no restrictions.
#define SCARA           11  // 2 axis SCARA.<br>
  • Microcontrollers supported
#define BOARD_RUMBA        1  // Reprap discount Rumba board
#define BOARD_RAMPS        2  // Mega2560 + Ramps 1.4
#define BOARD_SANGUINOLULU 3  // Sanguinolulu
#define BOARD_TEENSYLU     4  // Teensylu
#define BOARD_WEMOS        5  // Wemos D1 R2 + CNC Shield v3 (see board_wemos.h)
#define BOARD_SIXI_MEGA    6  // Arduino Mega + custom shield for Sixi 2 robot
#define BOARD_CNCV3        7  // Mega2560 + CNC Shield v3
#define BOARD_ESP32        8  // ESP32 + Marginally Clever Polargraph PCB.

Step 7: Firmware Adjustment

I have made a few adjustments on Mekalangelo firmware to make it compatible with my plotter. Details are as follows:

  • "configure.h": Configuration settings for vertical plotter

- Plotter type: Polargraph

- Controller: Arduino Mega 2560 + RAMPS 1.4

- No LCD

// Robot styles supported

// LCD panels supported

// Microcontrollers supported
  • "robot_polargraph.h": Configuration settings for polargraph

- Version: MAKELANGELO_5

- With Pen Lift.

- No LCD - No SDCard - No limit switches.

#define MAX_SEGMENTS         (32)
//#define HAS_SD
//#define HAS_LCD
  • "configMotors.h": Stepper motor and pulley settings

- I used stepper motors NEMA 17 with step angel: 1.8°. So the number of steps required for stepper motors to make 1 complete revolution: 200 step/rev.

- A4988 micro-steps setting: 16.

- I used GT2 timing belt, which has a pitch of 2mm per tooth and GT2-80 pulleys which have 80 teeth. The value 80x2=160mm (PULLEY_PITCH) means the circumference of pulleys (pulley diameter = 160/PI = 50.9mm) or the travel distance of timing belts when stepper motors make 1 revolution.

#pragma once
 * Motor settings shared between various kinematic systems
// choose one of the following
#define NORMAL_MOTOR_STEPS   200  // 1.8 degrees per step

// stepper motor drivers can use microstepping to split steps into fractions of steps for greater precision.
// A4988 drivers ( default) use 16x.

#define MICROSTEPS           (16.0)

// Using GT2 timing belt, which has 2mm teeth.
// I also use GT2-80 pulleys which have 80 teeth.
// 80*2 means the pitch is 160.

#define PULLEY_PITCH         (160.0)

#define DEFAULT_FEEDRATE     (180.0)
#define DEGREES_PER_STEP     (1.8)
#define DEFAULT_FEEDRATE     (100.0)
#define DEGREES_PER_STEP     (0.9)
  • "board_ramps.h": Arduino Mega 2560 pin setting

Take note that the RAMPS 1.4 provides four servo male headers tied to pins D11, D6, D5 & D4. I used pin D11 for controlling pen lift micro servo.

#define MAX_BOARD_SERVOS          (1)   /* Default: 4 */
#define SERVO0_PIN                (11)   /* Default: 11 - Servo 1 */
#define SERVO1_PIN                (6)
#define SERVO2_PIN                (5)
#define SERVO3_PIN                (4)

Step 8: User Interface

Makelangelo software is a computer tool that contains everything you need to configure and export the print files for vertical plotter. It allows us to adjust the plotter configuration, paper size, pen lift micro servo setting.... In addition, it also has built-in tools for converting the images into GCODE and sending it to plotter controller.

We can refer how to use the Makelangego software at:

  • Open Makelangelo software and connect to Arduino Mega 2560.

- We should check the stepper motors direction and travel distance: from "Manual Driving" drop-down list, click buttons left, right, up, down, with optional travel distances of 1, 10, 100mm.

- Click on Pen up/ Pen down buttons to check the micro servo functioning.

  • Click on "Setting" tab and configure the machine.

- Model: Makelangelo (Custom).

- Machine Width: 550 (mm).

- Machine Height: 800 (mm).

- Acceleration: 10 (mm/s²).

  • Setup the paper size and margin.

  • Setup the pen and draw speed. The pen lift up/down can be calibrated by adjusting servo angle values, lift speed and "Test" buttons.

  • Click on built-in feature "Generate art" , select the graph and adjust any additional parameters we want to draw.
  • Click on "Open File" to select the images. Makelangelo software can converts the JPG, PNG, BMP, GIF, or DXF/SVG images into GCODE in several styles of conversion format, such as:

- Boxxy

- Multipass

- Crosshatch

- Pusle line

- Pulsing Spiral

- And so on ...

Step 9: Testing

I wrote a small Excel template to simulate a vertical plotter. Realistically speaking, Excel is a useful tool and it has been used in most of my works or D.I.Y projects that I have gone through.

We enter the X, Y coordinates, the Excel template will simulate the pen position, as well as, belt length from pulleys to the pen and from pulleys to the counterweights.

To do a first test, I clicked on built-in feature "Generate art", selected a "Your message here" on drop-down list, chose size and font, typing a message then clicked "Start".

And this is the result.

We can see how it work on below video:

Testing "Lissajous" graph from "Generate art" Tab.

Continue to test "Spirograph" from "Generate art" Tab.

"Tue Nhi" is my daughter's name and she was excited to color her name. The result looks really eye-catching.

I tried to draw a portrait.

And the result surprised me. It looks amazing!

We can export an image in DXF/ SVG format from Inkscape with hatch fill extensions then open this DXF/ SVG file in Makelangelo, simply click Start for carrying out.

Step 10: Finish

Here are some other pictures of the Blackboard V-Plotter project. Thank to Dan Royer - Marginally Clever Robots, Limited - for both great firmware and software.

And thank you for your reading!!!

Anything Goes Contest

Second Prize in the
Anything Goes Contest

Be the First to Share


    • Meatless Challenge

      Meatless Challenge
    • Remote Control Contest

      Remote Control Contest
    • Eggs Challenge

      Eggs Challenge



    4 weeks ago

    Very nice! I was wondering, do you sitll have the 7.23 sofware version available? I'm having difficulties finding a version that allows for machine width configration. THe newest version seem to be solely for the official version (but maybe I'm overlooking something).


    Question 7 months ago

    is it possible to obtain a complete firmware directory running on
    MEGA 2560 with RAMPS + NEMA 17 as a basis for "small" adjustments?
    I downloaded all possible versions from github but didn't get it to work.
    Thanks for help.


    Question 1 year ago

    thanks for the super description. It inspired me to finally start the project, which I have been pushing along for at least a year.
    I have one question concerning the 80 teeth pulley.
    Using microsteps (800) i get a resolution of 0,19mm/Step with 80 teeth
    with 20 teeth i get 0,048mm/Step.
    Why did you choose such a low resolution?
    Thanks for your reply.


    Answer 1 year ago

    Thank! In my own opinion, when I used a pulley with multiple teeth (big diameter or circumference), then it would have more contacted with the timing belt and prevent slipping. STEP/MM can be calculated as follow:
    Step/mm = ((steps/rev motor) x (micro-stepping))/ ((pulley pitch) x (pulley teeth)) = (200x16)/(2x80)=20 step/mm or 0.05 mm/step.
    This value is OK. And plotter accuracy also depend on pen tip.


    Reply 1 year ago

    Hello tuenhidiy,
    I think we are using different calculations; enclosed please find my calculations for resolution, which is mm/Step. depending on the # of teeth of the wheel.
    You state that the Step/mm = mm/Step (Result) ????
    In addition placing a large wheel on the motor reduces the holding moment of the motor.
    My calculation for this is also provided as a picture.
    But as long as your plotter is working this is a theoretical discussion.
    Have fun ;)

    mm per step.JPGNEMA 17 max Force F(M,T).jpg

    Reply 1 year ago

    Hi OttofarAway. We had the same result:
    - With original step per revolution 200 step/rev, when we apply micro-stepping mode 1/16 (full step), stepper motor will be divided into 200x16 = 3200 steps for 1 complete revolution.
    - When stepper completes 1 turn, the timing belt moves a distance equal to circumference of pulley 80 teeth: 158.4mm following your calculation sheet. Therefore:
    * Value STEP/MM= 3200 steps / 158.4mm = 20.2 step/mm
    * Or value MM/STEP = 158.4mm / 3200 steps = 0.0495mm/step (~0.05mm/step).
    Just a little different: I applied the formula for circumference of GT2-80 pulley
    based on a pitch of 2mm per tooth and it have 80 teeth. So the its circumference is: 20x80=160mm.
    For 1/4 micro-stepping, it is 160/(200x4) = 0.2 mm/step in my case, comparing with your result: 158.4/800= 0.198mm/step.
    Thank you for insteresting in my project!


    1 year ago

    Hi ! thanks for your project ! I try to start Makelangelo software on windows but impossible... I download the last version on the official website, same for Makelangelo. Sometime i can run the software but crach when i try to connect the arduino, sometimes i can't just run the soft when clic on "start windows" or "Makelangelo-7.23.0-with-dependencies". I tried on 4 differents computers but same problems seems come from java. What's wrong ?


    Reply 1 year ago

    It's seems to be a New version problème of Java. I tried with a old version and this is working now.


    1 year ago

    Wonderful project and implementation.

    I wonder if we could convince this robot to cut vinyl too ;)


    Reply 1 year ago

    Thank you!


    Tip 1 year ago

    Put some felt on the counterweights so they don't rub on the wall. Quiet is better.

    If you want a fully assembled polargraph, I have them ready for you at a great price:

    If you'd like to talk with other like-minded people about robots and especially polargraphs, come find us at


    Reply 1 year ago

    Thank you very much for this tip. Both firmware and software from Marginally Clever Robots are amazing!!!


    Reply 1 year ago



    Question 1 year ago on Step 2

    Very nice!! I would like to build one. Can you share a source or sources for the components? THANKS!!!


    Answer 1 year ago

    Thank you! The components to build this V-Plotter are listed at STEP 1. You just simply copy the part names and search them in Google. They are very easy to buy. Please contact me via email: for any part which was not clarified.


    1 year ago


    You got my vote!!


    Reply 1 year ago

    Thank you!!!


    1 year ago

    This project is so amazing, I love it!