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.
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.
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.
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
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.
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).
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.
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,
Qual é o seu servo? Tem um site que mostra as especificações de vários servomotores de muitos fabricantes, talvez tenha informação sobre a largura de pulso (Pulse Width) do seu servo.
https://servodatabase.com