Servo vs DC motors for a robot?

So I'm looking into making a robot with arduino and I started to look around at other people's designs and I ran into something. I've noticed that for the motors connected to the wheels, people usually use DC motors or modified servos. I was just wondering what the differences are between using one or the other type of motor to control the movement of the robot. What are the advantages/disadvantages of using one or the other?
Thanks.

I am not an expert, but here are my thoughts on it:
Servos are slow, but precise. You send a command to the servo that will command the servo to rotate at a specific rotational speed. With Arduino, you'd usually use the Arduino Servo library (Servo - Arduino Reference) and a constant rotation servo.
Servo's also tend to require less power to run. This is only a general rule, and there are certainly exceptions.

DC motors can give you considerably more power and/or speed, but can be tricky to control as accurately. If you don't have an encoder attached to each DC motor, it'll be very difficult to make each wheel spin the same speed.
If you do have encoders, you'll wind up needing to code some type of constant comparison between the two encoder speeds and adjust the individual motor voltages to make the speeds match. Every time the floor changes grade, or a tire hits a bump, or the floor changes texture, the required voltage to make that DC motor spin the same fast changes.

I believe that some of the DC Motor Control Boards have this built in. It may be worth paying extra to have this feature.

All of the experts around here, feel free to correct/add to this... Just my 2 cents.

Wyldhunt: Thanks! This is exactly the type of answer I was hoping for.

Just another thing, in general, I have seen a lot of robots that used DC motors need a power supply for the motors. I'm assuming this is due to the more power required to run. So, If I used servo motors, could I power them from the Arduino's 5v or 3.3v pins, (Assuming the motors' operating voltage is in this range) without needing a separate power supply for the motors?

My 2 cent
Selecting the best motor .....man that is hard. :sleeping:
Let me share what I (think) I know.
A continuous rotational servo is a geared dc motor with a controller controlled by PPM. I'm not sure how the power of the PPM signal relates to PWM'ing a standard geared dc motor; but I think the performance will be similar.

Continuous rotational servo's are easy to find and cheap and have a build in controller. That is a lot for a small package and a small price ( one of the rare benefits of mass production).
If you need more power (heavier robot; more difficult terrain) you will want to step up.

The problem with most motors (that is exclusive the stepper) is that: to get some power you need speed. If you connect the motor directly to the wheels the speed of the wheels -and as such the robot-will very likely be to fast.
So you need to reduce the speed. Most commonly we use a gearbox. That is what the servo does and the geared dc motor.
Biggest benefit of the gearbox is that you can chain the gears and get reductions of 100 or more in a small area. The planetary gearboxes are also very efficient.
Belts for instance become very impractical even before the reduction rate is higher than 10.
The stepper is an exception here as it can deliver big torques and low rotational speeds. However a smooth run is not his best trait.
With some mosfets you can control them directly from your arduino. The drawback of powerfull steppers is: price, availability, power consumption. The last one is making it unsuited for driving wheels as the power consumption is equal whatever speed (and even at standing still if you keep the motor powered)

In DC world(you can make AC from DC and run a AC motor in your robot; but it is very unlikely in your first real project) you have brushed and brushless DC motors. As less is more brushless is more money $)
The difference is technical and has to do with the need of brushes because the current flows in the rotating part (this is called the rotar). Brushless motors do not have current floating in the rotating part.
In both cases you need a controller. It is actually the controller that will influence the characterisics of the motor.
However a brushed motor can have a really easy controller (like 1 mosfet if you do not need to reverse) but a brushed motor needs a good controller (read expensive)

From a usability point of view the main difference between brushed an brushless is that brushed has a very high stall torque (that is if the wheels are blocked the motor will try very hard to get it free) but loses power when PWM'ed.
The brushless on the other hand has a smaller stall torque (but with the correct controller) hardly loses power when reducing speed.

Best regards
Jantje

Jantje:
Continuous rotational servo's are easy to find and cheap and have a build in controller.

I want to make the robot as simple as possible to start, so I believe these would do. But how do you program them? Is it like a normal servo when you have to program each rotation or the motor? Or can you just supply power to it and the shaft will turn?

You control them like standard servo's but
0=full speed backward
....
90=stand still
....
180 = full speed forward
Note that the 90 for stand still may be a tat different.
There is plenty of doc on the internet to explain.
Jantje

Also, if I were to go the DC motor route for motor control, would I just need something like a motor driver shield for my arduino? Something like this SparkFun Ardumoto - Motor Driver Shield - DEV-14129 - SparkFun Electronics or http://arduino.cc/en/Main/ArduinoMotorShieldR3

If you do not need feedback of the actual speed; that will do yes.
As I said brushed dc motor control can be really easy.
Definitely when it is a low power motor and you do not need feedback.
Note that you need 2PWM pins per motor where with a servo any pin will do.
In other words buying 2 of these shields will not be good enough to drive 4 motors forward and backwards.

I might be repeating people but…

Servo motors are accurate but slow, they don't need much energy though. If you want a robot that senses walls with an Distance Sensor (HC-SR04), then use servo motors.
See here: Store - FoxyTronics

DC motors usually work in two. You would need extra power supply but not too much or else you will burn the motor. You can use capacitors for this. Also, using a Motor Shield will be better when using DC Motors because it will control the power of the motors.

However, you can use stepper motors which are accurate and fast. They are hard to control which is why most shields can control only one stepper motor. But, they get the job done pretty well.
See below:

These are all my opinions but for me, I would use DC motors for moving around, and Servo or Stepper motors for other tasks such as looking around with an HC-SR04 attached to it, or maybe picking up an object.

Everyone's replies are right on the money, but I don't believe anyone talked about how to power the servos or DC motors. Just to make sure you know, you should not power motors directly from the Arduino for two reason:

  1. If they draw too much current, it could potentially damage the voltage regulator on the Arduino

  2. Even if they don't damage the Arduino, it is very likely they will cause problems for the board, such as pulling the voltage too low for a split second which can cause a reset (or other screwy things). I've experienced this problem personally and have seen it happen many times.

trendz3:
But how do you program them? Is it like a normal servo when you have to program each rotation or the motor? Or can you just supply power to it and the shaft will turn?

[shameless self promotion]

How to use continuous rotation servos with Arduino

[/shameless self promotion]

I want to make the robot as simple as possible to start, so I believe these would do. But how do you program them? Is it like a normal servo when you have to program each rotation or the motor? Or can you just supply power to it and the shaft will turn?

For a simple setup, you might start with continuous rotation servos. No extra driver is needed and the servo can have a nice selection of speeds in forward or reverse. The servo library is used and the servo code should be fairly straight forward. Below is how I modify an inexpensive (~$5) servo for continuous rotation. Bottom is a basic external power setup for a servo.

I am not an expert, but here are my thoughts on it:
Servos are slow, but precise. You send a command to the servo that will command the servo to rotate at a specific rotational speed. With Arduino, you'd usually use the Arduino Servo library (Servo - Arduino Reference) and a constant rotation servo.
Servo's also tend to require less power to run. This is only a general rule, and there are certainly exceptions.

DC motors can give you considerably more power and/or speed, but can be tricky to control as accurately. If you don't have an encoder attached to each DC motor, it'll be very difficult to make each wheel spin the same speed.
If you do have encoders, you'll wind up needing to code some type of constant comparison between the two encoder speeds and adjust the individual motor voltages to make the speeds match. Every time the floor changes grade, or a tire hits a bump, or the floor changes texture, the required voltage to make that DC motor spin the same fast changes.

I believe that some of the DC Motor Control Boards have this built in. It may be worth paying extra to have this feature.

All of the experts around here, feel free to correct/add to this... Just my 2 cents.

I do agree (and confirm) absolutelly.

I'm not an expert . . .except for I've spent a time (100 hrs?) developing a software-speed-servo for a cheap DC (hobby) motor.

I've managed to make it work (control speed) in different load conditions (say, simulating different floor grade) although it seems very complicated to control them at low speeds (under 20 rpm). For a position servo you will need such a precise and big gear that, I think, is much more reasonable to use steppers.

If they draw too much current, it could potentially damage the voltage regulator on the Arduino

RoboticsGuy, what if I used a separate voltage Regulator, suppose a 5V voltage regulator that is directly mounted to the motor? And connect the power to that?

Or what if I used a resistor to cut down some of the power directly from the Arduino?

Just saying that it won't always burn out if you are careful with it.

s_tanay:
RoboticsGuy, what if I used a separate voltage Regulator, suppose a 5V voltage regulator that is directly mounted to the motor? And connect the power to that?

When you buy the servos also purchase a "BEC" (battery elimination circuit) to use with them. The BEC (or sometimes called a "UBEC") is just a voltage regulator, but typically a switching type and more efficient than the Arduino's linear type. They're cheap and powering servos is what they're designed for.