Como usar o Servo Motor Shield 16 canais Adafruit
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!
existe possibilidades de eu uisar esse shield para enviar sinal de tensão de 1 a 5 para controlar uma valvula insdustrial de 4 a 20 miliampres? Obrigado..
Bom dia,
Não sei qual o esquema de ligação dessa válvula, mas neste caso você nem precisa do shield. A própria porta do Arduino pode fornecer a tensão e a corrente que você precisa.
Abraço!
Busquei essa placa no site da Adafruit (https://www.adafruit.com) e não encontrei. Há uma placa com funcionalidade similar de código PCA9685 que me parece menor que essa. Qual a diferença entre elas e onde encontro mais informações acerca dela?
Bom dia Ronaldo,
O link que você está procurando é esse:
https://www.adafruit.com/products/1411
A diferença entre a placa desse post e a PCA9685 é que a do post é em formato Shield, e possui uma área de prototipagem. No restante, as características são as mesmas.
Abraço!
Amigo, ao invés de servos posso usar um motor de passo?
Bom dia Felipe,
Esse shield e a biblioteca são indicados apenas para utilização com servo motores.
Abraço!
Tenho um projeto com 1024 motores de passo, posso usar um Shield desse para controlar um módulo com 16?
Olá boa noite
Estou querendo controlar 4 servos com esses módulo gostaria de saber qual a programação que devo usar para direcionar cada servo com ângulos diferentes
Boa tarde, preciso utilizar 5 servos, porem necessito que cada um tenha um range diferente, a biblioteca permite apenas de 0 a 180, gostaria de outras possibilidades como de -90 a 90, -45 a 135, tem algum comando para alterar esses valores.?
Bom dia Pedro,
Talvez você consiga usar o comando map():
map(variavel_angulo, 0, 180, -90, 90)
referencia: https://www.arduino.cc/en/Reference/Map
Abraço!
Deu certo amigo,
Muito Obrigado pela ajuda.
funciona no arduino mega 2560? nao ta rodando o motor mas o resto do script ta funcionando normal com as leds e o potenciômetro, eu conectei do mesmo jeito exceto pelo sda e scl depois do ARef, eu tentei conectar esses dois com jumper wires no digital 20 e 21 do arduino mega (marcados como sda e scl) mas isso fazia parar de funcionar o script todo.
Boa tarde,
Funciona, mas vc precisa cortar algumas trilhas da placa, veja as instruções neste link, por favor:
https://learn.adafruit.com/adafruit-16-channel-pwm-slash-servo-shield/shield-connections
Abraço!
bom dia não consigo controlar os servos mg 996r so os mg90 qual sera o defeito
Bom dia,
Estranho. O que acontece quando vc liga o MG996 ?
Abraço!
Boa tarde!
Aonde posso conseguir a "biblioteca" deste componente para o fritzing?
Grato
Olá, boa noite! Estou fazendo um projeto em que preciso controlar a intensidade de 51 LEDs no arduino. Minha idéia é utilizar dois módulos desse e tentar controlar a intensidade dos LEDs pelo PWM do módulo. Será que seria possivel? Tem idéia de como?
Desde já agradeço a ajuda!
Olá estou montando um braço robotico, mas preciso gravar as posições dos servos para movimentos autonomos. Você teria um codigo que possa me ajudar a desenrolar o projeto ?
Grato !
Estou com uma projeto para ser utilizado no teatro… para 7 (sete) holofotes que no plano deverão ter movimento horizontal e vertical (PAN & TILT) com movimentação independente, mas também individual e com possibilidade de controlar ambas ao mesmo tempo… É possível?
Boa dia amigo. Você saberia explicar qual diferença entre o Shield L293DD Arduino 2 Motor DC + 16 Servo, Módulo PWM Servo 16 canais PCA9685 e o Servo Motor Shield 16 canais da Adafruit? Sei q todos controlam diversos servos, mas queria saber se a saída pwm sempre sera a mesma.
Oi Leone,
Não tenho essa informação no momento, mas vc teria que verificar por exemplo as bibliotecas e como elas tratam o acionamento dos motores.
Abraço!
Adilson