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.

Adafruit Servo Motor Shield 16 channel 12 bit PWM

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.

Servo Shield com conectores macho/fêmea

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.

Adafruit Servo Shield - Conexões

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:

Alterando o endereçamento da placa

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
Circuito Arduino Uno e Adafruit Servo Shield

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.

Projeto em funcionamento

Gostou? Confira outros posts usando servo motor aqui mesmo no Arduino e Cia!

Avalie este post!