Sabia que é possível usar um Arduino e controlar simultaneamente 16 servos utilizando apenas 2 pinos? Sim, isso é possível com a ajuda do módulo PWM Servo de 16 canais da Adafruit.
O módulo PWM Servo de 16 canais usa o protocolo I2C para comunicação com Arduino, que para conexão precisa de apenas 2 pinos. O controle PWM é feito pelo próprio módulo para todos os 16 canais simultaneamente sem sobrecarga de processamento adicional no Arduino. E ainda é possível fazer uma conexão em cascata conectando até 62 módulos juntos para controlar 992 servos, todos com os mesmos 2 pinos! É muito servo para pouco pino!
Este módulo é perfeito para projetos que necessitam de muitos servos como robôs-bípedes e robôs-aranha.
Este post foi baseado no post original em inglês encontrado no blog da Adafruit escrito por Bill Earl.
Montagem do módulo PWM Servo
O módulo acompanha todas as suas barras de pinos e conector borne para ligação de fonte externa. Veja a seguir como é feita a montagem do módulo.
Instale e solde nas posições marcadas as 4 barras de pinos macho tamanho 3×4.
Instale e solde as barras de pino macho em uma das laterais ou nas duas se desejar usar conexão em cascata.
Por fim instale o conector borne de fonte externa para os servos.
Circuito módulo PWM Servo Adafruit
Conecte o módulo ao arduino da seguinte maneira fazendo uso dos pinos 5V, GND, SDA e SCL.
Atente para a diferença entre os pinos VCC e V+!
VCC -> energia para o chip do módulo, pode ser usado 5V do Arduino.
V+ -> fonte externa para os servos que pode ser até 6V.
É aconselhado energizar os servos através do conector azul.
Para escolher a fonte de alimentação é necessário levar em conta o número de servos e seus tamanhos. Servos grandes e de alto torque podem chegar a consumir até 1A cada. Para 16 micro servos aconselhamos fontes de 5A ou mais pois cada micro servo pode consumir em torno de 300mA.
Conectando um servo motor
Para este tutorial usamos o Micro Servo 9g SG90 Tower Pro. Os servos possuem um conector padrão de 3 pinos que pode ser conectado direto no módulo. Tenha certeza de alinhar o pino GND do servo (usualmente na cor preta ou marrom) com a coluna de pinos GND do módulo e o pino de sinal do servo com a coluna PWM do módulo.
Com um módulo podem ser usados até 16 servos conectados como na figura abaixo
Conexão em cascata
Com mais de um módulo PWM, pode ser feita uma conexão em cascata podendo conectar até 62 módulos resultando em 992 saídas PWM.
Cada módulo conectado em cascata deve possuir um endereço único e isso é feito através dos pads de endereçamento. O endereço padrão para o módulo é 0x40. Para mudar o endereço é necessário soldar os pads. Cada pad soldado incrementa 1 binário no endereço 0x40.
- Módulo 0: Endereço = 0x40 -> binário 00000 (nenhum pad soldado)
- Módulo 1: Endereço = 0x41 -> binário 00001 (solde apenas A0 como na foto acima)
- Módulo 2: Endereço = 0x42 -> binário 00010 (solde apenas A1)
- Módulo 3: Endereço = 0x43 -> binário 00011 (solde apenas A0 & A1)
- Módulo 4: Endereço = 0x44 -> binário 00100 (solde apenas A2)
Usando a biblioteca da Adafruit
Para adicionar a biblioteca na IDE do Arduino clique em Sketch -> Incluir Biblioteca -> Gerenciar Bibliotecas…
No campo de pesquisa procure por adafruit pwm, selecione a biblioteca Adafruit PWM Servo Driver Library by Adafruit e clique em Instalar.
Abra o exemplo da biblioteca clicando em Arquivo -> Exemplos -> Adafruit PWM Servo Driver Library -> servo
Faça o upload do Sketch e você verá os servos se movimentando um de cada vez. O outro exemplo pwmtest deve mover os servos em uma forma de onda, conforme o gif mostrado no início deste post.
Agora você já pode criar seus robôs sem se preocupar com o número de saídas no Arduino!
Gostou? Deixe seu comentário logo abaixo.
Olá Giovanni ,
Bom Dia!
Sou estudante em arduino estou nos primeiros passos, eu posso usa este modulo pwm 16 servos para acinoar modulo rele de 16 reles?
Se alquem doder mim ajudar eu agradeço muito, como eu faria a logica?
Desde já Obrigado.
Olá.
Um relé não pode ser acionado por uma onda PWM, pois uma onda PWM é variável e o relé ficaria “estalando” toda hora.
O que você pode fazer é aplicar um filtro/conversor que transforma a onda PWM em um sinal contínuo, ou usar um PWM com duty cycle de 100%.
Att.
Vitor Mattos.
Suporte Técnico MakerHero.
Olá Giovanni, bacana seu post, com esse tutorial e esse exemplo da biblioteca consigo fazer um robô aranha? Não queria usar dois módulos, pensei em usar apenas 4 pernas, acha que pode ser feito assim?
Wilson,
Com mais algumas modificações para a utilização desse robô, é possível sim.
Abraços!
Boa noite, fiz as devidas ligações da placa com o arduino uno e com um micro servo motor 9g , alimentei a placa pwm 16 servos com 6v, instalei a biblioteca adafruit. Resultado, o monitor serial mostra 8 channel servo test e abaixo os números de 0 a 7…mas o servo não se movimenta…o que pode estar acontecendo, preciso alterar o programa para fazer funcionar com um servo, apenas?
Airton
Dê uma conferida nas diversas opções presentes para esse módulo: https://learn.adafruit.com/16-channel-pwm-servo-driver?view=all
Abraços!
Diogo – Equipe MakerHero
Boa tarde,
fique interessado neste Módulo, gostaria de saber se ele controla cargas indutivas que podem queimar o arduino ou vou precisar instalar um transistor com diodo?
Boa tarde!
Tenho uma dúvida, se eu utilizar dois módulos em cascata e colocar 32 micro servo sg90, teria que usar uma fonte de 5V/10A. Eu devo usar duas fonte, uma em cada módulo (sendo 5V/5A cada) ou no primeiro módulo (o que esta conectado com o arduino) sendo 5V/10A?
Muito obrigada!
Tamires,
Você deve alimentar os dois módulos, pois são eles que alimentam os servos.
Abraços!
Diogo – Equipe MakerHero
Olá Filipe,tenho uma duvida, da pra controlar a velocidade de rotação dos servos utilizando a placa pwm, em caso de um robó por exemplo… qual funçao usaria? desde já agradeço…
Filipe bom dia
Tenho uma maquete ferroviária e estou querendo usar servos para acionar os desvios,no caso são 10 desvios,gostaria de saber como faço para fazer esse esquema,sendo que os desvios serão acionados independentes um do outro e e no caso a energia que vai alimentar o servo ou placa e de 12 volts.Desde já te agradeço pela atenção.
Olá, Junior!
Sugiro que leve essa ideia de projeto para o fórum, lá o pessoal pode te ajudar de forma mais detalhada!
Abraços!
Diogo – Equipe MakerHero
Oi Júnior, tudo bem? Você ainda está com essa dúvida? Se sim, eu posso te ajudar. 31-99692-0405.
Eu estou a tentar fazer um relógio de 28 servos e necessito de 2 placas PCA9685.
Cheguei a um problema e gostava que me ajudasse.
Como é que eu consigo na programação, controlar as 2 PCA9685 ao mesmo tempo e também separadamente?
Olá Daniel,
Para controlar duas placas simultaneamente você pode cascateá-las (conforme o tutorial) e mudar a ultima linha do código.
Já para controlá-las separadamente você pode ver esse tutorial aqui: https://www.makerhero.com/blog/tarefas-paralelo-no-arduino/
Abraço!
Rosana – Equipe MakerHero
Bom Dia
Seria possível controlar o servo na pca9685 usando potenciômetros?
Olá Eder,
Você controlar os servos com potenciômetros ao invés de utilizar o Arduino? Isso/
Abraço!
Rosana – Equipe MakerHero
Olá, gostaria de saber como controlar a velocidade dos servos, ainda nao encontrei informções, obg
Olá Elton!
O legal de fórums é que você muitas vezes encontra alguém que procura o mesmo que você.
Dê uma olhada no seguinte fórum: https://forums.adafruit.com/viewtopic.php?f=19&t=101299&sid=8604774551deaecc8f1a3a9fcf3d2054
Lá dizem para adicionar um delay entre cada loop. o que vai mudar a velocidade do servo. Creio que essa seja a forma mais básica e fácil.
Encontrei essa informação pesquisando no google o seguinte: “adafruit pwm servo driver library speed”
Bons projetos!
Olá, sabe me dizer se este modulo trabalha as saídas PWM de 0V a 5V ou de 0V a 3.3V? pergunto pois estou pensando em utilizar ele e nas saídas implementar um drive de potencia AC opto acoplado e criar um Dimmer DMX ( será que da certo? ) ou vai virar uma máquina de fumaça kkkkk.
Olá Ricardo! Na página 38 do datasheet você encontra várias informações de tensão e corrente.
https://cdn-shop.adafruit.com/datasheets/PCA9685.pdf
VOH HIGH-level output voltage
IOH = 10 mA; VDD = 2.3V min=1.6V
IOH = 10 mA; VDD = 3.0V min=2.3V
IOH = 10 mA; VDD = 4.5V min=4.0V
IO(LEDn) output current on pin LEDn – 25 mA
Então, alimentando com 5V a saída é de 0 a 5V
Mas não fizemos esse teste para comprovar. Testamos apenas com os servos como indicado no tutorial.
Olá Giovanni, boa tarde.
Já é de grande ajuda, muito obrigado.
É possível controlar um servo especifico por vez, através desse modulo? Ou apenas todos os servos de uma só vez?
Pode controlar cada um individualmente.
É bem interessante dar uma olhada no código fonte da biblioteca.
Você pode encontrá-lo aqui: https://github.com/adafruit/Adafruit-PWM-Servo-Driver-Library/blob/master/Adafruit_PWMServoDriver.cpp
Note a função
void Adafruit_PWMServoDriver::setPWM(uint8_t num, uint16_t on, uint16_t off)
num, é o número do servo que se quer controlar.
Segue a função completa:
/**************************************************************************/
/*!
@brief Sets the PWM output of one of the PCA9685 pins
@param num One of the PWM output pins, from 0 to 15
@param on At what point in the 4096-part cycle to turn the PWM output ON
@param off At what point in the 4096-part cycle to turn the PWM output OFF
*/
/**************************************************************************/
void Adafruit_PWMServoDriver::setPWM(uint8_t num, uint16_t on, uint16_t off) {
#ifdef ENABLE_DEBUG_OUTPUT
Serial.print(“Setting PWM “); Serial.print(num); Serial.print(“: “); Serial.print(on); Serial.print(“->”); Serial.println(off);
#endif
_i2c->beginTransmission(_i2caddr);
_i2c->write(LED0_ON_L+4*num);
_i2c->write(on);
_i2c->write(on>>8);
_i2c->write(off);
_i2c->write(off>>8);
_i2c->endTransmission();
}
olá. poderia usar este modulo para expandir as saídas do arduino, para acionar um modulo relé de 16 canais? como ficaria esta programação?. Obrigado.
Olá Luciano!
Ainda não fizemos este teste mas provavelmente funcionaria sim.
Outra opção é vc usar um expansor de portas I2C: https://www.makerhero.com/produto/ci-pcf8574-expansor-de-portas-i2c/
Tutorial: https://www.arduinoecia.com.br/2017/03/como-usar-pcf8574-expansor-de-portas-i2c.html
Infelizmente não fazemos customização de códigos.
Irei anotar sua ideia como ideia de post para nosso blog, e iremos avaliar a viabilidade da produção desse conteúdo.
Abraço!
Eu tenho um robô humanóide com 16 servos MG996, de alto torque, posso utilizá-los nessa placa? A energia no conector é somente para os servos?
Olá Airton!
Creio que esses servos precisam de bastante corrente para operar.
Esse módulo PWM suporta 25mA por porta.
ola Giovanni, eu consigo controtar Motores de Passo com este modulo ? tenho um projeto que utiliza 8 motores e alguns outros sensores.
Olá Fabiano!
Não consegue, esse módulo é para PWM, somente.
Esse módulo serve para controlar mais de um motor de passo por vez: https://www.makerhero.com/produto/motor-shield-adafruit-v2-arduino/
Abraços!
André – Equipe MakerHero
Parabéns pelo tutorial, impecável.
Favor postar um sketch com módulo 16 canais pwm e joystik , pelo menso 4.
Grato
Carlos Bruni
Obrigado pela ideia Carlos!
Infelizmente não desenvolvemos sketches customizados.
Mas iremos analisar a viabilidade da produção desse conteúdo.
como fazer um skteh para dois modolus 16 canais estou fazendo
Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver(0x40);
Adafruit_PWMServoDriver pwm1 = Adafruit_PWMServoDriver(0x41);
erro pwm1 does not name a tip
Não sei exatamente como vocẽ está fazendo aí em seu computador.
Já instalou a biblioteca corretamente?
As instruções para instalação estão na seção “Usando a biblioteca da Adafruit”
O que eu fiz foi instalar a biblioteca corretamente e abrir um exemplo da própria biblioteca. Então apenas descomentei a linha e renomeei o pwm.
#include Wire.h
#include Adafruit_PWMServoDriver.h
// called this way, it uses the default address 0x40
Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();
// you can also call it with a different address you want
Adafruit_PWMServoDriver pwm1 = Adafruit_PWMServoDriver(0x41);
Fiz outro teste não incluindo a biblioteca, e me retornaram vários erros “does not name a type”.
como faço para confirar no arduino dois modulos em cascata o módulo PWM Servo de 16 canai
Para conectar em cascata basta seguir as instruções na seção: Conexão em cascata
No quesito programação você pode iniciar os módulos indicando o endereço de cada um por exemplo:
Adafruit_PWMServoDriver modulo1 = Adafruit_PWMServoDriver(0x40);
Adafruit_PWMServoDriver modulo2 = Adafruit_PWMServoDriver(0x41);
Abraço!
Gostei da solução! Gostaria de saber se posso utilizar este módulo PWM Servo 16 canais com o sensor DHT11?