Hobby, Microcontroladores, Motores, Projetos, Tutorial

PCA9685: Como usar no Arduino?

Neste post, é mostrado como usar a placa PCA9685 com o Arduino. Para controlar vários servomotores é uma solução melhor do que os comandos tradicionais.

Post sobre o funcionamento do servomotorClique aqui

A placa PCA9685

Com uma placa PCA9685, pode-se controlar até 16 servos ligando apenas dois fios ao Arduino, excluindo os de alimentação.

PCA9685

A placa PCA9685 se comunica com o Arduino através do protocolo de comunicação I²C, este será assunto para um futuro post. O pino SDA deve estar ligado ao pino analógico 4 do Arduino Uno e o SCL ao analógico 5. Para conectar os motores, basta observar que os pinos preto, vermelho e amarelo são GND, V+ e PWM respectivamente.

Servomotor ligado ao PCA9685

Em outras placas Arduino, a pinagem para o protocolo I²C é diferente. Ligando várias placas em série pode usar uma quantidade maior de servos. O limite máximo teórico de saídas PWM é 992.

PCA9685 em série

Fonte de energia e regulador de tensão

A alimentação 5 V do Arduino é ligada ao Vcc. Porém, este 5 V é apenas para o chip da placa. Para alimentar os servos, é necessário uma fonte externa de 5 a 6 V. Quanto maior o número de servomotores, maior corrente elétrica é exigida. Neste caso, é recomendável usar um regulador de tensão.

O regulador LM2596S

Regulador de tensão LM2596S

Este é o regulador ajustável usado nos presentes projetos, o LM2596S é um conversor DC/DC step down. Ou seja, a tensão de saída é menor que a de entrada, e ambas são contínuas. As especificações são:

  • Tensão de entrada: 3,2 a 40 V.
  • Tensão de saída: 1,5 a 35 V.
  • Corrente de saída máxima: 3 A.
  • Eficiência: 92%.
  • Velocidade máxima de comutação: 150 kHz.

O capacitor serve para evitar picos de corrente e filtrar ruídos. Neste post, são apresentados dois projetos, um que pode ser alimentado diretamente pela fonte e outro, onde o regulador é obrigatório.

Projetos

É preciso baixar a biblioteca “Adafruit_PWMServoDriver.h”, que se encontra neste link.

Braço robótico 6 DOF

Este projeto controla o braço robótico 6 DOF mostrado no post “Unboxing de um braço robótico”, com a placa PCA9685.

Braço robótico 6 DOF

Montando o braço robóticoClique aqui

Ligando o braço ao PCA9685 e Arduino. Os motores são ligados da garra (terminal 1) até a base (terminal 6).

6 DOF com PCA9685

Este é o código com as explicações em “//”.

#include <Wire.h> //Biblioteca que permite a comunicação I2C.
#include <Adafruit_PWMServoDriver.h> //Esta biblioteca deve ser baixada para rodar o código.

Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();//Instanciando objetos com a classe Adafruit_PWMServoDriver.

#define MIN_PULSE_WIDTH 650   //Estes são os valores mínimo e máximo de largura de pulso que servem para o MG 995.
#define MAX_PULSE_WIDTH 2350
#define DEFAULT_PULSE_WIDTH 1500
#define FREQUENCY 60

int pulseWidth(int angle){ //Esta função calcula o ângulo de movimento do servo.
int pulse_wide, analog_value;
pulse_wide = map(angle, 0, 180, MIN_PULSE_WIDTH, MAX_PULSE_WIDTH); //Esta função pega ângulo de 0 a 180 graus e mapeia do valor mínimo de largura até o valor máximo. 
analog_value = int(float(pulse_wide) / 1000000 * FREQUENCY * 4096);
Serial.println(analog_value);
return analog_value; //O valor que a função retorna.
}
 
void setup(){
Serial.begin(9600);
//Serial.println("16 channel Servo test!");
pwm.begin();  //Inicializa a biblioteca e envia sinais PWM.
pwm.setPWMFreq(FREQUENCY); //Frequência de atualização do servo a 60 Hertz.
pwm.setPWM(1,0,pulseWidth(0)); 
pwm.setPWM(2,0,pulseWidth(0)); 
pwm.setPWM(3,0,pulseWidth(0)); 
pwm.setPWM(4,0,pulseWidth(0));
pwm.setPWM(5,0,pulseWidth(0));
pwm.setPWM(6,0,pulseWidth(0));
}

void loop(){ 
pwm.setPWM(6,0,pulseWidth(45));
pwm.setPWM(4,0,pulseWidth(0));
delay(1000);  
pwm.setPWM(3,0,pulseWidth(0));
pwm.setPWM(1,0,pulseWidth(120));
delay(500);
pwm.setPWM(3,0,pulseWidth(90));
pwm.setPWM(1,0,pulseWidth(0));
delay(2000);
delay(2000);
pwm.setPWM(2,0,pulseWidth(0));
pwm.setPWM(6,0,pulseWidth(0));
delay(2000);
}

//TESTANDO O BRAÇO.
//pwm.setPWM(1,0,pulseWidth(0)); //Abre a garra.
//pwm.setPWM(1,0,pulseWidth(120)); //Fecha a garra.
//pwm.setPWM(2, 0, pulseWidth(90)); //Movendo a posição da garra.

//pwm.setPWM(3,0,pulseWidth(20)); //Número baixo levanta a mão.
//pwm.setPWM(3,0,pulseWidth(0)); //Número alto abaixa a mão.

//pwm.setPWM(4, 0, pulseWidth(180));//Número alto abaixa o cotovelo.
//pwm.setPWM(4, 0, pulseWidth(70));

No comando “pwm.setPWM”, o primeiro número indica o terminal onde o servomotor está ligado na placa. Enquanto o segundo número controla a largura do pulso do sinal PWM.

Servorelógio

Este projeto usa 12 microservos, cada um representado a hora de um relógio, e um motor central como o ponteiro dos segundos. Por isso o nome.

O servomotor central move 60 vezes um passo para dar uma volta completa. Depois de uma volta completa, um dos servos pequenos dá um pequeno passo. Quando o pequeno servo fizer 60 passos, este volta para a posição original e o próximo, no sentido horário se move. Tem a opção de fazer o ponteiro dos segundos se mover mais rápido.

Vídeo dos projetos com PCA9685

A primeira parte do vídeo é o servorelógio, nesta parte o vídeo foi acelerado pois ia demorar muito em velocidade normal. A segunda parte é o braço robótico.

About Pedro Ney Stroski

2 thoughts on “PCA9685: Como usar no Arduino?

  1. Boa noite!

    Poderia me informar onde consigo os valores da largura de pulso do servo ?
    Estou com um projeto para fazer e estou com dificuldades de achar os valores corretos do meu motor.

    Atenciosamente,

Deixe um comentário

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