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