Como usar o módulo PWM Servo 16 canais 26

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. Em caso de dúvidas, caso queira trocar uma ideia, ou até mesmo dividir seu projeto, acesse nosso Fórum!

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

26 Comentários

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

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

    aleksander faleiro bastos
    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!

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

    aleksander faleiro bastos
    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”.

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

  5. 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.filipeflop.com/produto/motor-shield-adafruit-v2-arduino/

      Abraços!

      André – Equipe FILIPEFLOP

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

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

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

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

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

    Elton Alexandria B. barreto
    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. 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 FilipeFlop

  12. 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.filipeflop.com/blog/tarefas-paralelo-no-arduino/

      Abraço!
      Rosana – Equipe FilipeFlop

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

      https://www.filipeflop.com/forum/

      Abraços!
      Diogo – Equipe FilipeFlop