Those who intend to build a more complex project (in this case I mean with more DOFs, like a hexapod, biped humanoid and others) may find dificulties if using a Arduino UNO or similar board, unless they have a Mega. That's what happened with me when I was working on my biped project.
After researching a lot of alternatives, without changing the board, I found this IC: TLC5940.
This is sold as a 16 channel LED driver, but with this library it can control 16 servo motors easily as the "sweep servo". But not only that, the IC can be daisy-chained and expand the PWM outputs even more (I haven't yet tried it, but seems to be very easy). What you lose of your board are 5 pins.
You can find this IC in a breakout board and also in a shield (PWM shield), or make your own with very low cost (less than USD 2,00 per chip). If you live in Brazil you can buy 20 chips for the price of one PWM shield. :)
Well guys, what you'll need to make this work are below:
- Arduino board (I utilized UNO);
- 1x TLC5940 IC (16 channels);
- 2.2k resistors;
- external power for the servos;
- jumper wires;
- servos (how many you want to control or your project needs);
In my example, I utilized only 6 servos. But you can easily add more on the remaining channels.
Owwwww... What a mess of wires! It's a bit difficult to understand the connections on the above pic. Because of this I made a schematic in Fritzing. But before it, let's take a look in the IC pins.
Now, let's go to the connections... Follow the color and pins sequence below.
- IC pins 1 until 15 and pin 28 are the output channels, where you connect the signal wire of the servo. You got to add a 2.2k pull-up resistor in each channel and connect to 5V to make it possible to control servos.
- IC pin 16: XERR (non utilized in this case).
- IC pin 17 - SOUT (non utilized in this case).
- IC pin 18 - GSCLK: BROWN wire connected to the Arduino pin 3;
- IC pin 19 - DCPRG: connected to 5V;
- IC pin 20 - IREF: put on it a 2.2k resistor and connect to GND;
- IC pin 21 - VCC: connected to 5V;
- IC pin 22 - GND: connected to GND;
- IC pin 23 - BLANK: ORANGE wire connected to the Arduino pin 10;
- IC pin 24 - XLAT: YELLOW wire connected to the Arduino pin 9;
- IC pin 25 - SCLK: BLUE wire connected to the Arduino pin 13;
- IC pin 26 - SIN: GREEN wire connected to the Arduino pin 11;
- IC pin 27 - VPRG: connected to GND.
As you will utilize a bunch of servos, you'll need an external power supply for them. Don't forget to connect the ground of the servo power to the Arduino power, to make a common GND.
Note: In the begin I was having troubles to make the servos turn from 0 to 180º, they only turned from 0 to 90º. I researched in many forums and found some guys with the same problem. But nobody had the solution. After changing some values in the tlc_servos.h file, I solved this trouble. So, if someone have this same problem, change the SERVO_MIN_WIDTH from 204 to 120 and the SERVO_MAX_WIDTH from 410 to 475.
For now, that's all guys.