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!