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.
- Braço robótico EEZYbotARM MK1
- Braço robótico EEZYbotARM MK2
Para efectuar o controlo do braço recorri ao hardware e software descrito mais abaixo.

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

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