Controlo de PWM com PCA9685 e Pontenciometros variaveis

Este artigo foi efectuado para documentar os testes que efectuei com os seguintes braços róboticos educativos cujas algumas das peças mecanicas se podem fazer com uma impressora 3D.

Para efectuar o controlo do braço recorri ao hardware e software descrito mais abaixo.

sdr

O controlo dos 4 servos do braço é efectuado por um conjunto de 4 potenciómetros cuja posição é lida pelo recurso á leitura de 4 dos pinos analógicos de um Arduino Uno, que é convertido num comprimento de pulso mapeado entre o valor minimo e máximo de comprimento de pulso ,  enviado por I2C para o módulo PCA9685, que gera o PWM para a respectiva posição para cada um dos servos.

Hardware

A parte electrónica é composta por:

  • um microcontrolador ATMEGA 328P (Arduino Uno)
  • um modulo PCA9685
  • quatro potenciómetros
  • uma resistencia
Ligações entre os potenciometros, mcu, PCA9685 e servos MG996

Software

Para implementar o procedimento descrito existe um pequeno programa disponivel mais abaixo e que necessita da biblioteca Adafruit PWM Servo Driver para o Arduino que se pode instalar no arduino ide.

A biblioteca pode ser instalada recorrendo ao gestor de bibliotecas, pesquisar por: “adafruit pwm” e instalar. Mas também está disponivel no seguinte endereço

https://github.com/adafruit/Adafruit-PWM-Servo-Driver-Library

Programa para o Arduino Uno

servo_pca9685 _potenciometer_v2

#include <Wire.h>
#include <Adafruit_PWMServoDriver.h>

Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();

#define SERVOCOUNT 4

#define SERVOMIN 150 // this is the 'minimum' pulse length count (out of 4096)
#define SERVOMAX 600 // this is the 'maximum' pulse length count (out of 4096)

int potpin[SERVOCOUNT] = {0};
int potval[SERVOCOUNT] = {0};
int srvang[SERVOCOUNT] = {0}; 
int srvpls[SERVOCOUNT] = {SERVOMIN};

void setup() {
Serial.begin(115200);
potpin[0]=0;
potpin[1]=1;
potpin[2]=2;
potpin[3]=3;
pwm.begin();
pwm.setPWMFreq(60);
delay(10);
}

void loop() {
int i;

for(i = 0; i < SERVOCOUNT; i++) {
// read potentiometer
potval[i] = analogRead(potpin[i]);
// map potentiometer value to degrees
srvang[i] = map(potval[i], 0, 1023, 0, 180);
// map degrees to pulse length
srvpls[i] = map(srvang[i], 0, 180, SERVOMIN, SERVOMAX);
// print to give feedback 
Serial.print(potval[i]); Serial.print("\t"); Serial.print(srvang[i]); Serial.print("\t");
// send pwm to servo
pwm.setPWM(potpin[i], 0, srvpls[i]); 
}

Serial.println("\n");
}

 

Referências:

https://learn.adafruit.com/16-channel-pwm-servo-driver/using-the-adafruit-library

Arduino PCA9685 example