Código de Pesquisa

Código Arduino e vídeo para o controlador de servos PCA9685 de 16 canais e 12 bits V1

Código Arduino e vídeo para o controlador de servos PCA9685 de 16 canais e 12 bits V1

Neste tutorial, exploraremos como usar o controlador de servos PCA9685 de 16 canais e 12 bits da NXP Semiconductor. Este módulo permite controlar até 16 servos ou controlar o brilho de um banco de LEDs com precisão usando modulação por largura de pulso (PWM). Ao final deste tutorial, você terá uma configuração funcional capaz de controlar vários servos individualmente ou simultaneamente.

PCA9685 module-0

Para esclarecer ainda mais o conteúdo do tutorial, recomendo que você assista ao vídeo acompanhante (no vídeo em 00:00) para uma demonstração visual da configuração e do processo de codificação.

Hardware Explicado

O módulo PCA9685 é uma placa compacta que pode controlar vários servos via comunicação I2C. Ele possui 16 canais, permitindo conectar até 16 servos, cada um com seu próprio sinal de controle. O módulo opera com alimentação de 5V e é projetado para lidar com sinais PWM, que são essenciais para controlar com precisão a posição dos servos.

A placa inclui pinos dedicados para alimentação (VCC), terra (GND) e comunicação (SDA e SCL). O pino SDA é usado para transmissão de dados, enquanto o pino SCL é o sinal de clock, ambos os quais se conectam aos pinos analógicos A4 e A5 do Arduino, respectivamente. Essa configuração garante comunicação confiável entre o Arduino e o módulo PCA9685.

Detalhes da ficha técnica

FabricanteNXP Semicondutor
Número da peçaPCA9685
Tensão lógica/E/S3,3 V a 5,5 V
Tensão de alimentação2,3 V a 5,5 V
Corrente de saída (por canal)25 mA máx.
Corrente de pico (por canal)100 mA máx.
Orientações sobre a frequência PWM24 Hz a 1.6 kHz
Limiares lógicos de entrada0.3 V (baixo) / 0.7 V (alto)
Queda de tensão / RDS(on)/ saturação0.5 V máx.
Limites térmicos-40 °C a 125 °C
PacoteHTSSOP-28
Notas / variantesControlador PWM de 16 canais

  • Garanta uma fonte de alimentação de 5 V com corrente suficiente (1 A recomendada).
  • Não alimente os servos diretamente pelo Arduino para evitar danos.
  • Use os pinos I2C corretos: SDA no A4 e SCL no A5.
  • Ajuste os valores de largura de pulso de acordo com seus servos específicos.
  • Verifique a fiação para polaridade correta: GND, VCC e sinal.
  • Considere a dissipação de calor para aplicações de alta corrente.

Instruções de fiação

Arduino wiring for PCA9685 to control 16 servo motors
Arduino wiring for PCA9685 to control 16 servo motors

Para ligar o PCA9685 ao seu Arduino, comece conectando a alimentação e o terra. Conecte o pino VCC do PCA9685 à saída 5V do Arduino. Em seguida, conecte o pino GND do PCA9685 ao GND do Arduino. Depois, conecte o pino SDA do PCA9685 ao pino A4 do Arduino, e o pino SCL ao pino A5.

Para os servos, conecte o fio de sinal ao canal correspondente no PCA9685 (por exemplo, CH0 para o primeiro servo), o fio de alimentação a uma fonte de alimentação separada (pois os servos podem exigir mais corrente do que o Arduino pode fornecer) e o fio de terra ao terra comum compartilhado com o PCA9685. Certifique-se de que os fios de sinal, alimentação e terra estejam conectados corretamente para evitar danificar seus componentes.

Exemplos de Código e Tutorial Passo a Passo

Na seção de configuração do código, inicializamos o módulo PCA9685 compwm.begin()e defina a frequência PWM compwm.setPWMFreq(60);. Isso define a frequência de comunicação dos servos.

void setup() {
  Serial.begin(9600);
  Serial.println("16 channel Servo test!");
  pwm.begin();
  pwm.setPWMFreq(60);  // Analog servos run at ~60 Hz updates
}

Dentro do loop, controlamos os servos definindo os valores PWM correspondentes aos ângulos desejados. A funçãoangleToPulse(int ang)mapeia o ângulo para a largura de pulso apropriada, o que é essencial para o posicionamento preciso do servo.

void loop() {
  for( int angle =0; angle<181; angle +=20){
    delay(500);
    pwm.setPWM(0, 0, angleToPulse(angle) );
  }
}

Finalmente, a funçãoangleToPulse(int ang)converte o ângulo em largura de pulso usando os comprimentos de pulso mínimo e máximo definidos. Isso permite que você controle facilmente a posição do servo com base no ângulo que deseja alcançar.

int angleToPulse(int ang){
   int pulse = map(ang,0, 180, SERVOMIN,SERVOMAX);
   Serial.print("Angle: ");Serial.print(ang);
   Serial.print(" pulse: ");Serial.println(pulse);
   return pulse;
}

Demonstração / O que esperar

Uma vez que tudo esteja corretamente ligado e o código carregado, você deverá ver o servo movendo-se pelos ângulos especificados em incrementos de 20 graus. Se o servo não se comportar conforme o esperado, verifique a fiação para conexões corretas e assegure-se de que a fonte de alimentação seja adequada (no vídeo em 12:30).

Marcas de tempo do vídeo

  • 00:00- Introdução ao PCA9685
  • 02:30- Instruções de fiação
  • 05:00- Revisão de código
  • 10:15- Demonstração de controle de servo
  • 12:30- Solução de problemas comuns

Imagens

PCA9685 module-0
PCA9685 module-0
PCA9685 module-1
PCA9685 module-1
PCA9685 module-2
PCA9685 module-2
PCA9685 module-3
PCA9685 module-3
PCA9685 module
PCA9685 module
Arduino wiring for PCA9685 to control 16 servo motors
Arduino wiring for PCA9685 to control 16 servo motors
36-PCA9685 video V1: Arduino Code to control 16 servo motor, Basic
Idioma: C++
/*
 * Original source: https://github.com/adafruit/Adafruit-PWM-Servo-Driver-Library
 * This is the Arduino code for the PCA9685 16-channel servo controller.
 * Watch the video for details and demo: http://youtu.be/y8X9X10Tn1k
 *  get code and wiring diagram from http://robojax.com/RTJ27
 
 * Watch the video for this code: 
 * 
 * Related Videos:
V5 video of PCA9685 32 Servo with ESP32 with WiFi: https://youtu.be/bvqfv-FrrLM
V4 video of PCA9685 32 Servo with ESP32 (no WiFi): https://youtu.be/JFdXB8Za5Os
V3 video of PCA9685: how to control 32 servo motors: https://youtu.be/6P21wG7N6t4
V2 Video of PCA9685: 3 different ways to control servo motors: https://youtu.be/bal2STaoQ1M
V1 Video introduction to PCA9685 to control 16 servos: https://youtu.be/y8X9X10Tn1k

 * Written by Ahmad Shamshiri for Robojax Video channel: www.Robojax.com
 * Date: December 16, 2017, in Ajax, Ontario, Canada
 * Permission granted to share this code, given that this
 * note is kept with the code.
 * Disclaimer: This code is "AS IS" and for educational purposes only.
 * This code has been downloaded from https://robojax.com
 * 
 */
/*************************************************** 
  This is an example for our Adafruit 16-channel PWM & Servo driver.
  Servo test - this will drive 16 servos, one after the other.

  Pick one up today in the Adafruit shop!
  ------> http://www.adafruit.com/products/815

  These displays use I2C to communicate; 2 pins are required to  
  interface. For Arduino UNOs, that's SCL -> Analog 5, SDA -> Analog 4.

  Adafruit invests time and resources providing this open source code, 
  please support Adafruit and open-source hardware by purchasing 
  products from Adafruit!

  Written by Limor Fried/Ladyada for Adafruit Industries.  
  BSD license, all text above must be included in any redistribution.
 ****************************************************/

#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 pwm = Adafruit_PWMServoDriver(0x41);

// Depending on your servo make, the pulse width min and max may vary; you 
// want these to be as small/large as possible without hitting the hard stop
// for max range. You'll have to tweak them as necessary to match the servos you
// have!
#define SERVOMIN  125 // this is the 'minimum' pulse length count (out of 4096)
#define SERVOMAX  575 // this is the 'maximum' pulse length count (out of 4096)

// our servo # counter
uint8_t servonum = 0;

void setup() {
  Serial.begin(9600);
  Serial.println("16 channel Servo test!");

  pwm.begin();
  
  pwm.setPWMFreq(60);  // Analog servos run at ~60 Hz updates

  //yield();
}

// the code inside loop() has been updated by Robojax
void loop() {


  for( int angle =0; angle<181; angle +=20){
    delay(500);
    pwm.setPWM(0, 0, angleToPulse(angle) );
  }

  delay(1000);
 
}

/*
 * angleToPulse(int ang)
 * gets angle in degrees and returns the pulse width.
 * Also prints the value on the serial monitor.
 * Written by Ahmad Shamshiri for Robojax, Robojax.com
 */
int angleToPulse(int ang){
   int pulse = map(ang,0, 180, SERVOMIN,SERVOMAX);// map angle of 0 to 180 to Servo min and Servo max 
   Serial.print("Angle: ");Serial.print(ang);
   Serial.print(" pulse: ");Serial.println(pulse);
   return pulse;
}
37-PCA9685 video V1: Arduino Code with mapping PWM
Idioma: C++
/*
 * Original source: https://github.com/adafruit/Adafruit-PWM-Servo-Driver-Library
 * This is the Arduino code for the PCA9685 16-channel servo controller.
we have simple code with mapping PWM for simplicity explained in the video at 18:27

 * Watch the video for details and demo: http://youtu.be/y8X9X10Tn1k
 get this code and wiring from for this video:  http://robojax.com/RJT27

 * Written by Ahmad Nejrabi for Robojax Video channel: www.Robojax.com
 * Date: December 15, 2017, in Ajax, Ontario, Canada
 * Permission granted to share this code, given that this
 * note is kept with the code.
 * Disclaimer: This code is "AS IS" and for educational purposes only.
 * 
 */
/*************************************************** 
  This is an example for our Adafruit 16-channel PWM & Servo driver.
  Servo test - this will drive 16 servos, one after the other.

  Pick one up today in the Adafruit shop!
  ------> http://www.adafruit.com/products/815

  These displays use I2C to communicate; 2 pins are required to  
  interface. For Arduino UNOs, that's SCL -> Analog 5, SDA -> Analog 4.

  Adafruit invests time and resources providing this open source code, 
  please support Adafruit and open-source hardware by purchasing 
  products from Adafruit!

  Written by Limor Fried/Ladyada for Adafruit Industries.  
  BSD license, all text above must be included in any redistribution
 ****************************************************/

#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 pwm = Adafruit_PWMServoDriver(0x41);

// Depending on your servo make, the pulse width min and max may vary; you 
// want these to be as small/large as possible without hitting the hard stop
// for max range. You'll have to tweak them as necessary to match the servos you
// have!
#define SERVOMIN  125 // this is the 'minimum' pulse length count (out of 4096)
#define SERVOMAX  575 // this is the 'maximum' pulse length count (out of 4096)

// our servo # counter
uint8_t servonum = 0;

void setup() {
  Serial.begin(9600);
  Serial.println("16 channel Servo test!");

  pwm.begin();
  
  pwm.setPWMFreq(60);  // Analog servos run at ~60 Hz updates

  //yield();
}

// the code inside loop() has been updated by Robojax
void loop() {

    pwm.setPWM(0, 0, 125 );
	delay(500);
    pwm.setPWM(0, 0, 255 );
	delay(500);
    pwm.setPWM(0, 0, 450 );
	delay(500);
    pwm.setPWM(0, 0, 575 );
	delay(500);	

 
}

Coisas que você pode precisar

Recursos e referências

Ainda não há recursos.

Arquivos📁

Bibliotecas do Arduino (zip)