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.
Controle 16 Servos usando um módulo PCA9685 e o sketch Arduino V2 #1: Um por Um
Neste tutorial, aprenderemos a controlar até 16 servomotores usando um módulo PCA9685 e um Arduino. O PCA9685 é um controlador PWM de 16 canais e 12 bits que permite o controle preciso de servomotores. Ao seguir este guia, você será capaz de controlar individualmente cada servomotor e defini-los em ângulos específicos, alcançando uma variedade de movimentos robóticos.
Vamos começar discutindo os componentes de hardware que você precisará para este projeto, seguidos de instruções detalhadas de fiação. Depois disso, vamos passar pelo código passo a passo, destacando identificadores-chave e seus papéis no controle dos servomotores. Para uma melhor compreensão, você pode querer consultar o vídeo acompanhante (no vídeo às 00:00).
Hardware Explicado
O componente principal deste projeto é o módulo PCA9685, que é responsável por gerar sinais PWM para controlar os servos. Cada servo está conectado a um dos 16 canais do PCA9685, permitindo controle independente. O módulo se comunica com o Arduino usando o protocolo I2C, que requer apenas dois fios: SDA e SCL.
Além do PCA9685, você precisará de uma placa Arduino, 16 servos e uma fonte de alimentação externa. A fonte de alimentação externa é crucial porque o Arduino sozinho pode não fornecer corrente suficiente para alimentar todos os servos simultaneamente. Cada servo normalmente opera a 5V, então certifique-se de que sua fonte de alimentação atenda a esse requisito.
Detalhes da Ficha Técnica
| Fabricante | NXP Semiconductors |
|---|---|
| Número da peça | PCA9685 |
| Tensão de lógica/IO | 2,3 - 5,5 V |
| Tensão de alimentação | 5 V |
| Corrente de saída (por canal) | 25 mA |
| Orientação sobre a frequência PWM | 60 Hz |
| Limites de lógica de entrada | 0,3VCC (baixo) / 0,7VCC (alto) |
| Queda de tensão / RDS(on)/ saturação | - |
| Limites térmicos | - |
| Pacote | TSSOP-28 / VQFN-28 |
| Notas / variantes | - |
- Conecte uma fonte de alimentação externa de 5V para os servos.
- Use I2C para comunicação, conectando SDA ao A4 e SCL ao A5 no Arduino.
- Certifique-se de que todos os aterramentos sejam comuns entre o Arduino e o PCA9685.
- Ajuste as larguras de pulso de acordo com os servos específicos utilizados.
- Mantenha o resfriamento adequado para o PCA9685 se estiver alimentando muitos servos simultaneamente.
Instruções de fiação
Para conectar o módulo PCA9685 ao Arduino e aos servomotores, comece ligando a fonte de alimentação externa de 5V ao terminal V+ do PCA9685. Conecte o aterramento da fonte de alimentação ao terminal de aterramento do PCA9685, bem como ao aterramento do Arduino.
Em seguida, conecte os pinos SDA e SCL do PCA9685 aos pinos correspondentes no Arduino (SDA ao A4 e SCL ao A5). Cada motor servo terá três fios: terra (geralmente preto ou marrom), VCC (tipicamente vermelho) e sinal (frequentemente amarelo ou branco). Conecte o fio terra de cada servo ao terminal de terra do PCA9685, o fio VCC ao terminal V+ e o fio de sinal aos respectivos canais (0-15) no PCA9685. Certifique-se de conectar o fio de sinal na ordem correta para cada servo.
Exemplos de Código e Passo a Passo
Agora vamos passar pelo código que controla os motores de passo um por um. O código começa importando as bibliotecas necessárias para comunicação I2C e o módulo PCA9685. O trecho a seguir inicializa o objeto PCA9685:
#include
#include
Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver(); // Initialize PCA9685 Na função de configuração, inicializamos o monitor serial e definimos a frequência de PWM para os servos:
void setup() {
Serial.begin(9600); // Start serial communication
pwm.begin(); // Initialize PCA9685
pwm.setPWMFreq(60); // Set frequency to 60 Hz for servos
}O loop principal contém dois loops aninhados: o loop externo itera através de cada um dos 16 servos, enquanto o loop interno muda gradualmente o ângulo de 0 a 180 graus:
void loop() {
for(int i=0; i<16; i++) {
for(int angle = 0; angle<181; angle += 10) {
delay(50); // Wait for servo to move
pwm.setPWM(i, 0, angleToPulse(angle)); // Set servo position
}
}
delay(1000); // Wait before repeating
}Essa estrutura permite que cada servo se mova para seu ângulo designado em incrementos de 10 graus, proporcionando transições suaves. A funçãoangleToPulse(int ang)converte valores de ângulo em larguras de pulso apropriadas para os servos:
int angleToPulse(int ang) {
int pulse = map(ang, 0, 180, SERVOMIN, SERVOMAX); // Map angle to pulse width
return pulse; // Return pulse width
}Esta função é essencial para traduzir o ângulo desejado em um sinal PWM que o PCA9685 pode entender e transmitir para os servos. Para mais detalhes, lembre-se de que o código completo está carregado abaixo do artigo.
Demonstração / O que Esperar
Uma vez que tudo esteja conectado corretamente e o código esteja carregado, você deve ver cada servo se movendo para seus respectivos ângulos um após o outro. Se você encontrar algum problema, verifique suas conexões e assegure-se de que possui uma fonte de alimentação estável para os servos. Se os servos não estiverem respondendo como esperado, verifique os sinais PWM que estão sendo enviados através do PCA9685.
Marcas de Tempo do Vídeo
- Detalhes do módulo com o chip PCA9685
- 06:14 Adicionando a biblioteca necessária para o PCA9685
- 07:14 Carregando o código de exemplo
- 07:35 Código explicado
- 11:31 Código Arduino simplificado para PCA9685
- 12:00 Encontrando o valor mínimo e máximo para o seu servo
- 18:27 Mapeando o ângulo do pulso para a largura do pulso
- 20:05 Criando um método separado para mapeamento
- 20:55 Usando o loop for para testar todos os ângulos para mapeamento
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
- 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
- Controlando um Motor Servo de 32 usando um Módulo PCA9685 e um ESP32 V4
- Controle 32 Servos via Wi-Fi usando ESP32 e PCA9685 pelo Desktop ou Telefone Móvel V5
/*
* Original source: https://github.com/adafruit/Adafruit-PWM-Servo-Driver-Library
* PCA9685 Video V2, Arduino Code-1
* This is the Arduino code PAC6985 16 channel servo controller
* watch the video for details (V1) and demo http://youtu.be/y8X9X10Tn1k
* This code is #1 for V2 Video Watch the video :https://youtu.be/bal2STaoQ1M
get this code and wiring from https://robojax.com/RTJ243
* I have got 3 codes as follow:
#1-Arduino Code to run one by one all servos from 0 to 180°
#2-Arduino Code to control specific servos with specific angle
#3-Arduino Code to run 2 or all servos at together
* Written/updated by Ahmad Shamshiri for Robojax Video channel www.Robojax.com
* Date: Dec 16, 2017, in Ajax, Ontario, Canada
* Watch 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 Servo https://youtu.be/y8X9X10Tn1k
* Disclaimer: this code is "AS IS" and for educational purpose only.
* this code has been downloaded from https://robojax.com
or make donation using PayPal http://robojax.com/L/?id=64
* * This code is "AS IS" without warranty or liability. Free to be used as long as you keep this note intact.*
* This code has been download from Robojax.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
/***************************************************
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, thats 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!
// Watch video V1 to understand the two lines below: http://youtu.be/y8X9X10Tn1k
#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() {
//watch video for details: https://youtu.be/bal2STaoQ1M
for(int i=0; i<16; i++)
{
for( int angle =0; angle<181; angle +=10){
delay(50);
pwm.setPWM(i, 0, angleToPulse(angle) );
// see YouTube video for details (robojax)
}
}
// robojax PCA9865 16 channel Servo control
delay(1000);// wait for 1 second
}
/*
/* angleToPulse(int ang)
* @brief gets angle in degree and returns the pulse width
* @param "ang" is integer representing angle from 0 to 180
* @return returns integer pulse width
* Usage to use 65 degree: angleToPulse(65);
* Written by Ahmad Shamshiri on Sep 17, 2019.
* in Ajax, Ontario, Canada
* www.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;
}
/*
* Original sourse: https://github.com/adafruit/Adafruit-PWM-Servo-Driver-Library
* PCA9685 Video V2, Arduino Code-2
* This is the Arduino code PAC6985 16 channel servo controller
* watch the video for details (V1) and demo http://youtu.be/y8X9X10Tn1k
* This code is #2 for V2 Video Watch the video :https://youtu.be/bal2STaoQ1M
get codes and wring from https://robojax.com/RTJ243
* I have got 3 codes as follow:
#1-Arduino Code to run one by one all servos from 0 to 180°
#2-Arduino Code to control specific servos with specific angle
#3-Arduino Code to run 2 or all servos at together
*
* Written/updated by Ahmad Shamshiri for Robojax Video channel www.Robojax.com
* Date: Dec 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 purpose only.
* this code has been downloaded from https://robojax.com
* Watch 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 Servo https://youtu.be/y8X9X10Tn1k
* Get this code and other Arduino codes from Robojax.com
Learn Arduino step by step in structured course with all material, wiring diagram and library
all in once place. Purchase My course on Udemy.com http://robojax.com/L/?id=62
****************************
Get early access to my videos via Patreon and have your name mentioned at end of very
videos I publish on YouTube here: http://robojax.com/L/?id=63 (watch until end of this video to list of my Patrons)
****************************
or make donation using PayPal http://robojax.com/L/?id=64
* * This code is "AS IS" without warranty or liability. Free to be used as long as you keep this note intact.*
* This code has been download from Robojax.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#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!
// Watch video V1 to understand the two lines below: http://youtu.be/y8X9X10Tn1k
#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() {
//watch video for details: https://youtu.be/bal2STaoQ1M
for(int i=0; i<16; i++)
{
for( int angle =0; angle<181; angle +=10){
delay(50);
pwm.setPWM(5, 0, angleToPulse(angle) );
pwm.setPWM(8, 0, angleToPulse(angle) );
pwm.setPWM(15, 0, angleToPulse(angle) );
}
}
// robojax PCA9865 16 channel Servo control
delay(1000);
}
/*
* angleToPulse(int ang)
* gets angle in degree and returns the pulse width
* also prints the value on seial 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;
}
Recursos e referências
Ainda não há recursos.
Arquivos📁
Nenhum arquivo disponível.