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