Uma dúvida frequente entre os leitores do blog é o controle de vários servo motores com o Arduino, não só pela limitação do número de portas, como também pelo consumo desses motores, que podem sobrecarregar o Arduino. Se o seu projeto precisa de vários deles, uma boa opção é o Servo Motor Shield 16 Canais, da Adafruit.

Com esse shield, todo o controle dos servos (16 por shield) fica por conta do controlador PWM embutido na placa, liberando o Arduino dessa carga de processamento. Além disso, o shield tem a sua própria entrada de energia (5 à 6VDC) para alimentação dos motores.
A comunicação entre o Arduino e o servo shield é feita pela interface I2C, utilizando apenas os pinos A4 (SDA) e A5 (SCL), liberando os outros pinos para utilização de acordo com as necessidades do seu projeto. A placa permite ainda que que você encaixe outros shields iguais, podendo controlar até 992 servos ! (16 servos por shield x 62 shields = 992 servos).
Montagem do shield
Antes de começar a utilizar o shield, você precisa soldar os conectores que acompanham a placa.
Você pode optar por soldar os conectores que já vem com o shield (pinos macho/macho), como na imagem acima, ou adquirir um kit Barra de pinos empilhável, com conectores macho/fêmea, se desejar empilhar vários shields.
Servo Motor Shield conexões e endereçamento
Na imagem abaixo, temos as principais conexões da placa. No lado esquerdo, os pinos de alimentação dos servos e os leds indicadores de tensão de entrada (verde/inferior) e alimentação do shield pelo Arduino (vermelho/superior), além do botão de reset.
Próximo ao conector de alimentação, temos um espaço (C2) para colocar um capacitor eletrolítico, caso seja necessário para evitar oscilações/ruídos. A Adafruit recomenda um capacitor de aproximadamente 100µF para cada servo, assim, se você tiver 4 servos, por exemplo, use um capacitor de 470µF. Este capacitor não é fornecido junto com o shield.
O endereçamento de cada shield é feito por meio dos pontos A0 à A5 do shield (não confunda com as portas analógicas do Arduino). O endereço padrão é 0x40, e você pode alterar esse endereço soldando os pontos correspondentes como na imagem abaixo:
Assim, se você quiser o endereço 0x41, solde os pontos correspondentes ao A0 (1000001 em binário = 0x41 em hexadecimal), se quiser o endereço 0x42 , solde o terminal A1 (1000010 = 0x42), e assim por diante.
Conexão do Adafruit Servo Shield ao Arduino
Agora que já temos informações sobre a montagem e conexões do servo shield, chegou a hora de montar um circuito de testes, onde vamos movimentar cada servo de maneira independente.
Monte o circuito abaixo, composto por:
- 3 leds
- 3 resistores de 330 ohms para os leds
- Push button
- Resistor de 10K para o push-button
- Potenciômetro
- 3 servo motores
Observe que é obrigatória a utilização de uma fonte de 5 à 6V para alimentação do shield. Sem ela, os servo motores não funcionam. Ao alimentar o shield com a fonte externa, o led verde irá acender.
Siga o esquema de ligação do servo motor mostrado acima: fio marrom = GND, vermelho = VCC e laranja = Sinal.
Programa e biblioteca Adafruit Servo Shield
O programa usa a biblioteca Adafruit-PWM-Servo-Driver, disponível neste link. Descompacte o arquivo e renomeie a pasta para Adafruit_PWMServoDriver. Depois copie essa pasta para dentro da pasta LIBRARIES da IDE do Arduino.
O controle dos motores dentro do programa, apesar de ser feito pela biblioteca, pode exigir a configuração de parâmetros relativos ao PWM. Consulte os programas de exemplo da biblioteca para maiores informações sobre esses parâmetros.
//Programa: Adafruit Servo Shield 16 Canais
//Autor: Arduino e Cia
#include <Wire.h>
#include <Adafruit_PWMServoDriver.h>
//Seleciona o shield com endereço 0x40
Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver(0x40);
//Configuração PWM para o servo motor. Ajuste o pulso de acordo com
//o servo motor que você vai utilizar
#define SERVOMIN 150 //Comprimento de pulso minimo
#define SERVOMAX 600 //Comprimento de pulso maximo
#define pino_botao A0
#define pino_pot A2
int motor_selecionado = 0;
int pino_led = 5;
void setup() {
Serial.begin(9600);
pinMode(pino_botao, INPUT);
pinMode(pino_pot, INPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
digitalWrite(5, HIGH);
Serial.println("Pressione o botao para selecionar o servo\n");
Serial.println("Motor selecionado: 0");
pwm.begin();
//Frequencia servo analogico
pwm.setPWMFreq(60);
}
void loop()
{
int valor = digitalRead(A0);
//Verifica se o botao foi pressionado
if (valor == 0)
{
//Altera o motor selecionado
motor_selecionado++;
pino_led++;
if (motor_selecionado > 2)
{
motor_selecionado = 0;
pino_led = 5;
}
//Mostra o motor selecionado no serial monitor
Serial.print("Motor selecionado: ");
Serial.println(motor_selecionado);
//Aciona o led correspondente
digitalWrite(5, LOW);
digitalWrite(6, LOW);
digitalWrite(7, LOW);
digitalWrite(pino_led, HIGH);
while (digitalRead(A0) == 0) {}
}
//Leitura do valor do potenciometro
int valor_pot = analogRead(pino_pot);
//Converte o valor lido do potenciometro para um valor
//entre SERVOMIN e SERVOMAX
int valor_pulso = map(valor_pot, 0, 1024, SERVOMIN, SERVOMAX);
//Movimenta o servo
pwm.setPWM(motor_selecionado, 0, valor_pulso);
delay(50);
}
O programa começa selecionando o Motor 1, e você pode movimentá-lo utilizando o potenciômetro. Pressione o push-button para também controlar o Motor 2 ou o Motor 3. A cada toque no botão, o led correspondente ao motor será aceso, e a indicação do motor selecionado também é enviada para o serial monitor.
Gostou? Confira outros posts usando servo motor aqui mesmo no Arduino e Cia!