Introduction: Omni Wheel CNC Plotter

About: 55+ years in electronics, computers, and teaching ... now retired.

Omni-wheels only have traction in the direction of rotation.

This instructable explains how to make an XY plotter from four Omni-wheels, four 28BYJ-48 stepping motors, an Arduino Uno R3 microcontroller, an SG90 servo, and an HC-06 Bluetooth module.

Metal-work is simple ... all you need is a screw-driver, three drills, a rat-tail file, and a sharp knife,.

The CNC plotter has an on-board interpreter that recognises the g-code output from “Inkscape”. All that is required is an XON XOFF terminal that can send text-files one line at a time.

The plotter may also be controlled using a cell-phone or tablet as explained in instructable

Extremely large drawings are possible due to the Bluetooth design. The plotter accuracy is excellent providing the wheels don’t slip! The plotter has a resolution of 22 steps per mm.

The cost to build this plotter is less than $100 USD ... the most expensive items being the Omni-wheels and couplings.

The opening photo shows the assembled plotter.

The video shows the plotter in operation. To conserve batteries an external power source is being used.

Photo 2 shows three sample plots.

Step 1: Circuit Diagram

The circuit diagram for the omni-wheel plotter is shown in photo 1.

Heat-sinking is required for input voltages over 7 volts as the LM7805 regulator can only disspate 2 watts.

A 7 volt power supply with a trailing lead is suitable for day to day use. Rechargeable batteries are recommended as the current drain approaches 900mA.

The shield layout is shown in photo 2. The holes in columns 4 and 14 (pale red and green stripes) are connected together on some proto-boards. For this reason I have left these columns clear. You may also find it necessary to connect GND and +5V jumpers to the HC-06 circuit.

Arduino ports B and C are each connected to two 28BYJ-48 stepping motors.

Motors W1 and W3, and W2 and W4, are wired such that they always rotate in opposite directions. The 560 ohm resistors provide a degree of isolation between the motor controllers.

The 1 amp LM7805 regulator supplies 5 volts to the four motors and to the pen-lift servo. The 1N4007 diodes provide reverse voltage protection to the Arduino and the LM7805 regulator.

The HC-06 bluetooth module obtains its power from the Arduino. The 1200 ohm and 2200 ohm resistors form a voltage divider which lowers the Arduino TX output voltage to a safe level for the bluetooth RX input.

Key Points

  • All points labelled 5V (in red) are connected to the LM7805 5V output.
  • All points labelled GND are connected together.
  • Program the arduino BEFORE connecting the bluetooth module as it is not possible to program an Arduino when two devices are competing for the same serial connection.

Step 2: Parts List

The estimated cost for this plotter is less than $100 USD.

The following items were obtained from

  • 1 only Arduino UNO R3 with USB Cable
  • 1 only SG90 servo
  • 1 only HC-06 Bluetooth module
  • 4 only 28BYJ-48 5V stepper motors with ULN2003 motor controllers [1]
  • 4 only 58mm plastic omni wheels
  • 4 only 5mm metal omni wheel couplings [2]
  • 24 only Arduino female-female jumper cables
  • 1 only proto-board to make the shield

The following items were obtained locally:

  • 1 only 6 cell AAA battery holder
  • 6 only 1.5 volt AA batteries
  • 1 only PCB two-terminal screw mount for battery wires
  • 1 only SPDT miniature switch
  • 2 only 1N4007 diodes
  • 1 only LM7805 regulator
  • 17 only 560 ohm resistors
  • 1 only 1200 ohm resistor
  • 1 only 2200 ohm resistor
  • 24 only M3 x 6mm bolts
  • 14 only M3 x 10mm bolts
  • 14 only M3 nuts
  • 9 only M4 x 10mm bolts
  • 4 only M4 x 50mm bolts
  • 21 only M4 nuts
  • 2 only M4 washers
  • 12 only tapped nylon spacers (9mm x M3
  • 2 only 40-pin male header strips
  • 1 only small female header strip (four pins used for Bluetooth module)
  • 1 only small sheet of 1mm (18 gauge) aluminium
  • 1 only base from a 20cm baking pan.


28BYJ-48 stepper motors were chosen for this plotter as:

    • the motors are low current
    • the motors are extremely low cost

    The down side to these motors is that they have a tiny bit of mechanical back-lash in the 64:1 gearing which can affect the plotter accuracy

    Small direct drive motors would be more accurate but:

    • are significantly more expensive,
    • would require a larger battery due to the larger current drain,
    • and would require the purchase of separate motor controllers.
    • A code change would also be required.


    The most expensive items are the omni-wheels and the couplings.

    The combined weight of these “free postage” items appears to incur an additional postage charge if ordered together. I found it significantly cheaper to split the order.

    Step 3: Theory

    Omni-wheels (photo 1) only have traction in the direction of rotation. Any oblique force causes the wheel to move sideways.

    Movement in any direction is possible if we place omni-wheels along the X-axis and Y-axis as shown in photo 2.

    The omni-wheel arrangement shown in photo 2 is ideally suited to Bresenham’s line drawing algorithm.

    The design for this plotter was inspired by the following article which explains how to construct 3, 4, 6, and 8 wheeled omni-bots.

    My wheel arrangement, which differs from that in the above article, offers the following advantages:

    • The wheels are ideally positioned for XY plotting.
    • No tyre scrubbing
    • Simpler calculations
    • Simpler electronics

    Step 4: Kinematics

    This step derives the forward, and inverse, kinematic equations for my “omni wheel CNC plotter” and may be omitted.


    • The robot X-axis lies along W2, W4.
    • The robot Y-axis lies along W1, W3.
    • Normal rotation is clockwise looking towards the robot center.
    • Omni wheels (photo 1) only have traction in the ‘S’ directions.

    The ‘x’ and ‘y’ vector components for any given wheel are derived in photo 2.

    For the four-wheel robot shown in photo 1 the ‘x’ and ‘y’ vector components are:

    • x1 = cos(Alpha 1 + PI/2)*S1 = cos(90 + 90)* S1 = cos(180)*S1
    • x2 = cos(Alpha 2 + PI/2)*S1 = cos(180 + 90)* S1 = cos(270)*S2
    • x3 = cos(Alpha 3 + PI/2)*S1 = cos(270 + 90)*S1 = cos(360)*S3
    • x4 = cos(Alpha 4 + PI/2)*S1 = cos(360 + 90)*S1 = cos(450)*S4
    • y1 = sin(Alpha 1 + PI/2)*S1 = sin(90 + 90)* S1 = sin(180)*S1
    • y2 = sin(Alpha 2 + PI/2)*S1 = sin(180 + 90)* S1 = sin(270)*S2
    • y3 = sin(Alpha 3 + PI/2)*S1 = sin(270 + 90)*S1 = sin(360)*S3
    • y4 = sin(Alpha 4 + PI/2)*S1 = sin(360 + 90)*S1 = sin(450)*S4

    The resultant vectors for this robot are:

    • x = x1 + x2 + x3 + x4
    • y = y1 + y2 + y3 + y4

    There is also an angular rotational component "w" which enables the robot to spin about its Z-axis:

    • w= s1 + s2 + s3 + s4

    Forward kinematics

    Photo 3 shows the above equations written in matrix form.

    The “forward” equations are not particularly useful as they calculate where the robot will be after the wheels have finished rotating.

    Reverse kinematics

    What we want are the “reverse” equations as these allow us to calculate how much each wheel must rotate for the robot to reach a given (X,Y) coordinate.

    These equations also enable us to simultaneously rotate the robot body.

    Calculating the “inverse matrix”

    There are several methods for obtaining the “inverse” of a matrix.

    The “Gauss-Jordan” technique, using “identity” matrices, is perhaps the simplest of the manual methods. A video demonstrating this technique may be found at

    Another way is to use an online “inverse matrix calculator” such as that found at

    This calculator requires that the matrix information be entered in the following format:


    Photo 4 shows the output when you click "compute".

    Horizontal motion

    The relative wheel speeds for horizontal motion may be found by plugging the following equation into the online “matrix calculator” at

    Substituting {x,y,w} = {1,0,0} in the reverse kinematics formula:

    • {S1,S2,S3,S4} = {{-0.5,0,0.25},{0,-0.5,0.25},{0.5,0,0.25},{0,0.5,0.25}}*{1,0,0}
    • {S1,S2,S3,S4} = {-0.5,0,0.5,0}

    The results are shown in photo 5. A negative sign indicates CCW rotation.

    Wheel W1 rotates CCW ... wheel W3 rotates CW.

    Vertical motion

    The relative wheel speeds for vertical motion may be found by plugging the following equation into the online “matrix calculator” at

    Substituting {x,y,w} = {0,1,0} in the reverse kinematics formula:

    • {S1,S2,S3,S4} = {{-0.5,0,0.25},{0,-0.5,0.25},{0.5,0,0.25},{0,0.5,0.25}}*{0,1,0}
    • {S1,S2,S3,S4} = {0,-0.5,0,0.5}

    The results are shown in photo 6. A negative sign indicates CCW rotation.

    Wheel W2 rotates CCW ... wheel W4 rotates CW.

    Angular motion

    This feature is not required in this plotter since we are using Bresenham’s line formula which only requires horizontal and vertical movement.

    The relative wheel speeds for angular motion may be found by plugging the following equation into the online “matrix calculator” at

    Substituting {x,y,w} = {0,0,1} in the reverse kinematics formula:

    • {S1,S2,S3,S4} = {{-0.5,0,0.25},{0,-0.5,0.25},{0.5,0,0.25},{0,0.5,0.25}}*{0,0,1}
    • {S1,S2,S3,S4} = {0.25,0.25,0.25,0.25}

    The results are shown in photo 7. A negative sign indicates CCW rotation.

    All wheels rotate in the same direction.

    Diagonal motion

    This feature is not required in this plotter since we are using Bresenham’s line formula which only requires horizontal and vertical movement.

    The relative wheel speeds for vertical motion may be found by plugging the following equation into the online “matrix calculator” at

    Substituting {x,y,w} = {1,1,0} in the reverse kinematics formula:

    • {S1,S2,S3,S4} = {{-0.5,0,0.25},{0,-0.5,0.25},{0.5,0,0.25},{0,0.5,0.25}}*{1,1,0}
    • {S1,S2,S3,S4} = {-0.5,-0.5,0.5,0.5}

    The results are shown in photo 8. A negative sign indicates CCW rotation.

    Wheels W1 and W2 rotate CCW ... wheels W3 and W4 rotate CW.

    Composite motion

    This feature is not required in this plotter since we are using Bresenham’s line formula which only requires horizontal and vertical movement.

    It is possible to combine angular and diagonal motion by varying the {x,y,w} parameters.

    The relative wheel speeds for combined diagonal and angular motion may be found by plugging the following equation into the online “matrix calculator” at

    Substituting {x,y,w} = {1,1,1} in the reverse kinematics formula:

    • {S1,S2,S3,S4} = {{-0.5,0,0.25},{0,-0.5,0.25},{0.5,0,0.25},{0,0.5,0.25}}*{1,1,1}
    • {S1,S2,S3,S4} = {-0.25,-0.25,0.75,0.75}

    The results are shown in photo 9. A negative sign indicates CCW rotation.

    The relative wheel speeds in this example cause the body to rotate as the plotter moves diagonally.

    Step 5: Metal Work

    Design considerations

    It is essential that the Omni-wheels maintain contact with the floor at all times. To allow for wheel imperfections, and undulating surfaces, the chassis must flex.

    Two possible solutions are shown in photo 1:

    • Use flexible plastic such as a CD (red circle) ... not tried
    • Build a pivot joint into the chassis.

    The second option is described below.


    The chassis dimensions are not critical.

    Each base-plate (photo 1) is made from 1mm (18 gauge) aluminium sheet.

    The two L-shaped base-plates form a square when butted together.

    A diagonal of 120mm, which is the diameter of a CD, is obtained if you make each baseplate 84mm x 42mm with a 15mm lip.

    Equal traction on each wheel is obtained by loosely clamping the L-shaped base-plates together by means of a single 4mm nut and bolt mid-way through each lip. “Double-nut” the bolt, as shown in photo 3, to prevent the bolt unscrewing. A 4mm washer was placed beneath the bolt-head and beneath the nuts. Do not place a washer between the base-plates.

    The aluminium sheet was cut and folded using the method described in my instructable

    Motor Brackets

    Four motor brackets are required for the 28BYJ-48 stepping motors.

    The dimensions and holes sizes for each bracket are shown in photo 2. The brackets are made from 1mm (18 gauge) aluminium sheet.

    Each motor bracket is fastened to the base-plates (chassis) by means of 3mm nuts and bolts.

    Construction tips:

    • drill 3mm pilot holes in the first bracket
    • use this first bracket as a template for the remaining three brackets
    • enlarge the 4mm and 9mm holes
    • now fold the brackets

    Chassis assembly

    Photo 3 shows the assembled chassis resting on a flat surface.

    Photo 4 demonstrates the flexing motion of the chassis when an object is placed beneath the rear motor. All wheels maintain contact with the surface even if one or more wheels are raised.

    Component tray

    The component tray is made from the bottom disc from a 20cm baking tin ... ask your better half first !!

    All electronic modules are attached to this disc using 3mm bolts and threaded nylon spacers.

    The component tray is attached to the chassis by means of four M4 x 50mm nuts and bolts as shown in photo 5

    These four bolts pass through the component tray as shown in photo 6. Four additional nuts are then used to anchor the component tray in place.

    Step 6: Pen Lift

    The pen_lift assembly comprises an SG-90 servo, an ink pen, a simple “collar”, and a bracket as shown in photo 3.

    The bracket dimensions are shown in photo 1.

    The bracket and servo are shown in photo 3. The servo has been cable-tied into position with a small piece of double-sided tape beneath to prevent slippage.

    Photo 4 shows the completed pen_lift.

    The orange “collar” comprises a small plastic disk glued to the center of a radio knob that has been drilled to size ... but anything that enables the servo to raise the pen will do.

    Construction tip:

    • Drill 3mm pilot holes in each of the hole positions ... do not bend the bracket.
    • Next place the bracket on the component tray and drill each of the three in-line holes.
    • Place a 3mm bolt in the first hole before drilling the remaining two as shown in photo 2. This ensures that the remaining two holes will be in the correct position.
    • Now custom fit each of the center holes to your pen diameter before bending the bracket.

    Step 7: Software Installation

    Plotter software

    • Unplug the motor shield. This removes the Bluetooth module and external 9V supply
    • Connect a USB cable between your Arduino and your PC
    • Download the attached file “omni_wheel_plotter.ino”
    • Copy the file contents into a new Arduino sketch using a text editor, such as Notepad++.
    • Save the sketch as “omni_wheel_plotter” (without the quotes) then upload it to your Arduino.
    • Click “Tools|Serial Monitor”
    • Set the “baud speed” to 9600 ... a menu should appear
    • Close the Arduino IDE (“integrated development environment”)
    • Leave the USB cable connected
    • Leave the motor shield disconnected.

    Terminal software

    Data flow to the plotter requires a terminal that:

    • supports the XON XOFF protocol,
    • is able to send text files, and
    • can be configured to pause after each linefeed character [1]

    Suitable terminal software includes:

    Installation instructions for CoolTerm

    • Download the settings file "" (attached)
    • Download "CoolTerm" for Windows from ""
    • Unzip the file ""
    • Copy the entire folder "CoolTermWin" to your "desktop"
    • Copy "" into the "CoolTermWin" folder [2]
    • Unplug the motor shield (this disconnects the Bluetooth module & external power)
    • Connect a USB cable to your plotter.
    • Double "left-click" the file "CoolTerm.exe" within the "CoolTermWin" folder to run.
    • Left_click "Connect"
    • Type "menu" ... a menu should appear (photo 1)
    • Experiment with the options. [3]
    • Unplug the USB cable.


    It is essential that the terminal waits for an XOFF signal between lines of g-code as the plotter does not have an input buffer.


    The "" file contains the Omni wheel plotter settings that I use. The default port when using a USB cable is COM3 ... you may need to change this.


    At this stage the Arduino “thinks” that the motor shield is connected. This step confirms that both software packages are working.

    Step 8: Connecting Via Bluetooth

    We are now ready to talk to the plotter via Bluetooth:

    Power up the plotter

    • Disconnect the USB cable from the plotter.
    • Plug the motor shield into the plotter
    • Plug the HC-06 Bluetooth module (photo 1) into the shield
    • Apply power to the shield ... a Bluetooth LED should start flashing.

    “Pair” your PC to the plotter

    • Open “Settings” on your PC and select “Devices: Bluetoth, printers, mouse” (photo 2).
    • Click “Bluetooth & other devices” (photo 3).
    • Turn on your PC’s Bluetooth (photo 4 ... blue button) then
    • click the “+” button to “Add bluetooth or another device”.
    • Now click “Bluetooth: Mice, keyboards, pens, or other kinds of Bluetooth devices”.
    • Click “HC-06” in the “Add a Device” screen (photo 5).
    • Enter the pin number 1234 when asked (photo 6).
    • Wait for a “Ready to go” message (photo 7)
    • The Bluetooth LED will continue to flash.

    Controlling your plotter via Bluetooth

    • Double "left-click" the file "CoolTerm.exe" within the "CoolTermWin".
    • Left_click "Connect" ... the Bluetooth LED should stop flashing.
    • If not then the Bluetooth module is using a different COM port ... mine uses COM8.
    • To change COM ports click “Connect|Options|Rescan serial ports”.
    • Once you have made a connection the Bluetooth LED will stop flashing.
    • Click “Save” and save your updated settings to “”
    • Type “menu” ... a menu should appear when you press the “enter” key
    • Experiment with the options ... they should work the same as if you had a USB cable.

    Sending a g-code file to the plotter

    • Copy the attached “square.gcode” file into your “CoolTermWin” folder.
    • Rename the file to “square.gcode.txt” or “square.txt” [1]
    • Run “CoolTerm” [2]
    • Click “Connection|Send Textfile” and select the file “square.txt”
    • Click “open” and your plotter should start working.
    • The plot is finished when the progress-bar reaches 100%


    “CoolTerm” does not have a “display all files” option ... it only displays files with a file-extension that it supports. The simplest solution is to add a .txt extension to your g-code files.


    “CoolTerm” uses the settings in the “” file at startup. The “Open” and “Save” menus allow you to update the “” file should you need to change your COM port settings.

    Step 9: Summary

    This plotter features:

    • a small foot-print
    • unrestricted paper size (within reason)
    • 22 steps per mm precision
    • Bluetooth operation

    The plotter may be controlled using an Android cell-phone or tablet. Instructions for doing this are given in my instructable

    The 64:1 plastic gears within each 28BYJ-48 stepping motor introduce a tiny amount of “backlash”. Direct drive stepping motors should eliminate this backlash but will require alternate motor controllers, a higher capacity battery, and a few minor code changes.

    Unlike a traditional XY plotter with fixed guide-rails, the accuracy of this plotter is reliant upon:

    • all wheels having the same diameter
    • all wheels maintaining contact with the surface
    • all rollers working freely

    The plots are remarkably good considering these mechanical requirements.

    Not tried ... coating the wheels with "grippo" (as used in outdoor bowls), or a fine grit, may prevent wheel slip on glossy paper.

      Click here   to view my other instructables.

    Epilog X Contest

    First Prize in the
    Epilog X Contest