Olá! Boa tarde!
Estou construindo um braço robótico de Inox e usando o Arduino para controlar todo o movimento, e 3 servos motores de 15kgf movem toda a estrutura (usamos chapas de inox de 2mm, deixando a estrutura bem pesada, e fazendo-se necessário o uso desses servos), mas estou enfrentando 2 problemas.
A rotina de movimento do servo é simples: através de um sensor ultrasônico o arduino detecta a presença de alguma peça e então, move os servos para a posição da mesma, pega a peça, e a transporta para outro lugar, conforme pode ser visto no vídeo abaixo.
Mas 2 problemas estão afetando todo o funcionamento, e mesmo revisando a estrutura, a eletrônica e o código várias vezes, não consegui identificar quais são as causas. O primeiro problema ocorre quando o braço vai pegar alguma peça, nesse momento o servo que movimenta a base começa a ter pequenos "espasmos" fazendo com que a garra não consiga pegar a peça. E o segundo problema é logo depois que o braço coloca a peça em outro lugar, o servo da articulação enfrenta problemas para subir a estrutura, o que é meio estranho já que ele consegue subir a estrutura normalmente logo depois de pegar a peça, os dois problemas podem ser vistos no vídeo abaixo, vocês poderiam me ajudar a solucioná-los?
Vídeo:
#include "Ultrasonic.h"
#include <Servo.h>;
// Pino VCC -> 5V
// Pino GND -> GND
#define echoPin 13 // Pino 13 -> Echo
#define trigPin 12 // Pino 12 -> Trig
#define LED 8
Ultrasonic ultrasonic(trigPin,echoPin);
int parado = 0;
int inicio = 0;
Servo gservo;
Servo aservo;
Servo bservo;
void setup()
{
gservo.attach(11); //fio do servo da Garra
aservo.attach(9); //fio do servo da Articulação
bservo.attach(10); //fio do servo da Base
}
void mexendo(void) {
aservo.write(110);
delay(15);
bservo.write(180);
delay (1500);
gservo.write(100);
delay(1500);
aservo.write(100);
delay(1500);
aservo.write(90);
delay(1500);
aservo.write(60);
delay(1500);
aservo.write(30);
delay(1500);
aservo.write(10);
delay(1500);
aservo.write(5);
delay(3000);
gservo.write(80);
delay(1500);
gservo.write(75);
delay(1000);
gservo.write(72);
delay(500);
aservo.write(30);
delay(1500);
aservo.write(60);
delay(1500);
aservo.write(90);
delay(1500);
aservo.write(110);
delay(1500);
bservo.write(50);
delay (3000);
bservo.write(1);
delay (3000);
aservo.write(100);
delay(1500);
aservo.write(90);
delay(1500);
aservo.write(60);
delay(1500);
aservo.write(30);
delay(1500);
aservo.write(10);
delay(1500);
aservo.write(5);
delay(1500);
gservo.write(80);
delay(1500);
aservo.write(30);
delay(300);
aservo.write(60);
delay(300);
aservo.write(90);
delay(300);
aservo.write(110);
delay(1500);
gservo.write(100);
delay(3000);
bservo.write(50);
delay(1500);
}
void quieto(void) {
aservo.write(110);
delay(1500);
bservo.write(50);
delay (1500);
gservo.write(100);
delay(1500);
}
void loop(){
int i=0;
long distance=ultrasonic.Ranging(CM);
while(i<4) {
distance=(distance + ultrasonic.Ranging(CM))/2;
i++;
}
if(distance<10) {
digitalWrite(LED,HIGH);
mexendo();
inicio=1;
} else {
digitalWrite(LED,LOW);
if(inicio==0) {
quieto();
delay(1000);
parado=1;
}
}
}