Animação com vários servo motores conectado ao Arduino se movimentando.

Como usar o módulo PWM Servo 16 canais 37

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.

Módulo PWM Servo 16 canais Adafruit

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.

Soldagem das barras de pino no módulo

Soldagem das barras de pino no módulo

Instale e solde as barras de pino macho em uma das laterais ou nas duas se desejar usar conexão em cascata.

Soldagem das barras de pino laterais

Por fim instale o conector borne de fonte externa para os servos.

Soldagem do conector fonte externa

Circuito módulo PWM Servo Adafruit

Conecte o módulo ao arduino da seguinte maneira fazendo uso dos pinos 5V, GND, SDA e SCL.

Circuito conexão módulo PWM Servo ao Arduino

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.

Circuito conexão servo ao módulo

Com um módulo podem ser usados até 16 servos conectados como na figura abaixo

Circuito conexão 16 servos ao módulo

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. 

Circuito cascata

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.

Pads de endereçamento

  • 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…

Menu gerenciador de bibliotecas

No campo de pesquisa procure por adafruit pwm, selecione a biblioteca Adafruit PWM Servo Driver Library by Adafruit e clique em Instalar.

Tela Biblioteca Adafruit

Abra o exemplo da biblioteca clicando em Arquivo -> Exemplos -> Adafruit PWM Servo Driver Library -> servo

Menu exemplo 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.

Módulo em funcionamento

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. 

Faça seu comentário

Acesse sua conta e participe

37 Comentários

  1. 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.

    1. 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.

  2. 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?

    1. Wilson,

      Com mais algumas modificações para a utilização desse robô, é possível sim.

      Abraços!

  3. 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?

    1. 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

  4. 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?

  5. 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!

    1. Tamires,

      Você deve alimentar os dois módulos, pois são eles que alimentam os servos.

      Abraços!
      Diogo – Equipe MakerHero

  6. 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…

  7. 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.

    1. 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

    2. Oi Júnior, tudo bem? Você ainda está com essa dúvida? Se sim, eu posso te ajudar. 31-99692-0405.

  8. 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?

    1. 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

  9. Bom Dia

    Seria possível controlar o servo na pca9685 usando potenciômetros?

    1. Olá Eder,

      Você controlar os servos com potenciômetros ao invés de utilizar o Arduino? Isso/

      Abraço!
      Rosana – Equipe MakerHero

  10. Olá, gostaria de saber como controlar a velocidade dos servos, ainda nao encontrei informções, obg

    1. 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!

  11. 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.

    1. 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.

      1. Olá Giovanni, boa tarde.
        Já é de grande ajuda, muito obrigado.

  12. É possível controlar um servo especifico por vez, através desse modulo? Ou apenas todos os servos de uma só vez?

    1. 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();
      }

  13. 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.

    1. 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!

  14. 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?

    1. Olá Airton!

      Creio que esses servos precisam de bastante corrente para operar.

      Esse módulo PWM suporta 25mA por porta.

  15. ola Giovanni,   eu consigo controtar Motores de Passo com este modulo ?  tenho um projeto que utiliza 8 motores e alguns outros sensores.

    1. 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

  16. Parabéns pelo tutorial, impecável.

    Favor postar um sketch com módulo 16 canais pwm e joystik , pelo menso 4.

     

    Grato

    Carlos Bruni

     

    1. Obrigado pela ideia Carlos!
      Infelizmente não desenvolvemos sketches customizados.
      Mas iremos analisar a viabilidade da produção desse conteúdo.

  17. 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

    1. 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”.

  18. como faço para confirar no arduino dois modulos em cascata o módulo PWM Servo de 16 canai

    1. 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!

  19. Gostei da solução! Gostaria de saber se posso utilizar este módulo PWM Servo 16 canais com o sensor DHT11?