Este tutorial faz parte de: Controlando 16 ou 32 servomotores com PCA9685
Esta coleção de tutoriais em vídeo ajuda você a controlar 32 ou mais servomotores usando Arduino UNO, Nano, Mini ou ESP32. Todos os códigos são fornecidos.
Controlando um Motor Servo de 32 usando um Módulo PCA9685 e um ESP32 V4
Neste tutorial, você aprenderá como controlar até 32 servomotores usando um microcontrolador ESP32 conectado a um módulo PCA9685. Isso é particularmente útil para projetos que exigem que vários servomotores operem simultaneamente sem o uso de Wi-Fi. O resultado será uma configuração totalmente funcional onde você poderá manipular a posição de cada servomotor individualmente.

Este tutorial o guiará pelos componentes de hardware necessários, instruções de fiação e uma visão geral do código necessário para alcançar este controle. Para uma demonstração detalhada, considere assistir ao vídeo associado (no vídeo às 00:00).
Hardware Explicado
Os componentes principais utilizados neste projeto são o microcontrolador ESP32 e o módulo driver PWM PCA9685. O ESP32 serve como o controlador principal que envia sinais para o módulo PCA9685, que por sua vez controla os motores servo. O PCA9685 pode controlar até 16 motores servo por módulo, permitindo a conexão de dois módulos para controlar um total de 32 servos.
O módulo PCA9685 opera utilizando comunicação I2C, o que significa que possui dois fios principais para transferência de dados: SDA (linha de dados) e SCL (linha de clock). Ele também requer uma fonte de alimentação para operar os servos, tipicamente a 5V. O ESP32 atua como o dispositivo mestre, fornecendo os sinais de controle necessários para os módulos escravos PCA9685.
Detalhes da Ficha Técnica
| Fabricante | Adafruit |
|---|---|
| Número da peça | PCA9685 |
| Tensão de lógica/entrada e saída | 3,3 V a 5,5 V |
| Tensão de alimentação | 5 V |
| Corrente de saída (por canal) | ~20 mA |
| Corrente de pico (por canal) | ~25 mA |
| Orientação sobre frequência PWM | 60 Hz |
| Limiares de lógica de entrada | 0,3*VDDbaixo, 0,7*VDD(alto) |
| Queda de tensão / RDS(on)/ saturação | 0,5 V máx |
| Limites térmicos | 125 °C |
| Pacote | HTSSOP-28 |
| Notas / variantes | Controlador PWM de 16 canais |
- Utilize fonte de alimentação externa para os servos (5V, 2A recomendado).
- Assegure um aterramento adequado entre o ESP32 e o PCA9685.
- Verifique as configurações de frequência PWM para um desempenho ideal do servo.
- Ajuste os limites da largura do pulso com base nas especificações do servo.
- Tenha cuidado com a corrente quando vários servos estão ativos.
Instruções de Fiação

Para conectar o PCA9685 ao ESP32, comece ligando a fonte de alimentação e o terra. Conecte o VCCconecte o pino do PCA9685 a uma fonte de alimentação de 5V e conecte o pino GND a um dos pinos GND no ESP32. Isso garante que tanto o módulo quanto o ESP32 compartilhem um terra comum.
Em seguida, para a comunicação I2C, conecte o pino SDA no PCA9685 ao GPIO 21 no ESP32 e o pino SCL ao GPIO 22. Esta configuração permite que o ESP32 se comunique corretamente com o módulo PCA9685. Certifique-se de usar fios curtos para evitar ruídos nas linhas de comunicação, especialmente se você estiver trabalhando com vários servos.
Como mostrado na imagem acima, para a placa PCA9685 2 (à esquerda), certifique-se de soldar aquele caminho para definir o endereço I2C para que seja diferente da placa 1 (à direita).
Exemplos de Código e Passo a Passo
O código inicializa os módulos PCA9685 e define a frequência PWM. Os identificadores-chave no código incluemboard1eboard2, que representam os dois módulos PCA9685 conectados ao ESP32. Osetup()a função inicializa o monitor serial e define a frequência PWM para ambas as placas.
void setup() {
Serial.begin(9600);
Serial.println("32 channel Servo test!");
board1.begin();
board2.begin();
board1.setPWMFreq(60); // Analog servos run at ~60 Hz updates
board2.setPWMFreq(60);
}Este trecho mostra o processo de configuração, onde a comunicação serial é inicializada e a frequência PWM é definida para os drivers de servo. OsetPWMFreq(60)A função garante que os servos recebam a frequência correta para um funcionamento suave.
No loop, um loop for itera por ângulos de 0 a 180 graus, enviando comandos de largura de pulso para os servos conectados a ambas as placas PCA9685. A funçãoangleToPulseconverte o ângulo na largura de pulso correspondente.
void loop() {
for(int angle = 0; angle < 181; angle += 10) {
for(int i = 0; i < 16; i++) {
board2.setPWM(i, 0, angleToPulse(angle));
board1.setPWM(i, 0, angleToPulse(angle));
}
}
delay(100);
}Este trecho de código demonstra como os servos são controlados em um loop. O ângulo do servo aumenta em 10 graus, e asetPWMa função é chamada para ambas as placas para mover os servos para o ângulo especificado. O atraso permite uma breve pausa entre os movimentos.
Demonstração / O que Esperar
Ao concluir a fiação e carregar o código, você deve ver os servos se movendo em incrementos de 0 a 180 graus. Isso acontecerá para os 32 servos conectados aos dois módulos PCA9685 simultaneamente. Se algum servo não responder, verifique a fonte de alimentação e certifique-se de que todas as conexões estão seguras (no vídeo às 12:30).
Carimbos de tempo do vídeo
- 00:00 Iniciar
- 00:36 Introdução
- 04:01 Fiação Explicada (somente ESP32)
- 06:26 Preparando o Arduino IDE para ESP32
- 08:34 Código Explicado
- 13:40 Demonstração de funcionamento de 32 Motores Servo
Este tutorial é parte de: Controlando 16 ou 32 servomotores com PCA9685
- Código Arduino e vídeo para o controlador de servos PCA9685 de 16 canais e 12 bits V1
- Controle 16 Servos usando um módulo PCA9685 e o sketch Arduino V2 #1: Um por Um
- Controlando 16 Servomotores Usando um Módulo PCA9685 e Esboço Arduino V2: Controle Individual de Servos
- Controlling 16 Servo Motors Using a PCA9685 Module and Arduino V2 Sketch #3: All Servos Together
- Controlando um Servo Motor de 32 com um Módulo PCA9685 e Sketch Arduino V3 #1: Todos os Servos Juntos
- Controle 32 Servos via Wi-Fi usando ESP32 e PCA9685 pelo Desktop ou Telefone Móvel V5
/*
* Fonte da biblioteca original: https://github.com/adafruit/Adafruit-PWM-Servo-Driver-Library
*
* Este é o código Arduino do controlador de servo PCA6985 de 16 canais
* para controlar 32 Motores Servo com a placa ESP32 sem WiFi
*
* obtenha este código e a fiação deste vídeo: http://robojax.com/RJT268
*
* Este é o vídeo V4 sobre o PCA9685: https://youtu.be/JFdXB8Za5Os
*
* assista ao vídeo para detalhes (V1) e demonstração http://youtu.be/y8X9X10Tn1k
*
* Escrito/atualizado por Ahmad Shamshiri para o canal de vídeos Robojax www.Robojax.com
* Data: 15 de dezembro de 2019, em Ajax, Ontário, Canadá
*
* Isenção de responsabilidade: este código é "COMO ESTÁ" e apenas para fins educacionais.
*
* ou faça uma doação usando PayPal http://robojax.com/L/?id=64
*
* Este código é "COMO ESTÁ" sem garantia ou responsabilidade. Livre para ser usado desde que você mantenha esta nota intacta.*
* Este código foi baixado do Robojax.com
* Este programa é software livre: você pode redistribuí-lo e/ou modificá-lo
* sob os termos da GNU General Public License conforme publicado pela
* Free Software Foundation, seja a versão 3 da Licença, ou
* (a seu critério) qualquer versão posterior.
*
* Este programa é distribuído na expectativa de que seja útil,
* mas SEM QUALQUER GARANTIA; sem mesmo a garantia implícita de
* COMERCIALIZAÇÃO ou ADEQUAÇÃO A UM PROPÓSITO ESPECÍFICO. Consulte a
* GNU General Public License para mais detalhes.
*
* Você deve ter recebido uma cópia da GNU General Public License
* junto com este programa. Se não, veja <https://www.gnu.org/licenses/>.
*/
#include <Wire.h>
#include <Adafruit_PWMServoDriver.h>
// chamada desta forma, usa o endereço padrão 0x40
Adafruit_PWMServoDriver board1 = Adafruit_PWMServoDriver(0x40);
Adafruit_PWMServoDriver board2 = Adafruit_PWMServoDriver(0x41);
// Dependendo da marca do seu servo, a largura do pulso mínima e máxima pode variar, você
// quero que sejam o menor/o maior possível sem atingir o limite máximo
// para o alcance máximo. Você terá que ajustá-los conforme necessário para combinar com os servos que
// tenha!
// Assista ao vídeo V1 para entender as duas linhas abaixo: http://youtu.be/y8X9X10Tn1k
#define SERVOMIN 125 // este é o contador do comprimento mínimo de pulso (de 4096)
#define SERVOMAX 575 // este é o contador de comprimento de pulso 'máximo' (de 4096)
int servoNumber = 0;
void setup() {
Serial.begin(9600);
Serial.println("32 channel Servo test!");
board1.begin();
board2.begin();
board1.setPWMFreq(60); // Servos analógicos funcionam com atualizações de ~60 Hz.
board2.setPWMFreq(60);
// yield();
}
// o código dentro da loop() foi atualizado por Robojax
void loop() {
for( int angle =0; angle<181; angle +=10){
for(int i=0; i<16; i++)
{
board2.setPWM(i, 0, angleToPulse(angle) );
board1.setPWM(i, 0, angleToPulse(angle) );
}
}
// robojax PCA9865 controle de Servo de 16 canais
delay(100);
}
/*
* angleToPulse(int ang)
* adquire o ângulo em graus e retorna a largura do pulso
* também imprime o valor no monitor serial
* escrito por Ahmad Shamshiri para Robojax, Robojax.com
*/
int angleToPulse(int ang){
int pulse = map(ang,0, 180, SERVOMIN,SERVOMAX); // mapear o ângulo de 0 a 180 para Servo min e Servo max
Serial.print("Angle: ");Serial.print(ang);
Serial.print(" pulse: ");Serial.println(pulse);
return pulse;
}
Coisas que você pode precisar
-
AmazonasCompre o PCA9685 na Amazonamzn.to
-
eBayCompre o PCA9685 no eBayebay.us
-
AliExpressCompre PCA9685 na AliExpresss.click.aliexpress.com
-
BanggoodCompre PCA9685 na Banggoodbanggood.com
Recursos e referências
Ainda não há recursos.
Arquivos📁
Bibliotecas do Arduino (zip)
-
Adafruit-PWM-Servo-Driver-Library-master
Adafruit-PWM-Servo-Driver-Library-master.zip0.02 MB