Make: Projects

R/C Omniwheel Robot

Build an easy holonomic “Kiwi drive” robot platform that moves instantly in any direction.


This article appeared in Make: Vol. 40.

This article appeared in Make: Vol. 40.

A robot that can move in any direction immediately is useful for getting around tight spaces and for behaviors like chasing (or fleeing). No matter how fast an R/C car is, there’s no way it can catch something that can instantly go any direction, even sideways. Regular car-style robots can’t drive sideways, but omniwheel robots can!

An omniwheel is a wheel whose tread is made up of a bunch of little rollers. They’re used commercially for things like transfer tables on production lines, and this means they’re cheap and reliable. In this project you’ll use them to build a Kiwi drive robot platform — a three-omniwheel vehicle that can travel in any direction. It’s mesmerizing to watch, and it can even rotate while traveling, so it’s great for turret-type applications too.

If a robot can drive in any direction immediately, it is called holonomic — it has two degrees of freedom on the floor. Cars, where all the wheels line up, can’t move at right angles to their wheels, so they’re not holonomic.


Omniwheels can move at 90 degrees to their axis, so you can mount them facing different directions on your vehicle and use a bit of math to still go in a straight line. (That’s where a microcontroller comes in handy.) Like most things in engineering, there are some tradeoffs, which is why we don’t all drive omniwheel cars. They’re slower, sensitive to dust, can take less load — only a few pounds for the wheels we’re using — and they’re less efficient. But in tight spaces they’re the right choice, and a lot of fun!

Our omniwheel robot is a beginner-friendly build that uses an Arduino microcontroller, the new Make: Motor Shield, and standard R/C gear — all of it plug-and-play.

NEW! Make: Motor Shield

Co-developed with Wicked Device, our awesome new motor shield can run 4 DC motors (1.2A–3A max), or 2 steppers and 6 servos. It has current sensing so you can use motors as sensors, and it accepts R/C inputs from standard radio control gear! No soldering required. Maker Shed item #MSMOT01, from

Kiwi Drive: Crack the Code

Your robot has 3 wheels, all pointing in different directions — how on Earth is it going to drive in a straight line? It requires some sophisticated math, so you can’t drive this vehicle without a computer. The Arduino code turns the radio control signals into motor power signals for each motor. But how?

  1. A radio control signal is a little bit like a pulse-width modulation signal (PWM), but not quite. The R/C transmitter creates signal pulses, and the Arduino reads these in on pins Dig4 (R/C input 1, on the right) and Dig8 (R/C input 2, on the left, near the other jumpers).
  2. The Arduino converts the R/C signals to PWM motor drive signals, using the PulseIn command.
  3. Next, the Arduino sketch applies vector math formulas to break the motor signal’s single vector (A–B) into 3 vectors, one for each wheel (w1, w2, and w3). The Arduino works all this out for you on the fly, sends the new drive signals to each motor, and the vehicle drives!


How does the math work? Imagine you’re trying to walk from point A to point B. The problem is, the only directions you’re allowed to walk are the red, green, and blue directions. How would you walk? Because of our rules, you can’t walk straight there. One way to do it would be to walk in the green direction until you were level with point B, then walk in the red direction until you arrived at B. You wouldn’t need to walk in the blue direction. (There are many solutions).

This way of walking looks a lot like using vectors, because it is. You don’t need to walk in the blue direction in this example, so let’s make the problem harder: Imagine you’re trying to travel at a certain speed, shown by the length of the line, and you have to use all the lines. So you have 3 lines, all specific lengths and directions. Now there’s only one possible way to combine the red, green, and blue lines to get from A to B (Figure 2). The key thing to understand is that line length represents the speed of each wheel. What we have to do is calculate the length each line needs to be.

The line length represents the wheel speed (WS) of each wheel. We already know how fast we want the vehicle to go (the magnitude of the vector), the direction we want (vehicle angle, or theta, θ) and the angle of each wheel on the vehicle (WA), which was set when we built it (0°, 120°, and 240° — that’s where the √(3/2) comes from in the formulas below).

We can now work out 2 numbers, the x and y vectors:

vx = cos(θ) * magnitude
vy = sin(θ) * magnitude

We plug those into 3 formulas to get the speeds (angular velocities) for each wheel. The first wheel is easy — it only moves parallel to the x-axis, so we just take the x component and throw away the y:

w1 = –vx

The other 2 wheels, w2 and w3, have a component of both x and y vectors:

w2 = 0.5 * vx – √(3/2) * vy
w3 = 0.5 * vx + √(3/2) * vy

Of course, you don’t have to do this math, it’s all done by the Arduino. If you read the Arduino sketch, you’ll see there’s an additional implementation detail to handle whether the results are positive or negative. This is because we want a negative answer to mean “go backward” and a positive “go forward.”


Step #1: Solder wires to the motors

R/C Omniwheel RobotR/C Omniwheel RobotR/C Omniwheel Robot
  • Then test each motor by connecting it to the battery pack — just twist the wires together — to make sure the wheels turn smoothly. The motor terminal tabs are fragile, so be careful with the wires until they’re glued down.
  • NOTE: With DC motors, it doesn’t matter which side is positive (+) and which is negative (–). But make sure all 3 motors are wired the same way or your robot will end up driving in circles, because one motor will be going backward.

Step #2: Attach the wheels

R/C Omniwheel RobotR/C Omniwheel RobotR/C Omniwheel RobotR/C Omniwheel Robot
  • Cut disks from 1/8" (0.118") acrylic following the provided template wheel1.svg, and super-glue them together as shown. (I set a small weight on top while the glue dried.)
  • Then glue the larger disks to the omniwheels, and the smaller disks directly to the motors as shown.

Step #3: Mount the motors

R/C Omniwheel Robot
  • Use double-stick tape to mount the motors to the platform, following the template base1.svg to make sure the motor shafts are lined up correctly, 120° apart.
  • Put a dab of hot glue on each pair of wires to hold them down.

Step #4: Route the motor wires

R/C Omniwheel Robot
  • Drill 3 holes to pass the motor wires through the platform. The platform will want to run up the drill bit, so hold it down firmly.
  • Route the wires through the holes. Test each motor with the battery pack again.

Step #5: Add the electronics

R/C Omniwheel Robot
  • Turn the platform over so the motors are on the bottom. On top, stack the battery pack, an insulating sheet of paper or plastic, the Arduino, and the Make: Motor Shield (in that order). I used little rubber feet on the Arduino, but double-stick tape will work as well.
  • Make sure the motor shield switch is in the Off position, then connect the battery pack to the shield's + and – pins, and the motors to pins M1, M2, and M3 on the shield.

Step #6: Connect the receiver

R/C Omniwheel Robot
  • Follow the manufacturer’s instructions to pair your R/C receiver with your transmitter.
  • Run an R/C servo cable from your receiver to the 2 RC_IN ports on the motor shield. Black (ground) is toward the middle of the shield. I used the rudder (RUDD) and aileron (AILE) connections of my R/C receiver, which map to the left-hand transmitter joystick.

Step #7: Program the Arduino

R/C Omniwheel Robot
  • Connect your Arduino to your computer with a USB cable. Download the sketch OmniWheelControl.ino from, open it in the Arduino IDE, and click the arrow button to upload it to your board.
  • You’ll also need the Motor Shield library; download it at then go to the Arduino IDE and install it by selecting Sketch → Import Library.

Step #8: Add a cover (optional)

R/C Omniwheel RobotR/C Omniwheel RobotR/C Omniwheel Robot
  • You can make one out of pretty much anything you like the looks of.
  • If you have access to a laser cutter, download our files for laser-cutting a basic box from 1/8" (0.118") acrylic, sized to contain a 6×AA battery pack, the Arduino, the motor shield, and the R/C receiver.

Step #9: Take it for a test drive

R/C Omniwheel RobotR/C Omniwheel RobotR/C Omniwheel Robot
  • The motor shield has 2 important jumpers to keep in mind. BEC provides power to the radio receiver, so you don’t need an additional power source. EXT provides power to the Arduino using the motor power source, in this case the battery pack. Make sure both these jumpers are connected and that there are fresh batteries in the holder.
  • TIP: When removing a jumper, don’t try to store it away from the board — it’s tiny and easy to lose. Instead, disconnect it from one pin only, and let it hang. This breaks the connection, but keeps the jumper handy if you want to reset it.
  • The switch on the motor shield powers up the motors — this is so you can experiment with a robot on your desk without having it drive off suddenly. Turn it on now. Turn on your transmitter and try moving the sticks. If everything’s working, you should now have a working R/C holonomic robot!
  • NOTE: When not operating the Robot, disconnect the power jumpers and turn off the motor power switch to save batteries. (I got 6 hours of near-continuous use out of 4 Duracells at Maker Faire, so it’s pretty efficient.)

Step #10: Going further

R/C Omniwheel RobotR/C Omniwheel RobotR/C Omniwheel Robot
  • Once you’ve driven your robot around a bit, you’ll probably notice that it can be hard to tell front from back. An easy fix is to attach an arrow, a face, or some other prominent decoration on one side.
  • For more of a challenge, add a Nerf gun to the vehicle. Since it can “strafe” sideways without turning, it can slide out from cover, shoot, and then slide quickly back. Use a servo-operated mechanism to pull the trigger.
  • Try adding a camera setup for spying, FPV driving, or even a telepresence robot. Or make a pair of kiwi bots to play laser tag or robot soccer.
  • Finally, let’s talk about a scaled-up Kiwi drive. The math and the code should work with vehicles of any size, and bigger omniwheels (like the Kornylak RW27) can easily support a person on a set of three. R/C mobile barstool, anyone?

Step #11: Killer Kiwis

R/C Omniwheel RobotR/C Omniwheel RobotR/C Omniwheel Robot
  • What else can you do with a Make: Motor Shield and a Kiwi drive robot? Try these ideas — and share yours in the comments below, or with #makeprojects.
  • Laser battle bots — Use one R/C stick to drive and the other to rotate, just like your favorite first-person-shooter video games. On each bot, add a laser pointer and a light sensor, protected inside a short piece of pipe so that only direct hits are detected!
  • “Dr. Evil” frickin' rotating chair — Scale up to big omniwheels, 12V motors, and an oversized R/C joystick to build a go-anywhere villain’s throne that also spins on command (or, like the original, randomly). The math and the code should work with vehicles of any size, and bigger omniwheels (like the Kornylak RW27) can handle 200lb loads apiece.
  • Ball balancing robot — Use brushless DC motors and add an IMU to build an astonishing bot that drives any direction while balancing on top of a ball. You’ll have one remaining DC motor connection and 6 servo connections to build functionality on top. Serve beverages like Artoo on Jabba’s sail barge?
  • Cat Tormentor — Chase kitty with your basic Kiwi bot, and mount a laser pointer on a two-servo pantilt rig to give kitty something to chase too.
Dirk Swart

Dirk Swart

Dirk Swart is a co-founderof Wicked Device LLC, a maker of fun electronic kits.

  • Patrick Wire

    stumbled upon this site while browsing but you guys have lots of work to do… got my son really excited looking at some of the projects. we decided on simple toy cannon (also in thiis issue) and we tried to follow the link (404 not found)for instructions and the entire project is no where to be found.. poof .. vanished. So we decided for the slightly more complex ominwheel robot. talked it through with him and he gets excited. We go to start ordering materials and none of the links work for the parts.. so little more complicated.. the part numbers are there I will just look them up.. nope.. no such part numbers in the makershed. For example try to find #MSMOT01. I did find an arduino motor shield (MKAD66 but it is out of stock!! I go over to wicked device and find the motors, wheels and cable but when trying to find mounting kit and hardware (#omni1) again no such part number exist. cool projects but not much fun if you can’t find the parts.

  • caoimhin

    I have to agree with Patrick Wire. Can’t find any of the parts recommended. I started off trying to find the parts of the magazine and tried to find them by going to online article. None of them worked out. In the magazine it said that the Omniwheel hardware included wheels ( but online it seems obvious that it does not include the wheels themselves.

    You guys are making it very hard to take my money.

    • Dirk Swart

      Please can you tell me what would make it easier? Should we bundle everything into one kit?

      • caoimhin

        One kit would be easier but that wasn’t my particular issue.

        If you’re following along in the article and you go to the Wicked Devices site and search for “TRANSWHEEL1″ (as suggested in the article) you get no results.”MOTO1” returns both the wheels and the plastic gearhead motors. Going to Maker Shed and searching for the motor shield using “MSMOTO1” doesn’t return any results.

        When I first looked at the mounting platform hardware on the Wicked Devices I don’t remember it mentioning the wheels as being included. It does now show that they are included.

        On the webpage this link doesn’t work:

        Basically, I think everyone’s gripes were that the search strings and the links didn’t take us to what we wanted.

        • Dirk Swart

          Hi caolmhin. Thanks for your comments. The TRANSWHEEL1 link has been fixed. I have followed up with Make to find out about the motor shield.

          • caoimhin

            Thanks, Dirk.

            Also, I don’t think it was clear above but the link posted above is from the article. That link is provided in the article and it doesn’t resolve.

          • Dirk Swart

            Got it. I have contacted their product manager.

      • Patrick Wire

        do not necessarily need it in one kit as may have some of the items laying around…. just need links to work and the items to be available. Thank you for taking the time to reply and help resolve.

  • Lee Brock

    I agree…. only I never got past the motor shield. I emailed Maker Shed and recieved this reply. “We should have the motorshield available in a couple of weeks. We just
    ran into some delays in getting the packaging ready. Sorry for the lag.”

    Publishing an article before the parts are ready is poor form.

    • Dirk Swart

      Please let me know if you don’t have any luck resolving this ([email protected]).

  • Dirk Swart

    Here are the parts from Wicked Device:

    • Patrick Wire

      I notice there is now an item for complete project.. but it is password protected.. any way I can order and get the motor shield from you instead of maker shed??Protected: Omniwheel robot, complete kit

  • Guest

    I’m totally new to all of this and need to buy an inexpensive RC Transmitter. Any suggestions? This one is appealing, as it comes with a receiver, but I can’t really tell one from another:

  • Daniel Newman

    would’ve been really helpful to have listed that you need two r/c servo cables

  • Madison

    Hi all, noob tinkerer here.

    I’d like to ask what your thoughts are on using the omniwheel with a gimbal to create a diy tracking/camera rig? What do I need to do accomplish this? Any advice or references to existing projects would be helpful.


    • therobotmaker

      Most omni-wheels make for a bumpy ride.

  • Alice

    Hello everyone,

    The OrangeRx R/C transmitter has been out of stock for quite a while on Hobby King, and is ridiculously expensive elsewhere. We ended up purchasing the Turnigy 9x9Ch Transmitter through Hobby King instead. Decent reviews and similar functioning as the OrangeRx. With shipping from their USA warehouse and international service fees, it ended up being about $85. Similar pricing as the OrangeRx, but the Turnigy kit includes a receiver.

    I hope this helps those who are also searching for an affordable yet decent r/c transmitter.

  • Taylor

    Got my Omniwheel robot working! I found (quite by accident) that if you switch the leads on M1, then you get a forward / backward, rotate side to side type robot, which is also a lot of fun. I switched them back, and now I’m getting what I saw in the video – the robot moves as if on an x/y grid.

    Now that I got it working, I would like to add another RC control to allow for rotation. Has anyone done this yet? I’m about to start looking at the Arduino code, but if someone else has already done it and can save me some time… ;-)

    Has anyone attempted this?

  • Catalina Pi

    We’ve got a working Omniwheel bot, too. Instead of using an RC transmitter, we’ve got it running from a *nix box (Mac, Raspberry Pi, Linux PC) using XBees for the wireless. We use joysticks connected to an Arduino as our input devices.

    We’ve made a number of other enhancements. A flashing LED, sensors (temp, pressure, height,…), and 2 joystick controls. The second joystick lets you spin the bot in either direction.


  • Duncan Bailey

    I am not able to find the motor shield. Where can I find it?

  • Dennis Wetherall

    To set up the RC communication, I see three parts are needed: the Turngy handset, the trransmitter module and the receiver module. I am new to RC systems. Could you elaboater on how the transmitter module and the handset fit together. Why can’t the handset talk to the receiver module directly? Why does the hanset need a tranmitter module? Is there a recepticle in the handset to hold the module? Is the handset designed to use a module or are we breaking it open and hacking it? I have bought a few cheep RC toys and the RC set up appeared simpler, consisting only of a handset and the toy itself. I am just trying to get my head around this. Is there a good link that would give me some background? I am realy excited to try this project. Looks great!

    • maddoc

      Yes, I am new to RC too. So you are correct – but no breaking in or hacking required. It took me a while to work through this.
      The transmitter module in the Turnigy 9x clips out – and the Orange transmitter module clips in to the same spot (and has its own antenna). There is a bit of trick though if you want to keep the Turnigy transmitter module with its antenna – you have to desolder the wire from the transmitter module. But you could just cut it (easier)….nothing lost really. Watch this vid
      Once in, you have the turnigy 9x with the orange transmitter…then talking to the orange receiver on the robot.
      I hope that clarifies….I was doing this when I saw your post :)

  • Michael

    I just finished this great project and have started on a related project of my own and have a question. How do I read more than two R/C channels at once? I need to use both joysticks at the same time for my project and haven’t been able to use more than two channels. I can change which channels I use but not how many. Thanks in advance!

    • Dan Fisher


      Don’t know if this is helpful to you at this point. I built my own version of this project and wanted to program it myself using AtmelStudio rather than the Arduino IDE (I’m still programming the ATmega328p, the same chip from the Arduion UNO). My solution to reading 6 RC channels was to set up an interrupt on PortC (PCINT1). Each pin, PC0 to PC5, is the input for an RC channel coming from my receiver. Every time there is a LOW to HIGH or HIGH to LOW change on any pin (the microcontroller doesn’t distinguish which pin is changing), the interrupt code checks which pin is HIGH, sets a flag variable to know which pin is high, and starts timing. When the pin goes LOW, it stops timing. Once all 6 channels have updated, the main loop of my control program updates the direction and speed of each motor depending on the channel values. Here’s my interrupt code (Written in C for AtmelStudio. Note that variables are declared globally as volatile so they can be used int the interrupt code. You can also set interrupts using the Arduino IDE but I haven’t done that before):


  • Andrew

    I have a quick newbie question about the radio transmitter and receiver. Will the receiver that comes with the Turnigy 9x kit work? Is there any reason to by the OrangeRX module in addition?

  • Andrew

    Does anyone have some tips on how to glue concentric circles such that they are truly centered? I eyeballed it when I glued the acrylic disks to the wheels, and they are not well centered.

    I imagine there is some sort of jig for this purpose.

    • Nate

      I had the same problem. Only 1 of the 3 I assembled were aligned properly (user error). I ended up printing hubs for the wheels and trashing the acrylic versions.

  • Nate

    I had an issue with the bot not moving in one axis unless it was already moving in another axis. When I debugged with the console the pulseIn command wasn’t capturing channel 1 unless channel 2’s input value was large. I “fixed” it but editing the sketch and changing the timeout in the PulseIn command from 25000 to 0. The bot moves as commanded now.