Este tutorial faz parte de: Servomotores
Todos os vídeos relacionados a servomotores que abordam o tema estão listados aqui. Os links para outros vídeos encontram-se abaixo deste artigo.
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.

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
| Fabricante | NXP Semicondutor |
|---|---|
| Número da peça | PCA9685 |
| Tensão lógica/E/S | 3,3 V a 5,5 V |
| Tensão de alimentação | 2,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 PWM | 24 Hz a 1.6 kHz |
| Limiares lógicos de entrada | 0.3 V (baixo) / 0.7 V (alto) |
| Queda de tensão / RDS(on)/ saturação | 0.5 V máx. |
| Limites térmicos | -40 °C a 125 °C |
| Pacote | HTSSOP-28 |
| Notas / variantes | Controlador 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

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
Este tutorial é parte de: Servomotores
- Controlando um servo com botões de pressão usando o Arduino
- Control a Servo Motor with a Push Button: Move Servo and Return SPB-1
- Control a Servo Motor with a Push Button: Move Servo in One Direction SPB-2
- Controlling a Servo Motor with a Push Button: Move Servo While Button Is Pressed (SPB-3)
- Controlando um servo com um potenciômetro usando o Arduino
- Controlando um servo com um potenciômetro e um LCD1602 usando Arduino
- Controlando Motores Servo Usando um Controle Remoto Infravermelho com Arduino
- Controle de Motor Servo Arduino Usando um Potenciômetro
- Controlando a Posição do Servo com Gestos de Mão para Arduino
- Controlling Two or More Servos with Potentiometers Using an Arduino
- How to Control a 360° Servo with Three Push-Button Switches
- How to Use Continuous 360° Servo with Arduino
- Build an Arduino Servo Toggle Switch with a Push Button
Recursos e referências
Ainda não há recursos.
Arquivos📁
Nenhum arquivo disponível.